X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1c4293cb91327247ad69e6ec8d589bfaa299db28..079f4130b861d094c79e0952966caad8b85dab67:/src/propgrid/editors.cpp diff --git a/src/propgrid/editors.cpp b/src/propgrid/editors.cpp index 6e677a242f..570ec33a80 100644 --- a/src/propgrid/editors.cpp +++ b/src/propgrid/editors.cpp @@ -4,7 +4,7 @@ // Author: Jaakko Salli // Modified by: // Created: 2007-04-14 -// RCS-ID: $Id: +// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli // Licence: wxWindows license ///////////////////////////////////////////////////////////////////////////// @@ -16,6 +16,8 @@ #pragma hdrstop #endif +#if wxUSE_PROPGRID + #ifndef WX_PRECOMP #include "wx/defs.h" #include "wx/object.h" @@ -39,7 +41,6 @@ #include "wx/stattext.h" #include "wx/scrolwin.h" #include "wx/dirdlg.h" - #include "wx/layout.h" #include "wx/sizer.h" #include "wx/textdlg.h" #include "wx/filedlg.h" @@ -57,36 +58,33 @@ // This define is necessary to prevent macro clearing #define __wxPG_SOURCE_FILE__ -#include -#include -#include +#include "wx/propgrid/propgrid.h" +#include "wx/propgrid/editors.h" +#include "wx/propgrid/props.h" #if wxPG_USE_RENDERER_NATIVE - #include + #include "wx/renderer.h" #endif // How many pixels between textctrl and button #ifdef __WXMAC__ - #define wxPG_TEXTCTRL_AND_BUTTON_SPACING 8 + #define wxPG_TEXTCTRL_AND_BUTTON_SPACING 4 #else #define wxPG_TEXTCTRL_AND_BUTTON_SPACING 2 #endif #define wxPG_BUTTON_SIZEDEC 0 -#include +#include "wx/odcombo.h" #ifdef __WXMSW__ - #include + #include "wx/msw/private.h" #endif // ----------------------------------------------------------------------- #if defined(__WXMSW__) // tested - #define wxPG_NAT_TEXTCTRL_BORDER_X 0 // Unremovable border of native textctrl. - #define wxPG_NAT_TEXTCTRL_BORDER_Y 0 // Unremovable border of native textctrl. - #define wxPG_NAT_BUTTON_BORDER_ANY 1 #define wxPG_NAT_BUTTON_BORDER_X 1 #define wxPG_NAT_BUTTON_BORDER_Y 1 @@ -107,9 +105,6 @@ #define wxPG_CHECKMARK_HADJ (-1) #define wxPG_CHECKMARK_DEFLATE 3 - #define wxPG_NAT_TEXTCTRL_BORDER_X 3 // Unremovable border of native textctrl. - #define wxPG_NAT_TEXTCTRL_BORDER_Y 3 // Unremovable border of native textctrl. - #define wxPG_NAT_BUTTON_BORDER_ANY 1 #define wxPG_NAT_BUTTON_BORDER_X 1 #define wxPG_NAT_BUTTON_BORDER_Y 1 @@ -124,14 +119,11 @@ #define wxPG_CHECKMARK_HADJ 0 #define wxPG_CHECKMARK_DEFLATE 0 - #define wxPG_NAT_TEXTCTRL_BORDER_X 0 // Unremovable border of native textctrl. - #define wxPG_NAT_TEXTCTRL_BORDER_Y 0 // Unremovable border of native textctrl. - #define wxPG_NAT_BUTTON_BORDER_ANY 0 #define wxPG_NAT_BUTTON_BORDER_X 0 #define wxPG_NAT_BUTTON_BORDER_Y 0 - #define wxPG_TEXTCTRLYADJUST 3 + #define wxPG_TEXTCTRLYADJUST 0 #else // defaults @@ -141,9 +133,6 @@ #define wxPG_CHECKMARK_HADJ 0 #define wxPG_CHECKMARK_DEFLATE 0 - #define wxPG_NAT_TEXTCTRL_BORDER_X 0 // Unremovable border of native textctrl. - #define wxPG_NAT_TEXTCTRL_BORDER_Y 0 // Unremovable border of native textctrl. - #define wxPG_NAT_BUTTON_BORDER_ANY 0 #define wxPG_NAT_BUTTON_BORDER_X 0 #define wxPG_NAT_BUTTON_BORDER_Y 0 @@ -152,16 +141,14 @@ #endif -#if (!wxPG_NAT_TEXTCTRL_BORDER_X && !wxPG_NAT_TEXTCTRL_BORDER_Y) - #define wxPG_ENABLE_CLIPPER_WINDOW 0 -#else - #define wxPG_ENABLE_CLIPPER_WINDOW 1 -#endif - - // for odcombo +#ifdef __WXMAC__ +#define wxPG_CHOICEXADJUST -3 // required because wxComboCtrl reserves 3pixels for wxTextCtrl's focus ring +#define wxPG_CHOICEYADJUST -3 +#else #define wxPG_CHOICEXADJUST 0 #define wxPG_CHOICEYADJUST 0 +#endif #define ODCB_CUST_PAINT_MARGIN 6 // Number added to image width for SetCustomPaintWidth @@ -180,6 +167,11 @@ wxPGEditor::~wxPGEditor() { } +wxString wxPGEditor::GetName() const +{ + return GetClassInfo()->GetClassName(); +} + void wxPGEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* property, const wxString& text ) const { if ( !property->IsValueUnspecified() ) @@ -223,200 +215,11 @@ bool wxPGEditor::CanContainCustomImage() const return false; } -// ----------------------------------------------------------------------- -// wxPGClipperWindow -// ----------------------------------------------------------------------- - - -#if wxPG_ENABLE_CLIPPER_WINDOW - -// -// Clipper window is used to "remove" borders from controls -// which otherwise insist on having them despite of supplied -// wxNO_BORDER window style. -// -class wxPGClipperWindow : public wxWindow -{ - DECLARE_CLASS(wxPGClipperWindow) -public: - - wxPGClipperWindow() - : wxWindow() - { - wxPGClipperWindow::Init(); - } - - wxPGClipperWindow(wxWindow* parent, - wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize) - { - Init(); - Create(parent,id,pos,size); - } - - void Create(wxWindow* parent, - wxWindowID id, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize); - - virtual ~wxPGClipperWindow(); - - virtual bool ProcessEvent(wxEvent& event); - - inline wxWindow* GetControl() const { return m_ctrl; } - - // This is called before wxControl is constructed. - void GetControlRect( int xadj, int yadj, wxPoint& pt, wxSize& sz ); - - // This is caleed after wxControl has been constructed. - void SetControl( wxWindow* ctrl ); - - virtual void Refresh( bool eraseBackground = true, - const wxRect *rect = (const wxRect *) NULL ); - virtual void SetFocus(); - - virtual bool SetFont(const wxFont& font); - - inline int GetXClip() const { return m_xadj; } - - inline int GetYClip() const { return m_yadj; } - -protected: - wxWindow* m_ctrl; - - int m_xadj; // Horizontal border clip. - - int m_yadj; // Vertical border clip. - -private: - void Init () - { - m_ctrl = (wxWindow*) NULL; - } -}; - - -IMPLEMENT_CLASS(wxPGClipperWindow,wxWindow) - - -// This is called before wxControl is constructed. -void wxPGClipperWindow::GetControlRect( int xadj, int yadj, wxPoint& pt, wxSize& sz ) -{ - m_xadj = xadj; - m_yadj = yadj; - pt.x = -xadj; - pt.y = -yadj; - wxSize own_size = GetSize(); - sz.x = own_size.x+(xadj*2); - sz.y = own_size.y+(yadj*2); -} - - -// This is caleed after wxControl has been constructed. -void wxPGClipperWindow::SetControl( wxWindow* ctrl ) -{ - m_ctrl = ctrl; - - // GTK requires this. - ctrl->SetSizeHints(3,3); - - // Correct size of this window to match the child. - wxSize sz = GetSize(); - wxSize chsz = ctrl->GetSize(); - - int hei_adj = chsz.y - (sz.y+(m_yadj*2)); - if ( hei_adj ) - SetSize(sz.x,chsz.y-(m_yadj*2)); - -} - - -void wxPGClipperWindow::Refresh( bool eraseBackground, const wxRect *rect ) -{ - wxWindow::Refresh(false,rect); - if ( m_ctrl ) - m_ctrl->Refresh(eraseBackground); -} - - -// Pass focus to control -void wxPGClipperWindow::SetFocus() -{ - if ( m_ctrl ) - m_ctrl->SetFocus(); - else - wxWindow::SetFocus(); -} - - -bool wxPGClipperWindow::SetFont(const wxFont& font) -{ - bool res = wxWindow::SetFont(font); - if ( m_ctrl ) - return m_ctrl->SetFont(font); - return res; -} - - -void wxPGClipperWindow::Create(wxWindow* parent, - wxWindowID id, - const wxPoint& pos, - const wxSize& size ) -{ - wxWindow::Create(parent,id,pos,size); -} - - -wxPGClipperWindow::~wxPGClipperWindow() -{ -} - - -bool wxPGClipperWindow::ProcessEvent(wxEvent& event) -{ - if ( event.GetEventType() == wxEVT_SIZE ) - { - if ( m_ctrl ) - { - // Maintain correct size relationship. - wxSize sz = GetSize(); - m_ctrl->SetSize(sz.x+(m_xadj*2),sz.y+(m_yadj*2)); - event.Skip(); - return false; - } - } - return wxWindow::ProcessEvent(event); -} - -#endif // wxPG_ENABLE_CLIPPER_WINDOW - -/*wxWindow* wxPropertyGrid::GetActualEditorControl( wxWindow* ctrl ) -{ -#if wxPG_ENABLE_CLIPPER_WINDOW - // Pass real control instead of clipper window - if ( ctrl->IsKindOf(CLASSINFO(wxPGClipperWindow)) ) - { - return ((wxPGClipperWindow*)ctrl)->GetControl(); - } -#else - return ctrl; -#endif -}*/ - // ----------------------------------------------------------------------- // wxPGTextCtrlEditor // ----------------------------------------------------------------------- -// Clipper window support macro (depending on whether it is used -// for this editor or not) -#if wxPG_NAT_TEXTCTRL_BORDER_X || wxPG_NAT_TEXTCTRL_BORDER_Y - #define wxPG_NAT_TEXTCTRL_BORDER_ANY 1 -#else - #define wxPG_NAT_TEXTCTRL_BORDER_ANY 0 -#endif - -WX_PG_IMPLEMENT_EDITOR_CLASS(TextCtrl,wxPGTextCtrlEditor,wxPGEditor) +WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(TextCtrl,wxPGTextCtrlEditor,wxPGEditor) wxPGWindowList wxPGTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid, @@ -433,7 +236,8 @@ wxPGWindowList wxPGTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid, return (wxWindow*) NULL; if ( !property->IsValueUnspecified() ) - text = property->GetValueString(property->HasFlag(wxPG_PROP_READONLY)?0:wxPG_EDITABLE_VALUE); + text = property->GetValueAsString(property->HasFlag(wxPG_PROP_READONLY) ? + 0 : wxPG_EDITABLE_VALUE); int flags = 0; if ( (property->GetFlags() & wxPG_PROP_PASSWORD) && @@ -469,7 +273,8 @@ void wxPGTextCtrlEditor::DrawValue( wxDC& dc, wxPGProperty* property, const wxRe void wxPGTextCtrlEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const { - wxTextCtrl* tc = wxStaticCast(ctrl, wxTextCtrl); + wxTextCtrl* tc = wxDynamicCast(ctrl, wxTextCtrl); + if (!tc) return; wxString s; @@ -478,9 +283,22 @@ void wxPGTextCtrlEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) else s = property->GetDisplayedString(); - tc->SetValue(s); -} + tc->SetValue(s); + // Update font boldness + wxPropertyGrid* pg = property->GetGrid(); + if ( pg->HasFlag(wxPG_BOLD_MODIFIED) ) + { + if ( property->HasFlag(wxPG_PROP_MODIFIED) ) + tc->SetFont(pg->GetCaptionFont()); + else + tc->SetFont(pg->GetFont()); + +#if defined(__WXMSW__) && !defined(__WXWINCE__) + ::SendMessage(GetHwndOf(tc), EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0)); +#endif + } +} // Provided so that, for example, ComboBox editor can use the same code // (multiple inheritance would get way too messy). @@ -592,7 +410,7 @@ wxPGTextCtrlEditor::~wxPGTextCtrlEditor() { } // ----------------------------------------------------------------------- -WX_PG_IMPLEMENT_EDITOR_CLASS(Choice,wxPGChoiceEditor,wxPGEditor) +WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(Choice,wxPGChoiceEditor,wxPGEditor) // This is a special enhanced double-click processor class. @@ -723,31 +541,37 @@ public: name ) ) return false; - m_dclickProcessor = new wxPGDoubleClickProcessor(this, GetGrid()->GetSelection() ); + m_dclickProcessor = new + wxPGDoubleClickProcessor( this, GetGrid()->GetSelection() ); PushEventHandler(m_dclickProcessor); return true; } - virtual void OnDrawItem( wxDC& dc, const wxRect& rect, int item, int flags ) const + virtual void OnDrawItem( wxDC& dc, + const wxRect& rect, + int item, + int flags ) const { wxPropertyGrid* pg = GetGrid(); - pg->OnComboItemPaint((wxPGCustomComboControl*)this,item,dc,(wxRect&)rect,flags); + pg->OnComboItemPaint( this, item, &dc, (wxRect&)rect, flags ); } + virtual wxCoord OnMeasureItem( size_t item ) const { wxPropertyGrid* pg = GetGrid(); wxRect rect; rect.x = -1; rect.width = 0; - pg->OnComboItemPaint((wxPGCustomComboControl*)this,item,*((wxDC*)NULL),rect,0); + pg->OnComboItemPaint( this, item, NULL, rect, 0 ); return rect.height; } wxPropertyGrid* GetGrid() const { - wxPropertyGrid* pg = wxDynamicCast(GetParent()->GetParent(),wxPropertyGrid); + wxPropertyGrid* pg = wxDynamicCast(GetParent()->GetParent(), + wxPropertyGrid); wxASSERT(pg); return pg; } @@ -758,15 +582,17 @@ public: wxRect rect; rect.x = -1; rect.width = -1; - pg->OnComboItemPaint((wxPGCustomComboControl*)this,item,*((wxDC*)NULL),rect,0); + pg->OnComboItemPaint( this, item, NULL, rect, 0 ); return rect.width; } - virtual void PositionTextCtrl( int WXUNUSED(textCtrlXAdjust), int WXUNUSED(textCtrlYAdjust) ) + virtual void PositionTextCtrl( int WXUNUSED(textCtrlXAdjust), + int WXUNUSED(textCtrlYAdjust) ) { wxPropertyGrid* pg = GetGrid(); wxOwnerDrawnComboBox::PositionTextCtrl( - wxPG_TEXTCTRLXADJUST - (wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1) - 1, + wxPG_TEXTCTRLXADJUST - + (wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1) - 1, pg->GetSpacingY() + 2 ); } @@ -777,25 +603,27 @@ private: }; -void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, +void wxPropertyGrid::OnComboItemPaint( const wxPGComboBox* pCb, int item, - wxDC& dc, + wxDC* pDc, wxRect& rect, int flags ) { - wxPGComboBox* pCb = (wxPGComboBox*)pCc; - // Sanity check wxASSERT( IsKindOf(CLASSINFO(wxPropertyGrid)) ); wxPGProperty* p = m_selected; wxString text; - const wxPGChoices* pChoices = &p->GetChoices(); + const wxPGChoices& choices = p->GetChoices(); const wxPGCommonValue* comVal = NULL; - int choiceCount = p->GetChoiceCount(); int comVals = p->GetDisplayedCommonValueCount(); int comValIndex = -1; + + int choiceCount = 0; + if ( choices.IsOk() ) + choiceCount = choices.GetCount(); + if ( item >= choiceCount && comVals > 0 ) { comValIndex = item - choiceCount; @@ -812,7 +640,7 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, else { if ( !p->IsValueUnspecified() ) - text = p->GetValueString(0); + text = p->GetValueAsString(0); } } @@ -823,8 +651,8 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, const wxBitmap* itemBitmap = NULL; - if ( item >= 0 && pChoices && pChoices->Item(item).GetBitmap().Ok() && comValIndex == -1 ) - itemBitmap = &pChoices->Item(item).GetBitmap(); + if ( item >= 0 && choices.IsOk() && choices.Item(item).GetBitmap().Ok() && comValIndex == -1 ) + itemBitmap = &choices.Item(item).GetBitmap(); // // Decide what custom image size to use @@ -860,21 +688,24 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, if ( (flags & wxODCB_PAINTING_CONTROL) ) paintdata.m_choiceItem = -1; - if ( &dc ) - dc.SetBrush(*wxWHITE_BRUSH); + if ( pDc ) + pDc->SetBrush(*wxWHITE_BRUSH); if ( rect.x >= 0 ) { // // DrawItem call + wxDC& dc = *pDc; wxPoint pt(rect.x + wxPG_CONTROL_MARGIN - wxPG_CHOICEXADJUST - 1, rect.y + 1); - int renderFlags = 0; + int renderFlags = wxPGCellRenderer::DontUseCellColours; if ( flags & wxODCB_PAINTING_CONTROL ) renderFlags |= wxPGCellRenderer::Control; + else + renderFlags |= wxPGCellRenderer::ChoicePopup; if ( flags & wxODCB_PAINTING_SELECTED ) renderFlags |= wxPGCellRenderer::Selected; @@ -926,9 +757,9 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, if ( item < 0 && (flags & wxODCB_PAINTING_CONTROL) ) item = pCb->GetSelection(); - if ( pChoices && item >= 0 && comValIndex < 0 ) + if ( choices.IsOk() && item >= 0 && comValIndex < 0 ) { - const wxPGChoiceEntry& cell = pChoices->Item(item); + const wxPGChoiceEntry& cell = choices.Item(item); wxPGCellRenderer* renderer = wxPGGlobalVars->m_defaultRenderer; int imageOffset = renderer->PreDrawCell( dc, rect, cell, renderFlags ); if ( imageOffset ) @@ -951,6 +782,7 @@ void wxPropertyGrid::OnComboItemPaint( wxPGCustomComboControl* pCc, { // // MeasureItem call + wxDC& dc = *pDc; p->OnCustomPaint( dc, rect, paintdata ); rect.height = paintdata.m_drawnHeight + 2; @@ -989,20 +821,15 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, const wxSize& sz, long extraStyle ) const { - wxString defString; - - // Get choices. - int index = property->GetChoiceInfo( NULL ); + const wxPGChoices& choices = property->GetChoices(); + wxString defString; + int index = property->GetChoiceSelection(); bool isUnspecified = property->IsValueUnspecified(); - if ( isUnspecified ) - index = -1; - else + if ( !isUnspecified ) defString = property->GetDisplayedString(); - const wxPGChoices& choices = property->GetChoices(); - wxArrayString labels = choices.GetLabels(); wxPGComboBox* cb; @@ -1016,7 +843,7 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, si.x -= wxPG_CHOICEXADJUST; wxWindow* ctrlParent = propGrid->GetPanel(); - int odcbFlags = extraStyle | wxNO_BORDER | wxTE_PROCESS_ENTER; + int odcbFlags = extraStyle | wxBORDER_NONE | wxTE_PROCESS_ENTER; // // If common value specified, use appropriate index @@ -1049,20 +876,10 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, labels, odcbFlags); - //int extRight = propGrid->GetClientSize().x - (po.x+si.x); - //int extRight = - (po.x+si.x); - cb->SetButtonPosition(si.y,0,wxRIGHT); - //cb->SetPopupExtents( 1, extRight ); cb->SetTextIndent(wxPG_XBEFORETEXT-1); wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() ); - /*if ( property->GetFlags() & wxPG_PROP_CUSTOMIMAGE ) - { - wxSize imageSize = propGrid->GetImageSize(property, index); - if ( imageSize.x ) imageSize.x += ODCB_CUST_PAINT_MARGIN; - cb->SetCustomPaintWidth( imageSize.x ); - }*/ if ( index >= 0 && index < (int)cb->GetCount() ) { @@ -1088,7 +905,7 @@ void wxPGChoiceEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) c wxASSERT( ctrl ); wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; wxASSERT( cb->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox))); - int ind = property->GetChoiceInfo( (wxPGChoiceInfo*)NULL ); + int ind = property->GetChoiceSelection(); cb->SetSelection(ind); } @@ -1161,7 +978,7 @@ bool wxPGChoiceEditor::GetValueFromControl( wxVariant& variant, wxPGProperty* pr int index = cb->GetSelection(); - if ( index != property->GetChoiceInfo( (wxPGChoiceInfo*) NULL ) || + if ( index != property->GetChoiceSelection() || // Changing unspecified always causes event (returning // true here should be enough to trigger it). property->IsValueUnspecified() @@ -1210,13 +1027,15 @@ wxPGChoiceEditor::~wxPGChoiceEditor() { } // ----------------------------------------------------------------------- -WX_PG_IMPLEMENT_EDITOR_CLASS(ComboBox,wxPGComboBoxEditor,wxPGChoiceEditor) +WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(ComboBox, + wxPGComboBoxEditor, + wxPGChoiceEditor) void wxPGComboBoxEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const { wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; - cb->SetValue(property->GetValueString(wxPG_EDITABLE_VALUE)); + cb->SetValue(property->GetValueAsString(wxPG_EDITABLE_VALUE)); // TODO: If string matches any selection, then select that. } @@ -1289,8 +1108,9 @@ wxPGComboBoxEditor::~wxPGComboBoxEditor() { } // ----------------------------------------------------------------------- -// This simpler implement_editor macro doesn't define class body. -WX_PG_IMPLEMENT_EDITOR_CLASS(ChoiceAndButton,wxPGChoiceAndButtonEditor,wxPGChoiceEditor) +WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(ChoiceAndButton, + wxPGChoiceAndButtonEditor, + wxPGChoiceEditor) wxPGWindowList wxPGChoiceAndButtonEditor::CreateControls( wxPropertyGrid* propGrid, @@ -1321,7 +1141,7 @@ wxPGWindowList wxPGChoiceAndButtonEditor::CreateControls( wxPropertyGrid* propGr ch_sz.x -= wxPG_TEXTCTRL_AND_BUTTON_SPACING; #endif - wxWindow* ch = wxPG_EDITOR(Choice)->CreateControls(propGrid,property, + wxWindow* ch = wxPGEditor_Choice->CreateControls(propGrid,property, pos,ch_sz).m_primary; #ifdef __WXMSW__ @@ -1339,9 +1159,9 @@ wxPGChoiceAndButtonEditor::~wxPGChoiceAndButtonEditor() { } // wxPGTextCtrlAndButtonEditor // ----------------------------------------------------------------------- - -// This simpler implement_editor macro doesn't define class body. -WX_PG_IMPLEMENT_EDITOR_CLASS(TextCtrlAndButton,wxPGTextCtrlAndButtonEditor,wxPGTextCtrlEditor) +WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(TextCtrlAndButton, + wxPGTextCtrlAndButtonEditor, + wxPGTextCtrlEditor) wxPGWindowList wxPGTextCtrlAndButtonEditor::CreateControls( wxPropertyGrid* propGrid, @@ -1366,7 +1186,9 @@ wxPGTextCtrlAndButtonEditor::~wxPGTextCtrlAndButtonEditor() { } #if wxPG_INCLUDE_CHECKBOX -WX_PG_IMPLEMENT_EDITOR_CLASS(CheckBox,wxPGCheckBoxEditor,wxPGEditor) +WX_PG_IMPLEMENT_INTERNAL_EDITOR_CLASS(CheckBox, + wxPGCheckBoxEditor, + wxPGEditor) // state argument: 0x01 = set if checked @@ -1432,7 +1254,7 @@ public: wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize ) - : wxControl(parent,id,pos,size,wxNO_BORDER|wxWANTS_CHARS) + : wxControl(parent,id,pos,size,wxBORDER_NONE|wxWANTS_CHARS) { // Due to SetOwnFont stuff necessary for GTK+ 1.2, we need to have this SetFont( parent->GetFont() ); @@ -1482,7 +1304,7 @@ void wxSimpleCheckBox::SetValue( int value ) wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent()->GetParent(); wxASSERT( propGrid->IsKindOf(CLASSINFO(wxPropertyGrid)) ); - propGrid->OnCustomEditorEvent(evt); + propGrid->HandleCustomEditorEvent(evt); } @@ -1491,14 +1313,6 @@ bool wxSimpleCheckBox::ProcessEvent(wxEvent& event) wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent()->GetParent(); wxASSERT( propGrid->IsKindOf(CLASSINFO(wxPropertyGrid)) ); - if ( event.GetEventType() == wxEVT_NAVIGATION_KEY ) - { - //wxLogDebug(wxT("wxEVT_NAVIGATION_KEY")); - //SetFocusFromKbd(); - //event.Skip(); - //return wxControl::ProcessEvent(event); - } - else if ( ( (event.GetEventType() == wxEVT_LEFT_DOWN || event.GetEventType() == wxEVT_LEFT_DCLICK) && ((wxMouseEvent&)event).m_x > (wxPG_XBEFORETEXT-2) && ((wxMouseEvent&)event).m_x <= (wxPG_XBEFORETEXT-2+m_boxHeight) ) @@ -1569,12 +1383,6 @@ bool wxSimpleCheckBox::ProcessEvent(wxEvent& event) { wxKeyEvent& keyEv = (wxKeyEvent&) event; - if ( keyEv.GetKeyCode() == WXK_TAB ) - { - propGrid->SendNavigationKeyEvent( keyEv.ShiftDown()?0:1 ); - return true; - } - else if ( keyEv.GetKeyCode() == WXK_SPACE ) { SetValue(2); @@ -1599,15 +1407,7 @@ wxPGWindowList wxPGCheckBoxEditor::CreateControls( wxPropertyGrid* propGrid, cb->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW)); - cb->Connect( wxPG_SUBID1, wxEVT_LEFT_DOWN, - (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) - &wxPropertyGrid::OnCustomEditorEvent, NULL, propGrid ); - - cb->Connect( wxPG_SUBID1, wxEVT_LEFT_DCLICK, - (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) - &wxPropertyGrid::OnCustomEditorEvent, NULL, propGrid ); - - if ( property->GetChoiceInfo((wxPGChoiceInfo*)NULL) && + if ( property->GetChoiceSelection() > 0 && !property->IsValueUnspecified() ) cb->m_state = 1; @@ -1666,7 +1466,7 @@ void wxPGCheckBoxEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* int state = 0; if ( !property->IsValueUnspecified() ) { - state = property->GetChoiceInfo((wxPGChoiceInfo*)NULL); + state = property->GetChoiceSelection(); if ( dc.GetFont().GetWeight() == wxBOLD ) state |= 2; } DrawSimpleCheckBox(dc,rect,dc.GetCharHeight(),state,dc.GetTextForeground()); @@ -1675,7 +1475,7 @@ void wxPGCheckBoxEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* void wxPGCheckBoxEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) const { wxASSERT( ctrl ); - ((wxSimpleCheckBox*)ctrl)->m_state = property->GetChoiceInfo((wxPGChoiceInfo*)NULL); + ((wxSimpleCheckBox*)ctrl)->m_state = property->GetChoiceSelection(); ctrl->Refresh(); } @@ -1697,7 +1497,7 @@ bool wxPGCheckBoxEditor::GetValueFromControl( wxVariant& variant, wxPGProperty* int index = cb->m_state; - if ( index != property->GetChoiceInfo( (wxPGChoiceInfo*) NULL ) || + if ( index != property->GetChoiceSelection() || // Changing unspecified always causes event (returning // true here should be enough to trigger it). property->IsValueUnspecified() @@ -1738,14 +1538,6 @@ wxWindow* wxPropertyGrid::GetEditorControl() const if ( !ctrl ) return ctrl; - // If it's clipper window, return its child instead -#if wxPG_ENABLE_CLIPPER_WINDOW - if ( ctrl->IsKindOf(CLASSINFO(wxPGClipperWindow)) ) - { - return ((wxPGClipperWindow*)ctrl)->GetControl(); - } -#endif - return ctrl; } @@ -1798,6 +1590,9 @@ void wxPropertyGrid::CorrectEditorWidgetSizeX() void wxPropertyGrid::CorrectEditorWidgetPosY() { + if ( m_selColumn == -1 ) + return; + if ( m_selected && (m_wndEditor || m_wndEditor2) ) { wxRect r = GetEditorWidgetRect(m_selected, m_selColumn); @@ -1823,29 +1618,6 @@ void wxPropertyGrid::CorrectEditorWidgetPosY() // ----------------------------------------------------------------------- -bool wxPropertyGrid::AdjustPosForClipperWindow( wxWindow* topCtrlWnd, int* x, int* y ) -{ -#if wxPG_ENABLE_CLIPPER_WINDOW - // Take clipper window into account - if (topCtrlWnd->GetPosition().x < 1 && - !topCtrlWnd->IsKindOf(CLASSINFO(wxPGClipperWindow))) - { - topCtrlWnd = topCtrlWnd->GetParent(); - wxASSERT( topCtrlWnd->IsKindOf(CLASSINFO(wxPGClipperWindow)) ); - *x -= ((wxPGClipperWindow*)topCtrlWnd)->GetXClip(); - *y -= ((wxPGClipperWindow*)topCtrlWnd)->GetYClip(); - return true; - } -#else - wxUnusedVar(topCtrlWnd); - wxUnusedVar(x); - wxUnusedVar(y); -#endif - return false; -} - -// ----------------------------------------------------------------------- - // Fixes position of wxTextCtrl-like control (wxSpinCtrl usually // fits into that category as well). void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl, const wxPoint& offset ) @@ -1881,6 +1653,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, int extraStyle, int maxLen ) { + wxWindowID id = wxPG_SUBID1; wxPGProperty* selected = m_selected; wxASSERT(selected); @@ -1894,7 +1667,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, // Need to reduce width of text control on Mac #if defined(__WXMAC__) - s.x -= 8; + s.x -= 8; #endif // Take button into acccount @@ -1910,46 +1683,20 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, if ( (sz.y - m_lineHeight) > 5 ) hasSpecialSize = true; -#if wxPG_NAT_TEXTCTRL_BORDER_ANY - - // Create clipper window - wxPGClipperWindow* wnd = new wxPGClipperWindow(); -#if defined(__WXMSW__) - wnd->Hide(); -#endif - wnd->Create(GetPanel(),wxPG_SUBID1,p,s); - - // This generates rect of the control inside the clipper window - if ( !hasSpecialSize ) - wnd->GetControlRect(wxPG_NAT_TEXTCTRL_BORDER_X, wxPG_NAT_TEXTCTRL_BORDER_Y, p, s); - else - wnd->GetControlRect(0, 0, p, s); - - wxWindow* ctrlParent = wnd; - -#else - wxWindow* ctrlParent = GetPanel(); if ( !hasSpecialSize ) - tcFlags |= wxNO_BORDER; - -#endif + tcFlags |= wxBORDER_NONE; wxTextCtrl* tc = new wxTextCtrl(); -#if defined(__WXMSW__) && !wxPG_NAT_TEXTCTRL_BORDER_ANY +#if defined(__WXMSW__) tc->Hide(); #endif SetupTextCtrlValue(value); - tc->Create(ctrlParent,wxPG_SUBID1,value, p, s,tcFlags); - -#if wxPG_NAT_TEXTCTRL_BORDER_ANY - wxWindow* ed = wnd; - wnd->SetControl(tc); -#else + tc->Create(ctrlParent,id,value, p, s,tcFlags); + wxWindow* ed = tc; -#endif // Center the control vertically if ( !hasSpecialSize ) @@ -1972,6 +1719,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize& sz ) { + wxWindowID id = wxPG_SUBID2; wxPGProperty* selected = m_selected; wxASSERT(selected); @@ -1984,7 +1732,7 @@ wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize wxSize s(25, -1); wxButton* but = new wxButton(); - but->Create(GetPanel(),wxPG_SUBID2,wxS("..."),p,s,wxWANTS_CHARS); + but->Create(GetPanel(),id,wxS("..."),p,s,wxWANTS_CHARS); // Now that we know the size, move to the correct position p.x = pos.x + sz.x - but->GetSize().x - 2; @@ -1998,16 +1746,28 @@ wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize if ( s.x > m_lineHeight ) s.x = m_lineHeight; +#ifdef __WXGTK__ + // On wxGTK, take fixed button margins into account + if ( s.x < 25 ) + s.x = 25; +#endif + wxPoint p(pos.x+sz.x-s.x, pos.y+wxPG_BUTTON_SIZEDEC-wxPG_NAT_BUTTON_BORDER_Y); wxButton* but = new wxButton(); -#ifdef __WXMSW__ + #ifdef __WXMSW__ but->Hide(); -#endif - but->Create(GetPanel(),wxPG_SUBID2,wxS("..."),p,s,wxWANTS_CHARS); - - but->SetFont( m_captionFont ); + #endif + but->Create(GetPanel(),id,wxS("..."),p,s,wxWANTS_CHARS); + + #ifdef __WXGTK__ + wxFont font = GetFont(); + font.SetPointSize(font.GetPointSize()-2); + but->SetFont(font); + #else + but->SetFont(GetFont()); + #endif #endif if ( selected->HasFlag(wxPG_PROP_READONLY) ) @@ -2039,7 +1799,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrlAndButton( const wxPoint& pos, wxString text; if ( !property->IsValueUnspecified() ) - text = property->GetValueString(property->HasFlag(wxPG_PROP_READONLY)?0:wxPG_EDITABLE_VALUE); + text = property->GetValueAsString(property->HasFlag(wxPG_PROP_READONLY)?0:wxPG_EDITABLE_VALUE); return GenerateEditorTextCtrl(pos,sz,text,but,property->m_maxLen); } @@ -2110,6 +1870,12 @@ wxPGMultiButton::wxPGMultiButton( wxPropertyGrid* pg, const wxSize& sz ) SetBackgroundColour(pg->GetCellBackgroundColour()); } +void wxPGMultiButton::Finalize( wxPropertyGrid* WXUNUSED(propGrid), + const wxPoint& pos ) +{ + Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y ); +} + int wxPGMultiButton::GenId( int id ) const { if ( id < -1 ) @@ -2147,3 +1913,5 @@ void wxPGMultiButton::Add( const wxString& label, int id ) } // ----------------------------------------------------------------------- + +#endif // wxUSE_PROPGRID