]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
Added missing include
[wxWidgets.git] / src / generic / datavgen.cpp
index fa031653a48139ac8b914b8da11fd9a0dc18aac3..adcf1b358224923c1d259ecbcd082107627c95fc 100644 (file)
@@ -134,8 +134,6 @@ public:
 
     ~wxDataViewHeaderWindowMSW();
 
-    void OnPaint(wxPaintEvent &event);
-
     // called when any column setting is changed and/or changed
     // the column count
     virtual void UpdateDisplay();
@@ -156,9 +154,9 @@ protected:
         { return GetColumn(GetColumnIdxFromHeader(nmHDR)); }
         
     int m_scrollOffsetX;
+    int m_buttonHeight;
 
 private:
-    DECLARE_EVENT_TABLE()
     DECLARE_DYNAMIC_CLASS(wxDataViewHeaderWindowMSW)
 };
 
@@ -407,7 +405,7 @@ int LINKAGEMODE wxGenericTreeModelItemCmp( void ** id1, void ** id2)
 WX_DEFINE_SORTED_USER_EXPORTED_ARRAY_SIZE_T(unsigned int, wxDataViewSelection,
                                             WXDLLIMPEXP_ADV);
 WX_DECLARE_LIST(wxDataViewItem, ItemList);
-WX_DEFINE_LIST(ItemList);
+WX_DEFINE_LIST(ItemList)
 
 class wxDataViewMainWindow: public wxWindow
 {
@@ -609,6 +607,8 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype,
     m_dc = NULL;
     m_align = align;
     m_mode = mode;
+    m_wantsAttr = false;
+    m_hasAttr = false;
 }
 
 wxDataViewRenderer::~wxDataViewRenderer()
@@ -715,6 +715,60 @@ wxSize wxDataViewTextRenderer::GetSize() const
     return wxSize(80,20);
 }
 
