#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__)
// 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.
//
// 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
wxPropertyGrid* GetGrid() const
{
- wxPropertyGrid* pg = wxDynamicCast(GetParent()->GetParent(),
+ wxPropertyGrid* pg = wxDynamicCast(GetParent(),
wxPropertyGrid);
wxASSERT(pg);
return pg;
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
);
}
// 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;
}
if ( pDc )
pDc->SetBrush(*wxWHITE_BRUSH);
+ wxPGCellRenderer* renderer = NULL;
+ const wxPGChoiceEntry* cell = NULL;
+
if ( rect.x >= 0 )
{
//
if ( choices.IsOk() && item >= 0 && comValIndex < 0 )
{
- const wxPGChoiceEntry& cell = choices.Item(item);
- wxPGCellRenderer* renderer = wxPGGlobalVars->m_defaultRenderer;
- int imageOffset = renderer->PreDrawCell( dc, rect, cell, renderFlags );
+ cell = &choices.Item(item);
+ renderer = wxPGGlobalVars->m_defaultRenderer;
+ int imageOffset = renderer->PreDrawCell(dc, rect, *cell,
+ renderFlags );
if ( imageOffset )
- imageOffset += wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2;
+ imageOffset += wxCC_CUSTOM_IMAGE_MARGIN1 +
+ wxCC_CUSTOM_IMAGE_MARGIN2;
pt.x += imageOffset;
}
}
pt.x += 1;
dc.DrawText( text, pt.x + wxPG_XBEFORETEXT, pt.y );
+
+ if ( renderer )
+ renderer->PostDrawCell(dc, this, *cell, renderFlags);
}
else
{
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
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();
odcbFlags);
cb->SetButtonPosition(si.y,0,wxRIGHT);
- cb->SetTextIndent(wxPG_XBEFORETEXT-1);
+ cb->SetMargins(wxPG_XBEFORETEXT-1);
wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() );
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);
wxCommandEvent evt(wxEVT_COMMAND_CHECKBOX_CLICKED,GetParent()->GetId());
- wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent()->GetParent();
+ wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent();
wxASSERT( propGrid->IsKindOf(CLASSINFO(wxPropertyGrid)) );
propGrid->HandleCustomEditorEvent(evt);
}
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 wxPGCheckBoxEditor::SetValueToUnspecified( wxPGProperty* WXUNUSED(property), wxWindow* ctrl ) const
{
- ((wxSimpleCheckBox*)ctrl)->m_state = 0;
+ ((wxSimpleCheckBox*)ctrl)->m_state = wxSCB_STATE_UNSPECIFIED;
ctrl->Refresh();
}
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 WXUNUSED(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;
+#ifndef wxPG_TEXTCTRLXADJUST
+ int textCtrlXAdjust = wxPG_XBEFORETEXT - 1;
+
+ wxTextCtrl* tc = static_cast<wxTextCtrl*>(ctrl);
+ tc->SetMargins(0);
+#else
+ int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST;
+#endif
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;
+
+#if defined(__WXMSW__)
+ // On Windows, we need to override read-only text ctrl's background
+ // colour to white. One problem with native 'grey' background is that
+ // tc->GetBackgroundColour() doesn't seem to return correct value
+ // for it.
+ if ( tcFlags & wxTE_READONLY )
+ {
+ wxVisualAttributes vattrs = tc->GetDefaultAttributes();
+ tc->SetBackgroundColour(vattrs.colBg);
+ }
+#endif
// Center the control vertically
if ( !hasSpecialSize )
- FixPosForTextCtrl(ed);
+ FixPosForTextCtrl(tc, forColumn);
+
+ if ( forColumn != 1 )
+ {
+ tc->SetBackgroundColour(m_colSelBack);
+ tc->SetForegroundColour(m_colSelFore);
+ }
#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));