DECLARE_DYNAMIC_CLASS_NO_COPY(wxDataViewCtrlBase)
};
+
+// ----------------------------------------------------------------------------
+// wxDataViewEvent - the event class for the wxDataViewCtrl notifications
+// ----------------------------------------------------------------------------
+
+class WXDLLEXPORT wxDataViewEvent : public wxNotifyEvent
+{
+public:
+ wxDataViewEvent(wxEventType commandType = wxEVT_NULL, int winid = 0)
+ : wxNotifyEvent(commandType, winid),
+ m_col(-1),
+ m_row(-1),
+ m_model(NULL),
+ m_value(wxNullVariant),
+ m_editCancelled(false)
+ { }
+
+ wxDataViewEvent(const wxDataViewEvent& event)
+ : wxNotifyEvent(event),
+ m_col(event.m_col),
+ m_row(event.m_col),
+ m_model(event.m_model),
+ m_value(event.m_value),
+ m_editCancelled(event.m_editCancelled)
+ { }
+
+ int GetColumn() const { return m_col; }
+ void SetColumn( int col ) { m_col = col; }
+ int GetRow() const { return m_row; }
+ void SetRow( int row ) { m_row = row; }
+ wxDataViewModel* GetModel() const { return m_model; }
+ void SetModel( wxDataViewModel *model ) { m_model = model; }
+ const wxVariant &GetValue() const { return m_value; }
+ void SetValue( const wxVariant &value ) { m_value = value; }
+
+ // was label editing canceled? (for wxEVT_COMMAND_DATVIEW_END_LABEL_EDIT only)
+ bool IsEditCancelled() const { return m_editCancelled; }
+ void SetEditCanceled(bool editCancelled) { m_editCancelled = editCancelled; }
+
+ virtual wxEvent *Clone() const { return new wxDataViewEvent(*this); }
+
+protected:
+ int m_col;
+ int m_row;
+ wxDataViewModel *m_model;
+ wxVariant m_value;
+ bool m_editCancelled;
+
+private:
+ DECLARE_DYNAMIC_CLASS_NO_ASSIGN(wxDataViewEvent)
+};
+
+BEGIN_DECLARE_EVENT_TYPES()
+ DECLARE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, -1)
+END_DECLARE_EVENT_TYPES()
+
+typedef void (wxEvtHandler::*wxDataViewEventFunction)(wxDataViewEvent&);
+
+#define wxDataViewEventHandler(func) \
+ (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(wxDataViewEventFunction, &func)
+
+#define wx__DECLARE_DATAVIEWEVT(evt, id, fn) \
+ wx__DECLARE_EVT1(wxEVT_COMMAND_DATAVIEW_ ## evt, id, wxDataViewEventHandler(fn))
+
+#define EVT_DATAVIEW_ROW_SELECTED(id, fn) wx__DECLARE_DATAVIEWEVT(ROW_SELECTED, id, fn)
+
+
#if defined(wxUSE_GENERICDATAVIEWCTRL)
#include "wx/generic/dataview.h"
#elif defined(__WXGTK20__)
ID_PREPEND_ROW_RIGHT,
ID_INSERT_ROW_RIGHT,
ID_DELETE_ROW_RIGHT,
- ID_EDIT_ROW_RIGHT
+ ID_EDIT_ROW_RIGHT,
+
+ ID_SORTED,
+ ID_UNSORTED
};
class MySortingFrame: public wxFrame
{
public:
MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
+ ~MySortingFrame();
public:
void OnQuit(wxCommandEvent& event);
void OnDeleteRowRight(wxCommandEvent& event);
void OnEditRowRight(wxCommandEvent& event);
+ void OnSelectedUnsorted(wxDataViewEvent &event);
+ void OnSelectedSorted(wxDataViewEvent &event);
+
private:
wxDataViewCtrl* dataview_left;
wxDataViewCtrl* dataview_right;
+
+ wxLog *m_logOld;
+ wxTextCtrl *m_logWindow;
MyUnsortedTextModel *m_unsorted_model;
MyFrame *frame = new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
frame->Show(true);
- MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 350, 600, 300);
+ MySortingFrame *frame2 = new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 150, 600, 500);
frame2->Show(true);
SetTopWindow(frame);
EVT_BUTTON( ID_PREPEND_ROW_LEFT, MySortingFrame::OnPrependRowLeft )
EVT_BUTTON( ID_INSERT_ROW_LEFT, MySortingFrame::OnInsertRowLeft )
EVT_BUTTON( ID_DELETE_ROW_LEFT, MySortingFrame::OnDeleteRowLeft )
+ EVT_DATAVIEW_ROW_SELECTED( ID_SORTED, MySortingFrame::OnSelectedSorted )
+ EVT_DATAVIEW_ROW_SELECTED( ID_UNSORTED, MySortingFrame::OnSelectedUnsorted )
END_EVENT_TABLE()
MySortingFrame::MySortingFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
{
+ m_logOld = NULL;
+
SetIcon(wxICON(sample));
wxMenu *file_menu = new wxMenu;
// Left wxDataViewCtrl
- dataview_left = new wxDataViewCtrl( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE );
+ dataview_left = new wxDataViewCtrl( this, ID_UNSORTED, wxDefaultPosition, wxDefaultSize, wxDV_MULTIPLE );
m_unsorted_model = new MyUnsortedTextModel;
dataview_left->AssociateModel( m_unsorted_model );
dataview_left->AppendColumn( new wxDataViewColumn( wxT("icon"), new wxDataViewBitmapCell, 3, 25 ) );
// Right wxDataViewCtrl using the sorting model
- dataview_right = new wxDataViewCtrl( this, wxID_ANY );
+ dataview_right = new wxDataViewCtrl( this, ID_SORTED );
wxDataViewSortedListModel *sorted_model =
new wxDataViewSortedListModel( m_unsorted_model );
wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
main_sizer->Add( top_sizer, 1, wxGROW );
main_sizer->Add( button_sizer, 0, wxGROW );
+
+ m_logWindow = new wxTextCtrl(this, wxID_ANY, wxEmptyString,
+ wxDefaultPosition, wxDefaultSize,
+ wxTE_MULTILINE | wxSUNKEN_BORDER);
+ main_sizer->Add( 20,20 );
+ main_sizer->Add( m_logWindow, 1, wxGROW );
+
+ m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_logWindow));
SetSizer( main_sizer );
}
+MySortingFrame::~MySortingFrame()
+{
+ delete wxLog::SetActiveTarget(m_logOld);
+}
+
+void MySortingFrame::OnSelectedUnsorted(wxDataViewEvent &event)
+{
+ wxLogMessage( wxT("OnSelected from unsorted list, selected %d"), (int) event.GetRow() );
+}
+
+void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event)
+{
+ wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() );
+}
+
void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
{
Close(true);
return gtk_tree_view_column_get_fixed_width( (GtkTreeViewColumn *)m_column );
}
+//-----------------------------------------------------------------------------
+// wxDataViewCtrl signal callbacks
+//-----------------------------------------------------------------------------
+
+static void
+wxdataview_selection_changed_callback( GtkTreeSelection* selection, wxDataViewCtrl *dv )
+{
+ wxDataViewEvent event( wxEVT_COMMAND_DATAVIEW_ROW_SELECTED, dv->GetId() );
+ if (dv->HasFlag(wxDV_MULTIPLE))
+ {
+ GtkTreeModel *model;
+ GList *list = gtk_tree_selection_get_selected_rows( selection, &model );
+
+ // do something
+ // ...
+
+ // delete list
+ g_list_foreach( list, (GFunc) gtk_tree_path_free, NULL );
+ g_list_free( list );
+ }
+ else
+ {
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gboolean has_selection = gtk_tree_selection_get_selected( selection, &model, &iter );
+ if (has_selection)
+ {
+ unsigned int row = (wxUIntPtr) iter.user_data;
+ event.SetRow( row );
+ }
+ }
+ event.SetModel( dv->GetModel() );
+ dv->GetEventHandler()->ProcessEvent( event );
+}
+
//-----------------------------------------------------------------------------
// wxDataViewCtrl
//-----------------------------------------------------------------------------
m_parent->DoAddChild( this );
+ GtkTreeSelection *selection = gtk_tree_view_get_selection( GTK_TREE_VIEW(m_treeview) );
+ g_signal_connect_after (selection, "changed",
+ G_CALLBACK (wxdataview_selection_changed_callback), this);
+
PostCreation(size);
return true;