public:
wxListLineData(wxListMainWindow *owner);
- ~wxListLineData() { delete m_gi; }
+ ~wxListLineData()
+ {
+ WX_CLEAR_LIST(wxListItemDataList, m_items);
+ delete m_gi;
+ }
// are we in report mode?
inline bool InReportView() const;
void OnRenameTimer();
bool OnRenameAccept(size_t itemEdit, const wxString& value);
+ void OnRenameCancelled(size_t itemEdit);
void OnMouse( wxMouseEvent &event );
wxListLineData::wxListLineData( wxListMainWindow *owner )
{
m_owner = owner;
- m_items.DeleteContents( TRUE );
if ( InReportView() )
{
void wxListLineData::CalculateSize( wxDC *dc, int spacing )
{
- wxListItemDataList::Node *node = m_items.GetFirst();
+ wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
wxCHECK_RET( node, _T("no subitems at all??") );
wxListItemData *item = node->GetData();
int window_width,
int spacing )
{
- wxListItemDataList::Node *node = m_items.GetFirst();
+ wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
wxCHECK_RET( node, _T("no subitems at all??") );
wxListItemData *item = node->GetData();
void wxListLineData::SetItem( int index, const wxListItem &info )
{
- wxListItemDataList::Node *node = m_items.Item( index );
+ wxListItemDataList::compatibility_iterator node = m_items.Item( index );
wxCHECK_RET( node, _T("invalid column index in SetItem") );
wxListItemData *item = node->GetData();
void wxListLineData::GetItem( int index, wxListItem &info )
{
- wxListItemDataList::Node *node = m_items.Item( index );
+ wxListItemDataList::compatibility_iterator node = m_items.Item( index );
if (node)
{
wxListItemData *item = node->GetData();
{
wxString s;
- wxListItemDataList::Node *node = m_items.Item( index );
+ wxListItemDataList::compatibility_iterator node = m_items.Item( index );
if (node)
{
wxListItemData *item = node->GetData();
void wxListLineData::SetText( int index, const wxString s )
{
- wxListItemDataList::Node *node = m_items.Item( index );
+ wxListItemDataList::compatibility_iterator node = m_items.Item( index );
if (node)
{
wxListItemData *item = node->GetData();
void wxListLineData::SetImage( int index, int image )
{
- wxListItemDataList::Node *node = m_items.Item( index );
+ wxListItemDataList::compatibility_iterator node = m_items.Item( index );
wxCHECK_RET( node, _T("invalid column index in SetImage()") );
wxListItemData *item = node->GetData();
int wxListLineData::GetImage( int index ) const
{
- wxListItemDataList::Node *node = m_items.Item( index );
+ wxListItemDataList::compatibility_iterator node = m_items.Item( index );
wxCHECK_MSG( node, -1, _T("invalid column index in GetImage()") );
wxListItemData *item = node->GetData();
wxListItemAttr *wxListLineData::GetAttr() const
{
- wxListItemDataList::Node *node = m_items.GetFirst();
+ wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
wxCHECK_MSG( node, NULL, _T("invalid column index in GetAttr()") );
wxListItemData *item = node->GetData();
void wxListLineData::SetAttr(wxListItemAttr *attr)
{
- wxListItemDataList::Node *node = m_items.GetFirst();
+ wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
wxCHECK_RET( node, _T("invalid column index in SetAttr()") );
wxListItemData *item = node->GetData();
void wxListLineData::Draw( wxDC *dc )
{
- wxListItemDataList::Node *node = m_items.GetFirst();
+ wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
wxCHECK_RET( node, _T("no subitems at all??") );
bool highlighted = IsHighlighted();
y = rect.y + (LINE_SPACING + EXTRA_HEIGHT) / 2;
size_t col = 0;
- for ( wxListItemDataList::Node *node = m_items.GetFirst();
+ for ( wxListItemDataList::compatibility_iterator node = m_items.GetFirst();
node;
node = node->GetNext(), col++ )
{
case WXK_ESCAPE:
Finish();
+ m_owner->OnRenameCancelled( m_itemEdited );
break;
default:
{
if ( !m_finished )
{
- (void)AcceptChanges();
-
+ // We must finish regardless of success, otherwise we'll get focus problems
Finish();
+
+ if ( !AcceptChanges() )
+ m_owner->OnRenameCancelled( m_itemEdited );
}
-
+
event.Skip();
}
void wxListMainWindow::Init()
{
- m_columns.DeleteContents( TRUE );
m_dirty = TRUE;
m_countVirt = 0;
m_lineFrom =
wxListMainWindow::~wxListMainWindow()
{
DoDeleteAllItems();
+ WX_CLEAR_LIST(wxListHeaderDataList, m_columns);
delete m_highlightBrush;
delete m_highlightUnfocusedBrush;
le.IsAllowed();
}
+#ifdef __VMS__ // Ignore unreacheable code
+# pragma message disable initnotreach
+#endif
+
+void wxListMainWindow::OnRenameCancelled(size_t itemEdit)
+{
+ // wxMSW seems not to notify the program about
+ // cancelled label edits.
+ return;
+
+ // let owner know that the edit was cancelled
+ wxListEvent le( wxEVT_COMMAND_LIST_END_LABEL_EDIT, GetParent()->GetId() );
+
+ // These only exist for wxTreeCtrl, which should probably be changed
+ // le.m_editCancelled = TRUE;
+ // le.m_label = wxEmptyString;
+
+ le.SetEventObject( GetParent() );
+ le.m_itemIndex = itemEdit;
+
+ wxListLineData *data = GetLine(itemEdit);
+ wxCHECK_RET( data, _T("invalid index in OnRenameCancelled()") );
+
+ data->GetItem( 0, le.m_item );
+
+ GetEventHandler()->ProcessEvent( le );
+}
+#ifdef __VMS__
+# pragma message enable initnotreach
+#endif
+
void wxListMainWindow::OnMouse( wxMouseEvent &event )
{
event.SetEventObject( GetParent() );
void wxListMainWindow::SetColumn( int col, wxListItem &item )
{
- wxListHeaderDataList::Node *node = m_columns.Item( col );
+ wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col );
wxCHECK_RET( node, _T("invalid column index in SetColumn") );
if ( headerWin )
headerWin->m_dirty = TRUE;
- wxListHeaderDataList::Node *node = m_columns.Item( col );
+ wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col );
wxCHECK_RET( node, _T("no column?") );
wxListHeaderData *column = node->GetData();
for ( size_t i = 0; i < count; i++ )
{
wxListLineData *line = GetLine(i);
- wxListItemDataList::Node *n = line->m_items.Item( col );
+ wxListItemDataList::compatibility_iterator n = line->m_items.Item( col );
wxCHECK_RET( n, _T("no subitem?") );
void wxListMainWindow::GetColumn( int col, wxListItem &item ) const
{
- wxListHeaderDataList::Node *node = m_columns.Item( col );
+ wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col );
wxCHECK_RET( node, _T("invalid column index in GetColumn") );
wxListHeaderData *column = node->GetData();
int wxListMainWindow::GetColumnWidth( int col ) const
{
- wxListHeaderDataList::Node *node = m_columns.Item( col );
+ wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col );
wxCHECK_MSG( node, 0, _T("invalid column index") );
wxListHeaderData *column = node->GetData();
void wxListMainWindow::DeleteColumn( int col )
{
- wxListHeaderDataList::Node *node = m_columns.Item( col );
+ wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col );
wxCHECK_RET( node, wxT("invalid column index in DeleteColumn()") );
m_dirty = TRUE;
- m_columns.DeleteNode( node );
+ delete node->GetData();
+ m_columns.Erase( node );
+
+ if ( !IsVirtual() )
+ {
+ // update all the items
+ for ( size_t i = 0; i < m_lines.GetCount(); i++ )
+ {
+ wxListLineData * const line = GetLine(i);
+ wxListItemDataList::compatibility_iterator n = line->m_items.Item( col );
+ delete n->GetData();
+ line->m_items.Erase(n);
+ }
+ }
// invalidate it as it has to be recalculated
m_headerWidth = 0;
void wxListMainWindow::DeleteEverything()
{
- m_columns.Clear();
+ WX_CLEAR_LIST(wxListHeaderDataList, m_columns);
DeleteAllItems();
}
{
if (item.m_width == wxLIST_AUTOSIZE_USEHEADER)
item.m_width = GetTextLength( item.m_text );
+
wxListHeaderData *column = new wxListHeaderData( item );
- if ((col >= 0) && (col < (int)m_columns.GetCount()))
+ bool insert = (col >= 0) && ((size_t)col < m_columns.GetCount());
+ if ( insert )
{
- wxListHeaderDataList::Node *node = m_columns.Item( col );
+ wxListHeaderDataList::compatibility_iterator node = m_columns.Item( col );
m_columns.Insert( node, column );
}
else
m_columns.Append( column );
}
+ if ( !IsVirtual() )
+ {
+ // update all the items
+ for ( size_t i = 0; i < m_lines.GetCount(); i++ )
+ {
+ wxListLineData * const line = GetLine(i);
+ wxListItemData * const data = new wxListItemData(this);
+ if ( insert )
+ line->m_items.Insert(col, data);
+ else
+ line->m_items.Append(data);
+ }
+ }
+
// invalidate it as it has to be recalculated
m_headerWidth = 0;
}
BEGIN_EVENT_TABLE(wxGenericListCtrl,wxControl)
EVT_SIZE(wxGenericListCtrl::OnSize)
- EVT_IDLE(wxGenericListCtrl::OnIdle)
END_EVENT_TABLE()
wxGenericListCtrl::wxGenericListCtrl()
}
}
-void wxGenericListCtrl::OnIdle( wxIdleEvent & event )
+void wxGenericListCtrl::OnInternalIdle()
{
- event.Skip();
-
+ wxWindow::OnInternalIdle();
+
// do it only if needed
if ( !m_mainWin->m_dirty )
return;
m_mainWin->RefreshLines(itemFrom, itemTo);
}
+/*
+ * Generic wxListCtrl is more or less a container for two other
+ * windows which drawings are done upon. These are namely
+ * 'm_headerWin' and 'm_mainWin'.
+ * Here we override 'virtual wxWindow::Refresh()' to mimic the
+ * behaviour wxListCtrl has under wxMSW.
+ */
+void wxGenericListCtrl::Refresh(bool eraseBackground, const wxRect *rect)
+{
+ if (!rect)
+ {
+ // The easy case, no rectangle specified.
+ if (m_headerWin)
+ m_headerWin->Refresh(eraseBackground);
+
+ if (m_mainWin)
+ m_mainWin->Refresh(eraseBackground);
+ }
+ else
+ {
+ // Refresh the header window
+ if (m_headerWin)
+ {
+ wxRect rectHeader = m_headerWin->GetRect();
+ rectHeader.Intersect(*rect);
+ if (rectHeader.GetWidth() && rectHeader.GetHeight())
+ {
+ int x, y;
+ m_headerWin->GetPosition(&x, &y);
+ rectHeader.Offset(-x, -y);
+ m_headerWin->Refresh(eraseBackground, &rectHeader);
+ }
+
+ }
+
+ // Refresh the main window
+ if (m_mainWin)
+ {
+ wxRect rectMain = m_mainWin->GetRect();
+ rectMain.Intersect(*rect);
+ if (rectMain.GetWidth() && rectMain.GetHeight())
+ {
+ int x, y;
+ m_mainWin->GetPosition(&x, &y);
+ rectMain.Offset(-x, -y);
+ m_mainWin->Refresh(eraseBackground, &rectMain);
+ }
+ }
+ }
+}
+
void wxGenericListCtrl::Freeze()
{
m_mainWin->Freeze();