+ wxAboutDialogInfo info;
+ info.SetName(_("DataView sample"));
+ info.SetDescription(_("This sample demonstrates the dataview control handling"));
+ info.SetCopyright(_T("(C) 2007 Robert Roebling"));
+
+ wxAboutBox(info);
+}
+
+void MyFrame::OnNewSortingFrame(wxCommandEvent& WXUNUSED(event) )
+{
+ MySortingFrame *frame2 =
+ new MySortingFrame(NULL, wxT("wxDataViewCtrl sorting test"), 10, 150, 600, 500);
+ frame2->Show(true);
+}
+
+void MyFrame::OnStyleChange(wxCommandEvent& WXUNUSED(event) )
+{
+ // recreate the wxDataViewCtrl:
+ CreateDataViewControls();
+}
+
+void MyFrame::OnColumnSetting(wxCommandEvent& event)
+{
+ wxArrayInt columns;
+ int flag = 0;
+ bool header = false, minwidth = false;
+ wxString msg;
+
+ switch (event.GetId())
+ {
+ case ID_RESIZEABLE_COLUMNS:
+ flag = wxDATAVIEW_COL_RESIZABLE;
+ columns = GetFlaggedColumns(flag);
+ break;
+ case ID_SORTABLE_COLUMNS:
+ flag = wxDATAVIEW_COL_SORTABLE;
+ columns = GetFlaggedColumns(flag);
+ break;
+ case ID_HIDDEN_COLUMNS:
+ flag = wxDATAVIEW_COL_HIDDEN;
+ columns = GetFlaggedColumns(flag);
+ break;
+
+ case ID_CHOOSE_COLUMN_ALIGNMENT:
+ msg = wxT("Select the columns whose headers' alignment will be modified.");
+ header = true;
+ break;
+ case ID_CHOOSE_CONTENTS_ALIGNMENT:
+ msg = wxT("Select the columns whose contents' alignment will be modified.");
+ header = false;
+ break;
+
+ case ID_SET_MINWIDTH:
+ msg = wxT("Please provide the new minimal width:");
+ minwidth = true;
+ break;
+ case ID_SET_WIDTH:
+ msg = wxT("Please provide the new width:");
+ minwidth = false;
+ break;
+ }
+
+ // get column titles:
+
+ wxArrayString choices;
+ for (size_t i=0; i<dataview_left->GetColumnCount(); i++)
+ choices.Add(dataview_left->GetColumn(i)->GetTitle());
+
+ // ask the user
+ wxGetMultipleChoices(
+ columns,
+ wxT("Choose the columns to which apply the change."),
+ wxT("Choose the column"),
+ choices,
+ this);
+
+ switch (event.GetId())
+ {
+ case ID_RESIZEABLE_COLUMNS:
+ case ID_SORTABLE_COLUMNS:
+ case ID_HIDDEN_COLUMNS:
+ SetFlag(columns, flag);
+ break;
+
+ case ID_CHOOSE_COLUMN_ALIGNMENT:
+ case ID_CHOOSE_CONTENTS_ALIGNMENT:
+ SetAlignment(columns, header, ChooseAlign(msg, header));
+ break;
+
+ case ID_SET_MINWIDTH:
+ case ID_SET_WIDTH:
+ {
+ int def = minwidth ? wxDVC_DEFAULT_MINWIDTH : wxDVC_DEFAULT_WIDTH;
+
+ msg << wxT("\nNOTE: all non-selected columns will be reset to a width of ")
+ << def << wxT(" pixels.");
+
+ long ret =
+ wxGetNumberFromUser(msg, wxT("New value:"), wxT("Modify width"),
+ def, 0, 300, this);
+
+ if (ret != -1)
+ SetWidth(columns, minwidth, ret);
+ }
+ break;
+ }
+
+ dataview_left->Refresh();
+}
+
+wxAlignment MyFrame::ChooseAlign(const wxString &msg, bool onlyHorizontal)
+{
+ const wxString choices[] =
+ {
+ wxT("Left"),
+ wxT("Center horizontally"),
+ wxT("Right"),
+ wxT("Top"),
+ wxT("Center vertically"),
+ wxT("Bottom"),
+ wxT("Center")
+ };
+
+ wxAlignment flags[] =
+ {
+ wxALIGN_LEFT,
+ wxALIGN_CENTER_HORIZONTAL,
+ wxALIGN_RIGHT,
+ wxALIGN_TOP,
+ wxALIGN_CENTER_VERTICAL,
+ wxALIGN_BOTTOM,
+ wxALIGN_CENTER
+ };
+
+ int n = WXSIZEOF(choices);
+ if (onlyHorizontal)
+ n = 3; // show only the first three choices
+
+ int choice = wxGetSingleChoiceIndex(
+ msg + wxT("\nNOTE: _all_ non-selected column's alignment will be reset to wxALIGN_LEFT!"),
+ wxT("Alignment"),
+ n, choices,
+ this);
+
+ if (choice == wxNOT_FOUND)
+ return wxALIGN_LEFT;
+
+ return flags[choice];
+}
+
+void MyFrame::SetFlag(const wxArrayInt &idx, int toadd)
+{
+ for (size_t i=0; i<dataview_left->GetColumnCount(); i++)
+ {
+ int current = dataview_left->GetColumn(i)->GetFlags();
+
+ if (idx.Index(i) != wxNOT_FOUND)
+ dataview_left->GetColumn(i)->SetFlags(current | toadd);
+ else
+ dataview_left->GetColumn(i)->SetFlags(current & ~toadd);
+ }
+}
+
+wxArrayInt MyFrame::GetFlaggedColumns(int flag)
+{
+ wxArrayInt ret;
+ for (size_t i=0; i<dataview_left->GetColumnCount(); i++)
+ if (dataview_left->GetColumn(i)->GetFlags() & flag)
+ ret.Add(i);
+ return ret;
+}
+
+void MyFrame::SetAlignment(const wxArrayInt &idx, bool header, wxAlignment align)
+{
+ // set to DEFAULT_ALIGN all columns except those
+ // contained in 'idx' which are set to 'align'
+
+ for (size_t i=0; i<dataview_left->GetColumnCount(); i++)
+ {
+ wxAlignment toset = DEFAULT_ALIGN;
+ if (idx.Index(i) != wxNOT_FOUND)
+ toset = align;
+
+ if (header)
+ dataview_left->GetColumn(i)->SetAlignment(toset);
+ else
+ dataview_left->GetColumn(i)->GetRenderer()->SetAlignment(toset);
+ }
+}
+
+void MyFrame::SetWidth(const wxArrayInt &idx, bool minwidth, int width)
+{
+ // set to wxDVC_DEFAULT_WIDTH wide all columns except those
+ // contained in 'idx' which are set to 'width'
+
+ for (size_t i=0; i<dataview_left->GetColumnCount(); i++)
+ {
+ int toset = minwidth ? wxDVC_DEFAULT_MINWIDTH : wxDVC_DEFAULT_WIDTH;
+ if (idx.Index(i) != wxNOT_FOUND)
+ toset = width;
+
+ if (minwidth)
+ dataview_left->GetColumn(i)->SetMinWidth(toset);
+ else
+ dataview_left->GetColumn(i)->SetWidth(toset);
+ }
+}
+
+
+// -------------------------------------
+// MySortingFrame
+// -------------------------------------
+
+BEGIN_EVENT_TABLE(MySortingFrame,wxFrame)
+ EVT_BUTTON( ID_APPEND_ROW_LEFT, MySortingFrame::OnAppendRowLeft )
+ 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_BUTTON( ID_SELECT, MySortingFrame::OnSelect )
+ EVT_BUTTON( ID_UNSELECT_ALL, MySortingFrame::OnUnselectAll )
+ EVT_DATAVIEW_ROW_SELECTED( ID_SORTED, MySortingFrame::OnSelectedSorted )
+ EVT_DATAVIEW_ROW_SELECTED( ID_UNSORTED, MySortingFrame::OnSelectedUnsorted )
+ EVT_DATAVIEW_ROW_ACTIVATED( ID_UNSORTED, MySortingFrame::OnActivatedUnsorted )
+ EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_SORTED, MySortingFrame::OnHeaderClickSorted )
+ EVT_DATAVIEW_COLUMN_HEADER_CLICK( ID_UNSORTED, MySortingFrame::OnHeaderClickUnsorted )
+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));
+ CreateStatusBar();
+
+ wxPanel *main = new wxPanel(this);
+
+ // Left wxDataViewCtrl
+ dataview_left = new wxDataViewCtrl( main, ID_UNSORTED, wxDefaultPosition,
+ wxDefaultSize, wxDV_MULTIPLE );
+
+ m_unsorted_model.reset(new MyUnsortedTextModel);
+ dataview_left->AssociateModel( m_unsorted_model.get() );
+
+ wxDataViewTextRenderer *text_renderer =
+ new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
+ wxDataViewColumn *column = new wxDataViewColumn( wxT("editable"), text_renderer, 0 );
+ dataview_left->AppendColumn( column );
+ dataview_left->AppendTextColumn( wxT("second"), 1 );
+ dataview_left->AppendColumn( new wxDataViewColumn( wxBitmap(null_xpm),
+ new wxDataViewBitmapRenderer, 2, 25 ) );
+ dataview_left->AppendColumn( new wxDataViewColumn( wxT("icon"),
+ new wxDataViewBitmapRenderer, 3, 25 ) );
+
+ // Right wxDataViewCtrl using the sorting model
+ dataview_right = new wxDataViewCtrl( main, ID_SORTED );
+
+ m_sorted_model.reset(new wxDataViewSortedListModel( m_unsorted_model.get() ));
+ dataview_right->AssociateModel( m_sorted_model.get() );
+
+ text_renderer = new wxDataViewTextRenderer( wxT("string"), wxDATAVIEW_CELL_EDITABLE );
+ column = new wxDataViewColumn( wxT("editable"), text_renderer, 0, -1,
+ wxALIGN_CENTER,
+ wxDATAVIEW_COL_SORTABLE|wxDATAVIEW_COL_RESIZABLE );
+ dataview_right->AppendColumn( column );
+
+ dataview_right->AppendTextColumn( wxT("second"), 1 );
+
+ // layout dataview controls.
+
+ wxBoxSizer *top_sizer = new wxBoxSizer( wxHORIZONTAL );
+ top_sizer->Add( dataview_left, 1, wxGROW );
+ top_sizer->Add(10,10);
+ top_sizer->Add( dataview_right, 1, wxGROW );
+
+ wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
+ button_sizer->Add( 10, 10, 1 );
+ wxFlexGridSizer *left_sizer = new wxFlexGridSizer( 2 );
+ left_sizer->Add( new wxButton( main, ID_APPEND_ROW_LEFT, wxT("Append") ), 0, wxALL, 5 );
+ left_sizer->Add( new wxButton( main, ID_PREPEND_ROW_LEFT, wxT("Prepend") ), 0, wxALL, 5 );
+ left_sizer->Add( new wxButton( main, ID_INSERT_ROW_LEFT, wxT("Insert") ), 0, wxALL, 5 );
+ left_sizer->Add( new wxButton( main, ID_DELETE_ROW_LEFT, wxT("Delete second") ), 0, wxALL, 5 );
+ left_sizer->Add( new wxButton( main, ID_EDIT_ROW_LEFT, wxT("Edit") ), 0, wxALL, 5 );
+ left_sizer->Add( 5,5 );
+ left_sizer->Add( new wxButton( main, ID_SELECT, wxT("Select third") ), 0, wxALL, 5 );
+ left_sizer->Add( new wxButton( main, ID_UNSELECT_ALL, wxT("Unselect all") ), 0, wxALL, 5 );
+ button_sizer->Add( left_sizer );
+ button_sizer->Add( 10, 10, 2 );
+ wxFlexGridSizer *right_sizer = new wxFlexGridSizer( 2 );
+ right_sizer->Add( new wxButton( main, ID_APPEND_ROW_RIGHT, wxT("Append") ), 0, wxALL, 5 );
+ right_sizer->Add( new wxButton( main, ID_PREPEND_ROW_RIGHT, wxT("Prepend") ), 0, wxALL, 5 );
+ right_sizer->Add( new wxButton( main, ID_INSERT_ROW_RIGHT, wxT("Insert") ), 0, wxALL, 5 );
+ right_sizer->Add( new wxButton( main, ID_DELETE_ROW_RIGHT, wxT("Delete second") ), 0, wxALL, 5 );
+ right_sizer->Add( new wxButton( main, ID_EDIT_ROW_RIGHT, wxT("Edit") ), 0, wxALL, 5 );
+ button_sizer->Add( right_sizer );
+ button_sizer->Add( 10, 10, 1 );
+
+ wxBoxSizer *main_sizer = new wxBoxSizer( wxVERTICAL );
+ main_sizer->Add( top_sizer, 1, wxGROW );
+ main_sizer->Add( button_sizer, 0, wxGROW );
+
+ m_logWindow = new wxTextCtrl(main, 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));
+
+ main->SetSizer( main_sizer );
+}
+
+MySortingFrame::~MySortingFrame()
+{
+ delete wxLog::SetActiveTarget(m_logOld);
+}
+
+void MySortingFrame::OnSelectedUnsorted(wxDataViewEvent &event)
+{
+ int row = event.GetRow();
+ wxLogMessage( wxT("OnSelected from unsorted list, selected %d"), row );
+ if (row >= 0)
+ wxLogMessage( wxT("wxDataViewCtrl::IsSelected( %d ): %d (as int)"),
+ row, (int) dataview_right->IsSelected( row ) );
+}
+
+void MySortingFrame::OnSelectedSorted(wxDataViewEvent &event)
+{
+ wxLogMessage( wxT("OnSelected from sorted list, selected %d"), (int) event.GetRow() );
+}
+
+void MySortingFrame::OnActivatedUnsorted(wxDataViewEvent &event)
+{
+ wxLogMessage( wxT("OnActivated from unsorted list, activated %d"), (int) event.GetRow() );
+}
+
+void MySortingFrame::OnHeaderClickSorted(wxDataViewEvent &event)
+{
+ wxDataViewColumn *col = event.GetDataViewColumn();
+ wxLogMessage( wxT("OnHeaderClick from sorted list, column %s"), col->GetTitle().c_str() );
+
+ if (col->GetTitle() == wxT("editable"))
+ {
+ // this is the sorting column
+ if (col->IsSortOrderAscending())
+ {
+ col->SetSortOrder( false );
+ m_sorted_model->SetAscending( false );
+ m_sorted_model->Resort();
+ }
+ else
+ {
+ col->SetSortOrder( true );
+ m_sorted_model->SetAscending( true );
+ m_sorted_model->Resort();
+ }
+ }
+}
+
+void MySortingFrame::OnHeaderClickUnsorted(wxDataViewEvent &event)
+{
+ wxLogMessage( wxT("OnHeaderClick from unsorted list, column %s"),
+ event.GetDataViewColumn()->GetTitle().c_str() );
+}
+
+void MySortingFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
+{
+ Close(true);
+}
+
+void MySortingFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
+{
+ wxMessageDialog dialog(this, _T("This demonstrates the dataview control sorting"),