int CMPFUNC_CONV wxSizeTCmpFn(size_t n1, size_t n2) { return n1 - n2; }
-WX_DEFINE_SORTED_EXPORTED_ARRAY(size_t, wxIndexArray);
+WX_DEFINE_SORTED_EXPORTED_ARRAY_LONG(size_t, wxIndexArray);
// this class is used to store the selected items in the virtual list control
// (but it is not tied to list control and so can be used with other controls
wxCursor *m_resizeCursor;
bool m_isDragging;
- // column being resized
+ // column being resized or -1
int m_column;
// divider line position in logical (unscrolled) coords
// common part of all ctors
void Init();
+ void SendListEvent(wxEventType type, wxPoint pos);
+
DECLARE_DYNAMIC_CLASS(wxListHeaderWindow)
DECLARE_EVENT_TABLE()
};
void OnKillFocus( wxFocusEvent &event );
private:
- DECLARE_DYNAMIC_CLASS(wxListTextCtrl);
+ DECLARE_DYNAMIC_CLASS(wxListTextCtrl)
DECLARE_EVENT_TABLE()
};
// suspend/resume redrawing the control
void Freeze();
void Thaw();
-
+
void SetFocus();
void OnRenameTimer();
// if this is > 0, the control is frozen and doesn't redraw itself
size_t m_freezeCount;
- DECLARE_DYNAMIC_CLASS(wxListMainWindow);
+ DECLARE_DYNAMIC_CLASS(wxListMainWindow)
DECLARE_EVENT_TABLE()
};
// wxListHeaderWindow
//-----------------------------------------------------------------------------
-IMPLEMENT_DYNAMIC_CLASS(wxListHeaderWindow,wxWindow);
+IMPLEMENT_DYNAMIC_CLASS(wxListHeaderWindow,wxWindow)
BEGIN_EVENT_TABLE(wxListHeaderWindow,wxWindow)
EVT_PAINT (wxListHeaderWindow::OnPaint)
if (m_isDragging)
{
+ SendListEvent(wxEVT_COMMAND_LIST_COL_DRAGGING,
+ event.GetPosition());
+
// we don't draw the line beyond our window, but we allow dragging it
// there
int w = 0;
m_isDragging = FALSE;
m_dirty = TRUE;
m_owner->SetColumnWidth( m_column, m_currentX - m_minX );
+ SendListEvent(wxEVT_COMMAND_LIST_COL_END_DRAG,
+ event.GetPosition());
}
else
{
int xpos = 0;
// find the column where this event occured
- int countCol = m_owner->GetColumnCount();
- for (int col = 0; col < countCol; col++)
+ int col,
+ countCol = m_owner->GetColumnCount();
+ for (col = 0; col < countCol; col++)
{
xpos += m_owner->GetColumnWidth( col );
m_column = col;
m_minX = xpos;
}
+ if ( col == countCol )
+ m_column = -1;
+
if (event.LeftDown() || event.RightUp())
{
if (hit_border && event.LeftDown())
m_currentX = x;
DrawCurrent();
CaptureMouse();
+ SendListEvent(wxEVT_COMMAND_LIST_COL_BEGIN_DRAG,
+ event.GetPosition());
}
else // click on a column
{
- wxWindow *parent = GetParent();
- wxListEvent le( event.LeftDown()
+ SendListEvent( event.LeftDown()
? wxEVT_COMMAND_LIST_COL_CLICK
: wxEVT_COMMAND_LIST_COL_RIGHT_CLICK,
- parent->GetId() );
- le.SetEventObject( parent );
- le.m_pointDrag = event.GetPosition();
-
- // the position should be relative to the parent window, not
- // this one for compatibility with MSW and common sense: the
- // user code doesn't know anything at all about this header
- // window, so why should it get positions relative to it?
- le.m_pointDrag.y -= GetSize().y;
-
- le.m_col = m_column;
- parent->GetEventHandler()->ProcessEvent( le );
+ event.GetPosition());
}
}
else if (event.Moving())
m_owner->SetFocus();
}
+void wxListHeaderWindow::SendListEvent(wxEventType type, wxPoint pos)
+{
+ wxWindow *parent = GetParent();
+ wxListEvent le( type, parent->GetId() );
+ le.SetEventObject( parent );
+ le.m_pointDrag = pos;
+
+ // the position should be relative to the parent window, not
+ // this one for compatibility with MSW and common sense: the
+ // user code doesn't know anything at all about this header
+ // window, so why should it get positions relative to it?
+ le.m_pointDrag.y -= GetSize().y;
+
+ le.m_col = m_column;
+ parent->GetEventHandler()->ProcessEvent( le );
+}
+
//-----------------------------------------------------------------------------
// wxListRenameTimer (internal)
//-----------------------------------------------------------------------------
// wxListTextCtrl (internal)
//-----------------------------------------------------------------------------
-IMPLEMENT_DYNAMIC_CLASS(wxListTextCtrl,wxTextCtrl);
+IMPLEMENT_DYNAMIC_CLASS(wxListTextCtrl,wxTextCtrl)
BEGIN_EVENT_TABLE(wxListTextCtrl,wxTextCtrl)
EVT_CHAR (wxListTextCtrl::OnChar)
(*m_accept) = TRUE;
(*m_res) = GetValue();
-
+
if ((*m_res) != m_startValue)
m_owner->OnRenameAccept();
}
// wxListMainWindow
//-----------------------------------------------------------------------------
-IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow);
+IMPLEMENT_DYNAMIC_CLASS(wxListMainWindow,wxScrolledWindow)
BEGIN_EVENT_TABLE(wxListMainWindow,wxScrolledWindow)
EVT_PAINT (wxListMainWindow::OnPaint)
if ( ld->HasImage() && GetLineIconRect(line).Inside(x, y) )
return wxLIST_HITTEST_ONITEMICON;
- if ( ld->HasText() )
+ // VS: Testing for "ld->HasText() || InReportView()" instead of
+ // "ld->HasText()" is needed to make empty lines in report view
+ // possible
+ if ( ld->HasText() || InReportView() )
{
wxRect rect = InReportView() ? GetLineRect(line)
: GetLineLabelRect(line);
if (m_dirty)
wxSafeYield();
- wxClientDC dc(this);
- PrepareDC( dc );
-
wxString s = data->GetText(0);
wxRect rectLabel = GetLineLabelRect(m_currentEdit);
- rectLabel.x = dc.LogicalToDeviceX( rectLabel.x );
- rectLabel.y = dc.LogicalToDeviceY( rectLabel.y );
+ CalcScrolledPosition(rectLabel.x, rectLabel.y, &rectLabel.x, &rectLabel.y);
wxListTextCtrl *text = new wxListTextCtrl
(
#ifdef __WXGTK__
// FIXME: wxGTK generates bad sequence of events prior to doubleclick
- // ("down, up, down, double, up" while other ports
+ // ("down, up, down, double, up" while other ports
// do "down, up, double, up"). We have to have this hack
// in place till somebody fixes wxGTK...
if ( current == m_lineBeforeLastClicked )
void wxListMainWindow::SetFocus()
{
// VS: wxListMainWindow derives from wxPanel (via wxScrolledWindow) and wxPanel
- // overrides SetFocus in such way that it does never change focus from
+ // overrides SetFocus in such way that it does never change focus from
// panel's child to the panel itself. Unfortunately, we must be able to change
- // focus to the panel from wxListTextCtrl because the text control should
+ // focus to the panel from wxListTextCtrl because the text control should
// disappear when the user clicks outside it.
wxWindow *oldFocus = FindFocus();
-
+
if ( oldFocus && oldFocus->GetParent() == this )
{
wxWindow::SetFocus();
int clientWidth,
clientHeight;
GetSize( &clientWidth, &clientHeight );
-
+
if ( HasFlag(wxLC_REPORT) )
{
// all lines have the same height
{
// We start with 4 for the border around all items
entireWidth = 4;
-
+
if (tries == 1)
{
// Now we have decided that the items do not fit into the
// a scrollbar at the bottom of its client area.
entireWidth += SCROLL_UNIT_X;
}
-
+
// Start at 2,2 so the text does not touch the border
int x = 2;
int y = 2;
entireWidth += maxWidth+6;
maxWidth = 0;
}
-
+
// We have reached the last item.
if ( i == count - 1 )
entireWidth += maxWidth;
-
+
if ( (tries == 0) && (entireWidth+SCROLL_UNIT_X > clientWidth) )
{
clientHeight -= 15; // We guess the scrollbar height. (FIXME)
currentlyVisibleLines = 0;
break;
}
-
+
if ( i == count - 1 )
tries = 1; // Everything fits, no second try required.
}
m_dirty = TRUE;
m_columns.DeleteNode( node );
+
+ // invalidate it as it has to be recalculated
+ m_headerWidth = 0;
}
void wxListMainWindow::DoDeleteAllItems()
{
m_columns.Append( column );
}
+
+ // invalidate it as it has to be recalculated
+ m_headerWidth = 0;
}
}