]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
64 bit clean printing
[wxWidgets.git] / src / generic / datavgen.cpp
index a6c94b1e5d98e17d16abc0e915f54b6e99746a70..57d8ae6d58da1356ca0aa58b3267c462631b86ea 100644 (file)
@@ -425,8 +425,11 @@ public:
     bool Cleared();
     void Resort()
     {
-        SortPrepare();
-        m_root->Resort();
+        if (m_root)
+        {
+            SortPrepare();
+            m_root->Resort();
+        }
         UpdateDisplay();
     }
 
@@ -607,6 +610,8 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype,
     m_dc = NULL;
     m_align = align;
     m_mode = mode;
+    m_wantsAttr = false;
+    m_hasAttr = false;
 }
 
 wxDataViewRenderer::~wxDataViewRenderer()
@@ -713,6 +718,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
 // ---------------------------------------------------------
@@ -2352,25 +2411,46 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
         {
             // get the cell value and set it into the renderer
             wxVariant value;
-            wxDataViewTreeNode * node = GetTreeNodeByRow(item);
-            if( node == NULL )
-                continue;
+            wxDataViewTreeNode *node = NULL;
+            wxDataViewItem dataitem;
+            
+            if (m_root)
+            {
+                node = GetTreeNodeByRow(item);
+                if( node == NULL )
+                    continue;
 
-            wxDataViewItem dataitem = node->GetItem();
+                dataitem = node->GetItem();
 
-            if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem))
-                continue;
+                if ((i > 0) && model->IsContainer(dataitem) && !model->HasContainerColumns(dataitem))
+                    continue;
+            }
+            else
+            {
+                dataitem = wxDataViewItem( (void*) item );
+            }
 
             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;
 
             //Draw the expander here.
-            int indent = node->GetIndentLevel();
-            if( col == expander )
+            int indent = 0;
+            if ((m_root) && (col == expander))
             {
+                indent = node->GetIndentLevel();
+                
                 //Calculate the indent first
                 indent = cell_rect.x + GetOwner()->GetIndent() * indent;
 
@@ -2395,9 +2475,11 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
                 }
                 else
                 {
-                     // I am wandering whether we should draw dot lines between tree nodes
-                     delete node;
-                     //Yes, if the node does not have any child, it must be a leaf which mean that it is a temporarily created by GetTreeNodeByRow
+                     // I am wondering whether we should draw dot lines between tree nodes
+                     if (node)
+                         delete node;
+                     // Yes, if the node does not have any child, it must be a leaf which 
+                     // mean that it is a temporarily created by GetTreeNodeByRow
                 }
 
                  //force the expander column to left-center align
@@ -2794,9 +2876,16 @@ private:
 
 wxDataViewItem wxDataViewMainWindow::GetItemByRow(unsigned int row) const
 {
-    RowToItemJob job( row, -2 );
-    Walker( m_root , job );
-    return job.GetResult();
+    if (!m_root)
+    {
+        return wxDataViewItem( (void*) row );
+    }
+    else
+    {
+        RowToItemJob job( row, -2 );
+        Walker( m_root , job );
+        return job.GetResult();
+    }
 }
 
 class RowToTreeNodeJob: public DoJob
@@ -2869,9 +2958,16 @@ private:
 
 wxDataViewTreeNode * wxDataViewMainWindow::GetTreeNodeByRow(unsigned int row)
 {
-    RowToTreeNodeJob job( row , -2, m_root );
-    Walker( m_root , job );
-    return job.GetResult();
+    if (!m_root)
+    {
+        return NULL;
+    }
+    else
+    {
+        RowToTreeNodeJob job( row , -2, m_root );
+        Walker( m_root , job );
+        return job.GetResult();
+    }
 }
 
 wxDataViewEvent wxDataViewMainWindow::SendExpanderEvent( wxEventType type, const wxDataViewItem & item )
