]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/datavcmn.cpp
fixing screen coordinate transformation
[wxWidgets.git] / src / common / datavcmn.cpp
index 1a7dcf453a885f6f5390b8b958f0e9f1d60a2136..b38d9489f60443a529a6a822396e935fe0b9b086 100644 (file)
 
 #include "wx/dataview.h"
 #include "wx/spinctrl.h"
+#include "wx/choice.h"
 
 #include "wx/weakref.h"
+#include "wx/vector.h"
 
 #ifndef WX_PRECOMP
     #include "wx/dc.h"
@@ -30,7 +32,7 @@
     #include "wx/crt.h"
 #endif
 
-const wxChar wxDataViewCtrlNameStr[] = wxT("dataviewCtrl");
+const char wxDataViewCtrlNameStr[] = "dataviewCtrl";
 
 
 bool operator == (const wxDataViewItem &left, const wxDataViewItem &right)
@@ -454,18 +456,18 @@ int wxDataViewIndexListModel::Compare(const wxDataViewItem& item1,
 void wxDataViewIndexListModel::GetValue( wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col ) const
 {
-    GetValue( variant, GetRow(item), col );
+    GetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewIndexListModel::SetValue( const wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col )
 {
-    return SetValue( variant, GetRow(item), col );
+    return SetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewIndexListModel::GetAttr( const wxDataViewItem &item, unsigned int col, wxDataViewItemAttr &attr )
 {
-    return GetAttr( GetRow(item), col, attr );
+    return GetAttrByRow( GetRow(item), col, attr );
 }
 
 wxDataViewItem wxDataViewIndexListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
@@ -601,18 +603,18 @@ int wxDataViewVirtualListModel::Compare(const wxDataViewItem& item1,
 void wxDataViewVirtualListModel::GetValue( wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col ) const
 {
-    GetValue( variant, GetRow(item), col );
+    GetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewVirtualListModel::SetValue( const wxVariant &variant,
                            const wxDataViewItem &item, unsigned int col )
 {
-    return SetValue( variant, GetRow(item), col );
+    return SetValueByRow( variant, GetRow(item), col );
 }
 
 bool wxDataViewVirtualListModel::GetAttr( const wxDataViewItem &item, unsigned int col, wxDataViewItemAttr &attr )
 {
-    return GetAttr( GetRow(item), col, attr );
+    return GetAttrByRow( GetRow(item), col, attr );
 }
 
 wxDataViewItem wxDataViewVirtualListModel::GetParent( const wxDataViewItem & WXUNUSED(item) ) const
@@ -721,7 +723,7 @@ bool wxDataViewRendererBase::StartEditing( const wxDataViewItem &item, wxRect la
 void wxDataViewRendererBase::CancelEditing()
 {
     if (!m_editorCtrl) return;
-    
+
     GetOwner()->GetOwner()->GetMainWindow()->SetFocus();
 
     m_editorCtrl->Hide();
@@ -831,64 +833,18 @@ void wxDataViewEditorCtrlEvtHandler::OnKillFocus( wxFocusEvent &event )
 // wxDataViewColumnBase
 // ---------------------------------------------------------
 
-IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumnBase, wxObject)
-
-wxDataViewColumnBase::wxDataViewColumnBase(const wxString& WXUNUSED(title),
-                                           wxDataViewRenderer *renderer,
-                                           unsigned int model_column,
-                                           int WXUNUSED(width),
-                                           wxAlignment WXUNUSED(align),
-                                           int WXUNUSED(flags))
-{
-    m_renderer = renderer;
-    m_model_column = model_column;
-    m_owner = NULL;
-    m_renderer->SetOwner( (wxDataViewColumn*) this );
-
-    // NOTE: the wxDataViewColumn's ctor must store the width, align, flags
-    //       parameters inside the native control!
-}
-
-wxDataViewColumnBase::wxDataViewColumnBase(const wxBitmap& bitmap,
-                                           wxDataViewRenderer *renderer,
-                                           unsigned int model_column,
-                                           int WXUNUSED(width),
-                                           wxAlignment WXUNUSED(align),
-                                           int WXUNUSED(flags) )
+void wxDataViewColumnBase::Init(wxDataViewRenderer *renderer,
+                                unsigned int model_column)
 {
     m_renderer = renderer;
     m_model_column = model_column;
-    m_bitmap = bitmap;
     m_owner = NULL;
     m_renderer->SetOwner( (wxDataViewColumn*) this );
 }
 
 wxDataViewColumnBase::~wxDataViewColumnBase()
 {
-    if (m_renderer)
-        delete m_renderer;
-}
-
-int wxDataViewColumnBase::GetFlags() const
-{
-    int ret = 0;
-
-    if (IsSortable())
-        ret |= wxDATAVIEW_COL_SORTABLE;
-    if (IsResizeable())
-        ret |= wxDATAVIEW_COL_RESIZABLE;
-    if (IsHidden())
-        ret |= wxDATAVIEW_COL_HIDDEN;
-
-    return ret;
-}
-
-void wxDataViewColumnBase::SetFlags(int flags)
-{
-    SetSortable((flags & wxDATAVIEW_COL_SORTABLE) != 0);
-    SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0);
-    SetHidden((flags & wxDATAVIEW_COL_HIDDEN) != 0);
-    SetReorderable((flags & wxDATAVIEW_COL_REORDERABLE) != 0);
+    delete m_renderer;
 }
 
 // ---------------------------------------------------------
@@ -940,6 +896,30 @@ const wxDataViewModel* wxDataViewCtrlBase::GetModel() const
     return m_model;
 }
 
+void wxDataViewCtrlBase::ExpandAncestors( const wxDataViewItem & item )
+{
+    if (!m_model) return;
+    
+    if (!item.IsOk()) return;
+
+    wxVector<wxDataViewItem> parentChain;
+    
+    // at first we get all the parents of the selected item
+    wxDataViewItem parent = m_model->GetParent(item);
+    while (parent.IsOk())
+    {
+        parentChain.push_back(parent);
+        parent = m_model->GetParent(parent);
+    }
+    
+    // then we expand the parents, starting at the root
+    while (!parentChain.empty())
+    {
+         Expand(parentChain.back());
+         parentChain.pop_back();
+    }
+}
+
 wxDataViewColumn *
 wxDataViewCtrlBase::AppendTextColumn( const wxString &label, unsigned int model_column,
                             wxDataViewCellMode mode, int width, wxAlignment align, int flags )
@@ -1220,7 +1200,7 @@ wxDataViewCtrlBase::PrependColumn( wxDataViewColumn *col )
     return true;
 }
 
-bool 
+bool
 wxDataViewCtrlBase::InsertColumn( unsigned int WXUNUSED(pos), wxDataViewColumn *col )
 {
     col->SetOwner( (wxDataViewCtrl*) this );
@@ -1233,23 +1213,23 @@ wxDataViewCtrlBase::InsertColumn( unsigned int WXUNUSED(pos), wxDataViewColumn *
 
 IMPLEMENT_DYNAMIC_CLASS(wxDataViewEvent,wxNotifyEvent)
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED)
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEvent )
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED)
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEvent )
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU)
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, wxDataViewEvent )
 
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED)
-DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED)
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, wxDataViewEvent )
+wxDEFINE_EVENT( wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED, wxDataViewEvent )
 
 
 // -------------------------------------
