wxTextEntry::SetMargins(), GetMargins() - implemented on wxMSW and wxGTK (GTK+ 2.10+); also added similar functions into wxComboCtrl, deprecated old indent-functions; wxPropertyGrid modified to use the new functionality

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61834 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli
2009-09-05 12:39:12 +00:00
parent 8a9a313dcd
commit 0847e36eff
20 changed files with 396 additions and 101 deletions

View File

@@ -86,8 +86,8 @@ enum
wxCC_IFLAG_CREATED = 0x0100, wxCC_IFLAG_CREATED = 0x0100,
// Internal use: really put button outside // Internal use: really put button outside
wxCC_IFLAG_BUTTON_OUTSIDE = 0x0200, wxCC_IFLAG_BUTTON_OUTSIDE = 0x0200,
// Internal use: SetTextIndent has been called // Internal use: SetMargins has been succesfully called
wxCC_IFLAG_INDENT_SET = 0x0400, wxCC_IFLAG_LEFT_MARGIN_SET = 0x0400,
// Internal use: Set wxTAB_TRAVERSAL to parent when popup is dismissed // Internal use: Set wxTAB_TRAVERSAL to parent when popup is dismissed
wxCC_IFLAG_PARENT_TAB_TRAVERSAL = 0x0800, wxCC_IFLAG_PARENT_TAB_TRAVERSAL = 0x0800,
// Internal use: Secondary popup window type should be used (if available). // Internal use: Secondary popup window type should be used (if available).
@@ -118,7 +118,8 @@ struct wxComboCtrlFeatures
BitmapButton = 0x0002, // Button may be replaced with bitmap BitmapButton = 0x0002, // Button may be replaced with bitmap
ButtonSpacing = 0x0004, // Button can have spacing from the edge ButtonSpacing = 0x0004, // Button can have spacing from the edge
// of the control // of the control
TextIndent = 0x0008, // SetTextIndent can be used TextIndent = 0x0008, // SetMargins can be used to control
// left margin.
PaintControl = 0x0010, // Combo control itself can be custom painted PaintControl = 0x0010, // Combo control itself can be custom painted
PaintWritable = 0x0020, // A variable-width area in front of writable PaintWritable = 0x0020, // A variable-width area in front of writable
// combo control's textctrl can be custom // combo control's textctrl can be custom
@@ -302,19 +303,18 @@ public:
const wxBitmap& bmpHover = wxNullBitmap, const wxBitmap& bmpHover = wxNullBitmap,
const wxBitmap& bmpDisabled = wxNullBitmap ); const wxBitmap& bmpDisabled = wxNullBitmap );
#if WXWIN_COMPATIBILITY_2_6
// //
// This will set the space in pixels between left edge of the control and the // This will set the space in pixels between left edge of the control and the
// text, regardless whether control is read-only (ie. no wxTextCtrl) or not. // text, regardless whether control is read-only (ie. no wxTextCtrl) or not.
// Platform-specific default can be set with value-1. // Platform-specific default can be set with value-1.
// Remarks // Remarks
// * This method may do nothing on some native implementations. // * This method may do nothing on some native implementations.
void SetTextIndent( int indent ); wxDEPRECTED( void SetTextIndent( int indent ) );
// Returns actual indentation in pixels. // Returns actual indentation in pixels.
wxCoord GetTextIndent() const wxDEPRECTED( wxCoord GetTextIndent() const );
{ #endif
return m_absIndent;
}
// Returns area covered by the text field. // Returns area covered by the text field.
const wxRect& GetTextRect() const const wxRect& GetTextRect() const
@@ -385,6 +385,17 @@ public:
const wxBitmap& GetBitmapHover() const { return m_bmpHover; } const wxBitmap& GetBitmapHover() const { return m_bmpHover; }
const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; } const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; }
// Margins functions mirrored from TextEntryBase
// (wxComboCtrl does not inherit from wxTextEntry, but may embed a
// wxTextCtrl, so we need these). Also note that these functions
// have replaced SetTextIndent() in wxWidgets 2.9.1 and later.
bool SetMargins(const wxPoint& pt)
{ return DoSetMargins(pt); }
bool SetMargins(wxCoord left, wxCoord top = -1)
{ return DoSetMargins(wxPoint(left, top)); }
wxPoint GetMargins() const
{ return DoGetMargins(); }
// Return internal flags // Return internal flags
wxUint32 GetInternalFlags() const { return m_iFlags; } wxUint32 GetInternalFlags() const { return m_iFlags; }
@@ -423,7 +434,8 @@ protected:
// called from wxSizeEvent handler // called from wxSizeEvent handler
virtual void OnResize() = 0; virtual void OnResize() = 0;
// Return native text identation (for pure text, not textctrl) // Return native text identation
// (i.e. text margin, for pure text, not textctrl)
virtual wxCoord GetNativeTextIndent() const; virtual wxCoord GetNativeTextIndent() const;
// Called in syscolourchanged handler and base create // Called in syscolourchanged handler and base create
@@ -521,6 +533,10 @@ protected:
virtual void DoSetToolTip( wxToolTip *tip ); virtual void DoSetToolTip( wxToolTip *tip );
#endif #endif
// margins functions
virtual bool DoSetMargins(const wxPoint& pt);
virtual wxPoint DoGetMargins() const;
// This is used when m_text is hidden (readonly). // This is used when m_text is hidden (readonly).
wxString m_valueString; wxString m_valueString;
@@ -572,8 +588,8 @@ protected:
// selection indicator. // selection indicator.
wxCoord m_widthCustomPaint; wxCoord m_widthCustomPaint;
// absolute text indentation, in pixels // left margin, in pixels
wxCoord m_absIndent; wxCoord m_marginLeft;
// side on which the popup is aligned // side on which the popup is aligned
int m_anchorSide; int m_anchorSide;