+// ---------------------------------------------------------
+// wxDataViewTextRendererAttr
+// ---------------------------------------------------------
+
+IMPLEMENT_CLASS(wxDataViewTextRendererAttr, wxDataViewTextRenderer)
+
+wxDataViewTextRendererAttr::wxDataViewTextRendererAttr( const wxString &varianttype,
+                            wxDataViewCellMode mode, int align ) :
+    wxDataViewTextRenderer( varianttype, mode, align )
+{
+    m_wantsAttr = true;
+}
+
+bool wxDataViewTextRendererAttr::Render( wxRect cell, wxDC *dc, int WXUNUSED(state) )
+{
+    wxFont font;
+    wxColour colour;
+
+    if (m_hasAttr)
+    {
+        if (m_attr.HasColour())
+        {
+            colour = dc->GetTextForeground();
+            dc->SetTextForeground( m_attr.GetColour() );
+        }
+        
+        if (m_attr.GetBold() || m_attr.GetItalic())
+        {
+             font = dc->GetFont();
+             wxFont myfont = font;
+             if (m_attr.GetBold())
+                 myfont.SetWeight( wxFONTWEIGHT_BOLD );
+             if (m_attr.GetItalic())
+                 myfont.SetStyle( wxFONTSTYLE_ITALIC );
+             dc->SetFont( myfont );
+        }
+    }
+    
+    dc->DrawText( m_text, cell.x, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
+    
+    // restore dc
+    if (m_hasAttr)
+    {
+        if (m_attr.HasColour())
+            dc->SetTextForeground( colour );
+            
+        if (m_attr.GetBold() || m_attr.GetItalic())
+            dc->SetFont( font );
+    }
+    
+    return true;
+}
+        
+
 // ---------------------------------------------------------
 // wxDataViewBitmapRenderer
 // ---------------------------------------------------------
@@ -1195,34 +1249,38 @@ void wxDataViewHeaderWindowBase::SendEvent(wxEventType type, unsigned int n)
 
 #if defined(__WXMSW__) && USE_NATIVE_HEADER_WINDOW
 
+#ifndef HDS_DRAGDROP
+    #define HDS_DRAGDROP 0x0040
+#endif
+#ifndef HDS_FULLDRAG
+    #define HDS_FULLDRAG 0x0080
+#endif
+
 // implemented in msw/listctrl.cpp:
 int WXDLLIMPEXP_CORE wxMSWGetColumnClicked(NMHDR *nmhdr, POINT *ptClick);
 
 IMPLEMENT_ABSTRACT_CLASS(wxDataViewHeaderWindowMSW, wxWindow)
 
-BEGIN_EVENT_TABLE(wxDataViewHeaderWindowMSW, wxDataViewHeaderWindowBase)
-    // EVT_PAINT         (wxDataViewHeaderWindowMSW::OnPaint)
-END_EVENT_TABLE()
-
 bool wxDataViewHeaderWindowMSW::Create( wxDataViewCtrl *parent, wxWindowID id,
                                         const wxPoint &pos, const wxSize &size,
                                         const wxString &name )
 {
     m_owner = parent;
 
-    m_scrollOffsetX = 0;;
+    m_scrollOffsetX = 0;
+    m_buttonHeight = wxRendererNative::Get().GetHeaderButtonHeight( this ) + 10;
 
     int x = pos.x == wxDefaultCoord ? 0 : pos.x,
         y = pos.y == wxDefaultCoord ? 0 : pos.y,
         w = size.x == wxDefaultCoord ? 1 : size.x,
-        h = size.y == wxDefaultCoord ? 22 : size.y;
+        h = size.y == wxDefaultCoord ? m_buttonHeight : size.y;
 
     if ( !CreateControl(parent, id, pos, size, 0, wxDefaultValidator, name) )
         return false;
 
     // create the native WC_HEADER window:
     WXHWND hwndParent = (HWND)parent->GetHandle();
-    WXDWORD msStyle = WS_CHILD | HDS_BUTTONS | HDS_HORZ | HDS_HOTTRACK | HDS_FULLDRAG;
+    WXDWORD msStyle = WS_CHILD | HDS_DRAGDROP | HDS_BUTTONS | HDS_HORZ | HDS_HOTTRACK | HDS_FULLDRAG;
     
     if ( m_isShown )
         msStyle |= WS_VISIBLE;
@@ -1260,57 +1318,7 @@ wxDataViewHeaderWindowMSW::~wxDataViewHeaderWindow()
 
 wxSize wxDataViewHeaderWindowMSW::DoGetBestSize() const
 {
-    return wxSize(80, 22);
-}
-
-void wxDataViewHeaderWindowMSW::OnPaint(wxPaintEvent &event)
-{
-    wxClientDC dc(this);
-
-    int sortArrow = wxHDR_SORT_ICON_UP;
-
-    wxRect rect(0,0,80,22);
-
-    // Draw an up or down arrow
-    int arrowSpace = 0;
-    if (sortArrow != wxHDR_SORT_ICON_NONE )
-    {
-        wxRect ar = rect;
-
-        // make a rect for the arrow
-        ar.height = 4;
-        ar.width = 8;
-        ar.y += (rect.height - ar.height)/2;
-        ar.x = ar.x + rect.width - 3*ar.width/2;
-        arrowSpace = 3*ar.width/2; // space to preserve when drawing the label
-
-        wxPoint triPt[3];
-        if ( sortArrow & wxHDR_SORT_ICON_UP )
-        {
-            triPt[0].x = ar.width / 2;
-            triPt[0].y = 0;
-            triPt[1].x = ar.width;
-            triPt[1].y = ar.height;
-            triPt[2].x = 0;
-            triPt[2].y = ar.height;
-        }
-        else
-        {
-            triPt[0].x = 0;
-            triPt[0].y = 0;
-            triPt[1].x = ar.width;
-            triPt[1].y = 0;
-            triPt[2].x = ar.width / 2;
-            triPt[2].y = ar.height;
-        }
-
-        wxColour c = wxSystemSettings::GetColour(wxSYS_COLOUR_3DSHADOW);
-        dc.SetPen(wxPen(c));
-        dc.SetBrush(wxBrush(c));
-        dc.DrawPolygon( 3, triPt, ar.x, ar.y);
-    }
-
-    event.Skip();
+    return wxSize(80, m_buttonHeight );
 }
 
 void wxDataViewHeaderWindowMSW::UpdateDisplay()
@@ -1340,10 +1348,8 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay()
         {
             //The Microsoft Comctrl32.dll 6.0 support SORTUP/SORTDOWN, but they are not default
             //see http://msdn2.microsoft.com/en-us/library/ms649534.aspx for more detail
-            
-            // if (col->IsSortOrderAscending())
-            //  hdi.fmt |= col->IsSortOrderAscending() ? HDF_SORTUP : HDF_SORTDOWN;
-            // ;
+            // VZ: works with 5.81
+            hdi.fmt |= col->IsSortOrderAscending() ? HDF_SORTUP : HDF_SORTDOWN;
         }
 
         // lParam is reserved for application's use:
@@ -1373,7 +1379,7 @@ void wxDataViewHeaderWindowMSW::UpdateDisplay()
 
         default:
             // such alignment is not allowed for the column header!
-            wxFAIL;
+            break; // wxFAIL;
         }
 
         SendMessage((HWND)m_hWnd, HDM_INSERTITEM,
@@ -1548,7 +1554,8 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA
     return true;
 }
 
-void wxDataViewHeaderWindowMSW::ScrollWindow(int dx, int dy, const wxRect *rect )
+void wxDataViewHeaderWindowMSW::ScrollWindow(int dx, int WXUNUSED(dy),
+                                             const wxRect * WXUNUSED(rect))
 {
     m_scrollOffsetX += dx;
     
@@ -1559,7 +1566,8 @@ void wxDataViewHeaderWindowMSW::DoSetSize(int x, int y,
                                           int w, int h,
                                           int f)
 {
-    wxControl::DoSetSize( x+m_scrollOffsetX, y, w-m_scrollOffsetX, h, f );
+    // TODO: why is there a border + 2px around it?
+    wxControl::DoSetSize( x+m_scrollOffsetX+1, y+1, w-m_scrollOffsetX-2, h-2, f );
 }
 
 #else       // !defined(__WXMSW__)
@@ -1890,7 +1898,7 @@ END_EVENT_TABLE()
 
 wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID id,
     const wxPoint &pos, const wxSize &size, const wxString &name ) :
-    wxWindow( parent, id, pos, size, wxWANTS_CHARS, name ),
+    wxWindow( parent, id, pos, size, wxWANTS_CHARS|wxBORDER_NONE, name ),
     m_selection( wxDataViewSelectionCmp )
 
 {
@@ -2411,6 +2419,15 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
 
             model->GetValue( value, dataitem, col->GetModelColumn());
             cell->SetValue( value );
+            
+            if (cell->GetWantsAttr())
+            {
+                wxDataViewItemAttr attr;
+                bool ret = model->GetAttr( dataitem, col->GetModelColumn(), attr );
+                if (ret)
+                    cell->SetAttr( attr );
+                cell->SetHasAttr( ret );
+            }
 
             // update the y offset
             cell_rect.y = item * m_lineHeight;
@@ -3672,7 +3689,7 @@ wxDataViewItem wxDataViewMainWindow::GetSelection() const
 //-----------------------------------------------------------------------------
 // wxDataViewCtrl
 //-----------------------------------------------------------------------------
-WX_DEFINE_LIST(wxDataViewColumnList);
+WX_DEFINE_LIST(wxDataViewColumnList)
 
 IMPLEMENT_DYNAMIC_CLASS(wxDataViewCtrl, wxDataViewCtrlBase)
 
@@ -3696,7 +3713,7 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
            long style, const wxValidator& validator )
 {
     if (!wxControl::Create( parent, id, pos, size,
-                            style | wxScrolledWindowStyle|wxSUNKEN_BORDER, validator))
+                            style | wxScrolledWindowStyle|wxBORDER_SUNKEN, validator))
         return false;
 
     SetInitialSize(size);
@@ -3836,7 +3853,7 @@ wxDataViewColumn* wxDataViewCtrl::GetColumn( unsigned int pos ) const
 bool wxDataViewCtrl::DeleteColumn( wxDataViewColumn *column )
 {
     wxDataViewColumnList::compatibility_iterator  ret = m_cols.Find( column );
-    if (ret == NULL)
+    if (!ret)
         return false;
 
     m_cols.Erase(ret);