@@ -1316,6 +1296,256 @@ bool wxDataViewSpinRenderer::GetValue( wxVariant &value ) const
     return true;
 }
 
+// -------------------------------------
+// wxDataViewChoiceRenderer
+// -------------------------------------
+
+#if defined(wxHAS_GENERIC_DATAVIEWCTRL) || defined(__WXMAC__)
+
+wxDataViewChoiceRenderer::wxDataViewChoiceRenderer( const wxArrayString& choices, wxDataViewCellMode mode, int alignment ) :
+   wxDataViewCustomRenderer(wxT("string"), mode, alignment )
+{
+    m_choices = choices;
+}
+
+wxControl* wxDataViewChoiceRenderer::CreateEditorCtrl( wxWindow *parent, wxRect labelRect, const wxVariant &value )
+{
+    wxString s = value;
+    wxSize size = labelRect.GetSize();
+#ifdef __WXMAC__
+    size = wxSize( wxMax(70,labelRect.width ), -1 );
+#endif
+    wxChoice *c = new wxChoice( parent, wxID_ANY, labelRect.GetTopLeft(), size, m_choices );
+    c->SetStringSelection( value.GetString() );
+
+    return c;
+}
+
+bool wxDataViewChoiceRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVariant &value )
+{
+    wxChoice *c = (wxChoice*) editor;
+    wxString s = c->GetStringSelection();
+    value = s;
+    return true;
+}
+
+bool wxDataViewChoiceRenderer::Render( wxRect rect, wxDC *dc, int state )
+{
+    RenderText( m_data, 0, rect, dc, state );
+    return true;
+}
+
+wxSize wxDataViewChoiceRenderer::GetSize() const
+{
+    return wxSize(80,16);
+}
+
+bool wxDataViewChoiceRenderer::SetValue( const wxVariant &value )
+{
+    m_data = value.GetString();
+    return true;
+}
+
+bool wxDataViewChoiceRenderer::GetValue( wxVariant &value ) const
+{
+    value = m_data;
+    return true;
+}
+
+#endif
+
+//-----------------------------------------------------------------------------
+// wxDataViewListStore
+//-----------------------------------------------------------------------------
+
+wxDataViewListStore::wxDataViewListStore()
+{
+}
+
+wxDataViewListStore::~wxDataViewListStore()
+{
+    wxVector<wxDataViewListStoreLine*>::iterator it;
+    for (it = m_data.begin(); it != m_data.end(); ++it)
+    {
+        wxDataViewListStoreLine* line = *it;
+        delete line;
+    }
+}
+
+void wxDataViewListStore::PrependColumn( const wxString &varianttype )
+{
+    m_cols.Insert( varianttype, 0 );
+}
+
+void wxDataViewListStore::InsertColumn( unsigned int pos, const wxString &varianttype )
+{
+    m_cols.Insert( varianttype, pos );
+}
+
+void wxDataViewListStore::AppendColumn( const wxString &varianttype )
+{
+    m_cols.Add( varianttype );
+}
+
+unsigned int wxDataViewListStore::GetColumnCount() const
+{
+    return m_cols.GetCount();
+}
+
+wxString wxDataViewListStore::GetColumnType( unsigned int pos ) const
+{
+    return m_cols[pos];
+}
+    
+void wxDataViewListStore::AppendItem( const wxVector<wxVariant> &values, wxClientData *data )
+{
+    wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
+    line->m_values = values;
+    m_data.push_back( line );
+    
+    RowAppended();
+}
+
+void wxDataViewListStore::PrependItem( const wxVector<wxVariant> &values, wxClientData *data )
+{
+    wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
+    line->m_values = values;
+    m_data.insert( m_data.begin(), line );
+    
+    RowPrepended();
+}
+
+void wxDataViewListStore::InsertItem(  unsigned int row, const wxVector<wxVariant> &values, wxClientData *data )
+{
+    wxDataViewListStoreLine *line = new wxDataViewListStoreLine( data );
+    line->m_values = values;
+    m_data.insert( m_data.begin()+row, line );
+    
+    RowInserted( row );
+}
+
+void wxDataViewListStore::DeleteItem( unsigned row )
+{
+    wxVector<wxDataViewListStoreLine*>::iterator it = m_data.begin() + row;
+    m_data.erase( it );
+    
+    RowDeleted( row );
+}
+
+void wxDataViewListStore::DeleteAllItems()
+{
+    wxVector<wxDataViewListStoreLine*>::iterator it;
+    for (it = m_data.begin(); it != m_data.end(); ++it)
+    {
+        wxDataViewListStoreLine* line = *it;
+        delete line;
+    }
+    
+    Reset( 0 );
+}
+
+void wxDataViewListStore::GetValueByRow( wxVariant &value, unsigned int row, unsigned int col ) const
+{
+    wxDataViewListStoreLine *line = m_data[row];
+    value = line->m_values[col];
+}
+
+bool wxDataViewListStore::SetValueByRow( const wxVariant &value, unsigned int row, unsigned int col )
+{
+    wxDataViewListStoreLine *line = m_data[row];
+    line->m_values[col] = value;
+    
+    return true;
+}
+
+//-----------------------------------------------------------------------------
+// wxDataViewListCtrl
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxDataViewListCtrl,wxDataViewCtrl)
+
+BEGIN_EVENT_TABLE(wxDataViewListCtrl,wxDataViewCtrl)
+   EVT_SIZE( wxDataViewListCtrl::OnSize )
+END_EVENT_TABLE()
+
+wxDataViewListCtrl::wxDataViewListCtrl()
+{
+}
+
+wxDataViewListCtrl::wxDataViewListCtrl( wxWindow *parent, wxWindowID id,
+           const wxPoint& pos, const wxSize& size, long style,
+           const wxValidator& validator )
+{
+    Create( parent, id, pos, size, style, validator );
+
+    wxDataViewListStore *store = new wxDataViewListStore;
+    AssociateModel( store );
+    store->DecRef();
+}
+
+wxDataViewListCtrl::~wxDataViewListCtrl()
+{
+}
+
+
+bool wxDataViewListCtrl::Create( wxWindow *parent, wxWindowID id,
+           const wxPoint& pos, const wxSize& size, long style,
+           const wxValidator& validator )
+{
+    return wxDataViewCtrl::Create( parent, id, pos, size, style, validator );
+}
+
+void wxDataViewListCtrl::AppendCol( wxDataViewColumn *column, const wxString &varianttype )
+{
+    GetStore()->AppendColumn( varianttype );
+    AppendColumn( column );
+}
+
+void wxDataViewListCtrl::PrependCol( wxDataViewColumn *column, const wxString &varianttype )
+{
+    GetStore()->PrependColumn( varianttype );
+    PrependColumn( column );
+}
+
+void wxDataViewListCtrl::InsertCol( unsigned int pos, wxDataViewColumn *column, const wxString &varianttype )
+{
+    GetStore()->InsertColumn( pos, varianttype );
+    InsertColumn( pos, column );
+}
+                    
+wxDataViewColumn *wxDataViewListCtrl::AppendTextCol( const wxString &label, 
+          wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+    GetStore()->AppendColumn( wxT("string") );
+    return AppendTextColumn( label, GetStore()->GetColumnCount()-1, mode, width, align, flags );
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendToggleCol( const wxString &label, 
+          wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+    GetStore()->AppendColumn( wxT("bool") );
+    return AppendToggleColumn( label, GetStore()->GetColumnCount()-1, mode, width, align, flags );
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendProgressCol( const wxString &label, 
+          wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+    GetStore()->AppendColumn( wxT("long") );
+    return AppendProgressColumn( label, GetStore()->GetColumnCount()-1, mode, width, align, flags );
+}
+
+wxDataViewColumn *wxDataViewListCtrl::AppendIconTextCol( const wxString &label, 
+          wxDataViewCellMode mode, int width, wxAlignment align, int flags )
+{
+    GetStore()->AppendColumn( wxT("wxDataViewIconText") );
+    return AppendIconTextColumn( label, GetStore()->GetColumnCount()-1, mode, width, align, flags );
+}
+
+void wxDataViewListCtrl::OnSize( wxSizeEvent &event )
+{
+    event.Skip( true );
+}
+
 //-----------------------------------------------------------------------------
 // wxDataViewTreeStore
 //-----------------------------------------------------------------------------
@@ -1874,10 +2104,12 @@ void wxDataViewTreeCtrl::OnCollapsed( wxDataViewEvent &event )
 void wxDataViewTreeCtrl::OnSize( wxSizeEvent &event )
 {
 #if defined(wxUSE_GENERICDATAVIEWCTRL)
-    wxSize size = GetClientSize();
-    wxDataViewColumn *col = GetColumn( 0 );
-    if (col)
-       col->SetWidth( size.x );
+    // automatically resize our only column to take the entire control width
+    if ( GetColumnCount() )
+    {
+        wxSize size = GetClientSize();
+        GetColumn(0)->SetWidth(size.x);
+    }
 #endif
     event.Skip( true );
 }