View File

@@ -135,8 +135,8 @@ protected:
// custom list stores. // custom list stores.
virtual void GTKCreateComboBoxWidget(); virtual void GTKCreateComboBoxWidget();
// return the GtkEntry part of the combobox virtual GtkEntry *GetEntry() const
GtkEntry *GetEntry() const { return m_entry; } { return m_entry; }
GtkEntry* m_entry; GtkEntry* m_entry;

View File

@@ -178,6 +178,7 @@ protected:
private: private:
// overridden wxTextEntry virtual methods // overridden wxTextEntry virtual methods
virtual GtkEditable *GetEditable() const; virtual GtkEditable *GetEditable() const;
virtual GtkEntry *GetEntry() const;
virtual void EnableTextChangedEvents(bool enable); virtual void EnableTextChangedEvents(bool enable);
// change the font for everything in this control // change the font for everything in this control

View File

@@ -12,6 +12,7 @@
#define _WX_GTK_TEXTENTRY_H_ #define _WX_GTK_TEXTENTRY_H_
typedef struct _GtkEditable GtkEditable; typedef struct _GtkEditable GtkEditable;
typedef struct _GtkEntry GtkEntry;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// wxTextEntry: roughly corresponds to GtkEditable // wxTextEntry: roughly corresponds to GtkEditable
@@ -55,10 +56,17 @@ public:
protected: protected:
virtual wxString DoGetValue() const; virtual wxString DoGetValue() const;
// margins functions
virtual bool DoSetMargins(const wxPoint& pt);
virtual wxPoint DoGetMargins() const;
private: private:
// implement this to return the associated GtkEntry or another widget // implement this to return the associated GtkEntry or another widget
// implementing GtkEditable // implementing GtkEditable
virtual GtkEditable *GetEditable() const = 0; virtual GtkEditable *GetEditable() const = 0;
// implement this to return the associated GtkEntry
virtual GtkEntry *GetEntry() const = 0;
}; };
#endif // _WX_GTK_TEXTENTRY_H_ #endif // _WX_GTK_TEXTENTRY_H_

View File

@@ -76,6 +76,10 @@ protected:
}; };
virtual void DoSetSelection(long from, long to, int flags = SetSel_Scroll); virtual void DoSetSelection(long from, long to, int flags = SetSel_Scroll);
// margins functions
virtual bool DoSetMargins(const wxPoint& pt);
virtual wxPoint DoGetMargins() const;
private: private:
// implement this to return the HWND of the EDIT control // implement this to return the HWND of the EDIT control
virtual WXHWND GetEditHWND() const = 0; virtual WXHWND GetEditHWND() const = 0;

View File

@@ -37,9 +37,6 @@
// space between vertical line and value editor control // space between vertical line and value editor control
#define wxPG_XBEFOREWIDGET 1 #define wxPG_XBEFOREWIDGET 1
// x position adjustment for wxTextCtrl (and like)
#define wxPG_TEXTCTRLXADJUST 3
// comment to use bitmap buttons // comment to use bitmap buttons
#define wxPG_ICON_WIDTH 9 #define wxPG_ICON_WIDTH 9
// 1 if wxRendererNative should be employed // 1 if wxRendererNative should be employed
@@ -75,7 +72,9 @@
#define wxPG_XBEFOREWIDGET 1 #define wxPG_XBEFOREWIDGET 1
// x position adjustment for wxTextCtrl (and like) // x position adjustment for wxTextCtrl (and like)
#define wxPG_TEXTCTRLXADJUST 3 // NB: Only define wxPG_TEXTCTRLXADJUST for platforms that do not
// (yet) support wxTextEntry::SetMargins() for the left margin.
//#define wxPG_TEXTCTRLXADJUST 3
// comment to use bitmap buttons // comment to use bitmap buttons
#define wxPG_ICON_WIDTH 9 #define wxPG_ICON_WIDTH 9

View File

@@ -783,6 +783,7 @@ protected:
#ifdef __WXGTK20__ #ifdef __WXGTK20__
virtual wxWindow *GetEditableWindow() { return this; } virtual wxWindow *GetEditableWindow() { return this; }
virtual GtkEditable *GetEditable() const { return NULL; } virtual GtkEditable *GetEditable() const { return NULL; }
virtual GtkEntry *GetEntry() const { return NULL; }
#endif #endif
// Overrides // Overrides

View File

