#define wxPG_TEXTCTRL_AND_BUTTON_SPACING 4
#else
#define wxPG_TEXTCTRL_AND_BUTTON_SPACING 2
-#endif
+#endif
#define wxPG_BUTTON_SIZEDEC 0
// 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
// Sanity check
wxASSERT( IsKindOf(CLASSINFO(wxPropertyGrid)) );
- wxPGProperty* p = m_selected;
+ wxPGProperty* p = GetSelection();
wxString text;
const wxPGChoices& choices = p->GetChoices();
if ( rect.width < 0 )
{
wxCoord x, y;
- GetTextExtent(text, &x, &y, 0, 0, &m_font);
+ pCb->GetTextExtent(text, &x, &y, 0, 0);
rect.width = cis.x + wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2 + 9 + x;
}
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();
return false;
}
}
- return wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, cmnValIndex );
+ return wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, cmnValIndex );
}
return false;
}
int state = m_state;
if ( !(state & wxSCB_STATE_UNSPECIFIED) &&
- m_font.GetWeight() == wxBOLD )
+ GetFont().GetWeight() == wxBOLD )
state |= wxSCB_STATE_BOLD;
DrawSimpleCheckBox(dc,rect,m_boxHeight,state,txcol);
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));
}
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];
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 )
{
// 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 forColumn,
+ const wxPoint& offset )
{
// Center the control vertically
wxRect finalPos = ctrl->GetRect();
finalPos.y += y_adj;
finalPos.height -= (y_adj+sz_dec);
- const int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST;
+ int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST;
+
+ if ( forColumn != 1 )
+ textCtrlXAdjust -= 3; // magic number!
finalPos.x += textCtrlXAdjust;
finalPos.width -= textCtrlXAdjust;
const wxString& value,
wxWindow* secondary,
int extraStyle,
- int maxLen )
+ int maxLen,
+ unsigned int forColumn )
{
wxWindowID id = wxPG_SUBID1;
- wxPGProperty* selected = m_selected;
- wxASSERT(selected);
+ wxPGProperty* prop = GetSelection();
+ wxASSERT(prop);
int tcFlags = wxTE_PROCESS_ENTER | extraStyle;
- if ( selected->HasFlag(wxPG_PROP_READONLY) )
+ if ( prop->HasFlag(wxPG_PROP_READONLY) && forColumn == 1 )
tcFlags |= wxTE_READONLY;
wxPoint p(pos.x,pos.y);
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);
#endif
SetupTextCtrlValue(value);
tc->Create(ctrlParent,id,value, p, s,tcFlags);
-
- wxWindow* ed = tc;
// Center the control vertically
if ( !hasSpecialSize )
- FixPosForTextCtrl(ed);
+ FixPosForTextCtrl(tc, forColumn);
+
+ if ( forColumn != 1 )
+ {
+ tc->SetBackgroundColour(m_colSelBack);
+ tc->SetForegroundColour(m_colSelFore);
+
+ // Normalize margins
+ #ifdef __WXMSW__
+ ::SendMessage(GetHwndOf(tc), EM_SETMARGINS,
+ EC_LEFTMARGIN | EC_RIGHTMARGIN,
+ MAKELONG(3, 0));
+ #endif
+ }
#ifdef __WXMSW__
- ed->Show();
+ tc->Show();
if ( secondary )
secondary->Show();
#endif
if ( maxLen > 0 )
tc->SetMaxLength( maxLen );
- return (wxWindow*) ed;
+ wxVariant attrVal = prop->GetAttribute(wxPG_ATTR_AUTOCOMPLETE);
+ if ( !attrVal.IsNull() )
+ {
+ wxASSERT(attrVal.GetType() == wxS("arrstring"));
+ tc->AutoComplete(attrVal.GetArrayString());
+ }
+
+ return tc;
}
// -----------------------------------------------------------------------
wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize& sz )
{
wxWindowID id = wxPG_SUBID2;
- wxPGProperty* selected = m_selected;
+ wxPGProperty* selected = GetSelection();
wxASSERT(selected);
#ifdef __WXMAC__
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));
{
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
{
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));