Patch from Hartwig and me for implementing reorderable dataview columns. Works on OS X and GTK+, breaks OS X a litte

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50919 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
2007-12-26 18:30:56 +00:00
parent 6954e0f6f3
commit 99c75ebc5e
12 changed files with 638 additions and 397 deletions
+14
View File
@@ -82,6 +82,12 @@ Returns the renderer of this wxDataViewColumn.
See also \helpref{wxDataViewRenderer}{wxdataviewrenderer}.
\membersection{wxDataViewColumn::GetReorderable}\label{wxdataviewcolumngetreorderable}
\func{bool}{GetReorderable}{\void}
Returns true if the column is reorderable.
\membersection{wxDataViewColumn::GetSortable}\label{wxdataviewcolumngetsortable}
\func{bool}{GetSortable}{\void}
@@ -116,6 +122,14 @@ Set the alignment of the column header.
Set the bitmap of the column header.
\membersection{wxDataViewColumn::SetReorderable}\label{wxdataviewcolumnsetreorderable}
\func{void}{SetReorderable}{\param{bool }{reorderable}}
Indicate wether the column can be reordered by the
user using the mouse. This is typically implemented
visually by dragging the header button around.
\membersection{wxDataViewColumn::SetSortOrder}\label{wxdataviewcolumnsetsortorder}
\func{void}{SetSortOrder}{\param{bool }{ascending}}
+4 -2
View File
@@ -448,6 +448,7 @@ public:
virtual void SetTitle( const wxString &title ) = 0;
virtual void SetAlignment( wxAlignment align ) = 0;
virtual void SetSortable( bool sortable ) = 0;
virtual void SetReorderable(bool reorderable) = 0;
virtual void SetResizeable( bool resizeable ) = 0;
virtual void SetHidden( bool hidden ) = 0;
virtual void SetSortOrder( bool ascending ) = 0;
@@ -470,9 +471,10 @@ public:
virtual int GetFlags() const;
virtual bool IsSortable() const = 0;
virtual bool IsResizeable() const = 0;
virtual bool IsHidden() const = 0;
virtual bool IsReorderable() const = 0;
virtual bool IsResizeable() const = 0;
virtual bool IsSortable() const = 0;
virtual bool IsSortOrderAscending() const = 0;
const wxBitmap &GetBitmap() const { return m_bitmap; }
+3 -2
View File
@@ -328,7 +328,7 @@ public:
virtual void SetResizeable( bool resizeable );
virtual void SetHidden( bool hidden );
virtual void SetSortOrder( bool ascending );
virtual void SetReorderable( bool reorderable );
// getters:
@@ -347,7 +347,8 @@ public:
virtual bool IsHidden() const
{ return (m_flags & wxDATAVIEW_COL_HIDDEN) != 0; }
virtual bool IsSortOrderAscending() const;
virtual bool IsReorderable() const
{ return (m_flags & wxDATAVIEW_COL_REORDERABLE) != 0; }
private:
int m_width;
+3
View File
@@ -301,6 +301,7 @@ public:
virtual void SetMinWidth( int minWidth );
virtual void SetWidth( int width );
virtual void SetReorderable( bool reorderable );
// getters:
@@ -314,6 +315,8 @@ public:
virtual int GetWidth() const;
virtual int GetMinWidth() const;
virtual bool IsReorderable() const;
// implementation
GtkWidget* GetGtkHandle() { return m_column; }
+37 -15
View File
@@ -140,7 +140,7 @@ public:
OSStatus RemoveColumnByIndex (DataBrowserTableViewColumnIndex index);
OSStatus SetColumnIndex (DataBrowserPropertyID propertyID, DataBrowserTableViewColumnIndex index);
OSStatus SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows=true);
OSStatus SetDisclosureColumn(DataBrowserPropertyID propertyID, Boolean expandableRows=false);
OSStatus SetPropertyFlags (DataBrowserPropertyID propertyID, DataBrowserPropertyFlags flags);
//
@@ -218,17 +218,31 @@ public:
protected :
//
// callback functions
// standard callback functions
//
static pascal Boolean DataBrowserCompareProc (ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
static pascal void DataBrowserDrawItemProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
static pascal OSStatus DataBrowserGetSetItemDataProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue);
static pascal void DataBrowserItemNotificationProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
static pascal Boolean DataBrowserCompareProc (ControlRef browser, DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
static pascal void DataBrowserGetContextualMenuProc(ControlRef browser, MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection);
static pascal OSStatus DataBrowserGetSetItemDataProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue);
static pascal void DataBrowserItemNotificationProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
virtual Boolean DataBrowserCompareProc (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty) = 0;
virtual void DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection) = 0;
virtual OSStatus DataBrowserGetSetItemDataProc (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue) = 0;
virtual void DataBrowserItemNotificationProc (DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData) = 0;
//
// callback functions for customized types
//
static pascal void DataBrowserDrawItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
static pascal Boolean DataBrowserEditItemProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit);
static pascal Boolean DataBrowserHitTestProc (ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect);
static pascal DataBrowserTrackingResult DataBrowserTrackingProc(ControlRef browser, DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers);
virtual void DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice) = 0;
virtual Boolean DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit) = 0;
virtual Boolean DataBrowserHitTestProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect) = 0;
virtual DataBrowserTrackingResult DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers) = 0;
virtual Boolean DataBrowserCompareProc (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty) = 0;
virtual void DataBrowserDrawItemProc (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice) = 0;
virtual OSStatus DataBrowserGetSetItemDataProc (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue) = 0;
virtual void DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData) = 0;
private:
//
// wxWidget internal stuff
@@ -282,12 +296,20 @@ public:
protected:
//
// callback functions (inherited from wxMacDataBrowserTableViewControl)
// standard callback functions (inherited from wxMacDataBrowserTableViewControl)
//
virtual Boolean DataBrowserCompareProc (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
virtual void DataBrowserDrawItemProc (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
virtual void DataBrowserItemNotificationProc(DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
virtual OSStatus DataBrowserGetSetItemDataProc (DataBrowserItemID itemID, DataBrowserPropertyID property, DataBrowserItemDataRef itemData, Boolean getValue);
virtual Boolean DataBrowserCompareProc (DataBrowserItemID itemOneID, DataBrowserItemID itemTwoID, DataBrowserPropertyID sortProperty);
virtual void DataBrowserItemNotificationProc (DataBrowserItemID itemID, DataBrowserItemNotification message, DataBrowserItemDataRef itemData);
virtual void DataBrowserGetContextualMenuProc(MenuRef* menu, UInt32* helpType, CFStringRef* helpItemString, AEDesc* selection);
virtual OSStatus DataBrowserGetSetItemDataProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemDataRef itemData, Boolean getValue);
//
// callback functions for customized types (inherited from wxMacDataBrowserTableViewControl)
//
virtual void DataBrowserDrawItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, DataBrowserItemState state, Rect const* rectangle, SInt16 bitDepth, Boolean colorDevice);
virtual Boolean DataBrowserEditItemProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, CFStringRef theString, Rect* maxEditTextRect, Boolean* shrinkToFit);
virtual Boolean DataBrowserHitTestProc (DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Rect const* mouseRect);
virtual DataBrowserTrackingResult DataBrowserTrackingProc(DataBrowserItemID itemID, DataBrowserPropertyID propertyID, Rect const* theRect, Point startPt, EventModifiers modifiers);
private:
};
+41 -45
View File
@@ -143,42 +143,6 @@ public:
return false;
}
//
// in-place editing
//
virtual void CancelEditing()
{
}
virtual wxControl* CreateEditorCtrl(wxWindow * WXUNUSED(parent), wxRect WXUNUSED(labelRect), const wxVariant& WXUNUSED(value))
{
return NULL;
}
virtual bool FinishEditing()
{
return false;
}
wxControl* GetEditorCtrl(void) const
{
return this->m_editorCtrlPtr;
}
virtual bool GetValueFromEditorCtrl(wxControl* WXUNUSED(editor), wxVariant& WXUNUSED(value))
{
return false;
}
virtual bool HasEditorCtrl(void)
{
return false;
}
virtual bool StartEditing(wxDataViewItem const& WXUNUSED(item), wxRect WXUNUSED(labelRect))
{
return false;
}
//
// device context handling
//
@@ -423,6 +387,10 @@ public:
{
return false; // not implemented
}
virtual bool IsReorderable(void) const
{
return ((this->m_flags & wxDATAVIEW_COL_REORDERABLE) != 0);
}
virtual bool IsResizeable(void) const
{
return ((this->m_flags & wxDATAVIEW_COL_RESIZABLE) != 0);
@@ -442,13 +410,14 @@ public:
virtual void SetHidden(bool WXUNUSED(hidden))
{
}
virtual void SetMaxWidth (int maxWidth);
virtual void SetMinWidth (int minWidth);
virtual void SetResizeable(bool resizeable);
virtual void SetSortable (bool sortable);
virtual void SetSortOrder (bool ascending);
virtual void SetTitle (wxString const& title);
virtual void SetWidth (int width);
virtual void SetMaxWidth (int maxWidth);
virtual void SetMinWidth (int minWidth);
virtual void SetReorderable(bool reorderable);
virtual void SetResizeable (bool resizeable);
virtual void SetSortable (bool sortable);
virtual void SetSortOrder (bool ascending);
virtual void SetTitle (wxString const& title);
virtual void SetWidth (int width);
//
// implementation
@@ -496,7 +465,7 @@ class WXDLLIMPEXP_ADV wxDataViewCtrl: public wxDataViewCtrlBase
{
public:
// Constructors / destructor:
wxDataViewCtrl()
wxDataViewCtrl(void)
{
this->Init();
}
@@ -556,9 +525,22 @@ public:
// adds all children of the passed parent to the control; if 'parentItem' is invalid the root(s) is/are added:
void AddChildrenLevel(wxDataViewItem const& parentItem);
// finishes editing of custom items; if no custom item is currently edited the method does nothing
void FinishCustomItemEditing(void);
// returns a pointer to a column;
// in case the pointer cannot be found NULL is returned:
wxDataViewColumn* GetColumnPtr(WXDataBrowserPropertyID propertyID) const;
// returns the current being rendered item of the customized renderer (this item is only valid during editing)
wxDataViewItem const& GetCustomRendererItem(void) const
{
return this->m_CustomRendererItem;
}
// returns a pointer to a customized renderer (this pointer is only valid during editing)
wxDataViewCustomRenderer* GetCustomRendererPtr(void) const
{
return this->m_CustomRendererPtr;
}
// checks if currently a delete process is running:
bool IsDeleting(void) const
@@ -579,7 +561,17 @@ public:
return this->m_cgContext;
}
/// sets the flag indicating a deletion process:
// sets the currently being edited item of the custom renderer
void SetCustomRendererItem(wxDataViewItem const& NewItem)
{
this->m_CustomRendererItem = NewItem;
}
// sets the custom renderer
void SetCustomRendererPtr(wxDataViewCustomRenderer* NewCustomRendererPtr)
{
this->m_CustomRendererPtr = NewCustomRendererPtr;
}
// sets the flag indicating a deletion process:
void SetDeleting(bool deleting)
{
this->m_Deleting = deleting;
@@ -609,7 +601,11 @@ private:
// try to update data into variables that are already deleted; this flag will ignore all variable update requests during item deletion
void* m_cgContext; // pointer to core graphics context
wxDataViewCustomRenderer* m_CustomRendererPtr; // pointer to a valid custom renderer while editing; this class does NOT own the pointer
wxDataViewItem m_CustomRendererItem; // currently edited item by the customerenderer; it is invalid while not editing
ColumnPointerHashMapType m_ColumnPointers; // all column pointers are stored in a hash map with the property ID as a key
// wxWidget internal stuff:
+73 -66
View File
@@ -153,19 +153,19 @@ public:
MyMusicModel()
{
m_root = new MyMusicModelNode( NULL, "My Music" );
m_pop = new MyMusicModelNode( m_root, "Pop music" );
m_root = new MyMusicModelNode( NULL, wxT("My Music" ));
m_pop = new MyMusicModelNode( m_root, wxT("Pop music") );
m_root->Append( m_pop );
m_pop->Append( new MyMusicModelNode( m_pop,
"You are not alone", "Michael Jackson", 1995 ) );
wxT("You are not alone"), wxT("Michael Jackson"), 1995 ) );
m_pop->Append( new MyMusicModelNode( m_pop,
"Take a bow", "Madonna", 1994 ) );
m_classical = new MyMusicModelNode( m_root, "Classical music" );
wxT("Take a bow"), wxT("Madonna"), 1994 ) );
m_classical = new MyMusicModelNode( m_root, wxT("Classical music") );
m_root->Append( m_classical );
m_classical->Append( new MyMusicModelNode( m_classical,
"Ninth symphony", "Ludwig van Beethoven", 1824 ) );
wxT("Ninth symphony"), wxT("Ludwig van Beethoven"), 1824 ) );
m_classical->Append( new MyMusicModelNode( m_classical,
"German Requiem", "Johannes Brahms", 1868 ) );
wxT("German Requiem"), wxT("Johannes Brahms"), 1868 ) );
m_classicalMusicIsKnownToControl = false;
}
@@ -247,9 +247,9 @@ public:
virtual wxString GetColumnType( unsigned int col ) const
{
if (col == 2)
return "long";
return wxT("long");
return "string";
return wxT("string");
}
virtual void GetValue( wxVariant &variant,
@@ -263,7 +263,7 @@ public:
case 2: variant = (long) node->m_year; break;
default:
{
wxLogError( "MyMusicModel::GetValue: wrong column" );
wxLogError( wxT("MyMusicModel::GetValue: wrong column" ));
// provoke a crash when mouse button down
wxMouseState state = wxGetMouseState();
@@ -285,7 +285,7 @@ public:
case 0: node->m_title = variant.GetString(); return true;
case 1: node->m_artist = variant.GetString(); return true;
case 2: node->m_year = variant.GetLong(); return true;
default: wxLogError( "MyMusicModel::SetValue: wrong column" );
default: wxLogError( wxT("MyMusicModel::SetValue: wrong column") );
}
return false;
}
@@ -384,7 +384,7 @@ public:
for (i = 0; i < 100; i++)
{
wxString str;
str.Printf( "Test %d", i );
str.Printf( wxT("row number %d"), i );
m_array.Add( str );
}
@@ -450,9 +450,14 @@ public:
virtual wxString GetColumnType( unsigned int col ) const
{
if (col == 1)
return "wxDataViewIconText";
return wxT("wxDataViewIconText");
return "string";
return wxT("string");
}
virtual unsigned int GetRowCount()
{
return m_array.GetCount();
}
virtual void GetValue( wxVariant &variant,
@@ -463,7 +468,7 @@ public:
if (row >= m_array.GetCount())
{
wxString str;
str.Printf( "row %d", row - m_array.GetCount() );
str.Printf(wxT("row %d"), row - m_array.GetCount() );
variant = str;
}
else
@@ -473,15 +478,15 @@ public:
} else
if (col==1)
{
wxDataViewIconText data( "test", m_icon );
wxDataViewIconText data( wxT("test"), m_icon );
variant << data;
} else
if (col==2)
{
if (row >= m_array.GetCount())
variant = "plain";
variant = wxT("plain");
else
variant = "blue";
variant = wxT("blue");
}
}
@@ -679,12 +684,12 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
// build the menus:
wxMenu *file_menu = new wxMenu;
file_menu->Append(ID_ABOUT, "&About");
file_menu->Append(ID_ABOUT, wxT("&About"));
file_menu->AppendSeparator();
file_menu->Append(ID_EXIT, "E&xit");
file_menu->Append(ID_EXIT, wxT("E&xit"));
wxMenuBar *menu_bar = new wxMenuBar;
menu_bar->Append(file_menu, "&File");
menu_bar->Append(file_menu, wxT("&File"));
SetMenuBar(menu_bar);
CreateStatusBar();
@@ -697,23 +702,25 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
m_musicCtrl = new wxDataViewCtrl( this, ID_MUSIC_CTRL, wxDefaultPosition,
wxDefaultSize, wxDV_MULTIPLE );
m_music_model = new MyMusicModel;
m_musicCtrl->AssociateModel( m_music_model.get() );
/* wxDataViewColumn *col = */ m_musicCtrl->AppendTextColumn( "Title", 0, wxDATAVIEW_CELL_INERT, 200,
DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE );
#if 0
// Call this and sorting is enabled
// immediatly upon start up.
wxDataViewColumn *col = m_musicCtrl->AppendTextColumn( wxT("Title"), 0, wxDATAVIEW_CELL_INERT, 200,
DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE);
col->SetSortOrder( true );
#else
m_musicCtrl->AppendTextColumn(wxT("Title"),0,wxDATAVIEW_CELL_INERT,200,DEFAULT_ALIGN,wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE);
#endif
m_musicCtrl->AppendTextColumn( "Artist", 1, wxDATAVIEW_CELL_EDITABLE, 150,
DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE );
m_musicCtrl->AppendTextColumn( wxT("Artist"), 1, wxDATAVIEW_CELL_EDITABLE, 150,
DEFAULT_ALIGN, wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE);
wxDataViewSpinRenderer *sr = new wxDataViewSpinRenderer( 0, 2010 );
wxDataViewColumn *column = new wxDataViewColumn( "year", sr, 2, -1, wxALIGN_CENTRE, wxDATAVIEW_COL_SORTABLE );
wxDataViewColumn *column = new wxDataViewColumn( wxT("year"), sr, 2, -1, wxALIGN_CENTRE, wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE);
m_musicCtrl->AppendColumn( column );
data_sizer->Add( m_musicCtrl, 3, wxGROW );
@@ -723,16 +730,16 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
// MyList
m_listCtrl = new wxDataViewCtrl( this, wxID_ANY, wxDefaultPosition,
wxDefaultSize, wxDV_MULTIPLE );
wxDefaultSize, wxDV_MULTIPLE | wxDV_ROW_LINES);
m_list_model = new MyListModel;
m_listCtrl->AssociateModel( m_list_model.get() );
m_listCtrl->AppendTextColumn( "editable string", 0, wxDATAVIEW_CELL_EDITABLE, 120 );
m_listCtrl->AppendIconTextColumn( "icon", 1, wxDATAVIEW_CELL_INERT, 60 );
m_listCtrl->AppendTextColumn (wxT("editable string"), 0, wxDATAVIEW_CELL_EDITABLE, 120 );
m_listCtrl->AppendIconTextColumn(wxT("icon"), 1, wxDATAVIEW_CELL_INERT, 60 );
wxDataViewTextRendererAttr *ra = new wxDataViewTextRendererAttr;
column = new wxDataViewColumn( "attributes", ra, 2 );
column = new wxDataViewColumn(wxT("attributes"), ra, 2 );
m_listCtrl->AppendColumn( column );
data_sizer->Add( m_listCtrl, 2, wxGROW );
@@ -743,24 +750,24 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
button_sizer->Add( new wxButton( this, ID_ADD_MOZART, "Add Mozart"), 0, wxALL, 10 );
button_sizer->Add( new wxButton( this, ID_DELETE_MUSIC, "Delete selected"), 0, wxALL, 10 );
button_sizer->Add( new wxButton( this, ID_DELETE_YEAR, "Delete \"Year\" column"), 0, wxALL, 10 );
button_sizer->Add( new wxButton( this, ID_ADD_MOZART, _("Add Mozart")), 0, wxALL, 10 );
button_sizer->Add( new wxButton( this, ID_DELETE_MUSIC,_("Delete selected")), 0, wxALL, 10 );
button_sizer->Add( new wxButton( this, ID_DELETE_YEAR, _("Delete \"Year\" column")), 0, wxALL, 10 );
button_sizer->Add( 10, 10, 1 );
wxFlexGridSizer *grid_sizer = new wxFlexGridSizer( 2, 2 );
grid_sizer->Add( new wxButton( this, ID_PREPEND_LIST, "Prepend"), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_DELETE_LIST, "Delete selected"), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_GOTO, "Goto 50"), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_ADD_MANY, "Add 1000"), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_PREPEND_LIST,_("Prepend")), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_DELETE_LIST, _("Delete selected")), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_GOTO, _("Goto 50")), 0, wxALL, 2 );
grid_sizer->Add( new wxButton( this, ID_ADD_MANY, _("Add 1000")), 0, wxALL, 2 );
button_sizer->Add( grid_sizer, 0, wxALL, 10 );
main_sizer->Add( button_sizer, 0, wxGROW, 0 );
wxBoxSizer *bottom_sizer = new wxBoxSizer( wxHORIZONTAL );
m_log = new wxTextCtrl( this, -1, "", wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
m_log = new wxTextCtrl( this, -1,wxString(), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE );
m_logOld = wxLog::SetActiveTarget(new wxLogTextCtrl(m_log));
wxLogMessage("This is the log window");
wxLogMessage(_("This is the log window"));
bottom_sizer->Add( m_log, 1, wxGROW );
@@ -770,14 +777,14 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
wxDefaultPosition, wxSize(300,200), wxDV_NO_HEADER );
wxDataViewTreeStore *store = new wxDataViewTreeStore;
wxDataViewItem parent = store->AppendContainer( wxDataViewItem(0), "Root 1", wxIcon(small1_xpm) );
wxDataViewItem child = store->AppendItem( parent, "Child 1", wxIcon(small1_xpm) );
child = store->AppendItem( parent, "Child 2", wxIcon(small1_xpm) );
child = store->AppendItem( parent, "Child 3", wxIcon(small1_xpm) );
wxDataViewItem parent = store->AppendContainer( wxDataViewItem(0),wxT("Root 1"), wxIcon(small1_xpm) );
wxDataViewItem child = store->AppendItem( parent,wxT("Child 1"), wxIcon(small1_xpm) );
child = store->AppendItem( parent,wxT("Child 2"), wxIcon(small1_xpm) );
child = store->AppendItem( parent,wxT("Child 3"), wxIcon(small1_xpm) );
treectrl->AssociateModel( store );
store->DecRef();
treectrl->AppendIconTextColumn( "no label", 0, wxDATAVIEW_CELL_INERT, 200 );
treectrl->AppendIconTextColumn(wxT("no label"), 0, wxDATAVIEW_CELL_INERT, 200 );
bottom_sizer->Add( treectrl );
@@ -789,10 +796,10 @@ MyFrame::MyFrame(wxFrame *frame, const wxString &title, int x, int y, int w, int
ilist->Add( wxIcon(small1_xpm) );
treectrl2->SetImageList( ilist );
parent = treectrl2->AppendContainer( wxDataViewItem(0), "Root 1", 0 );
child = treectrl2->AppendItem( parent, "Child 1", 0 );
child = treectrl2->AppendItem( parent, "Child 2", 0 );
child = treectrl2->AppendItem( parent, "Child 3", 0 );
parent = treectrl2->AppendContainer( wxDataViewItem(0),wxT("Root 1"), 0 );
child = treectrl2->AppendItem( parent,wxT("Child 1"), 0 );
child = treectrl2->AppendItem( parent,wxT("Child 2"), 0 );
child = treectrl2->AppendItem( parent,wxT("Child 3"), 0 );
bottom_sizer->Add( treectrl2 );
@@ -810,7 +817,7 @@ void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event) )
void MyFrame::OnAddMozart(wxCommandEvent& WXUNUSED(event) )
{
m_music_model->AddToClassical( "Kleine Nachtmusik", "Wolfgang Mozart", 1787 );
m_music_model->AddToClassical( wxT("Kleine Nachtmusik"), wxT("Wolfgang Mozart"), 1787 );
}
void MyFrame::OnDeleteMusic(wxCommandEvent& WXUNUSED(event) )
@@ -830,7 +837,7 @@ void MyFrame::OnDeleteYear( wxCommandEvent& WXUNUSED(event) )
void MyFrame::OnPrependList( wxCommandEvent& WXUNUSED(event) )
{
m_list_model->Prepend( "Test" );
m_list_model->Prepend(wxT("Test"));
}
void MyFrame::OnDeleteList( wxCommandEvent& WXUNUSED(event) )
@@ -846,7 +853,7 @@ void MyFrame::OnValueChanged( wxDataViewEvent &event )
if (!m_log)
return;
wxLogMessage( "EVT_DATAVIEW_ITEM_VALUE_CHANGED, Item Id: %d; Column: %d", event.GetItem().GetID(), event.GetColumn() );
wxLogMessage( wxT("EVT_DATAVIEW_ITEM_VALUE_CHANGED, Item Id: %d; Column: %d"), event.GetItem().GetID(), event.GetColumn() );
}
void MyFrame::OnActivated( wxDataViewEvent &event )
@@ -855,7 +862,7 @@ void MyFrame::OnActivated( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED, Item: %s"), title.GetData());
}
void MyFrame::OnSelectionChanged( wxDataViewEvent &event )
@@ -865,9 +872,9 @@ void MyFrame::OnSelectionChanged( wxDataViewEvent &event )
wxString title = m_music_model->GetTitle( event.GetItem() );
if (title.empty())
title = "None";
title = wxT("None");
wxLogMessage("wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, First selected Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, First selected Item: %s"), title.GetData() );
}
void MyFrame::OnExpanding( wxDataViewEvent &event )
@@ -876,7 +883,7 @@ void MyFrame::OnExpanding( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING, Item: %s"), title.GetData() );
}
@@ -886,7 +893,7 @@ void MyFrame::OnEditingStarted( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED, Item: %s"), title.GetData() );
}
void MyFrame::OnEditingDone( wxDataViewEvent &event )
@@ -895,7 +902,7 @@ void MyFrame::OnEditingDone( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE, Item: %s"), title.GetData() );
}
void MyFrame::OnExpanded( wxDataViewEvent &event )
@@ -904,7 +911,7 @@ void MyFrame::OnExpanded( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED, Item: %s"), title.GetData() );
}
void MyFrame::OnCollapsing( wxDataViewEvent &event )
@@ -913,7 +920,7 @@ void MyFrame::OnCollapsing( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING, Item: %s"), title.GetData() );
}
void MyFrame::OnCollapsed( wxDataViewEvent &event )
@@ -922,7 +929,7 @@ void MyFrame::OnCollapsed( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED, Item: %s"),title.GetData());
}
void MyFrame::OnContextMenu( wxDataViewEvent &event )
@@ -931,7 +938,7 @@ void MyFrame::OnContextMenu( wxDataViewEvent &event )
return;
wxString title = m_music_model->GetTitle( event.GetItem() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, Item: %s", title );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU, Item: %s"),title.GetData());
}
void MyFrame::OnHeaderClick( wxDataViewEvent &event )
@@ -941,7 +948,7 @@ void MyFrame::OnHeaderClick( wxDataViewEvent &event )
int pos = m_musicCtrl->GetColumnPosition( event.GetDataViewColumn() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, Column position: %d", pos );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK, Column position: %d"), pos );
}
void MyFrame::OnHeaderRightClick( wxDataViewEvent &event )
@@ -951,7 +958,7 @@ void MyFrame::OnHeaderRightClick( wxDataViewEvent &event )
int pos = m_musicCtrl->GetColumnPosition( event.GetDataViewColumn() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, Column position: %d", pos );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK, Column position: %d"), pos );
}
void MyFrame::OnSorted( wxDataViewEvent &event )
@@ -961,7 +968,7 @@ void MyFrame::OnSorted( wxDataViewEvent &event )
int pos = m_musicCtrl->GetColumnPosition( event.GetDataViewColumn() );
wxLogMessage("wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, Column position: %d", pos );
wxLogMessage(wxT("wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED, Column position: %d"), pos );
}
void MyFrame::OnRightClick( wxMouseEvent &event )
@@ -969,7 +976,7 @@ void MyFrame::OnRightClick( wxMouseEvent &event )
if(!m_log)
return;
wxLogMessage("wxEVT_MOUSE_RIGHT_UP, Click Point is X: %d, Y: %d", event.GetX(), event.GetY());
wxLogMessage(wxT("wxEVT_MOUSE_RIGHT_UP, Click Point is X: %d, Y: %d"), event.GetX(), event.GetY());
}
void MyFrame::OnGoto(wxCommandEvent& WXUNUSED(event))
+6 -5
View File
@@ -40,7 +40,7 @@ bool operator == (const wxDataViewItem &left, const wxDataViewItem &right)
#ifdef __WXDEBUG__
void wxDataViewItem::Print(const wxString& text) const
{
wxPrintf("item %s: %l\n", text, (long)m_id);
wxPrintf(wxT("item %s: %l\n"), text.GetData(), (long)m_id);
}
#endif
@@ -801,6 +801,7 @@ 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);
}
// ---------------------------------------------------------
@@ -1162,7 +1163,7 @@ DEFINE_EVENT_TYPE(wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED)
// -------------------------------------
wxDataViewSpinRenderer::wxDataViewSpinRenderer( int min, int max, wxDataViewCellMode mode, int alignment ) :
wxDataViewCustomRenderer( "long", mode, alignment )
wxDataViewCustomRenderer(wxT("long"), mode, alignment )
{
m_min = min;
m_max = max;
@@ -1186,7 +1187,7 @@ bool wxDataViewSpinRenderer::GetValueFromEditorCtrl( wxControl* editor, wxVarian
bool wxDataViewSpinRenderer::Render( wxRect rect, wxDC *dc, int state )
{
wxString str;
str.Printf( "%d", (int) m_data );
str.Printf(wxT("%d"), (int) m_data );
RenderText( str, 0, rect, dc, state );
return true;
}
@@ -1647,12 +1648,12 @@ wxDataViewTreeCtrl::wxDataViewTreeCtrl( wxWindow *parent, wxWindowID id,
store->DecRef();
#if !defined(__WXGTK20__) || defined(wxUSE_GENERICDATAVIEWCTRL)
wxDataViewColumn *col = AppendIconTextColumn( "", 0, wxDATAVIEW_CELL_INERT, 40 );
wxDataViewColumn *col = AppendIconTextColumn(wxString(),0,wxDATAVIEW_CELL_INERT,40);
wxSize cient_size = GetClientSize();
col->SetWidth( size.x );
#else
AppendIconTextColumn( "", 0, wxDATAVIEW_CELL_INERT, 40 );
AppendIconTextColumn(wxString(),0,wxDATAVIEW_CELL_INERT,40);
#endif
}
+5
View File
@@ -1199,6 +1199,11 @@ void wxDataViewColumn::SetSortable( bool sortable )
GetOwner()->OnColumnChange();
}
void wxDataViewColumn::SetReorderable( bool reorderable )
{
// TODO
}
void wxDataViewColumn::SetSortOrder( bool ascending )
{
m_ascending = ascending;
+9
View File
@@ -2509,6 +2509,15 @@ void wxDataViewColumn::SetWidth( int width )
gtk_tree_view_column_set_fixed_width( GTK_TREE_VIEW_COLUMN(m_column), width );
}
void wxDataViewColumn::SetReorderable( bool reorderable )
{
gtk_tree_view_column_set_reorderable( GTK_TREE_VIEW_COLUMN(m_column), reorderable );
}
bool wxDataViewColumn::IsReorderable() const
{
return gtk_tree_view_column_get_reorderable( GTK_TREE_VIEW_COLUMN(m_column) );
}
//-----------------------------------------------------------------------------
// wxGtkTreeModelNode
File diff suppressed because it is too large Load Diff
+169 -99
View File
@@ -84,7 +84,11 @@ static pascal OSStatus wxMacDataViewCtrlEventHandler(EventHandlerCallRef handler
DataViewEvent.SetColumn(columnIndex);
DataViewEvent.SetDataViewColumn(DataViewCtrlPtr->GetColumn(columnIndex));
// finally sent the equivalent wxWidget event:
#if wxCHECK_VERSION(2,9,0)
DataViewCtrlPtr->HandleWindowEvent(DataViewEvent);
#else
DataViewCtrlPtr->GetEventHandler()->ProcessEvent(DataViewEvent);
#endif
return ::CallNextEventHandler(handler,EventReference);
} /* if */
else
@@ -113,29 +117,18 @@ static DataBrowserItemID* CreateDataBrowserItemIDArray(size_t& noOfEntries, wxDa
return itemIDs;
} /* CreateDataBrowserItemIDArray(size_t&, wxDataViewItemArray const&) */
#if wxCHECK_VERSION(2,9,0)
static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxCFStringRef const& title)
#else
static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDescription, wxDataViewColumn const* columnPtr, DataBrowserPropertyID columnPropertyID, wxMacCFStringHolder const& title)
#endif
{
// set properties for the column:
columnDescription.propertyDesc.propertyID = columnPropertyID;
columnDescription.propertyDesc.propertyType = columnPtr->GetRenderer()->GetPropertyType();
columnDescription.propertyDesc.propertyFlags = kDataBrowserListViewSelectionColumn; // make the column selectable
if (columnPtr->IsSortable())
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
#if 0
if (columnPtr->IsMovable())
if (columnPtr->IsReorderable())
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewMovableColumn;
#endif
if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
if ((columnDescription.propertyDesc.propertyType == kDataBrowserTextType) ||
(columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
(columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType))
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
#endif
// set header's properties:
columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
if (columnPtr->IsResizeable())
{
columnDescription.headerBtnDesc.minimumWidth = 0;
@@ -146,6 +139,20 @@ static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDes
columnDescription.headerBtnDesc.minimumWidth = columnPtr->GetWidth();
columnDescription.headerBtnDesc.maximumWidth = columnPtr->GetWidth();
} /* if */
if (columnPtr->IsSortable())
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewSortableColumn;
if (columnPtr->GetRenderer()->GetMode() == wxDATAVIEW_CELL_EDITABLE)
columnDescription.propertyDesc.propertyFlags |= kDataBrowserPropertyIsEditable;
if ((columnDescription.propertyDesc.propertyType == kDataBrowserCustomType) ||
(columnDescription.propertyDesc.propertyType == kDataBrowserDateTimeType) ||
(columnDescription.propertyDesc.propertyType == kDataBrowserIconAndTextType) ||
(columnDescription.propertyDesc.propertyType == kDataBrowserTextType))
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewTypeSelectColumn; // enables generally the possibility to have user input for the mentioned types
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
columnDescription.propertyDesc.propertyFlags |= kDataBrowserListViewNoGapForIconInHeaderButton;
#endif
// set header's properties:
columnDescription.headerBtnDesc.version = kDataBrowserListViewLatestHeaderDesc;
columnDescription.headerBtnDesc.titleOffset = 0;
columnDescription.headerBtnDesc.titleString = ::CFStringCreateCopy(kCFAllocatorDefault,title);
columnDescription.headerBtnDesc.initialOrder = kDataBrowserOrderIncreasing; // choose one of the orders as "undefined" is not supported anyway (s. ControlDefs.h in the HIToolbox framework)
@@ -169,10 +176,14 @@ static bool InitializeColumnDescription(DataBrowserListViewColumnDesc& columnDes
columnDescription.headerBtnDesc.btnFontStyle.style = normal;
columnDescription.headerBtnDesc.btnContentInfo.contentType = kControlContentIconRef;
if (columnPtr->GetBitmap().Ok())
#if wxCHECK_VERSION(2,9,0)
columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetIconRef();
#else
columnDescription.headerBtnDesc.btnContentInfo.u.iconRef = columnPtr->GetBitmap().GetBitmapData()->GetIconRef();
#endif
// done:
return true;
} /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxCFStringRef const&) */
} /* InitializeColumnDescription(DataBrowserListViewColumnDesc&, wxDataViewColumn const*, DataBrowserPropertyID, wxMacCFStringHolder const&) */
//-----------------------------------------------------------------------------
// local function pointers
@@ -238,7 +249,11 @@ public:
dataViewEvent.SetEventObject(dataViewCtrlPtr);
dataViewEvent.SetItem(item);
// sent the equivalent wxWidget event:
#if wxCHECK_VERSION(2,9,0)
dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
#else
dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
#endif
// done
return true;
} /* if */
@@ -270,7 +285,11 @@ public:
for (size_t i=0; i<noOfEntries; ++i)
{
dataViewEvent.SetItem(reinterpret_cast<void*>(itemIDs[i]));
#if wxCHECK_VERSION(2,9,0)
dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
#else
dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
#endif
} /* for */
} /* if */
// release allocated array space:
@@ -357,7 +376,11 @@ public:
dataViewEvent.SetColumn(col);
dataViewEvent.SetItem(item);
// send the equivalent wxWidget event:
#if wxCHECK_VERSION(2,9,0)
dataViewCtrlPtr->HandleWindowEvent(dataViewEvent);
#else
dataViewCtrlPtr->GetEventHandler()->ProcessEvent(dataViewEvent);
#endif
// done
return true;
} /* if */
@@ -450,7 +473,7 @@ wxDataViewCustomRenderer::~wxDataViewCustomRenderer(void)
void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
{
wxDataViewCtrl *view = GetOwner()->GetOwner();
wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? *wxWHITE : view->GetForegroundColour();
wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT) : view->GetForegroundColour();
dc->SetTextForeground(col);
dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
}
@@ -495,15 +518,15 @@ wxDataViewTextRenderer::wxDataViewTextRenderer(wxString const& varianttype, wxDa
bool wxDataViewTextRenderer::Render(void)
{
if (this->GetValue().GetType() == this->GetVariantType())
{
// variable definition:
wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Text renderer cannot render value; value type: ")) << this->GetValue().GetType());
return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
} /* if */
else
return false;
// variable definition:
#if wxCHECK_VERSION(2,9,0)
wxCFStringRef cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
#else
wxMacCFStringHolder cfString(this->GetValue().GetString(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
#endif
return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
} /* wxDataViewTextRenderer::Render(void) */
WXDataBrowserPropertyType wxDataViewTextRenderer::GetPropertyType(void) const
@@ -534,19 +557,25 @@ wxDataViewBitmapRenderer::wxDataViewBitmapRenderer(wxString const& varianttype,
}
bool wxDataViewBitmapRenderer::Render(void)
// This method returns 'true' if
// - the passed bitmap is valid and it could be assigned to the native data browser;
// - the passed bitmap is invalid (or is not initialized); this case simulates a non-existing bitmap.
// In all other cases the method returns 'false'.
{
if (this->GetValue().GetType() == this->GetVariantType())
{
wxBitmap bitmap;
bitmap << this->GetValue();
if (bitmap.Ok())
return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr);
else
return true;
} /* if */
wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Bitmap renderer cannot render value; value type: ")) << this->GetValue().GetType());
// variable definition:
wxBitmap bitmap;
bitmap << this->GetValue();
if (bitmap.Ok())
#if wxCHECK_VERSION(2,9,0)
return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetIconRef()) == noErr);
#else
return (::SetDataBrowserItemDataIcon(this->GetDataReference(),bitmap.GetBitmapData()->GetIconRef()) == noErr);
#endif
else
return false;
return true;
} /* wxDataViewBitmapRenderer::Render(void) */
WXDataBrowserPropertyType wxDataViewBitmapRenderer::GetPropertyType(void) const
@@ -567,26 +596,24 @@ wxDataViewIconTextRenderer::wxDataViewIconTextRenderer(wxString const& variantty
bool wxDataViewIconTextRenderer::Render(void)
{
if (this->GetValue().GetType() == this->GetVariantType())
{
// variable definition:
wxDataViewIconText iconText;
iconText << this->GetValue();
wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Icon & text renderer cannot render value; value type: ")) << this->GetValue().GetType());
// variable definition:
wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
// variable definition:
wxDataViewIconText iconText;
iconText << this->GetValue();
if (iconText.GetIcon().IsOk())
{
if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
return false;
}
return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
} /* if */
else
return false;
// variable definition:
#if wxCHECK_VERSION(2,9,0)
wxCFStringRef cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
#else
wxMacCFStringHolder cfString(iconText.GetText(),(this->GetView()->GetFont().Ok() ? this->GetView()->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
#endif
if (iconText.GetIcon().IsOk())
if (::SetDataBrowserItemDataIcon(this->GetDataReference(),MAC_WXHICON(iconText.GetIcon().GetHICON())) != noErr)
return false;
return (::SetDataBrowserItemDataText(this->GetDataReference(),cfString) == noErr);
} /* wxDataViewIconTextRenderer::Render(void) */
WXDataBrowserPropertyType wxDataViewIconTextRenderer::GetPropertyType(void) const
@@ -608,10 +635,8 @@ wxDataViewToggleRenderer::wxDataViewToggleRenderer(wxString const& varianttype,
bool wxDataViewToggleRenderer::Render(void)
{
if (this->GetValue().GetType() == this->GetVariantType())
return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr);
else
return false;
wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Toggle renderer cannot render value; value type: ")) << this->GetValue().GetType());
return (::SetDataBrowserItemDataButtonValue(this->GetDataReference(),this->GetValue().GetBool()) == noErr);
} /* wxDataViewToggleRenderer::Render(void) */
WXDataBrowserPropertyType wxDataViewToggleRenderer::GetPropertyType(void) const
@@ -632,12 +657,10 @@ wxDataViewProgressRenderer::wxDataViewProgressRenderer(wxString const& label, wx
bool wxDataViewProgressRenderer::Render(void)
{
if (this->GetValue().GetType() == this->GetVariantType())
return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(), 0) == noErr) &&
(::SetDataBrowserItemDataMaximum(this->GetDataReference(),100) == noErr) &&
(::SetDataBrowserItemDataValue (this->GetDataReference(),this->GetValue().GetLong()) == noErr));
else
return false;
wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Progress renderer cannot render value type; value type: ")) << this->GetValue().GetType());
return ((::SetDataBrowserItemDataMinimum(this->GetDataReference(), 0) == noErr) &&
(::SetDataBrowserItemDataMaximum(this->GetDataReference(),100) == noErr) &&
(::SetDataBrowserItemDataValue (this->GetDataReference(),this->GetValue().GetLong()) == noErr));
} /* wxDataViewProgressRenderer::Render(void) */
WXDataBrowserPropertyType wxDataViewProgressRenderer::GetPropertyType(void) const
@@ -658,10 +681,8 @@ wxDataViewDateRenderer::wxDataViewDateRenderer(wxString const& varianttype, wxDa
bool wxDataViewDateRenderer::Render(void)
{
if (this->GetValue().GetType() == this->GetVariantType())
return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
else
return false;
wxCHECK_MSG(this->GetValue().GetType() == this->GetVariantType(),false,wxString(_("Date renderer cannot render value; value type: ")) << this->GetValue().GetType());
return (::SetDataBrowserItemDataDateTime(this->GetDataReference(),this->GetValue().GetDateTime().Subtract(wxDateTime(1,wxDateTime::Jan,1904)).GetSeconds().GetLo()) == noErr);
} /* wxDataViewDateRenderer::Render(void) */
WXDataBrowserPropertyType wxDataViewDateRenderer::GetPropertyType(void) const
@@ -676,14 +697,14 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewDateRenderer,wxDataViewRenderer)
// ---------------------------------------------------------
#pragma mark -
wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags)
:wxDataViewColumnBase(title,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true),
:wxDataViewColumnBase(title,cell,model_column,width,align,flags), m_ascending(true),
m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN)), m_maxWidth(30000), m_minWidth(0), m_width(width >= 0 ? width : wxDVC_DEFAULT_WIDTH),
m_alignment(align), m_title(title)
{
} /* wxDataViewColumn::wxDataViewColumn(wxString const &title, wxDataViewRenderer*, unsigned int, int, wxAlignment, int) */
wxDataViewColumn::wxDataViewColumn(wxBitmap const& bitmap, wxDataViewRenderer *cell, unsigned int model_column, int width, wxAlignment align, int flags)
:wxDataViewColumnBase(bitmap,cell,model_column,width,wxALIGN_CENTER,flags), m_ascending(true),
:wxDataViewColumnBase(bitmap,cell,model_column,width,align,flags), m_ascending(true),
m_flags(flags & ~(wxDATAVIEW_COL_HIDDEN)), m_maxWidth(30000), m_minWidth(0), m_width(width >= 0 ? width : wxDVC_DEFAULT_WIDTH),
m_alignment(align)
{
@@ -744,7 +765,11 @@ void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
if (this->GetBitmap().Ok())
#if wxCHECK_VERSION(2,9,0)
headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetIconRef();
#else
headerDescription.btnContentInfo.u.iconRef = this->GetBitmap().GetBitmapData()->GetIconRef();
#endif
else
headerDescription.btnContentInfo.u.iconRef = NULL;
wxCHECK_RET(macDataViewListCtrlPtr->SetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not set icon."));
@@ -754,9 +779,10 @@ void wxDataViewColumn::SetBitmap(wxBitmap const& bitmap)
void wxDataViewColumn::SetFlags(int flags)
{
this->SetHidden ((flags & wxDATAVIEW_COL_HIDDEN) != 0);
this->SetResizeable((flags & wxDATAVIEW_COL_RESIZABLE) != 0);
this->SetSortable ((flags & wxDATAVIEW_COL_SORTABLE) != 0);
this->SetHidden ((flags & wxDATAVIEW_COL_HIDDEN) != 0);
this->SetReorderable((flags & wxDATAVIEW_COL_REORDERABLE) != 0);
this->SetResizeable ((flags & wxDATAVIEW_COL_RESIZABLE) != 0);
this->SetSortable ((flags & wxDATAVIEW_COL_SORTABLE) != 0);
} /* wxDataViewColumn::SetFlags(int) */
void wxDataViewColumn::SetMaxWidth(int maxWidth)
@@ -805,38 +831,59 @@ void wxDataViewColumn::SetMinWidth(int minWidth)
} /* if */
} /* wxDataViewColumn::SetMaxWidth(int) */
void wxDataViewColumn::SetReorderable(bool reorderable)
{
// first set the internal flag of the column:
if (reorderable)
this->m_flags |= wxDATAVIEW_COL_REORDERABLE;
else
this->m_flags &= ~wxDATAVIEW_COL_REORDERABLE;
// if the column is associated with a control change also immediately the flags of the control:
wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
if (dataViewCtrlPtr != NULL)
{
// variable definition and initialization:
DataBrowserPropertyFlags flags;
wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
if (reorderable)
flags |= kDataBrowserListViewMovableColumn;
else
flags &= ~kDataBrowserListViewMovableColumn;
wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
} /* if */
} /* wxDataViewColumn::SetReorderable(bool) */
void wxDataViewColumn::SetResizeable(bool WXUNUSED(resizeable))
{
} /* wxDataViewColumn::SetResizeable(bool) */
void wxDataViewColumn::SetSortable(bool sortable)
{
// variable definition and initialization:
wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner());
// first set the internal flag of the column:
if (sortable)
this->m_flags |= wxDATAVIEW_COL_SORTABLE;
else
this->m_flags &= ~wxDATAVIEW_COL_SORTABLE;
// if the column is associated with a control change also immediately the flags of the control:
wxDataViewCtrl* dataViewCtrlPtr(this->GetOwner()); // variable definition and initialization
if (dataViewCtrlPtr != NULL)
{
// variable definition and initialization:
DataBrowserPropertyFlags flags;
wxMacDataViewDataBrowserListViewControlPointer macDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(dataViewCtrlPtr->GetPeer()));
if (macDataViewListCtrlPtr != NULL)
{
// variable definition and initialization:
DataBrowserPropertyFlags flags;
wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
if (sortable)
{
this->m_flags |= wxDATAVIEW_COL_SORTABLE;
flags |= kDataBrowserListViewSortableColumn;
} /* if */
else
{
this->m_flags &= ~wxDATAVIEW_COL_SORTABLE;
flags &= ~kDataBrowserPropertyIsEditable;
} /* if */
wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
} /* if */
wxCHECK_RET(macDataViewListCtrlPtr != NULL, _("Valid pointer to native data view control does not exist"));
wxCHECK_RET(macDataViewListCtrlPtr->GetPropertyFlags(this->GetPropertyID(),&flags) == noErr,_("Could not get property flags."));
if (sortable)
flags |= kDataBrowserListViewSortableColumn;
else
flags &= ~kDataBrowserListViewSortableColumn;
wxCHECK_RET(macDataViewListCtrlPtr->SetPropertyFlags(this->GetPropertyID(),flags) == noErr,_("Could not set property flags."));
} /* if */
} /* wxDataViewColumn::SetSortable(bool) */
@@ -882,7 +929,11 @@ void wxDataViewColumn::SetTitle(wxString const& title)
{
// variable definition and initialization:
DataBrowserListViewHeaderDesc headerDescription;
#if wxCHECK_VERSION(2,9,0)
wxCFStringRef cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
#else
wxMacCFStringHolder cfTitle(title,(dataViewCtrlPtr->GetFont().Ok() ? dataViewCtrlPtr->GetFont().GetEncoding() : wxLocale::GetSystemEncoding()));
#endif
wxCHECK_RET(macDataViewListCtrlPtr->GetHeaderDesc(this->GetPropertyID(),&headerDescription) == noErr,_("Could not get header description."));
headerDescription.titleString = cfTitle;
@@ -918,9 +969,10 @@ IMPLEMENT_ABSTRACT_CLASS(wxDataViewColumn,wxDataViewColumnBase)
#pragma mark -
void wxDataViewCtrl::Init(void)
{
this->m_Deleting = false;
this->m_macIsUserPane = false;
this->m_cgContext = NULL;
this->m_CustomRendererPtr = NULL;
this->m_Deleting = false;
this->m_macIsUserPane = false;
this->m_cgContext = NULL;
} /* wxDataViewCtrl::Init(void) */
bool wxDataViewCtrl::Create(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator )
@@ -961,7 +1013,11 @@ bool wxDataViewCtrl::AppendColumn(wxDataViewColumn* columnPtr)
wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
#if wxCHECK_VERSION(2,9,0)
wxCFStringRef title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
#else
wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
#endif
// first, some error checking:
@@ -1077,7 +1133,11 @@ bool wxDataViewCtrl::PrependColumn(wxDataViewColumn* columnPtr)
wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
#if wxCHECK_VERSION(2,9,0)
wxCFStringRef title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
#else
wxMacCFStringHolder title(columnPtr->GetTitle(),this->m_font.Ok() ? this->m_font.GetEncoding() : wxLocale::GetSystemEncoding());
#endif
// first, some error checking:
@@ -1335,6 +1395,16 @@ void wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const& parentItem)
#endif
} /* wxDataViewCtrl::AddChildrenLevel(wxDataViewItem const&) */
void wxDataViewCtrl::FinishCustomItemEditing(void)
{
if (this->GetCustomRendererItem().IsOk())
{
this->GetCustomRendererPtr()->FinishEditing();
this->SetCustomRendererItem(wxDataViewItem());
this->SetCustomRendererPtr (NULL);
} /* if */
} /* wxDataViewCtrl::FinishCustomItemEditing(void) */
wxDataViewColumn* wxDataViewCtrl::GetColumnPtr(WXDataBrowserPropertyID propertyID) const
{
// variable definition:
@@ -1354,7 +1424,7 @@ void wxDataViewCtrl::DoSetExpanderColumn(void)
// variable definition and initialization:
wxMacDataViewDataBrowserListViewControlPointer MacDataViewListCtrlPtr(dynamic_cast<wxMacDataViewDataBrowserListViewControlPointer>(this->m_peer));
(void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID());
(void) MacDataViewListCtrlPtr->SetDisclosureColumn(this->GetExpanderColumn()->GetPropertyID(),false); // second parameter explicitely passed to ensure that arrow is centered
} /* if */
} /* wxDataViewCtrl::DoSetExpanderColumn(void) */