// Author: Jaakko Salli
// Modified by:
// Created: 2007-04-14
-// RCS-ID: $Id:
+// RCS-ID: $Id$
// Copyright: (c) Jaakko Salli
// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
#pragma hdrstop
#endif
+#if wxUSE_PROPGRID
+
#ifndef WX_PRECOMP
#include "wx/defs.h"
#include "wx/object.h"
#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"
// This define is necessary to prevent macro clearing
#define __wxPG_SOURCE_FILE__
-#include <wx/propgrid/propgrid.h>
-#include <wx/propgrid/editors.h>
-#include <wx/propgrid/props.h>
+#include "wx/propgrid/propgrid.h"
+#include "wx/propgrid/editors.h"
+#include "wx/propgrid/props.h"
#if wxPG_USE_RENDERER_NATIVE
- #include <wx/renderer.h>
+ #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 <wx/odcombo.h>
+#include "wx/odcombo.h"
#ifdef __WXMSW__
- #include <wx/msw/private.h>
+ #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
#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
#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
#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
#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
{
}
+wxString wxPGEditor::GetName() const
+{
+ return GetClassInfo()->GetClassName();
+}
+
void wxPGEditor::DrawValue( wxDC& dc, const wxRect& rect, wxPGProperty* property, const wxString& text ) const
{
if ( !property->IsValueUnspecified() )
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,
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) &&
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).
// -----------------------------------------------------------------------
-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.
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;
}
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
);
}
};
-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;
else
{
if ( !p->IsValueUnspecified() )
- text = p->GetValueString(0);
+ text = p->GetValueAsString(0);
}
}
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
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;
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 )
{
//
// MeasureItem call
+ wxDC& dc = *pDc;
p->OnCustomPaint( dc, rect, paintdata );
rect.height = paintdata.m_drawnHeight + 2;
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;
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
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() )
{
wxASSERT( ctrl );
wxOwnerDrawnComboBox* cb = (wxOwnerDrawnComboBox*)ctrl;
wxASSERT( cb->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)));
- int ind = property->GetChoiceInfo( (wxPGChoiceInfo*)NULL );
+ int ind = property->GetChoiceSelection();
cb->SetSelection(ind);
}
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()
// -----------------------------------------------------------------------
-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.
}
// -----------------------------------------------------------------------
-// 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,
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__
// 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,
#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
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() );
wxPropertyGrid* propGrid = (wxPropertyGrid*) GetParent()->GetParent();
wxASSERT( propGrid->IsKindOf(CLASSINFO(wxPropertyGrid)) );
- propGrid->OnCustomEditorEvent(evt);
+ propGrid->HandleCustomEditorEvent(evt);
}
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) )
{
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);
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;
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());
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();
}
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()
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;
}
void wxPropertyGrid::CorrectEditorWidgetPosY()
{
+ if ( m_selColumn == -1 )
+ return;
+
if ( m_selected && (m_wndEditor || m_wndEditor2) )
{
wxRect r = GetEditorWidgetRect(m_selected, m_selColumn);
// -----------------------------------------------------------------------
-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 )
int extraStyle,
int maxLen )
{
+ wxWindowID id = wxPG_SUBID1;
wxPGProperty* selected = m_selected;
wxASSERT(selected);
// Need to reduce width of text control on Mac
#if defined(__WXMAC__)
- s.x -= 8;
+ s.x -= 8;
#endif
// Take button into acccount
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 )
wxWindow* wxPropertyGrid::GenerateEditorButton( const wxPoint& pos, const wxSize& sz )
{
+ wxWindowID id = wxPG_SUBID2;
wxPGProperty* selected = m_selected;
wxASSERT(selected);
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;
#ifdef __WXMSW__
but->Hide();
#endif
- but->Create(GetPanel(),wxPG_SUBID2,wxS("..."),p,s,wxWANTS_CHARS);
+ but->Create(GetPanel(),id,wxS("..."),p,s,wxWANTS_CHARS);
#ifdef __WXGTK__
wxFont font = GetFont();
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);
}
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 )
}
// -----------------------------------------------------------------------
+
+#endif // wxUSE_PROPGRID