@@ -142,6 +142,20 @@ public:
virtual wxString GetHint() const; virtual wxString GetHint() const;
// margins
// -------
// margins are the empty space between borders of control and the text
// itself. When setting margin, use value -1 to indicate that specific
// margin should not be changed.
bool SetMargins(const wxPoint& pt)
{ return DoSetMargins(pt); }
bool SetMargins(wxCoord left, wxCoord top = -1)
{ return DoSetMargins(wxPoint(left, top)); }
wxPoint GetMargins() const
{ return DoGetMargins(); }
protected: protected:
// flags for DoSetValue(): common part of SetValue() and ChangeValue() and // flags for DoSetValue(): common part of SetValue() and ChangeValue() and
// also used to implement WriteText() in wxMSW // also used to implement WriteText() in wxMSW
@@ -159,6 +173,10 @@ protected:
// generation and also by generic hints implementation // generation and also by generic hints implementation
virtual wxWindow *GetEditableWindow() = 0; virtual wxWindow *GetEditableWindow() = 0;
// margins functions
virtual bool DoSetMargins(const wxPoint& pt);
virtual wxPoint DoGetMargins() const;
// class which should be used to temporarily disable text change events // class which should be used to temporarily disable text change events
// //

View File

@@ -159,7 +159,7 @@ struct wxComboCtrlFeatures
BitmapButton = 0x0002, ///< Button may be replaced with bitmap. BitmapButton = 0x0002, ///< Button may be replaced with bitmap.
ButtonSpacing = 0x0004, ///< Button can have spacing from the edge ButtonSpacing = 0x0004, ///< Button can have spacing from the edge
///< of the control. ///< of the control.
TextIndent = 0x0008, ///< wxComboCtrl::SetTextIndent() can be used. TextIndent = 0x0008, ///< wxComboCtrl::SetMargins() can be used.
PaintControl = 0x0010, ///< Combo control itself can be custom painted. PaintControl = 0x0010, ///< Combo control itself can be custom painted.
PaintWritable = 0x0020, ///< A variable-width area in front of writable PaintWritable = 0x0020, ///< A variable-width area in front of writable
///< combo control's textctrl can be custom ///< combo control's textctrl can be custom
@@ -454,6 +454,19 @@ public:
*/ */
virtual long GetLastPosition() const; virtual long GetLastPosition() const;
/**
Returns the margins used by the control. The @c x field of the returned
point is the horizontal margin and the @c y field is the vertical one.
@remarks If given margin cannot be accurately determined, its value
will be set to -1.
@see SetMargins()
@since 2.9.1
*/
wxPoint GetMargins() const;
/** /**
Returns current popup interface that has been set with Returns current popup interface that has been set with
SetPopupControl(). SetPopupControl().
@@ -472,6 +485,8 @@ public:
/** /**
Returns actual indentation in pixels. Returns actual indentation in pixels.
@deprecated Use GetMargins() instead.
*/ */
wxCoord GetTextIndent() const; wxCoord GetTextIndent() const;
@@ -607,6 +622,21 @@ public:
*/ */
virtual void SetInsertionPointEnd(); virtual void SetInsertionPointEnd();
//@{
/**
Attempts to set the control margins. When margins are given as wxPoint,
x indicates the left and y the top margin. Use -1 to indicate that
an existing value should be used.
@return
@true if setting of all requested margins was successful.
@since 2.9.1
*/
bool SetMargins(const wxPoint& pt);
bool SetMargins(wxCoord left, wxCoord top = -1);
//@}
/** /**
Set side of the control to which the popup will align itself. Valid Set side of the control to which the popup will align itself. Valid
values are @c wxLEFT, @c wxRIGHT and 0. The default value 0 means that values are @c wxLEFT, @c wxRIGHT and 0. The default value 0 means that
@@ -676,6 +706,8 @@ public:
This will set the space in pixels between left edge of the control and This will set the space in pixels between left edge of the control and
the text, regardless whether control is read-only or not. Value -1 can the text, regardless whether control is read-only or not. Value -1 can
be given to indicate platform default. be given to indicate platform default.
@deprecated Use SetMargins() instead.
*/ */
void SetTextIndent(int indent); void SetTextIndent(int indent);

View File

