X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/66fb9e1241d75e4981ff3323cfe957bdcbd53ebd..4908591c7eb448f3a0f70f3b0c6c4170b5945f9a:/src/propgrid/editors.cpp?ds=sidebyside diff --git a/src/propgrid/editors.cpp b/src/propgrid/editors.cpp index 2080439da9..12fa961484 100644 --- a/src/propgrid/editors.cpp +++ b/src/propgrid/editors.cpp @@ -71,16 +71,12 @@ #define wxPG_TEXTCTRL_AND_BUTTON_SPACING 4 #else #define wxPG_TEXTCTRL_AND_BUTTON_SPACING 2 -#endif +#endif #define wxPG_BUTTON_SIZEDEC 0 #include "wx/odcombo.h" -#ifdef __WXMSW__ - #include "wx/msw/private.h" -#endif - // ----------------------------------------------------------------------- #if defined(__WXMSW__) @@ -144,13 +140,14 @@ // for odcombo #ifdef __WXMAC__ #define wxPG_CHOICEXADJUST -3 // required because wxComboCtrl reserves 3pixels for wxTextCtrl's focus ring -#define wxPG_CHOICEYADJUST -3 +#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 +// Number added to image width for SetCustomPaintWidth +#define ODCB_CUST_PAINT_MARGIN 6 // Milliseconds to wait for two mouse-ups after focus inorder // to trigger a double-click. @@ -288,12 +285,7 @@ void wxPGTextCtrlEditor::UpdateControl( wxPGProperty* property, wxWindow* ctrl ) // // Fix indentation, just in case (change in font boldness is one good // reason). -#if defined(__WXMSW__) && !defined(__WXWINCE__) - ::SendMessage(GetHwndOf(tc), - EM_SETMARGINS, - EC_LEFTMARGIN | EC_RIGHTMARGIN, - MAKELONG(0, 0)); -#endif + tc->SetMargins(0); } // Provided so that, for example, ComboBox editor can use the same code @@ -582,13 +574,16 @@ public: return rect.width; } - virtual void PositionTextCtrl( int WXUNUSED(textCtrlXAdjust), + virtual void PositionTextCtrl( int textCtrlXAdjust, int WXUNUSED(textCtrlYAdjust) ) { wxPropertyGrid* pg = GetGrid(); + #ifdef wxPG_TEXTCTRLXADJUST + textCtrlXAdjust = wxPG_TEXTCTRLXADJUST - + (wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1) - 1, + #endif wxOwnerDrawnComboBox::PositionTextCtrl( - wxPG_TEXTCTRLXADJUST - - (wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1) - 1, + textCtrlXAdjust, pg->GetSpacingY() + 2 ); } @@ -608,7 +603,7 @@ void wxPropertyGrid::OnComboItemPaint( const wxPGComboBox* pCb, // Sanity check wxASSERT( IsKindOf(CLASSINFO(wxPropertyGrid)) ); - wxPGProperty* p = m_selected; + wxPGProperty* p = GetSelection(); wxString text; const wxPGChoices& choices = p->GetChoices(); @@ -791,23 +786,28 @@ bool wxPGChoiceEditor_SetCustomPaintWidth( wxPropertyGrid* propGrid, wxPGComboBo wxPGProperty* property = propGrid->GetSelectedProperty(); wxASSERT( property ); + wxSize imageSize; + bool res; + if ( cmnVal >= 0 ) { // Yes, a common value is being selected property->SetCommonValue( cmnVal ); - wxSize imageSize = propGrid->GetCommonValue(cmnVal)-> + imageSize = propGrid->GetCommonValue(cmnVal)-> GetRenderer()->GetImageSize(property, 1, cmnVal); - if ( imageSize.x ) imageSize.x += ODCB_CUST_PAINT_MARGIN; - cb->SetCustomPaintWidth( imageSize.x ); - return false; + res = false; } else { - wxSize imageSize = propGrid->GetImageSize(property, -1); - if ( imageSize.x ) imageSize.x += ODCB_CUST_PAINT_MARGIN; - cb->SetCustomPaintWidth( imageSize.x ); - return true; + imageSize = propGrid->GetImageSize(property, -1); + res = true; } + + if ( imageSize.x ) + imageSize.x += ODCB_CUST_PAINT_MARGIN; + cb->SetCustomPaintWidth( imageSize.x ); + + return res; } // CreateControls calls this with CB_READONLY in extraStyle @@ -841,6 +841,10 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, int odcbFlags = extraStyle | wxBORDER_NONE | wxTE_PROCESS_ENTER; + if ( (property->GetFlags() & wxPG_PROP_USE_DCC) && + (property->IsKindOf(CLASSINFO(wxBoolProperty)) ) ) + odcbFlags |= wxODCB_DCLICK_CYCLES; + // // If common value specified, use appropriate index unsigned int cmnVals = property->GetDisplayedCommonValueCount(); @@ -873,7 +877,7 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid, odcbFlags); cb->SetButtonPosition(si.y,0,wxRIGHT); - cb->SetTextIndent(wxPG_XBEFORETEXT-1); + cb->SetMargins(wxPG_XBEFORETEXT-1); wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() ); @@ -962,7 +966,7 @@ bool wxPGChoiceEditor::OnEvent( wxPropertyGrid* propGrid, wxPGProperty* property return false; } } - return wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, cmnValIndex ); + return wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, cmnValIndex ); } return false; } @@ -1409,7 +1413,7 @@ wxPGWindowList wxPGCheckBoxEditor::CreateControls( wxPropertyGrid* propGrid, cb->m_state |= wxSCB_STATE_CHECKED; // Makes sure wxPG_EVT_CHANGING etc. is sent for this initial - // click + // click propGrid->ChangePropertyValue(property, wxPGVariant_Bool(cb->m_state)); } @@ -1524,9 +1528,6 @@ wxWindow* wxPropertyGrid::GetEditorControl() const void wxPropertyGrid::CorrectEditorWidgetSizeX() { - if ( m_selColumn == -1 ) - return; - int secWid = 0; int newSplitterx = m_pState->DoGetSplitterPosition(m_selColumn-1); int newWidth = newSplitterx + m_pState->m_colWidths[m_selColumn]; @@ -1569,12 +1570,9 @@ void wxPropertyGrid::CorrectEditorWidgetSizeX() void wxPropertyGrid::CorrectEditorWidgetPosY() { - if ( m_selColumn == -1 ) - return; - - if ( m_selected && (m_wndEditor || m_wndEditor2) ) + if ( GetSelection() && (m_wndEditor || m_wndEditor2) ) { - wxRect r = GetEditorWidgetRect(m_selected, m_selColumn); + wxRect r = GetEditorWidgetRect(GetSelection(), m_selColumn); if ( m_wndEditor ) { @@ -1599,7 +1597,9 @@ void wxPropertyGrid::CorrectEditorWidgetPosY() // Fixes position of wxTextCtrl-like control (wxSpinCtrl usually // fits into that category as well). -void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl, const wxPoint& offset ) +void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl, + unsigned int WXUNUSED(forColumn), + const wxPoint& offset ) { // Center the control vertically wxRect finalPos = ctrl->GetRect(); @@ -1612,7 +1612,14 @@ void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl, const wxPoint& offset ) finalPos.y += y_adj; finalPos.height -= (y_adj+sz_dec); - const int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST; +#ifndef wxPG_TEXTCTRLXADJUST + int textCtrlXAdjust = wxPG_XBEFORETEXT - 1; + + wxTextCtrl* tc = static_cast(ctrl); + tc->SetMargins(0); +#else + int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST; +#endif finalPos.x += textCtrlXAdjust; finalPos.width -= textCtrlXAdjust; @@ -1630,15 +1637,16 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, const wxString& value, wxWindow* secondary, int extraStyle, - int maxLen ) + int maxLen, + unsigned int forColumn ) { wxWindowID id = wxPG_SUBID1; - wxPGProperty* prop = m_selected; + wxPGProperty* prop = GetSelection(); wxASSERT(prop); int tcFlags = wxTE_PROCESS_ENTER | extraStyle; - if ( prop->HasFlag(wxPG_PROP_READONLY) ) + if ( prop->HasFlag(wxPG_PROP_READONLY) && forColumn == 1 ) tcFlags |= wxTE_READONLY; wxPoint p(pos.x,pos.y); @@ -1649,7 +1657,11 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, s.x -= 8; #endif - // Take button into acccount + // For label editors, trim the size to allow better splitter grabbing + if ( forColumn != 1 ) + s.x -= 2; + + // Take button into acccount if ( secondary ) { s.x -= (secondary->GetSize().x + wxPG_TEXTCTRL_AND_BUTTON_SPACING); @@ -1674,10 +1686,16 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, #endif SetupTextCtrlValue(value); tc->Create(ctrlParent,id,value, p, s,tcFlags); - + // Center the control vertically if ( !hasSpecialSize ) - FixPosForTextCtrl(tc); + FixPosForTextCtrl(tc, forColumn); + + if ( forColumn != 1 ) + { + tc->SetBackgroundColour(m_colSelBack); + tc->SetForegroundColour(m_colSelFore); + } #ifdef __WXMSW__ tc->Show(); @@ -1704,7 +1722,7 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos, wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize& sz ) { wxWindowID id = wxPG_SUBID2; - wxPGProperty* selected = m_selected; + wxPGProperty* selected = GetSelection(); wxASSERT(selected); #ifdef __WXMAC__ @@ -1722,7 +1740,7 @@ wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize p.x = pos.x + sz.x - but->GetSize().x - 2; but->Move(p); -#else +#else wxSize s(sz.y-(wxPG_BUTTON_SIZEDEC*2)+(wxPG_NAT_BUTTON_BORDER_Y*2), sz.y-(wxPG_BUTTON_SIZEDEC*2)+(wxPG_NAT_BUTTON_BORDER_Y*2)); @@ -1877,11 +1895,10 @@ void wxPGMultiButton::Add( const wxBitmap& bitmap, int id ) { id = GenId(id); wxSize sz = GetSize(); - wxButton* button = new wxBitmapButton( this, id, bitmap, wxPoint(sz.x, 0), wxSize(sz.y, sz.y) ); - m_buttons.push_back(button); - int bw = button->GetSize().x; - SetSize(wxSize(sz.x+bw,sz.y)); - m_buttonsWidth += bw; + wxButton* button = new wxBitmapButton( this, id, bitmap, + wxPoint(sz.x, 0), + wxSize(sz.y, sz.y) ); + DoAddButton( button, sz ); } #endif @@ -1889,7 +1906,14 @@ void wxPGMultiButton::Add( const wxString& label, int id ) { id = GenId(id); wxSize sz = GetSize(); - wxButton* button = new wxButton( this, id, label, wxPoint(sz.x, 0), wxSize(sz.y, sz.y) ); + wxButton* button = new wxButton( this, id, label, wxPoint(sz.x, 0), + wxSize(sz.y, sz.y) ); + DoAddButton( button, sz ); +} + +void wxPGMultiButton::DoAddButton( wxWindow* button, + const wxSize& sz ) +{ m_buttons.push_back(button); int bw = button->GetSize().x; SetSize(wxSize(sz.x+bw,sz.y));