-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 MyTextRenderer( 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 );
-
- MySpinCtrlInPlaceRenderer *sr = new MySpinCtrlInPlaceRenderer;
- column = new wxDataViewColumn( wxT("spin"), sr, 4, -1, wxALIGN_CENTER );
- dataview_right->AppendColumn( column );
-
- // 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"),
- _T("About DataView"), wxOK);
-
- dialog.ShowModal();
-}
-
-void MySortingFrame::OnSelect(wxCommandEvent& WXUNUSED(event))
-{
- dataview_left->SetSelection( 2 );
-}
-
-void MySortingFrame::OnUnselectAll(wxCommandEvent& WXUNUSED(event))
-{
- dataview_left->ClearSelection();
-}
-
-void MySortingFrame::OnAppendRowLeft(wxCommandEvent& WXUNUSED(event))
-{
- wxTextEntryDialog dialog( this, wxT("Enter text to append") );
- if (dialog.ShowModal() == wxID_OK)
- {
- wxString value = dialog.GetValue();
- if (!value.empty())
- m_unsorted_model->AppendRow( value );
- }
-}
-
-void MySortingFrame::OnPrependRowLeft(wxCommandEvent& WXUNUSED(event))
-{
- wxTextEntryDialog dialog( this, wxT("Enter text to prepend") );
- if (dialog.ShowModal() == wxID_OK)
- {
- wxString value = dialog.GetValue();
- if (!value.empty())
- m_unsorted_model->PrependRow( value );
- }
-}
-
-void MySortingFrame::OnInsertRowLeft(wxCommandEvent& WXUNUSED(event))
-{
- wxTextEntryDialog dialog( this, wxT("Enter text to insert before second") );
- if (dialog.ShowModal() == wxID_OK)
- {
- wxString value = dialog.GetValue();
- if (!value.empty())
- m_unsorted_model->InsertRowAt1( value );
- }
-}
-
-void MySortingFrame::OnDeleteRowLeft(wxCommandEvent& WXUNUSED(event))
-{
- m_unsorted_model->DeleteRow( 1 );
-}
-
-void MySortingFrame::OnEditRowLeft(wxCommandEvent& WXUNUSED(event))
-{
-}
-
-void MySortingFrame::OnAppendRowRight(wxCommandEvent& WXUNUSED(event))
-{
-}
-
-void MySortingFrame::OnPrependRowRight(wxCommandEvent& WXUNUSED(event))
-{
-}
-
-void MySortingFrame::OnInsertRowRight(wxCommandEvent& WXUNUSED(event))
-{
-}
-
-void MySortingFrame::OnDeleteRowRight(wxCommandEvent& WXUNUSED(event))
-{
-}
-
-void MySortingFrame::OnEditRowRight(wxCommandEvent& WXUNUSED(event))
-{
-}
-