@@ -381,6 +381,35 @@ public:
*/ */
virtual wxString GetHint() const; virtual wxString GetHint() const;
//@{
/**
Attempts to set the control margins. When margins are given as wxPoint,
x indicates the left and y the top margin. Use -1 to indicate that
an existing value should be used.
@return
@true if setting of all requested margins was successful.
@since 2.9.1
*/
bool SetMargins(const wxPoint& pt);
bool SetMargins(wxCoord left, wxCoord top = -1);
//@}
/**
Returns the margins used by the control. The @c x field of the returned
point is the horizontal margin and the @c y field is the vertical one.
@remarks If given margin cannot be accurately determined, its value
will be set to -1. On some platforms you cannot obtain valid
margin values until you have called SetMargins().
@see SetMargins()
@since 2.9.1
*/
wxPoint GetMargins() const;
/** /**
Sets the new text control value. Sets the new text control value.

View File

@@ -66,11 +66,20 @@
#define TEXTCTRL_TEXT_CENTERED 0 // 1 if text in textctrl is vertically centered #define TEXTCTRL_TEXT_CENTERED 0 // 1 if text in textctrl is vertically centered
#define FOCUS_RING 0 // No focus ring on wxMSW #define FOCUS_RING 0 // No focus ring on wxMSW
#if !defined(__WXWINCE__)
// 1 if wxTextEntry::SetMargins() can be used to set the left margin
#define LEFT_MARGIN_CAN_BE_SET 1
#else
#define LEFT_MARGIN_CAN_BE_SET 0
#endif
//#undef wxUSE_POPUPWIN //#undef wxUSE_POPUPWIN
//#define wxUSE_POPUPWIN 0 //#define wxUSE_POPUPWIN 0
#elif defined(__WXGTK__) #elif defined(__WXGTK__)
#include "wx/gtk/private.h"
// NB: It is not recommended to use wxDialog as popup on wxGTK, because of // NB: It is not recommended to use wxDialog as popup on wxGTK, because of
// this bug: If wxDialog is hidden, its position becomes corrupt // this bug: If wxDialog is hidden, its position becomes corrupt
// between hide and next show, but without internal coordinates being // between hide and next show, but without internal coordinates being
@@ -88,6 +97,13 @@
#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered
#define FOCUS_RING 0 // No focus ring on wxGTK #define FOCUS_RING 0 // No focus ring on wxGTK
#if GTK_CHECK_VERSION(2,10,0)
// 1 if wxTextEntry::SetMargins() can be used to set the left margin
#define LEFT_MARGIN_CAN_BE_SET 1
#else
#define LEFT_MARGIN_CAN_BE_SET 0
#endif
#elif defined(__WXMAC__) #elif defined(__WXMAC__)
#define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform) #define USE_TRANSIENT_POPUP 1 // Use wxPopupWindowTransient (preferred, if it works properly on platform)
@@ -102,6 +118,9 @@
#undef COMBO_MARGIN #undef COMBO_MARGIN
#define COMBO_MARGIN FOCUS_RING #define COMBO_MARGIN FOCUS_RING
// 1 if wxTextEntry::SetMargins() can be used to set the left margin
#define LEFT_MARGIN_CAN_BE_SET 0
#else #else
#define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform) #define USE_TRANSIENT_POPUP 0 // Use wxPopupWindowTransient (preferred, if it works properly on platform)
@@ -111,6 +130,9 @@
#define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered #define TEXTCTRL_TEXT_CENTERED 1 // 1 if text in textctrl is vertically centered
#define FOCUS_RING 0 #define FOCUS_RING 0
// 1 if wxTextEntry::SetMargins() can be used to set the left margin
#define LEFT_MARGIN_CAN_BE_SET 0
#endif #endif
@@ -519,7 +541,7 @@ void wxComboPopup::DefaultPaintComboControl( wxComboCtrlBase* combo,
combo->PrepareBackground(dc,rect,0); combo->PrepareBackground(dc,rect,0);
dc.DrawText( combo->GetValue(), dc.DrawText( combo->GetValue(),
rect.x + combo->GetTextIndent(), rect.x + combo->m_marginLeft,
(rect.height-dc.GetCharHeight())/2 + rect.y ); (rect.height-dc.GetCharHeight())/2 + rect.y );
} }
} }
@@ -804,7 +826,7 @@ void wxComboCtrlBase::Init()
m_extLeft = 0; m_extLeft = 0;
m_extRight = 0; m_extRight = 0;
m_absIndent = -1; m_marginLeft = -1;
m_iFlags = 0; m_iFlags = 0;
m_timeCanAcceptClick = 0; m_timeCanAcceptClick = 0;
@@ -833,7 +855,7 @@ bool wxComboCtrlBase::Create(wxWindow *parent,
// Get colours // Get colours
OnThemeChange(); OnThemeChange();
m_absIndent = GetNativeTextIndent(); m_marginLeft = GetNativeTextIndent();
m_iFlags |= wxCC_IFLAG_CREATED; m_iFlags |= wxCC_IFLAG_CREATED;
@@ -953,8 +975,8 @@ void wxComboCtrlBase::CalculateAreas( int btnWidth )
} }
// Defaul indentation // Defaul indentation
if ( m_absIndent < 0 ) if ( m_marginLeft < 0 )
m_absIndent = GetNativeTextIndent(); m_marginLeft = GetNativeTextIndent();
int butWidth = btnWidth; int butWidth = btnWidth;
@@ -1058,43 +1080,54 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust
if ( !m_text ) if ( !m_text )
return; return;
#if !TEXTCTRL_TEXT_CENTERED
wxSize sz = GetClientSize(); wxSize sz = GetClientSize();
int customBorder = m_widthCustomBorder; int customBorder = m_widthCustomBorder;
if ( (m_text->GetWindowStyleFlag() & wxBORDER_MASK) == wxNO_BORDER ) if ( (m_text->GetWindowStyleFlag() & wxBORDER_MASK) == wxNO_BORDER )
{ {
#if LEFT_MARGIN_CAN_BE_SET
// Call SetMargins() on textctrl if LEFT_MARGIN_CAN_BE_SET == 1
wxUnusedVar(textCtrlXAdjust);
m_text->SetMargins(0);
textCtrlXAdjust = 0;
#endif
// Centre textctrl // Centre textctrl
#if !TEXTCTRL_TEXT_CENTERED
int tcSizeY = m_text->GetBestSize().y; int tcSizeY = m_text->GetBestSize().y;
int diff = sz.y - tcSizeY; int diff0 = sz.y - tcSizeY;
int y = textCtrlYAdjust + (diff/2); int y = textCtrlYAdjust + (diff0/2);
#else
wxUnusedVar(textCtrlYAdjust);
int y = 0;
#endif
if ( y < customBorder ) if ( y < customBorder )
y = customBorder; y = customBorder;
m_text->SetSize( m_tcArea.x + m_widthCustomPaint + m_absIndent + textCtrlXAdjust, int x = m_tcArea.x + m_widthCustomPaint +
y, m_marginLeft + textCtrlXAdjust;
m_tcArea.width - COMBO_MARGIN -
(textCtrlXAdjust + m_widthCustomPaint + m_absIndent), m_text->SetSize(x,
-1 ); y,
m_tcArea.width - m_tcArea.x - x,
/*m_tcArea.width - COMBO_MARGIN -
(textCtrlXAdjust + m_widthCustomPaint +
m_marginLeft),*/
-1 );
// Make sure textctrl doesn't exceed the bottom custom border // Make sure textctrl doesn't exceed the bottom custom border
wxSize tsz = m_text->GetSize(); wxSize tsz = m_text->GetSize();
diff = (y + tsz.y) - (sz.y - customBorder); int diff1 = (y + tsz.y) - (sz.y - customBorder);
if ( diff >= 0 ) if ( diff1 >= 0 )
{ {
tsz.y = tsz.y - diff - 1; tsz.y = tsz.y - diff1 - 1;
m_text->SetSize(tsz); m_text->SetSize(tsz);
} }
} }
else else
#else // TEXTCTRL_TEXT_CENTERED
wxUnusedVar(textCtrlXAdjust);
wxUnusedVar(textCtrlYAdjust);
#endif // !TEXTCTRL_TEXT_CENTERED/TEXTCTRL_TEXT_CENTERED
{ {
// If it has border, have textctrl will the entire text field. // If it has border, have textctrl fill the entire text field.
m_text->SetSize( m_tcArea.x + m_widthCustomPaint, m_text->SetSize( m_tcArea.x + m_widthCustomPaint,
m_tcArea.y, m_tcArea.y,
m_tcArea.width - m_widthCustomPaint, m_tcArea.width - m_widthCustomPaint,
@@ -1729,9 +1762,9 @@ void wxComboCtrlBase::OnIdleEvent( wxIdleEvent& WXUNUSED(event) )
void wxComboCtrlBase::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event)) void wxComboCtrlBase::OnSysColourChanged(wxSysColourChangedEvent& WXUNUSED(event))
{ {
OnThemeChange(); OnThemeChange();
// indentation may also have changed // left margin may also have changed
if ( !(m_iFlags & wxCC_IFLAG_INDENT_SET) ) if ( !(m_iFlags & wxCC_IFLAG_LEFT_MARGIN_SET) )
m_absIndent = GetNativeTextIndent(); m_marginLeft = GetNativeTextIndent();
RecalcAndRefresh(); RecalcAndRefresh();
} }
@@ -2217,22 +2250,61 @@ void wxComboCtrlBase::SetCustomPaintWidth( int width )
RecalcAndRefresh(); RecalcAndRefresh();
} }
bool wxComboCtrlBase::DoSetMargins(const wxPoint& margins)
{
// For general sanity's sake, we ignore top margin. Instead
// we will always try to center the text vertically.
bool res = true;
if ( margins.x != -1 )
{
m_marginLeft = margins.x;
m_iFlags |= wxCC_IFLAG_LEFT_MARGIN_SET;
}
else
{
m_marginLeft = GetNativeTextIndent();
m_iFlags &= ~(wxCC_IFLAG_LEFT_MARGIN_SET);
}
if ( margins.y != -1 )
{
res = false;
}
RecalcAndRefresh();
return res;
}
wxPoint wxComboCtrlBase::DoGetMargins() const
{
return wxPoint(m_marginLeft, -1);
}
#if WXWIN_COMPATIBILITY_2_6
void wxComboCtrlBase::SetTextIndent( int indent ) void wxComboCtrlBase::SetTextIndent( int indent )
{ {
if ( indent < 0 ) if ( indent < 0 )
{ {
m_absIndent = GetNativeTextIndent(); m_marginLeft = GetNativeTextIndent();
m_iFlags &= ~(wxCC_IFLAG_INDENT_SET); m_iFlags &= ~(wxCC_IFLAG_LEFT_MARGIN_SET);
} }
else else
{ {
m_absIndent = indent; m_marginLeft = indent;
m_iFlags |= wxCC_IFLAG_INDENT_SET; m_iFlags |= wxCC_IFLAG_LEFT_MARGIN_SET;
} }
RecalcAndRefresh(); RecalcAndRefresh();
} }
wxCoord wxComboCtrlBase::GetTextIndent() const;
{
return m_marginLeft;
}
#endif
wxCoord wxComboCtrlBase::GetNativeTextIndent() const wxCoord wxComboCtrlBase::GetNativeTextIndent() const
{ {
return DEFAULT_TEXT_INDENT; return DEFAULT_TEXT_INDENT;

View File

@@ -265,4 +265,18 @@ wxString wxTextEntryBase::GetHint() const
return m_hintData ? m_hintData->GetHintString() : wxString(); return m_hintData ? m_hintData->GetHintString() : wxString();
} }
// ----------------------------------------------------------------------------
// margins support
// ----------------------------------------------------------------------------
bool wxTextEntryBase::DoSetMargins(const wxPoint& WXUNUSED(pt))
{
return false;
}
wxPoint wxTextEntryBase::DoGetMargins() const
{
return wxPoint(-1, -1);
}
#endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX #endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX

