]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/listctrl.cpp
showing a bevel button for a multiline label (is not multline on the OS level, but...
[wxWidgets.git] / src / generic / listctrl.cpp
index e2859684843794bbc90d8fa53123c88d73e5ccbc..5fd80d4198f478d403a6e68e8e7231f62c2e604f 100644 (file)
@@ -72,6 +72,9 @@
 
 #include "wx/renderer.h"
 
+#ifdef __WXMAC__
+    #include "wx/mac/private.h"
+#endif
 // ----------------------------------------------------------------------------
 // events
 // ----------------------------------------------------------------------------
@@ -112,7 +115,7 @@ static const int SCROLL_UNIT_X = 15;
 static const int LINE_SPACING = 0;
 
 // extra margins around the text label
-static const int EXTRA_WIDTH = 3;
+static const int EXTRA_WIDTH = 4;
 static const int EXTRA_HEIGHT = 4;
 
 // margin between the window and the items
@@ -519,7 +522,7 @@ public:
 
     // do we have a header window?
     bool HasHeader() const
-        { return HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER); }
+        { return InReportView() && !HasFlag(wxLC_NO_HEADER); }
 
     void HighlightAll( bool on );
 
@@ -1599,7 +1602,7 @@ void wxListLineData::DrawTextFormatted(wxDC *dc,
 
 bool wxListLineData::Highlight( bool on )
 {
-    wxCHECK_MSG( !m_owner->IsVirtual(), FALSE, _T("unexpected call to Highlight") );
+    wxCHECK_MSG( !IsVirtual(), FALSE, _T("unexpected call to Highlight") );
 
     if ( on == m_highlighted )
         return FALSE;
@@ -2291,7 +2294,7 @@ wxCoord wxListMainWindow::GetLineHeight() const
 
 wxCoord wxListMainWindow::GetLineY(size_t line) const
 {
-    wxASSERT_MSG( HasFlag(wxLC_REPORT), _T("only works in report mode") );
+    wxASSERT_MSG( InReportView(), _T("only works in report mode") );
 
     return LINE_SPACING + line*GetLineHeight();
 }
@@ -2450,7 +2453,7 @@ bool wxListMainWindow::HighlightLine( size_t line, bool highlight )
 
 void wxListMainWindow::RefreshLine( size_t line )
 {
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         size_t visibleFrom, visibleTo;
         GetVisibleLinesRange(&visibleFrom, &visibleTo);
@@ -2472,7 +2475,7 @@ void wxListMainWindow::RefreshLines( size_t lineFrom, size_t lineTo )
 
     wxASSERT_MSG( lineTo < GetItemCount(), _T("invalid line range") );
 
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         size_t visibleFrom, visibleTo;
         GetVisibleLinesRange(&visibleFrom, &visibleTo);
@@ -2503,7 +2506,7 @@ void wxListMainWindow::RefreshLines( size_t lineFrom, size_t lineTo )
 
 void wxListMainWindow::RefreshAfter( size_t lineFrom )
 {
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         size_t visibleFrom, visibleTo;
         GetVisibleLinesRange(&visibleFrom, &visibleTo);
@@ -2605,7 +2608,7 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
 
     dc.SetFont( GetFont() );
 
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         int lineHeight = GetLineHeight();
 
@@ -2698,22 +2701,18 @@ void wxListMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
         }
     }
 
+#ifndef __WXMAC__
+    // Don't draw rect outline under Mac at all.
     if ( HasCurrent() )
     {
-        // don't draw rect outline under Max if we already have the background
-        // color but under other platforms only draw it if we do: it is a bit
-        // silly to draw "focus rect" if we don't have focus!
-#ifdef __WXMAC__
-        if ( !m_hasFocus )
-#else // !__WXMAC__
         if ( m_hasFocus )
-#endif // __WXMAC__/!__WXMAC__
         {
             dc.SetPen( *wxBLACK_PEN );
             dc.SetBrush( *wxTRANSPARENT_BRUSH );
             dc.DrawRectangle( GetLineHighlightRect(m_current) );
         }
     }
+#endif
 
     dc.EndDrawing();
 }
@@ -2868,7 +2867,7 @@ void wxListMainWindow::OnMouse( wxMouseEvent &event )
     size_t count = GetItemCount(),
            current;
 
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         current = y / GetLineHeight();
         if ( current < count )
@@ -3032,7 +3031,7 @@ void wxListMainWindow::MoveToItem(size_t item)
     int view_x = SCROLL_UNIT_X*GetScrollPos( wxHORIZONTAL );
     int view_y = hLine*GetScrollPos( wxVERTICAL );
 
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         // the next we need the range of lines shown it might be different, so
         // recalculate it
@@ -3069,6 +3068,9 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event)
     {
         ChangeCurrent(newCurrent);
 
+        // refresh the old focus to remove it
+        RefreshLine( oldCurrent );
+
         // select all the items between the old and the new one
         if ( oldCurrent > newCurrent )
         {
@@ -3085,7 +3087,7 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event)
             HighlightAll(FALSE);
 
         ChangeCurrent(newCurrent);
-
+        
         // refresh the old focus to remove it
         RefreshLine( oldCurrent );
 
@@ -3094,7 +3096,7 @@ void wxListMainWindow::OnArrowChar(size_t newCurrent, const wxKeyEvent& event)
             HighlightLine( m_current, TRUE );
         }
     }
-
+       
     RefreshLine( m_current );
 
     MoveToFocus();
