]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/datavgen.cpp
revisions contributed by Utensil Candel
[wxWidgets.git] / src / generic / datavgen.cpp
index 0d0b1ad1202f618a9b871ff56f57141700bc631a..e64b805d364ef74f7e9bd8ef379f11fbfdbe95d2 100644 (file)
@@ -1464,7 +1464,7 @@ bool wxDataViewHeaderWindowMSW::MSWOnNotify(int idCtrl, WXLPARAM lParam, WXLPARA
 
         case HDN_BEGINDRAG:
             // user has started to reorder a column
-            if (!GetColumn(nmHDR->iItem)->IsReorderable())
+            if ((nmHDR->iItem != -1) && (!GetColumn(nmHDR->iItem)->IsReorderable()))
             {
                 // veto it!
                 *result = TRUE;
@@ -1921,7 +1921,7 @@ void wxDataViewRenameTimer::Notify()
 //-----------------------------------------------------------------------------
 
 //The tree building helper, declared firstly
-void BuildTreeHelper( wxDataViewModel * model,  wxDataViewItem & item, wxDataViewTreeNode * node);
+static void BuildTreeHelper( wxDataViewModel * model,  wxDataViewItem & item, wxDataViewTreeNode * node);
 
 int LINKAGEMODE wxDataViewSelectionCmp( unsigned int row1, unsigned int row2 )
 {
@@ -1970,10 +1970,10 @@ wxDataViewMainWindow::wxDataViewMainWindow( wxDataViewCtrl *parent, wxWindowID i
 
     SetBackgroundStyle(wxBG_STYLE_CUSTOM);
 
-    m_penRule = wxPen(GetRuleColour(), 1, wxSOLID);
+    m_penRule = wxPen(GetRuleColour());
 
     //Here I compose a pen can draw black lines, maybe there are something system colour to use
-    m_penExpander = wxPen( wxColour(0,0,0), 1, wxSOLID );
+    m_penExpander = wxPen(wxColour(0,0,0));
     //Some new added code to deal with the tree structure
     m_root = new wxDataViewTreeNode( NULL );
     m_root->SetHasChildren(true);
@@ -2196,19 +2196,15 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
                     else
                         wxRendererNative::Get().DrawTreeItemButton( this, dc, rect, flag);
                 }
-                else
-                {
-                     // 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
                  cell->SetAlignment( wxALIGN_CENTER_VERTICAL );
             }
-
+            if (node && !node->HasChildren())
+            {
+                // Yes, if the node does not have any child, it must be a leaf which
+                // mean that it is a temporarily created by GetTreeNodeByRow
+                wxDELETE(node)
+            }
 
             // cannot be bigger than allocated space
             wxSize size = cell->GetSize();
@@ -2399,7 +2395,7 @@ bool wxDataViewMainWindow::ItemAdded(const wxDataViewItem & parent, const wxData
     return true;
 }
 
-void DestroyTreeHelper( wxDataViewTreeNode * node);
+static void DestroyTreeHelper( wxDataViewTreeNode * node);
 
 bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
                                        const wxDataViewItem& item)
@@ -2457,16 +2453,11 @@ bool wxDataViewMainWindow::ItemDeleted(const wxDataViewItem& parent,
 
         node->GetNodes().Remove( n );
         sub -= n->GetSubTreeCount();
-        DestroyTreeHelper(n);
+        ::DestroyTreeHelper(n);
     }
     //Make the row number invalid and get a new valid one when user call GetRowCount
     m_count = -1;
     node->ChangeSubTreeCount(sub);
-    if( node->GetChildrenNumber() == 0)
-    {
-        node->GetParent()->GetNodes().Remove( node );
-        delete node;
-    }
 
     //Change the current row to the last row if the current exceed the max row number
     if( m_currentRow > GetRowCount() )
@@ -3073,7 +3064,7 @@ void wxDataViewMainWindow::OnExpanding( unsigned int row )
                if( node->GetChildrenNumber() == 0 )
                {
                    SortPrepare();
-                   BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node);
+                   ::BuildTreeHelper(GetOwner()->GetModel(), node->GetItem(), node);
                }
                m_count = -1;
                UpdateDisplay();
@@ -3157,26 +3148,32 @@ wxDataViewTreeNode * wxDataViewMainWindow::FindNode( const wxDataViewItem & item
             if( node->GetChildrenNumber() == 0 )
             {
                 SortPrepare();
-                BuildTreeHelper(model, node->GetItem(), node);
+                ::BuildTreeHelper(model, node->GetItem(), node);
             }
 
             wxDataViewTreeNodes nodes = node->GetNodes();
-            unsigned int i = 0;
-            for (; i < nodes.GetCount(); i ++)
+            unsigned int i;
+            bool found = false;
+            
+            for (i = 0; i < nodes.GetCount(); i ++)
             {
                 if (nodes[i]->GetItem() == (**iter))
                 {
+                    if (nodes[i]->GetItem() == item)
+                       return nodes[i];
+                       
                     node = nodes[i];
+                    found = true;
                     break;
                 }
             }
-            if (i == nodes.GetCount())
+            if (!found)
                 return NULL;
         }
         else
             return NULL;
     }
-    return node;
+    return NULL;
 }
 
 void wxDataViewMainWindow::HitTest( const wxPoint & point, wxDataViewItem & item, wxDataViewColumn* &column )