View File

@@ -42,35 +42,50 @@
#if defined(__WXUNIVERSAL__) #if defined(__WXUNIVERSAL__)
#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent // position adjustment for wxTextCtrl, to achieve zero left margin
// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
#define TEXTCTRLXADJUST 0
#define TEXTCTRLYADJUST 0 #define TEXTCTRLYADJUST 0
#define TEXTXADJUST 0 // how much is read-only text's x adjusted #define TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 19 #define DEFAULT_DROPBUTTON_WIDTH 19
#elif defined(__WXMSW__) #elif defined(__WXMSW__)
#define TEXTCTRLXADJUST 2 // position adjustment for wxTextCtrl, with zero indent // position adjustment for wxTextCtrl, to achieve zero left margin
// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
#define TEXTCTRLXADJUST 2
#define TEXTCTRLYADJUST 3 #define TEXTCTRLYADJUST 3
#define TEXTXADJUST 0 // how much is read-only text's x adjusted #define TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 17 #define DEFAULT_DROPBUTTON_WIDTH 17
#elif defined(__WXGTK__) #elif defined(__WXGTK__)
#define TEXTCTRLXADJUST -1 // position adjustment for wxTextCtrl, with zero indent // position adjustment for wxTextCtrl, to achieve zero left margin
// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
#define TEXTCTRLXADJUST -1
#define TEXTCTRLYADJUST 0 #define TEXTCTRLYADJUST 0
#define TEXTXADJUST 1 // how much is read-only text's x adjusted #define TEXTXADJUST 1 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 23 #define DEFAULT_DROPBUTTON_WIDTH 23
#elif defined(__WXMAC__) #elif defined(__WXMAC__)
#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent // position adjustment for wxTextCtrl, to achieve zero left margin
// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
#define TEXTCTRLXADJUST 0
#define TEXTCTRLYADJUST 0 #define TEXTCTRLYADJUST 0
#define TEXTXADJUST 0 // how much is read-only text's x adjusted #define TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 22 #define DEFAULT_DROPBUTTON_WIDTH 22
#else #else
#define TEXTCTRLXADJUST 0 // position adjustment for wxTextCtrl, with zero indent // position adjustment for wxTextCtrl, to achieve zero left margin
// meaningless if LEFT_MARGIN_CAN_BE_SET set to 1 in combocmn.cpp
#define TEXTCTRLXADJUST 0
#define TEXTCTRLYADJUST 0 #define TEXTCTRLYADJUST 0
#define TEXTXADJUST 0 // how much is read-only text's x adjusted #define TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 19 #define DEFAULT_DROPBUTTON_WIDTH 19