@@ -3188,7 +3190,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 
         case WXK_PRIOR:
             {
-                int steps = HasFlag(wxLC_REPORT) ? m_linesPerPage - 1 : m_current % m_linesPerPage;
+                int steps = InReportView() ? m_linesPerPage - 1 : m_current % m_linesPerPage;
 
                 int index = m_current - steps;
                 if (index < 0)
@@ -3200,7 +3202,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
 
         case WXK_NEXT:
             {
-                int steps = HasFlag(wxLC_REPORT)
+                int steps = InReportView()
                                ? m_linesPerPage - 1
                                : m_linesPerPage - (m_current % m_linesPerPage) - 1;
 
@@ -3214,7 +3216,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
             break;
 
         case WXK_LEFT:
-            if ( !HasFlag(wxLC_REPORT) )
+            if ( !InReportView() )
             {
                 int index = m_current - m_linesPerPage;
                 if (index < 0)
@@ -3225,7 +3227,7 @@ void wxListMainWindow::OnChar( wxKeyEvent &event )
             break;
 
         case WXK_RIGHT:
-            if ( !HasFlag(wxLC_REPORT) )
+            if ( !InReportView() )
             {
                 size_t index = m_current + m_linesPerPage;
 
@@ -3336,7 +3338,7 @@ void wxListMainWindow::DrawImage( int index, wxDC *dc, int x, int y )
     {
         m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT );
     }
-    else if ( HasFlag(wxLC_REPORT) && (m_small_image_list))
+    else if ( InReportView() && (m_small_image_list))
     {
         m_small_image_list->Draw( index, *dc, x, y, wxIMAGELIST_DRAW_TRANSPARENT );
     }
@@ -3356,7 +3358,7 @@ void wxListMainWindow::GetImageSize( int index, int &width, int &height ) const
     {
         m_small_image_list->GetSize( index, width, height );
     }
-    else if ( HasFlag(wxLC_REPORT) && m_small_image_list )
+    else if ( InReportView() && m_small_image_list )
     {
         m_small_image_list->GetSize( index, width, height );
     }
@@ -3453,7 +3455,7 @@ void wxListMainWindow::SetColumnWidth( int col, int width )
     wxCHECK_RET( col >= 0 && col < GetColumnCount(),
                  _T("invalid column index") );
 
-    wxCHECK_RET( HasFlag(wxLC_REPORT),
+    wxCHECK_RET( InReportView(),
                  _T("SetColumnWidth() can only be called in report mode.") );
 
     m_dirty = TRUE;
@@ -3857,7 +3859,7 @@ void wxListMainWindow::RecalculatePositions(bool noRefresh)
 
     const int lineHeight = GetLineHeight();
 
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         // all lines have the same height and we scroll one line per step
         int entireHeight = count*lineHeight + LINE_SPACING;
@@ -4268,7 +4270,7 @@ long wxListMainWindow::HitTest( int x, int y, int &flags )
 
     size_t count = GetItemCount();
 
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         size_t current = y / GetLineHeight();
         if ( current < count )
@@ -4313,7 +4315,7 @@ void wxListMainWindow::InsertItem( wxListItem &item )
     // this is unused variable
     int mode = 0;
     #endif
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         #if 0
         // this is unused variable
@@ -4371,7 +4373,7 @@ void wxListMainWindow::InsertItem( wxListItem &item )
 void wxListMainWindow::InsertColumn( long col, wxListItem &item )
 {
     m_dirty = TRUE;
-    if ( HasFlag(wxLC_REPORT) )
+    if ( InReportView() )
     {
         if (item.m_width == wxLIST_AUTOSIZE_USEHEADER)
             item.m_width = GetTextLength( item.m_text );
@@ -4474,7 +4476,7 @@ int wxListMainWindow::GetCountPerPage() const
 
 void wxListMainWindow::GetVisibleLinesRange(size_t *from, size_t *to)
 {
-    wxASSERT_MSG( HasFlag(wxLC_REPORT), _T("this is for report mode only") );
+    wxASSERT_MSG( InReportView(), _T("this is for report mode only") );
 
     if ( m_lineFrom == (size_t)-1 )
     {
@@ -4561,7 +4563,7 @@ void wxGenericListCtrl::CalculateAndSetHeaderHeight()
 
             m_headerWin->SetSize(m_headerWin->GetSize().x, m_headerHeight);
 
-            if ( HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER) )
+            if ( HasHeader() )
                 ResizeReportView(TRUE);
         }
     }
@@ -4612,7 +4614,12 @@ bool wxGenericListCtrl::Create(wxWindow *parent,
 
     m_mainWin = new wxListMainWindow( this, -1, wxPoint(0,0), size, style );
 
-    if ( HasFlag(wxLC_REPORT) )
+#if defined( __WXMAC__ ) && __WXMAC_CARBON__
+    wxFont font ;
+    font.MacCreateThemeFont( kThemeViewsFont ) ;
+    SetFont( font ) ;
+#endif
+    if ( InReportView() )
     {
         CreateHeaderWindow();
 
@@ -4662,8 +4669,8 @@ void wxGenericListCtrl::SetWindowStyleFlag( long flag )
         m_mainWin->DeleteEverything();
 
         // has the header visibility changed?
-        bool hasHeader = HasFlag(wxLC_REPORT) && !HasFlag(wxLC_NO_HEADER),
-             willHaveHeader = (flag & wxLC_REPORT) && !(flag & wxLC_NO_HEADER);
+        bool hasHeader = HasHeader();
+        bool willHaveHeader = (flag & wxLC_REPORT) && !(flag & wxLC_NO_HEADER);
 
         if ( hasHeader != willHaveHeader )
         {