94b1f7bcd3
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47270 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
358 lines
9.3 KiB
C++
358 lines
9.3 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: dataview.cpp
|
|
// Purpose: wxDataViewCtrl wxWidgets sample
|
|
// Author: Robert Roebling
|
|
// Modified by: Francesco Montorsi
|
|
// Created: 06/01/06
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) Robert Roebling
|
|
// Licence: wxWindows license
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx/wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/wx.h"
|
|
#endif
|
|
|
|
#include "wx/datetime.h"
|
|
#include "wx/splitter.h"
|
|
#include "wx/aboutdlg.h"
|
|
#include "wx/choicdlg.h"
|
|
#include "wx/numdlg.h"
|
|
#include "wx/dataview.h"
|
|
#include "wx/spinctrl.h"
|
|
|
|
#ifndef __WXMSW__
|
|
#include "../sample.xpm"
|
|
#endif
|
|
|
|
#include "null.xpm"
|
|
|
|
|
|
#define DEFAULT_ALIGN wxALIGN_LEFT
|
|
#define DATAVIEW_DEFAULT_STYLE (wxDV_MULTIPLE|wxDV_HORIZ_RULES|wxDV_VERT_RULES)
|
|
|
|
|
|
|
|
// -------------------------------------
|
|
// MyMusicModel
|
|
// -------------------------------------
|
|
|
|
/*
|
|
Implement this data model
|
|
Title Artist Year
|
|
-------------------------------------------------------------
|
|
1: My Music:
|
|
2: Pop music
|
|
3: You are not alone Michael Jackson 1995
|
|
4: Take a bow Madonna 1994
|
|
5: Classical music
|
|
6: Ninth Symphony Ludwig v. Beethoven 1824
|
|
7: German Requiem Johannes Brahms 1868
|
|
*/
|
|
|
|
|
|
class MyMusicModel: public wxDataViewModel
|
|
{
|
|
public:
|
|
MyMusicModel() {}
|
|
|
|
virtual unsigned int GetColumnCount() const
|
|
{
|
|
return 3;
|
|
}
|
|
|
|
virtual wxString GetColumnType( unsigned int col ) const
|
|
{
|
|
return "string";
|
|
}
|
|
|
|
virtual void GetValue( wxVariant &variant,
|
|
const wxDataViewItem &item, unsigned int col ) const
|
|
{
|
|
variant = wxString("");
|
|
int ID = item.GetID();
|
|
switch (ID)
|
|
{
|
|
case 1: if (col == 0) variant = wxString("My Music"); break;
|
|
case 2: if (col == 0) variant = wxString("Pop music"); break;
|
|
case 5: if (col == 0) variant = wxString("Classical music"); break;
|
|
case 3:
|
|
{
|
|
switch (col)
|
|
{
|
|
case 0: variant = wxString("You are not alone"); break;
|
|
case 1: variant = wxString("Michael Jackson"); break;
|
|
case 2: variant = wxString("1995");
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
{
|
|
switch (col)
|
|
{
|
|
case 0: variant = wxString("Take a bow"); break;
|
|
case 1: variant = wxString("Madonna"); break;
|
|
case 2: variant = wxString("1994");
|
|
}
|
|
}
|
|
break;
|
|
case 6:
|
|
{
|
|
switch (col)
|
|
{
|
|
case 0: variant = wxString("Ninth symphony"); break;
|
|
case 1: variant = wxString("Ludwig v. Beethoven"); break;
|
|
case 2: variant = wxString("1824");
|
|
}
|
|
}
|
|
break;
|
|
case 7:
|
|
{
|
|
switch (col)
|
|
{
|
|
case 0: variant = wxString("German requiem"); break;
|
|
case 1: variant = wxString("Johannes Brahms"); break;
|
|
case 2: variant = wxString("1868");
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
virtual bool SetValue( const wxVariant &variant,
|
|
const wxDataViewItem &item, unsigned int col )
|
|
{
|
|
// readonly
|
|
return true;
|
|
}
|
|
|
|
/*****************************************************************
|
|
If wxDataViewItem is not valid in the two methods I quote above
|
|
then it means "return the child item from the invisible root".
|
|
******************************************************************/
|
|
|
|
virtual bool HasChildren( const wxDataViewItem &item ) const
|
|
{
|
|
int ID = item.GetID();
|
|
return ((ID == 1) || (ID == 2) || (ID == 5) || (ID == 0));
|
|
}
|
|
|
|
virtual int GetChildCount( const wxDataViewItem &item ) const
|
|
{
|
|
int ID = item.GetID();
|
|
switch (ID)
|
|
{
|
|
case 0: return 1;
|
|
case 1: return 2;
|
|
case 2: return 2;
|
|
case 5: return 2;
|
|
}
|
|
return 0;
|
|
}
|
|
virtual wxDataViewItem GetParent( const wxDataViewItem &child ) const
|
|
{
|
|
int ID = child.GetID();
|
|
switch (ID)
|
|
{
|
|
case 2:
|
|
case 5: return wxDataViewItem( 1 );
|
|
case 3:
|
|
case 4: return wxDataViewItem( 2 );
|
|
case 6:
|
|
case 7: return wxDataViewItem( 5 );
|
|
}
|
|
|
|
return wxDataViewItem(0);
|
|
}
|
|
virtual wxDataViewItem GetFirstChild( const wxDataViewItem &parent ) const
|
|
{
|
|
int ID = parent.GetID();
|
|
switch (ID)
|
|
{
|
|
case 0: return wxDataViewItem( 1 );
|
|
case 1: return wxDataViewItem( 2 );
|
|
case 2: return wxDataViewItem( 3 );
|
|
case 5: return wxDataViewItem( 6 );
|
|
}
|
|
|
|
return wxDataViewItem(0);
|
|
}
|
|
virtual wxDataViewItem GetNextSibling( const wxDataViewItem &item ) const
|
|
{
|
|
int ID = item.GetID();
|
|
switch (ID)
|
|
{
|
|
case 2: return wxDataViewItem( 5 );
|
|
case 3: return wxDataViewItem( 4 );
|
|
case 6: return wxDataViewItem( 7 );
|
|
}
|
|
|
|
return wxDataViewItem(0);
|
|
}
|
|
virtual wxDataViewItem GetNthChild( const wxDataViewItem &parent, unsigned int n ) const
|
|
{
|
|
if (!parent.IsOk())
|
|
{
|
|
// root node
|
|
if (n == 0)
|
|
return wxDataViewItem( 1 );
|
|
|
|
return wxDataViewItem( 0 );
|
|
}
|
|
|
|
int ID = parent.GetID();
|
|
switch (ID)
|
|
{
|
|
case 1:
|
|
{
|
|
if (n == 0) return wxDataViewItem( 2 );
|
|
else if (n == 1) return wxDataViewItem( 5 );
|
|
}
|
|
break;
|
|
case 2:
|
|
{
|
|
if (n == 0) return wxDataViewItem( 3 );
|
|
else if (n == 1) return wxDataViewItem( 4 );
|
|
}
|
|
break;
|
|
case 5:
|
|
{
|
|
if (n == 0) return wxDataViewItem( 6 );
|
|
else if (n == 1) return wxDataViewItem( 7 );
|
|
}
|
|
break;
|
|
}
|
|
|
|
return wxDataViewItem(0);
|
|
}
|
|
};
|
|
|
|
// -------------------------------------
|
|
// MyApp
|
|
// -------------------------------------
|
|
|
|
class MyApp: public wxApp
|
|
{
|
|
public:
|
|
bool OnInit(void);
|
|
int OnExit();
|
|
};
|
|
|
|
// -------------------------------------
|
|
// MyFrame
|
|
// -------------------------------------
|
|
|
|
class MyFrame : public wxFrame
|
|
{
|
|
public:
|
|
MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h);
|
|
|
|
public:
|
|
void OnQuit(wxCommandEvent& event);
|
|
void OnAbout(wxCommandEvent& event);
|
|
|
|
private:
|
|
wxDataViewCtrl* m_dataview;
|
|
|
|
private:
|
|
DECLARE_EVENT_TABLE()
|
|
};
|
|
|
|
// -------------------------------------
|
|
// MyApp
|
|
// -------------------------------------
|
|
|
|
IMPLEMENT_APP(MyApp)
|
|
|
|
bool MyApp::OnInit(void)
|
|
{
|
|
if ( !wxApp::OnInit() )
|
|
return false;
|
|
|
|
// build the first frame
|
|
MyFrame *frame =
|
|
new MyFrame(NULL, wxT("wxDataViewCtrl feature test"), 10, 10, 800, 340);
|
|
frame->Show(true);
|
|
|
|
SetTopWindow(frame);
|
|
return true;
|
|
}
|
|
|
|
int MyApp::OnExit()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
|
|
// -------------------------------------
|
|
// MyFrame
|
|
// -------------------------------------
|
|
|
|
enum
|
|
{
|
|
// file menu
|
|
ID_ABOUT = wxID_ABOUT,
|
|
ID_EXIT = wxID_EXIT,
|
|
};
|
|
|
|
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
|
|
EVT_MENU( ID_ABOUT, MyFrame::OnAbout )
|
|
EVT_MENU( ID_EXIT, MyFrame::OnQuit )
|
|
END_EVENT_TABLE()
|
|
|
|
MyFrame::MyFrame(wxFrame *frame, wxChar *title, int x, int y, int w, int h):
|
|
wxFrame(frame, wxID_ANY, title, wxPoint(x, y), wxSize(w, h))
|
|
{
|
|
SetIcon(wxICON(sample));
|
|
|
|
// build the menus:
|
|
|
|
wxMenu *file_menu = new wxMenu;
|
|
file_menu->Append(ID_ABOUT, "&About");
|
|
file_menu->AppendSeparator();
|
|
file_menu->Append(ID_EXIT, "E&xit");
|
|
|
|
wxMenuBar *menu_bar = new wxMenuBar;
|
|
menu_bar->Append(file_menu, "&File");
|
|
|
|
SetMenuBar(menu_bar);
|
|
CreateStatusBar();
|
|
|
|
m_dataview = new wxDataViewCtrl( this, wxID_ANY, wxDefaultPosition,
|
|
wxDefaultSize );
|
|
|
|
wxObjectDataPtr<MyMusicModel> model(new MyMusicModel);
|
|
m_dataview->AssociateModel( model.get() );
|
|
|
|
m_dataview->AppendTextColumn( "Title", 0, wxDATAVIEW_CELL_INERT, 200,
|
|
DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE );
|
|
m_dataview->AppendTextColumn( "Artist", 1, wxDATAVIEW_CELL_INERT, 200,
|
|
DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE );
|
|
m_dataview->AppendTextColumn( "Year", 2, wxDATAVIEW_CELL_INERT, 50,
|
|
DEFAULT_ALIGN );
|
|
}
|
|
|
|
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
|
|
{
|
|
Close(true);
|
|
}
|
|
|
|
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event) )
|
|
{
|
|
wxAboutDialogInfo info;
|
|
info.SetName(_("DataView sample"));
|
|
info.SetDescription(_("This sample demonstrates the dataview control handling"));
|
|
info.SetCopyright(_T("(C) 2007 Robert Roebling"));
|
|
|
|
wxAboutBox(info);
|
|
}
|
|
|