@@ -3320,7 +3317,7 @@ int wxDataViewMainWindow::GetRowByItem(const wxDataViewItem & item)
     }
 }
 
-void BuildTreeHelper( wxDataViewModel * model,  wxDataViewItem & item, wxDataViewTreeNode * node)
+static void BuildTreeHelper( wxDataViewModel * model,  wxDataViewItem & item, wxDataViewTreeNode * node)
 {
     if( !model->IsContainer( item ) )
         return ;
@@ -3370,13 +3367,13 @@ void wxDataViewMainWindow::BuildTree(wxDataViewModel * model)
     m_count = -1 ;
 }
 
-void DestroyTreeHelper( wxDataViewTreeNode * node )
+static void DestroyTreeHelper( wxDataViewTreeNode * node )
 {
     if( node->GetNodeNumber() != 0 )
     {
         int len = node->GetNodeNumber();
         int i = 0 ;
-        wxDataViewTreeNodes nodes = node->GetNodes();
+        wxDataViewTreeNodes& nodes = node->GetNodes();
         for( ; i < len; i ++ )
         {
             DestroyTreeHelper(nodes[i]);
@@ -3389,7 +3386,7 @@ void wxDataViewMainWindow::DestroyTree()
 {
     if (m_root)
     {
-        DestroyTreeHelper(m_root);
+       ::DestroyTreeHelper(m_root);
         m_count = 0;
         m_root = NULL;
     }
@@ -3666,12 +3663,14 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
                         OnExpanding( current );
                 }
             }
+            if (node && !node->HasChildren())
+               delete node;
         }
         //If the user click the expander, we do not do editing even if the column with expander are editable
         if (m_lastOnSame && !expander && !ignore_other_columns)
         {
             if ((col == m_currentCol) && (current == m_currentRow) &&
-                (cell->GetMode() == wxDATAVIEW_CELL_EDITABLE) )
+                (cell->GetMode() & wxDATAVIEW_CELL_EDITABLE) )
             {
                 m_renameTimer->Start( 100, true );
             }
@@ -3704,28 +3703,18 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
             SendSelectionChangedEvent(GetItemByRow( m_currentRow ) );
         }
 
-        // notify cell about right click
         wxVariant value;
         model->GetValue( value, item, col->GetModelColumn() );
-        cell->SetValue( value );
-        wxRect cell_rect( xpos, current * m_lineHeight,
-                          col->GetWidth(), m_lineHeight );
-        if (!cell->RightClick( event.GetPosition(), cell_rect, model, item, col->GetModelColumn()))
-        {
-            wxWindow *parent = GetParent();
-            wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, parent->GetId());
-            le.SetItem( item );
-            le.SetEventObject(parent);
-            le.SetModel(GetOwner()->GetModel());
-            le.SetValue(value);
-
-            parent->GetEventHandler()->ProcessEvent(le);
-        }
+        wxWindow *parent = GetParent();
+        wxDataViewEvent le(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, parent->GetId());
+        le.SetItem( item );
+        le.SetEventObject(parent);
+        le.SetModel(GetOwner()->GetModel());
+        le.SetValue(value);
+        parent->GetEventHandler()->ProcessEvent(le);
     }
     else if (event.MiddleDown())
     {
-        // notify cell about middle click
-        // cell->...
     }
     if (event.LeftDown() || forceClick)
     {
@@ -3783,7 +3772,7 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
                 wxFAIL_MSG( _T("how did we get here?") );
             }
         }
-
+        
         if (m_currentRow != oldCurrentRow)
             RefreshRow( oldCurrentRow );
 
@@ -3794,6 +3783,18 @@ void wxDataViewMainWindow::OnMouse( wxMouseEvent &event )
 
         m_lastOnSame = !forceClick && ((col == oldCurrentCol) &&
                         (current == oldCurrentRow)) && oldWasSelected;
+
+        // Call LeftClick after everything else as under GTK+
+        if (cell->GetMode() & wxDATAVIEW_CELL_ACTIVATABLE)
+        {
+            // notify cell about right click
+            wxVariant value;
+            model->GetValue( value, item, col->GetModelColumn() );
+            cell->SetValue( value );
+            wxRect cell_rect( xpos, current * m_lineHeight,
+                          col->GetWidth(), m_lineHeight );
+            /* ignore ret */ cell->LeftClick( event.GetPosition(), cell_rect, model, item, col->GetModelColumn());
+        }
     }
 }
 
@@ -3840,6 +3841,12 @@ wxDataViewCtrl::~wxDataViewCtrl()
 {
     if (m_notifier)
         GetModel()->RemoveNotifier( m_notifier );
+
+    wxDataViewColumnList::const_iterator iter;
+    for (iter = m_cols.begin(); iter!=m_cols.end(); iter++)
+    {
+        delete *iter;
+    }
 }
 
 void wxDataViewCtrl::Init()
@@ -3851,8 +3858,11 @@ bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id,
            const wxPoint& pos, const wxSize& size,
            long style, const wxValidator& validator )
 {
+    if ( (style & wxBORDER_MASK) == 0)
+        style |= wxBORDER_SUNKEN;
+    
     if (!wxControl::Create( parent, id, pos, size,
-                            style | wxScrolledWindowStyle|wxBORDER_SUNKEN, validator))
+                            style | wxScrolledWindowStyle, validator))
         return false;
 
     SetInitialSize(size);