X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3e6d8c311868c2bce749c4d4922e2efb8e3f019a..62795f413a7222863b4aee76c08764071f94bd87:/src/propgrid/editors.cpp?ds=sidebyside diff --git a/src/propgrid/editors.cpp b/src/propgrid/editors.cpp index 21262e302d..3b0d7973fe 100644 --- a/src/propgrid/editors.cpp +++ b/src/propgrid/editors.cpp @@ -4,9 +4,8 @@ // Author: Jaakko Salli // Modified by: // Created: 2007-04-14 -// RCS-ID: $Id$ // Copyright: (c) Jaakko Salli -// Licence: wxWindows license +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // For compilers that support precompilation, includes "wx/wx.h". @@ -95,10 +94,10 @@ #elif defined(__WXGTK__) // tested - #define wxPG_CHECKMARK_XADJ 0 - #define wxPG_CHECKMARK_YADJ 0 - #define wxPG_CHECKMARK_WADJ (-1) - #define wxPG_CHECKMARK_HADJ (-1) + #define wxPG_CHECKMARK_XADJ 1 + #define wxPG_CHECKMARK_YADJ 1 + #define wxPG_CHECKMARK_WADJ (-2) + #define wxPG_CHECKMARK_HADJ (-2) #define wxPG_CHECKMARK_DEFLATE 3 #define wxPG_NAT_BUTTON_BORDER_ANY 1 @@ -109,10 +108,10 @@ #elif defined(__WXMAC__) // *not* tested - #define wxPG_CHECKMARK_XADJ 0 - #define wxPG_CHECKMARK_YADJ 0 - #define wxPG_CHECKMARK_WADJ 0 - #define wxPG_CHECKMARK_HADJ 0 + #define wxPG_CHECKMARK_XADJ 4 + #define wxPG_CHECKMARK_YADJ 4 + #define wxPG_CHECKMARK_WADJ -6 + #define wxPG_CHECKMARK_HADJ -6 #define wxPG_CHECKMARK_DEFLATE 0 #define wxPG_NAT_BUTTON_BORDER_ANY 0 @@ -149,7 +148,7 @@ // Number added to image width for SetCustomPaintWidth #define ODCB_CUST_PAINT_MARGIN 6 -// Milliseconds to wait for two mouse-ups after focus inorder +// Milliseconds to wait for two mouse-ups after focus in order // to trigger a double-click. #define DOUBLE_CLICK_CONVERSION_TRESHOLD 500 @@ -212,18 +211,18 @@ void wxPGEditor::SetControlAppearance( wxPropertyGrid* pg, wxWindow* ctrl, const wxPGCell& cell, const wxPGCell& oCell, - bool WXUNUSED(unspecified) ) const + bool unspecified ) const { // Get old editor appearance wxTextCtrl* tc = NULL; wxComboCtrl* cb = NULL; - if ( ctrl->IsKindOf(CLASSINFO(wxTextCtrl)) ) + if ( wxDynamicCast(ctrl, wxTextCtrl) ) { tc = (wxTextCtrl*) ctrl; } else { - if ( ctrl->IsKindOf(CLASSINFO(wxComboCtrl)) ) + if ( wxDynamicCast(ctrl, wxComboCtrl) ) { cb = (wxComboCtrl*) ctrl; tc = cb->GetTextCtrl(); @@ -262,6 +261,9 @@ void wxPGEditor::SetControlAppearance( wxPropertyGrid* pg, } } + // Do not make the mistake of calling GetClassDefaultAttributes() + // here. It is static, while GetDefaultAttributes() is virtual + // and the correct one to use. wxVisualAttributes vattrs = ctrl->GetDefaultAttributes(); // Foreground colour @@ -298,7 +300,8 @@ void wxPGEditor::SetControlAppearance( wxPropertyGrid* pg, } // Also call the old SetValueToUnspecified() - SetValueToUnspecified(property, ctrl); + if ( unspecified ) + SetValueToUnspecified(property, ctrl); } void wxPGEditor::SetValueToUnspecified( wxPGProperty* WXUNUSED(property), @@ -339,7 +342,7 @@ wxPGWindowList wxPGTextCtrlEditor::CreateControls( wxPropertyGrid* propGrid, int flags = 0; if ( (property->GetFlags() & wxPG_PROP_PASSWORD) && - property->IsKindOf(CLASSINFO(wxStringProperty)) ) + wxDynamicCast(property, wxStringProperty) ) flags |= wxTE_PASSWORD; wxWindow* wnd = propGrid->GenerateEditorTextCtrl(pos,sz,text,NULL,flags, @@ -402,14 +405,14 @@ bool wxPGTextCtrlEditor::OnTextCtrlEvent( wxPropertyGrid* propGrid, if ( !ctrl ) return false; - if ( event.GetEventType() == wxEVT_COMMAND_TEXT_ENTER ) + if ( event.GetEventType() == wxEVT_TEXT_ENTER ) { if ( propGrid->IsEditorsValueModified() ) { return true; } } - else if ( event.GetEventType() == wxEVT_COMMAND_TEXT_UPDATED ) + else if ( event.GetEventType() == wxEVT_TEXT ) { // // Pass this event outside wxPropertyGrid so that, @@ -440,7 +443,7 @@ bool wxPGTextCtrlEditor::GetTextCtrlValueFromControl( wxVariant& variant, wxPGPr wxTextCtrl* tc = wxStaticCast(ctrl, wxTextCtrl); wxString textVal = tc->GetValue(); - if ( property->UsesAutoUnspecified() && !textVal.length() ) + if ( property->UsesAutoUnspecified() && textVal.empty() ) { variant.MakeNull(); return true; @@ -482,8 +485,8 @@ void wxPGTextCtrlEditor_OnFocus( wxPGProperty* property, wxTextCtrl* tc ) { // Make sure there is correct text (instead of unspecified value - // indicator or inline help) - int flags = property->HasFlag(wxPG_PROP_READONLY) ? + // indicator or hint text) + int flags = property->HasFlag(wxPG_PROP_READONLY) ? 0 : wxPG_EDITABLE_VALUE; wxString correctText = property->GetValueAsString(flags); @@ -493,9 +496,9 @@ void wxPGTextCtrlEditor_OnFocus( wxPGProperty* property, tc->SetValue(correctText); } - tc->SetSelection(-1,-1); + tc->SelectAll(); } - + void wxPGTextCtrlEditor::OnFocus( wxPGProperty* property, wxWindow* wnd ) const { @@ -503,7 +506,12 @@ void wxPGTextCtrlEditor::OnFocus( wxPGProperty* property, wxPGTextCtrlEditor_OnFocus(property, tc); } -wxPGTextCtrlEditor::~wxPGTextCtrlEditor() { } +wxPGTextCtrlEditor::~wxPGTextCtrlEditor() +{ + // Reset the global pointer. Useful when wxPropertyGrid is accessed + // from an external main loop. + wxPG_EDITOR(TextCtrl) = NULL; +} // ----------------------------------------------------------------------- @@ -538,7 +546,7 @@ protected: int evtType = event.GetEventType(); if ( m_property->HasFlag(wxPG_PROP_USE_DCC) && - m_property->IsKindOf(CLASSINFO(wxBoolProperty)) && + wxDynamicCast(m_property, wxBoolProperty) && !m_combo->IsPopupShown() ) { // Just check that it is in the text area @@ -656,7 +664,17 @@ public: int flags ) const { wxPropertyGrid* pg = GetGrid(); - pg->OnComboItemPaint( this, item, &dc, (wxRect&)rect, flags ); + + // Handle hint text via super class + if ( (flags & wxODCB_PAINTING_CONTROL) && + ShouldUseHintText(flags) ) + { + wxOwnerDrawnComboBox::OnDrawItem(dc, rect, item, flags); + } + else + { + pg->OnComboItemPaint( this, item, &dc, (wxRect&)rect, flags ); + } } virtual wxCoord OnMeasureItem( size_t item ) const @@ -713,9 +731,6 @@ void wxPropertyGrid::OnComboItemPaint( const wxPGComboBox* pCb, wxRect& rect, int flags ) { - // Sanity check - wxASSERT( IsKindOf(CLASSINFO(wxPropertyGrid)) ); - wxPGProperty* p = GetSelection(); wxString text; @@ -755,7 +770,7 @@ void wxPropertyGrid::OnComboItemPaint( const wxPGComboBox* pCb, const wxBitmap* itemBitmap = NULL; - if ( item >= 0 && choices.IsOk() && choices.Item(item).GetBitmap().Ok() && comValIndex == -1 ) + if ( item >= 0 && choices.IsOk() && choices.Item(item).GetBitmap().IsOk() && comValIndex == -1 ) itemBitmap = &choices.Item(item).GetBitmap(); // @@ -808,20 +823,48 @@ void wxPropertyGrid::OnComboItemPaint( const wxPGComboBox* pCb, rect.y + 1); int renderFlags = wxPGCellRenderer::DontUseCellColours; + bool useCustomPaintProcedure; + + // If custom image had some size, we will start from the assumption + // that custom paint procedure is required + if ( cis.x > 0 ) + useCustomPaintProcedure = true; + else + useCustomPaintProcedure = false; + + if ( flags & wxODCB_PAINTING_SELECTED ) + renderFlags |= wxPGCellRenderer::Selected; if ( flags & wxODCB_PAINTING_CONTROL ) + { renderFlags |= wxPGCellRenderer::Control; + + // If wxPG_PROP_CUSTOMIMAGE was set, then that means any custom + // image will not appear on the control row (it may be too + // large to fit, for instance). Also do not draw custom image + // if no choice was selected. + if ( !p->HasFlag(wxPG_PROP_CUSTOMIMAGE) || item < 0 ) + useCustomPaintProcedure = false; + } else + { renderFlags |= wxPGCellRenderer::ChoicePopup; - if ( flags & wxODCB_PAINTING_SELECTED ) - renderFlags |= wxPGCellRenderer::Selected; + // For consistency, always use normal font when drawing drop down + // items + dc.SetFont(GetFont()); + } + + // If not drawing a selected popup item, then give property's + // m_valueBitmap a chance. + if ( p->m_valueBitmap && item != pCb->GetSelection() ) + useCustomPaintProcedure = false; + // If current choice had a bitmap set by the application, then + // use it instead of any custom paint procedure. + else if ( itemBitmap ) + useCustomPaintProcedure = false; - if ( cis.x > 0 && (p->HasFlag(wxPG_PROP_CUSTOMIMAGE) || !(flags & wxODCB_PAINTING_CONTROL)) && - ( !p->m_valueBitmap || item == pCb->GetSelection() ) && - ( item >= 0 || (flags & wxODCB_PAINTING_CONTROL) ) && - !itemBitmap - ) + if ( useCustomPaintProcedure ) { pt.x += wxCC_CUSTOM_IMAGE_MARGIN1; wxRect r(pt.x,pt.y,cis.x,cis.y); @@ -838,7 +881,7 @@ void wxPropertyGrid::OnComboItemPaint( const wxPGComboBox* pCb, if ( comValIndex >= 0 ) { const wxPGCommonValue* cv = GetCommonValue(comValIndex); - wxPGCellRenderer* renderer = cv->GetRenderer(); + renderer = cv->GetRenderer(); r.width = rect.width; renderer->Render( dc, r, this, p, m_selColumn, comValIndex, renderFlags ); return; @@ -945,6 +988,12 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, const wxSize& sz, long extraStyle ) const { + // Since it is not possible (yet) to create a read-only combo box in + // the same sense that wxTextCtrl is read-only, simply do not create + // the control in this case. + if ( property->HasFlag(wxPG_PROP_READONLY) ) + return NULL; + const wxPGChoices& choices = property->GetChoices(); wxString defString; int index = property->GetChoiceSelection(); @@ -971,7 +1020,7 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, int odcbFlags = extraStyle | wxBORDER_NONE | wxTE_PROCESS_ENTER; if ( (property->GetFlags() & wxPG_PROP_USE_DCC) && - (property->IsKindOf(CLASSINFO(wxBoolProperty)) ) ) + wxDynamicCast(property, wxBoolProperty) ) odcbFlags |= wxODCB_DCLICK_CYCLES; // @@ -1008,15 +1057,19 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, cb->SetButtonPosition(si.y,0,wxRIGHT); cb->SetMargins(wxPG_XBEFORETEXT-1); - wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() ); + // Set hint text + cb->SetHint(property->GetHintText()); + + wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, + property->GetCommonValue() ); if ( index >= 0 && index < (int)cb->GetCount() ) { cb->SetSelection( index ); - if ( defString.length() ) + if ( !defString.empty() ) cb->SetText( defString ); } - else if ( !(extraStyle & wxCB_READONLY) && defString.length() ) + else if ( !(extraStyle & wxCB_READONLY) && !defString.empty() ) { propGrid->SetupTextCtrlValue(defString); cb->SetValue( defString ); @@ -1038,7 +1091,7 @@ void wxPGChoiceEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) c { wxASSERT( ctrl ); wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; - wxASSERT( cb->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox))); + wxASSERT( wxDynamicCast(cb, wxOwnerDrawnComboBox)); int ind = property->GetChoiceSelection(); cb->SetSelection(ind); } @@ -1054,7 +1107,7 @@ int wxPGChoiceEditor::InsertItem( wxWindow* ctrl, const wxString& label, int ind { wxASSERT( ctrl ); wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; - wxASSERT( cb->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox))); + wxASSERT( wxDynamicCast(cb, wxOwnerDrawnComboBox)); if (index < 0) index = cb->GetCount(); @@ -1067,7 +1120,7 @@ void wxPGChoiceEditor::DeleteItem( wxWindow* ctrl, int index ) const { wxASSERT( ctrl ); wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; - wxASSERT( cb->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox))); + wxASSERT( wxDynamicCast(cb, wxOwnerDrawnComboBox)); cb->Delete(index); } @@ -1075,7 +1128,7 @@ void wxPGChoiceEditor::DeleteItem( wxWindow* ctrl, int index ) const bool wxPGChoiceEditor::OnEvent( wxPropertyGrid* propGrid, wxPGProperty* property, wxWindow* ctrl, wxEvent& event ) const { - if ( event.GetEventType() == wxEVT_COMMAND_COMBOBOX_SELECTED ) + if ( event.GetEventType() == wxEVT_COMBOBOX ) { wxPGComboBox* cb = (wxPGComboBox*)ctrl; int index = cb->GetSelection(); @@ -1164,7 +1217,10 @@ bool wxPGChoiceEditor::CanContainCustomImage() const } -wxPGChoiceEditor::~wxPGChoiceEditor() { } +wxPGChoiceEditor::~wxPGChoiceEditor() +{ + wxPG_EDITOR(Choice) = NULL; +} // ----------------------------------------------------------------------- @@ -1223,7 +1279,7 @@ bool wxPGComboBoxEditor::GetValueFromControl( wxVariant& variant, wxPGProperty* wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl; wxString textVal = cb->GetValue(); - if ( property->UsesAutoUnspecified() && !textVal.length() ) + if ( property->UsesAutoUnspecified() && textVal.empty() ) { variant.MakeNull(); return true; @@ -1248,7 +1304,11 @@ void wxPGComboBoxEditor::OnFocus( wxPGProperty* property, } -wxPGComboBoxEditor::~wxPGComboBoxEditor() { } +wxPGComboBoxEditor::~wxPGComboBoxEditor() +{ + wxPG_EDITOR(ComboBox) = NULL; +} + // ----------------------------------------------------------------------- @@ -1300,8 +1360,10 @@ wxPGWindowList wxPGChoiceAndButtonEditor::CreateControls( wxPropertyGrid* propGr } -wxPGChoiceAndButtonEditor::~wxPGChoiceAndButtonEditor() { } - +wxPGChoiceAndButtonEditor::~wxPGChoiceAndButtonEditor() +{ + wxPG_EDITOR(ChoiceAndButton) = NULL; +} // ----------------------------------------------------------------------- // wxPGTextCtrlAndButtonEditor @@ -1325,8 +1387,10 @@ wxPGWindowList wxPGTextCtrlAndButtonEditor::CreateControls( wxPropertyGrid* prop } -wxPGTextCtrlAndButtonEditor::~wxPGTextCtrlAndButtonEditor() { } - +wxPGTextCtrlAndButtonEditor::~wxPGTextCtrlAndButtonEditor() +{ + wxPG_EDITOR(TextCtrlAndButton) = NULL; +} // ----------------------------------------------------------------------- // wxPGCheckBoxEditor @@ -1352,12 +1416,12 @@ const int wxSCB_SETVALUE_CYCLE = 2; static void DrawSimpleCheckBox( wxDC& dc, const wxRect& rect, int box_hei, - int state, const wxColour& lineCol ) + int state ) { // Box rectangle. wxRect r(rect.x+wxPG_XBEFORETEXT,rect.y+((rect.height-box_hei)/2), box_hei,box_hei); - wxColour useCol = lineCol; + wxColour useCol = dc.GetTextForeground(); if ( state & wxSCB_STATE_UNSPECIFIED ) { @@ -1460,8 +1524,7 @@ END_EVENT_TABLE() wxSimpleCheckBox::~wxSimpleCheckBox() { - delete ms_doubleBuffer; - ms_doubleBuffer = NULL; + wxDELETE(ms_doubleBuffer); } wxBitmap* wxSimpleCheckBox::ms_doubleBuffer = NULL; @@ -1481,14 +1544,14 @@ void wxSimpleCheckBox::OnPaint( wxPaintEvent& WXUNUSED(event) ) dc.SetPen( bgcol ); dc.DrawRectangle( rect ); - wxColour txcol = GetForegroundColour(); + dc.SetTextForeground(GetForegroundColour()); int state = m_state; if ( !(state & wxSCB_STATE_UNSPECIFIED) && GetFont().GetWeight() == wxBOLD ) state |= wxSCB_STATE_BOLD; - DrawSimpleCheckBox(dc,rect,m_boxHeight,state,txcol); + DrawSimpleCheckBox(dc, rect, m_boxHeight, state); } void wxSimpleCheckBox::OnLeftClick( wxMouseEvent& event ) @@ -1523,10 +1586,10 @@ void wxSimpleCheckBox::SetValue( int value ) } Refresh(); - wxCommandEvent evt(wxEVT_COMMAND_CHECKBOX_CLICKED,GetParent()->GetId()); + wxCommandEvent evt(wxEVT_CHECKBOX,GetParent()->GetId()); wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent(); - wxASSERT( propGrid->IsKindOf(CLASSINFO(wxPropertyGrid)) ); + wxASSERT( wxDynamicCast(propGrid, wxPropertyGrid) ); propGrid->HandleCustomEditorEvent(evt); } @@ -1535,6 +1598,9 @@ wxPGWindowList wxPGCheckBoxEditor::CreateControls( wxPropertyGrid* propGrid, const wxPoint& pos, const wxSize& size ) const { + if ( property->HasFlag(wxPG_PROP_READONLY) ) + return NULL; + wxPoint pt = pos; pt.x -= wxPG_XBEFOREWIDGET; wxSize sz = size; @@ -1552,8 +1618,8 @@ wxPGWindowList wxPGCheckBoxEditor::CreateControls( wxPropertyGrid* propGrid, // If mouse cursor was on the item, toggle the value now. if ( propGrid->GetInternalFlags() & wxPG_FL_ACTIVATION_BY_CLICK ) { - wxPoint pt = cb->ScreenToClient(::wxGetMousePosition()); - if ( pt.x <= (wxPG_XBEFORETEXT-2+cb->m_boxHeight) ) + wxPoint point = cb->ScreenToClient(::wxGetMousePosition()); + if ( point.x <= (wxPG_XBEFORETEXT-2+cb->m_boxHeight) ) { if ( cb->m_state & wxSCB_STATE_CHECKED ) cb->m_state &= ~wxSCB_STATE_CHECKED; @@ -1578,7 +1644,6 @@ void wxPGCheckBoxEditor::DrawValue( wxDC& dc, const wxRect& rect, const wxString& WXUNUSED(text) ) const { int state = wxSCB_STATE_UNCHECKED; - wxColour rectCol = dc.GetTextForeground(); if ( !property->IsValueUnspecified() ) { @@ -1591,7 +1656,7 @@ void wxPGCheckBoxEditor::DrawValue( wxDC& dc, const wxRect& rect, state |= wxSCB_STATE_UNSPECIFIED; } - DrawSimpleCheckBox(dc, rect, dc.GetCharHeight(), state, rectCol); + DrawSimpleCheckBox(dc, rect, dc.GetCharHeight(), state); } void wxPGCheckBoxEditor::UpdateControl( wxPGProperty* property, @@ -1614,7 +1679,7 @@ void wxPGCheckBoxEditor::UpdateControl( wxPGProperty* property, bool wxPGCheckBoxEditor::OnEvent( wxPropertyGrid* WXUNUSED(propGrid), wxPGProperty* WXUNUSED(property), wxWindow* WXUNUSED(ctrl), wxEvent& event ) const { - if ( event.GetEventType() == wxEVT_COMMAND_CHECKBOX_CLICKED ) + if ( event.GetEventType() == wxEVT_CHECKBOX ) { return true; } @@ -1655,8 +1720,10 @@ void wxPGCheckBoxEditor::SetValueToUnspecified( wxPGProperty* WXUNUSED(property) } -wxPGCheckBoxEditor::~wxPGCheckBoxEditor() { } - +wxPGCheckBoxEditor::~wxPGCheckBoxEditor() +{ + wxPG_EDITOR(CheckBox) = NULL; +} #endif // wxPG_INCLUDE_CHECKBOX @@ -1677,8 +1744,10 @@ wxWindow* wxPropertyGrid::GetEditorControl() const void wxPropertyGrid::CorrectEditorWidgetSizeX() { int secWid = 0; - int newSplitterx = m_pState->DoGetSplitterPosition(m_selColumn-1); - int newWidth = newSplitterx + m_pState->m_colWidths[m_selColumn]; + + // Use fixed selColumn 1 for main editor widgets + int newSplitterx = m_pState->DoGetSplitterPosition(0); + int newWidth = newSplitterx + m_pState->m_colWidths[1]; if ( m_wndEditor2 ) { @@ -1693,7 +1762,7 @@ void wxPropertyGrid::CorrectEditorWidgetSizeX() #ifdef __WXMAC__ if ( m_wndEditor ) #else - if ( m_wndEditor && m_wndEditor->IsKindOf(CLASSINFO(wxTextCtrl)) ) + if ( wxDynamicCast(m_wndEditor, wxTextCtrl) ) #endif secWid += wxPG_TEXTCTRL_AND_BUTTON_SPACING; } @@ -1718,25 +1787,41 @@ void wxPropertyGrid::CorrectEditorWidgetSizeX() void wxPropertyGrid::CorrectEditorWidgetPosY() { - if ( GetSelection() && (m_wndEditor || m_wndEditor2) ) - { - wxRect r = GetEditorWidgetRect(GetSelection(), m_selColumn); + wxPGProperty* selected = GetSelection(); - if ( m_wndEditor ) + if ( selected ) + { + if ( m_labelEditor ) { - wxPoint pos = m_wndEditor->GetPosition(); + wxRect r = GetEditorWidgetRect(selected, m_selColumn); + wxPoint pos = m_labelEditor->GetPosition(); // Calculate y offset int offset = pos.y % m_lineHeight; - m_wndEditor->Move(pos.x, r.y + offset); + m_labelEditor->Move(pos.x, r.y + offset); } - if ( m_wndEditor2 ) + if ( m_wndEditor || m_wndEditor2 ) { - wxPoint pos = m_wndEditor2->GetPosition(); + wxRect r = GetEditorWidgetRect(selected, 1); + + if ( m_wndEditor ) + { + wxPoint pos = m_wndEditor->GetPosition(); - m_wndEditor2->Move(pos.x, r.y); + // Calculate y offset + int offset = pos.y % m_lineHeight; + + m_wndEditor->Move(pos.x, r.y + offset); + } + + if ( m_wndEditor2 ) + { + wxPoint pos = m_wndEditor2->GetPosition(); + + m_wndEditor2->Move(pos.x, r.y); + } } } } @@ -1847,6 +1932,13 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, } #endif + // This code is repeated from DoSelectProperty(). However, font boldness + // must be set before margin is set up below in FixPosForTextCtrl(). + if ( forColumn == 1 && + prop->HasFlag(wxPG_PROP_MODIFIED) && + HasFlag(wxPG_BOLD_MODIFIED) ) + tc->SetFont( m_captionFont ); + // Center the control vertically if ( !hasSpecialSize ) FixPosForTextCtrl(tc, forColumn); @@ -1874,6 +1966,9 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, tc->AutoComplete(attrVal.GetArrayString()); } + // Set hint text + tc->SetHint(prop->GetHintText()); + return tc; } @@ -1997,10 +2092,10 @@ wxTextCtrl* wxPropertyGrid::GetEditorTextCtrl() const if ( !wnd ) return NULL; - if ( wnd->IsKindOf(CLASSINFO(wxTextCtrl)) ) + if ( wxDynamicCast(wnd, wxTextCtrl) ) return wxStaticCast(wnd, wxTextCtrl); - if ( wnd->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) ) + if ( wxDynamicCast(wnd, wxOwnerDrawnComboBox) ) { wxOwnerDrawnComboBox* cb = wxStaticCast(wnd, wxOwnerDrawnComboBox); return cb->GetTextCtrl(); @@ -2060,35 +2155,35 @@ void wxPGMultiButton::Finalize( wxPropertyGrid* WXUNUSED(propGrid), Move( pos.x + m_fullEditorSize.x - m_buttonsWidth, pos.y ); } -int wxPGMultiButton::GenId( int id ) const +int wxPGMultiButton::GenId( int itemid ) const { - if ( id < -1 ) + if ( itemid < -1 ) { if ( m_buttons.size() ) - id = GetButton(m_buttons.size()-1)->GetId() + 1; + itemid = GetButton(m_buttons.size()-1)->GetId() + 1; else - id = wxPG_SUBID2; + itemid = wxPG_SUBID2; } - return id; + return itemid; } #if wxUSE_BMPBUTTON -void wxPGMultiButton::Add( const wxBitmap& bitmap, int id ) +void wxPGMultiButton::Add( const wxBitmap& bitmap, int itemid ) { - id = GenId(id); + itemid = GenId(itemid); wxSize sz = GetSize(); - wxButton* button = new wxBitmapButton( this, id, bitmap, + wxButton* button = new wxBitmapButton( this, itemid, bitmap, wxPoint(sz.x, 0), wxSize(sz.y, sz.y) ); DoAddButton( button, sz ); } #endif -void wxPGMultiButton::Add( const wxString& label, int id ) +void wxPGMultiButton::Add( const wxString& label, int itemid ) { - id = GenId(id); + itemid = GenId(itemid); wxSize sz = GetSize(); - wxButton* button = new wxButton( this, id, label, wxPoint(sz.x, 0), + wxButton* button = new wxButton( this, itemid, label, wxPoint(sz.x, 0), wxSize(sz.y, sz.y) ); DoAddButton( button, sz ); }