View File

@@ -1085,7 +1085,7 @@ void wxOwnerDrawnComboBox::OnDrawItem( wxDC& dc,
if ( flags & wxODCB_PAINTING_CONTROL ) if ( flags & wxODCB_PAINTING_CONTROL )
{ {
dc.DrawText( GetValue(), dc.DrawText( GetValue(),
rect.x + GetTextIndent(), rect.x + GetMargins().x,
(rect.height-dc.GetCharHeight())/2 + rect.y ); (rect.height-dc.GetCharHeight())/2 + rect.y );
} }
else else

View File

@@ -818,6 +818,11 @@ GtkEditable *wxTextCtrl::GetEditable() const
return GTK_EDITABLE(m_text); return GTK_EDITABLE(m_text);
} }
GtkEntry *wxTextCtrl::GetEntry() const
{
return GTK_ENTRY(m_text);
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// flags handling // flags handling
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -326,4 +326,74 @@ void wxTextEntry::SendMaxLenEvent()
win->HandleWindowEvent(event); win->HandleWindowEvent(event);
} }
// ----------------------------------------------------------------------------
// margins support
// ----------------------------------------------------------------------------
bool wxTextEntry::DoSetMargins(const wxPoint& margins)
{
#if GTK_CHECK_VERSION(2,10,0)
GtkEntry* entry = GetEntry();
if ( !entry )
return false;
const GtkBorder* oldBorder = gtk_entry_get_inner_border(entry);
GtkBorder* newBorder;
if ( oldBorder )
{
newBorder = gtk_border_copy(oldBorder);
}
else
{
#if GTK_CHECK_VERSION(2,14,0)
newBorder = gtk_border_new();
#else
newBorder = new GtkBorder;
#endif
// Use some reasonable defaults for initial margins
newBorder->left = 2;
newBorder->right = 2;
// These numbers seem to let the text remain vertically centered
// in common use scenarios when margins.y == -1.
newBorder->top = 3;
newBorder->bottom = 3;
}
if ( margins.x != -1 )
newBorder->left = (gint) margins.x;
if ( margins.y != -1 )
newBorder->top = (gint) margins.y;
gtk_entry_set_inner_border(entry, newBorder);
return true;
#else
wxUnusedVar(margins);
return false;
#endif
}
wxPoint wxTextEntry::DoGetMargins() const
{
#if GTK_CHECK_VERSION(2,10,0)
GtkEntry* entry = GetEntry();
if ( !entry )
return wxPoint(-1, -1);
const GtkBorder* border = gtk_entry_get_inner_border(entry);
if ( !border )
return wxPoint(-1, -1);
return wxPoint((wxCoord) border->left, (wxCoord) border->top);
#else
return wxPoint(-1, -1);
#endif
}
#endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX #endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX

