]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
Rewrote large parts of the non-DDE IPC stuff (wxTCPServer, wxTCPClient,
[wxWidgets.git] / src / generic / listctrl.cpp
index 816c94f3da97b492c3a8f275a901bd6f2457bb0b..e19e1ac69ca6143a8ab5ce2af3c15f5aed6cd648 100644 (file)
@@ -295,7 +295,7 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             {
                 wxListItemData *item = (wxListItemData*)node->Data();
                 wxString s = item->GetText();
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 if (lw > m_spacing) m_bound_all.width = lw;
             }
@@ -308,14 +308,14 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
             {
                 wxListItemData *item = (wxListItemData*)node->Data();
                 wxString s = item->GetText();
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 m_bound_all.width = lw;
                 m_bound_all.height = lh;
                 if (item->HasImage())
                 {
-                    int w = 0;
-                    int h = 0;
+                    wxCoord w = 0;
+                    wxCoord h = 0;
                     m_owner->GetImageSize( item->GetImage(), w, h );
                     m_bound_all.width += 4 + w;
                     if (h > m_bound_all.height) m_bound_all.height = h;
@@ -334,7 +334,7 @@ void wxListLineData::CalculateSize( wxDC *dc, int spacing )
                 wxString s;
                 item->GetText( s );
                 if (s.IsNull()) s = "H";
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 item->SetSize( item->GetWidth(), lh );
                 m_bound_all.width += lw;
@@ -384,7 +384,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
                 {
                     wxString s;
                     item->GetText( s );
-                    long lw,lh;
+                    wxCoord lw,lh;
                     dc->GetTextExtent( s, &lw, &lh );
                     if (m_bound_all.width > m_spacing)
                         m_bound_label.x = m_bound_all.x;
@@ -432,7 +432,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
         }
         case wxLC_REPORT:
         {
-            long lw,lh;
+            wxCoord lw,lh;
             dc->GetTextExtent( "H", &lw, &lh );
             m_bound_all.x = 0;
             m_bound_all.y -= 0;
@@ -448,7 +448,7 @@ void wxListLineData::SetPosition( wxDC *dc, int x, int y, int window_width )
                 wxString s;
                 item->GetText( s );
                 if (s.IsEmpty()) s = wxT("H");
-                long lw,lh;
+                wxCoord lw,lh;
                 dc->GetTextExtent( s, &lw, &lh );
                 m_bound_label.width = lw;
                 m_bound_label.height = lh;
@@ -586,9 +586,13 @@ int wxListLineData::GetImage( int index )
 void wxListLineData::SetAttributes(wxDC *dc,
                                    const wxListItemAttr *attr,
                                    const wxColour& colText,
-                                   const wxFont& font)
+                                   const wxFont& font,
+                                   bool hilight)
 {
-    if ( attr && attr->HasTextColour() )
+    // don't use foregroud colour for drawing highlighted items - this might
+    // make them completely invisible (and there is no way to do bit
+    // arithmetics on wxColour, unfortunately)
+    if ( !hilight && attr && attr->HasTextColour() )
     {
         dc->SetTextForeground(attr->GetTextColour());
     }
@@ -640,7 +644,7 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
     //     customize the subitems (in report mode) too.
     wxListItemData *item = (wxListItemData*)m_items.First()->Data();
     wxListItemAttr *attr = item->GetAttributes();
-    SetAttributes(dc, attr, colText, font);
+    SetAttributes(dc, attr, colText, font, hilight);
 
     bool hasBgCol = attr && attr->HasBackgroundColour();
     if ( paintBG || hasBgCol )
@@ -706,11 +710,11 @@ void wxListLineData::DoDraw( wxDC *dc, bool hilight, bool paintBG )
 void wxListLineData::Hilight( bool on )
 {
     if (on == m_hilighted) return;
+    m_hilighted = on;
     if (on)
         m_owner->SelectLine( this );
     else
         m_owner->DeselectLine( this );
-    m_hilighted = on;
 }
 
 void wxListLineData::ReverseHilight( void )
@@ -867,9 +871,10 @@ void wxListHeaderWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
         int cw = item.m_width-2;
 #if wxUSE_GENERIC_LIST_EXTENSIONS
         if ((i+1 == numColumns) || ( dc.LogicalToDeviceX(x+item.m_width) > w-5))
-                cw = dc.DeviceToLogicalX(w)-x-1;
+            cw = dc.DeviceToLogicalX(w)-x-1;
 #else
-        if ((i+1 == numColumns) || (x+item.m_width > w-5)) cw = w-x-1;
+        if ((i+1 == numColumns) || (x+item.m_width > w-5))
+            cw = w-x-1;
 #endif
         dc.SetPen( *wxWHITE_PEN );
 
@@ -1163,6 +1168,8 @@ wxListMainWindow::~wxListMainWindow()
 
 void wxListMainWindow::RefreshLine( wxListLineData *line )
 {
+    if (m_dirty) return;
+
     int x = 0;
     int y = 0;
     int w = 0;
@@ -1253,8 +1260,8 @@ void wxListMainWindow::SendNotify( wxListLineData *line, wxEventType command )
     le.SetEventObject( GetParent() );
     le.m_itemIndex = GetIndexOfLine( line );
     line->GetItem( 0, le.m_item );
-//    GetParent()->GetEventHandler()->ProcessEvent( le );
-    GetParent()->GetEventHandler()->AddPendingEvent( le );
+    GetParent()->GetEventHandler()->ProcessEvent( le );
+//    GetParent()->GetEventHandler()->AddPendingEvent( le );
 }
 
 void wxListMainWindow::FocusLine( wxListLineData *WXUNUSED(line) )
@@ -1823,8 +1830,8 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height )
 int wxListMainWindow::GetTextLength( wxString &s )
 {
     wxClientDC dc( this );
-    long lw = 0;
-    long lh = 0;
+    wxCoord lw = 0;
+    wxCoord lh = 0;
     dc.GetTextExtent( s, &lw, &lh );
     return lw + 6;
 }
@@ -1904,7 +1911,7 @@ void wxListMainWindow::SetColumnWidth( int col, int width )
             {
                 wxListItemData *item = (wxListItemData*)n->Data();
                 int current = 0, ix = 0, iy = 0;
-                long lx = 0, ly = 0;
+                wxCoord lx = 0, ly = 0;
                 if (item->HasImage())
                 {
                     GetImageSize( item->GetImage(), ix, iy );
@@ -2669,12 +2676,15 @@ wxListCtrl::~wxListCtrl()
 {
 }
 
-bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
-      const wxPoint &pos, const wxSize &size,
+bool wxListCtrl::Create(wxWindow *parent,
+                        wxWindowID id,
+                        const wxPoint &pos,
+                        const wxSize &size,
+                        long style,
 #if wxUSE_VALIDATORS
-      long style, const wxValidator &validator,
+                        const wxValidator &validator,
 #endif
-      const wxString &name )
+                        const wxString &name)
 {
     m_imageListNormal = (wxImageList *) NULL;
     m_imageListSmall = (wxImageList *) NULL;
@@ -2682,32 +2692,29 @@ bool wxListCtrl::Create( wxWindow *parent, wxWindowID id,
     m_mainWin = (wxListMainWindow*) NULL;
     m_headerWin = (wxListHeaderWindow*) NULL;
 
-    long s = style;
-
-#ifdef __VMS__
-#pragma message disable codcauunr
-   // VMS reports on this part the warning:
-   // statement either is unreachable or causes unreachable code
-#endif
-   if ((s & wxLC_REPORT == 0) &&
-        (s & wxLC_LIST == 0) &&
-        (s & wxLC_ICON == 0))
+    if ( !(style & (wxLC_REPORT | wxLC_LIST | wxLC_ICON)) )
     {
-        s = s | wxLC_LIST;
+        style = style | wxLC_LIST;
     }
-#ifdef __VMS__
-#pragma message enable codcauunr
-#endif
 
-    bool ret = wxControl::Create( parent, id, pos, size, s, name );
+    bool ret = wxControl::Create( parent,
+                                  id,
+                                  pos,
+                                  size,
+                                  style,
+#if wxUSE_VALIDATORS
+                                  validator,
+#endif
+                                  name );
 
 #if wxUSE_VALIDATORS
     SetValidator( validator );
 #endif
 
-    if (s & wxSUNKEN_BORDER) s -= wxSUNKEN_BORDER;
+    if (style & wxSUNKEN_BORDER)
+        style -= wxSUNKEN_BORDER;
 
-    m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, s );
+    m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, style );
 
     if (HasFlag(wxLC_REPORT))
         m_headerWin = new wxListHeaderWindow( this, -1, m_mainWin, wxPoint(0,0), wxSize(size.x,23), wxTAB_TRAVERSAL );
@@ -3093,7 +3100,10 @@ long wxListCtrl::InsertItem( long index, const wxString &label, int imageIndex )
 
 long wxListCtrl::InsertColumn( long col, wxListItem &item )
 {
+    wxASSERT( m_headerWin );
     m_mainWin->InsertColumn( col, item );
+    m_headerWin->Refresh();
+
     return 0;
 }