@@ -3058,7 +3154,15 @@ wxRect wxDataViewMainWindow::GetItemRect( const wxDataViewItem & item, const wxD
 
 int wxDataViewMainWindow::RecalculateCount()
 {
-    return m_root->GetSubTreeCount();
+    if (!m_root)
+    {
+        wxDataViewIndexListModel *list_model = (wxDataViewIndexListModel*) GetOwner()->GetModel();
+        return list_model->GetLastIndex();
+    }
+    else
+    {
+        return m_root->GetSubTreeCount();
+    }
 }
 
 class ItemToRowJob : public DoJob
@@ -3112,26 +3216,33 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item)
     if( model == NULL )
         return -1;
 
-    if( !item.IsOk() )
-        return -1;
-
-    //Compose the a parent-chain of the finding item
-    ItemList list;
-    wxDataViewItem * pItem = NULL;
-    list.DeleteContents( true );
-    wxDataViewItem it( item );
-    while( it.IsOk() )
+    if (!m_root)
     {
-        pItem = new wxDataViewItem( it );
-        list.Insert( pItem );
-        it = model->GetParent( it );
+        return wxPtrToUInt( item.GetID() );
     }
-    pItem = new wxDataViewItem( );
-    list.Insert( pItem );
+    else
+    {
+        if( !item.IsOk() )
+            return -1;
+
+        //Compose the a parent-chain of the finding item
+        ItemList list;
+        wxDataViewItem * pItem = NULL;
+        list.DeleteContents( true );
+        wxDataViewItem it( item );
+        while( it.IsOk() )
+        {
+            pItem = new wxDataViewItem( it );
+            list.Insert( pItem );
+            it = model->GetParent( it );
+        }
+        pItem = new wxDataViewItem( );
+        list.Insert( pItem );
 
-    ItemToRowJob job( item, list.begin() );
-    Walker(m_root , job );
-    return job.GetResult();
+        ItemToRowJob job( item, list.begin() );
+        Walker(m_root , job );
+        return job.GetResult();
+    }
 }
 
 void BuildTreeHelper( wxDataViewModel * model,  wxDataViewItem & item, wxDataViewTreeNode * node)
@@ -3166,6 +3277,17 @@ void BuildTreeHelper( wxDataViewModel * model,  wxDataViewItem & item, wxDataVie
 
 void wxDataViewMainWindow::BuildTree(wxDataViewModel * model)
 {
+    DestroyTree();
+
+    if (GetOwner()->GetModel()->IsIndexListModel())
+    {
+        m_count = -1 ;
+        return;
+    }
+
+    m_root = new wxDataViewTreeNode( NULL );
+    m_root->SetHasChildren(true);
+
     //First we define a invalid item to fetch the top-level elements
     wxDataViewItem item;
     SortPrepare();
@@ -3190,9 +3312,12 @@ void DestroyTreeHelper( wxDataViewTreeNode * node )
 
 void wxDataViewMainWindow::DestroyTree()
 {
-    DestroyTreeHelper(m_root);
-    m_root->SetSubTreeCount(0);
-    m_count = 0 ;
+    if (m_root)
+    {
+        DestroyTreeHelper(m_root);
+        m_count = 0;
+        m_root = NULL;
+    }
 }
 
 void wxDataViewMainWindow::OnChar( wxKeyEvent &event )
@@ -3332,7 +3457,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 
     //Test whether the mouse is hovered on the tree item button
     bool hover = false;
-    if (GetOwner()->GetExpanderColumn() == col)
+    if ((m_root) && (GetOwner()->GetExpanderColumn() == col))
     {
         wxDataViewTreeNode * node = GetTreeNodeByRow(current);
         if( node!=NULL && node->HasChildren() )
@@ -3457,7 +3582,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 
         //Process the event of user clicking the expander
         bool expander = false;
-        if (GetOwner()->GetExpanderColumn() == col)
+        if ((m_root) && (GetOwner()->GetExpanderColumn() == col))
         {
             wxDataViewTreeNode * node = GetTreeNodeByRow(current);
             if( node!=NULL && node->HasChildren() )
@@ -3719,6 +3844,8 @@ bool wxDataViewCtrl::AssociateModel( wxDataViewModel *model )
 
     model->AddNotifier( m_notifier );
 
+    m_clientArea->DestroyTree();
+    
     m_clientArea->BuildTree(model);
 
     m_clientArea->UpdateDisplay();
@@ -3788,7 +3915,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);