View File

@@ -117,9 +117,7 @@
#define NATIVE_TEXT_INDENT_XP 4 #define NATIVE_TEXT_INDENT_XP 4
#define NATIVE_TEXT_INDENT_CLASSIC 2 #define NATIVE_TEXT_INDENT_CLASSIC 2
#define TEXTCTRLXADJUST_XP 1
#define TEXTCTRLYADJUST_XP 3 #define TEXTCTRLYADJUST_XP 3
#define TEXTCTRLXADJUST_CLASSIC 1
#define TEXTCTRLYADJUST_CLASSIC 3 #define TEXTCTRLYADJUST_CLASSIC 3
#define COMBOBOX_ANIMATION_RESOLUTION 10 #define COMBOBOX_ANIMATION_RESOLUTION 10
@@ -264,19 +262,16 @@ void wxComboCtrl::OnResize()
// //
// Recalculates button and textctrl areas // Recalculates button and textctrl areas
int textCtrlXAdjust;
int textCtrlYAdjust; int textCtrlYAdjust;
#if wxUSE_UXTHEME #if wxUSE_UXTHEME
if ( wxUxThemeEngine::GetIfActive() ) if ( wxUxThemeEngine::GetIfActive() )
{ {
textCtrlXAdjust = TEXTCTRLXADJUST_XP;
textCtrlYAdjust = TEXTCTRLYADJUST_XP; textCtrlYAdjust = TEXTCTRLYADJUST_XP;
} }
else else
#endif #endif
{ {
textCtrlXAdjust = TEXTCTRLXADJUST_CLASSIC;
textCtrlYAdjust = TEXTCTRLYADJUST_CLASSIC; textCtrlYAdjust = TEXTCTRLYADJUST_CLASSIC;
} }
@@ -286,7 +281,7 @@ void wxComboCtrl::OnResize()
CalculateAreas(btnWidth); CalculateAreas(btnWidth);
// Position textctrl using standard routine // Position textctrl using standard routine
PositionTextCtrl(textCtrlXAdjust,textCtrlYAdjust); PositionTextCtrl(0, textCtrlYAdjust);
} }
// Draws non-XP GUI dotted line around the focus area // Draws non-XP GUI dotted line around the focus area

View File

@@ -474,4 +474,44 @@ wxString wxTextEntry::GetHint() const
#endif // wxUSE_UXTHEME #endif // wxUSE_UXTHEME
// ----------------------------------------------------------------------------
// margins support
// ----------------------------------------------------------------------------
bool wxTextEntry::DoSetMargins(const wxPoint& margins)
{
#if !defined(__WXWINCE__)
bool res = true;
if ( margins.x != -1 )
{
// left margin
::SendMessage(GetEditHwnd(), EM_SETMARGINS,
EC_LEFTMARGIN, MAKELONG(margins.x, 0));
}
if ( margins.y != -1 )
{
res = false;
}
return res;
#else
return false;
#endif
}
wxPoint wxTextEntry::DoGetMargins() const
{
#if !defined(__WXWINCE__)
LRESULT lResult = ::SendMessage(GetEditHwnd(), EM_GETMARGINS,
0, 0);
int left = LOWORD(lResult);
int top = -1;
return wxPoint(left, top);
#else
return wxPoint(-1, -1);
#endif
}
#endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX #endif // wxUSE_TEXTCTRL || wxUSE_COMBOBOX

View File

@@ -77,10 +77,6 @@
#include "wx/odcombo.h" #include "wx/odcombo.h"
#ifdef __WXMSW__
#include "wx/msw/private.h"
#endif
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
#if defined(__WXMSW__) #if defined(__WXMSW__)
@@ -150,7 +146,8 @@
#define wxPG_CHOICEYADJUST 0 #define wxPG_CHOICEYADJUST 0
#endif #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 9
// Milliseconds to wait for two mouse-ups after focus inorder // Milliseconds to wait for two mouse-ups after focus inorder
// to trigger a double-click. // 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 // Fix indentation, just in case (change in font boldness is one good
// reason). // reason).
#if defined(__WXMSW__) && !defined(__WXWINCE__) tc->SetMargins(0);
::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 // Provided so that, for example, ComboBox editor can use the same code
@@ -582,13 +574,16 @@ public:
return rect.width; return rect.width;
} }
virtual void PositionTextCtrl( int WXUNUSED(textCtrlXAdjust), virtual void PositionTextCtrl( int textCtrlXAdjust,
int WXUNUSED(textCtrlYAdjust) ) int WXUNUSED(textCtrlYAdjust) )
{ {
wxPropertyGrid* pg = GetGrid(); wxPropertyGrid* pg = GetGrid();
#ifdef wxPG_TEXTCTRLXADJUST
textCtrlXAdjust = wxPG_TEXTCTRLXADJUST -
(wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1) - 1,
#endif
wxOwnerDrawnComboBox::PositionTextCtrl( wxOwnerDrawnComboBox::PositionTextCtrl(
wxPG_TEXTCTRLXADJUST - textCtrlXAdjust,
(wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1) - 1,
pg->GetSpacingY() + 2 pg->GetSpacingY() + 2
); );
} }
@@ -877,7 +872,7 @@ wxWindow* wxPGChoiceEditor::CreateControlsBase( wxPropertyGrid* propGrid,
odcbFlags); odcbFlags);
cb->SetButtonPosition(si.y,0,wxRIGHT); cb->SetButtonPosition(si.y,0,wxRIGHT);
cb->SetTextIndent(wxPG_XBEFORETEXT-1); cb->SetMargins(wxPG_XBEFORETEXT-1);
wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() ); wxPGChoiceEditor_SetCustomPaintWidth( propGrid, cb, property->GetCommonValue() );
@@ -1598,7 +1593,7 @@ void wxPropertyGrid::CorrectEditorWidgetPosY()
// Fixes position of wxTextCtrl-like control (wxSpinCtrl usually // Fixes position of wxTextCtrl-like control (wxSpinCtrl usually
// fits into that category as well). // fits into that category as well).
void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl, void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl,
unsigned int forColumn, unsigned int WXUNUSED(forColumn),
const wxPoint& offset ) const wxPoint& offset )
{ {
// Center the control vertically // Center the control vertically
@@ -1612,10 +1607,14 @@ void wxPropertyGrid::FixPosForTextCtrl( wxWindow* ctrl,
finalPos.y += y_adj; finalPos.y += y_adj;
finalPos.height -= (y_adj+sz_dec); finalPos.height -= (y_adj+sz_dec);
int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST; #ifndef wxPG_TEXTCTRLXADJUST
int textCtrlXAdjust = wxPG_XBEFORETEXT - 1;
if ( forColumn != 1 ) wxTextCtrl* tc = static_cast<wxTextCtrl*>(ctrl);
textCtrlXAdjust -= 3; // magic number! tc->SetMargins(0);
#else
int textCtrlXAdjust = wxPG_TEXTCTRLXADJUST;
#endif
finalPos.x += textCtrlXAdjust; finalPos.x += textCtrlXAdjust;
finalPos.width -= textCtrlXAdjust; finalPos.width -= textCtrlXAdjust;
@@ -1691,13 +1690,6 @@ wxWindow* wxPropertyGrid::GenerateEditorTextCtrl( const wxPoint& pos,
{ {
tc->SetBackgroundColour(m_colSelBack); tc->SetBackgroundColour(m_colSelBack);
tc->SetForegroundColour(m_colSelFore); tc->SetForegroundColour(m_colSelFore);
// Normalize margins
#ifdef __WXMSW__
::SendMessage(GetHwndOf(tc), EM_SETMARGINS,
EC_LEFTMARGIN | EC_RIGHTMARGIN,
MAKELONG(3, 0));
#endif
} }
#ifdef __WXMSW__ #ifdef __WXMSW__

View File

@@ -64,10 +64,6 @@
#include "wx/timer.h" #include "wx/timer.h"
#include "wx/dcbuffer.h" #include "wx/dcbuffer.h"
#ifdef __WXMSW__
#include "wx/msw/private.h"
#endif
// Two pics for the expand / collapse buttons. // Two pics for the expand / collapse buttons.
// Files are not supplied with this project (since it is // Files are not supplied with this project (since it is
// recommended to use either custom or native rendering). // recommended to use either custom or native rendering).
@@ -3867,18 +3863,6 @@ bool wxPropertyGrid::DoSelectProperty( wxPGProperty* p, unsigned int flags )
if ( (p->m_flags & wxPG_PROP_MODIFIED) && (m_windowStyle & wxPG_BOLD_MODIFIED) ) if ( (p->m_flags & wxPG_PROP_MODIFIED) && (m_windowStyle & wxPG_BOLD_MODIFIED) )
SetCurControlBoldFont(); SetCurControlBoldFont();
//
// Fix TextCtrl indentation
#if defined(__WXMSW__) && !defined(__WXWINCE__)
wxTextCtrl* tc = NULL;
if ( primaryCtrl->IsKindOf(CLASSINFO(wxOwnerDrawnComboBox)) )
tc = ((wxOwnerDrawnComboBox*)primaryCtrl)->GetTextCtrl();
else
tc = wxDynamicCast(primaryCtrl, wxTextCtrl);
if ( tc )
::SendMessage(GetHwndOf(tc), EM_SETMARGINS, EC_LEFTMARGIN | EC_RIGHTMARGIN, MAKELONG(0, 0));
#endif
// Store x relative to splitter (we'll need it). // Store x relative to splitter (we'll need it).
m_ctrlXAdjust = m_wndEditor->GetPosition().x - splitterX; m_ctrlXAdjust = m_wndEditor->GetPosition().x - splitterX;