#include "wx/combobox.h"
#include "wx/dcclient.h"
#include "wx/settings.h"
+ #include "wx/textctrl.h"
#endif
#include "wx/dcbuffer.h"
#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 TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 19
#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 TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 17
#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 TEXTXADJUST 1 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 23
#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 TEXTXADJUST 0 // how much is read-only text's x adjusted
-#define DEFAULT_DROPBUTTON_WIDTH 19
+#define DEFAULT_DROPBUTTON_WIDTH 22
#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 TEXTXADJUST 0 // how much is read-only text's x adjusted
#define DEFAULT_DROPBUTTON_WIDTH 19
const wxValidator& validator,
const wxString& name)
{
-
- // Set border
+ //
+ // Note that technically we only support 'default' border and wxNO_BORDER.
long border = style & wxBORDER_MASK;
+ int tcBorder = wxNO_BORDER;
- if ( !border )
- {
#if defined(__WXUNIVERSAL__)
+ if ( !border )
border = wxBORDER_SIMPLE;
#elif defined(__WXMSW__)
+ if ( !border )
// For XP, have 1-width custom border, for older version use sunken
/*if ( wxUxThemeEngine::GetIfActive() )
{
}
else*/
border = wxBORDER_SUNKEN;
-#elif defined(__WXGTK__)
- border = wxBORDER_NONE;
- //m_widthCustomBorder = 2;
- m_widthCustomBorder = 1;
#else
- border = wxBORDER_SIMPLE;
-#endif
- style = (style & ~(wxBORDER_MASK)) | border;
+ //
+ // Generic version is optimized for wxGTK
+ //
+
+ #define UNRELIABLE_TEXTCTRL_BORDER
+
+ if ( !border )
+ {
+ if ( style & wxCB_READONLY )
+ {
+ m_widthCustomBorder = 1;
+ }
+ else
+ {
+ m_widthCustomBorder = 0;
+ tcBorder = 0;
+ }
+ }
+ else
+ {
+ // Have textctrl instead use the border given.
+ tcBorder = border;
}
-#if defined(__WXGTK__)
+ // Because we are going to have button outside the border,
+ // let's use wxBORDER_NONE for the whole control.
+ border = wxBORDER_NONE;
+
Customize( wxCC_BUTTON_OUTSIDE_BORDER |
- wxCC_NO_TEXT_AUTO_SELECT );
+ wxCC_NO_TEXT_AUTO_SELECT |
+ wxCC_BUTTON_STAYS_DOWN );
+
#endif
+ style = (style & ~(wxBORDER_MASK)) | border;
if ( style & wxCC_STD_BUTTON )
m_iFlags |= wxCC_POPUP_ON_MOUSE_UP;
pos,
size,
style | wxFULL_REPAINT_ON_RESIZE,
- wxDefaultValidator,
+ validator,
name) )
return false;
// Create textctrl, if necessary
- CreateTextCtrl( wxNO_BORDER, validator );
+ CreateTextCtrl( tcBorder );
// Add keyboard input handlers for main control and textctrl
InstallInputHandlers();
// Set background
SetBackgroundStyle( wxBG_STYLE_CUSTOM ); // for double-buffering
- // SetBestSize should be called last
- SetBestSize(size);
+ // SetInitialSize should be called last
+ SetInitialSize(size);
return true;
}
// Set border colour
wxPen pen1( wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT),
customBorder,
- wxSOLID );
+ wxPENSTYLE_SOLID);
dc.SetPen( pen1 );
// area around both controls
dc.DrawRectangle(rect2);
}
+#ifndef __WXMAC__ // see note in OnThemeChange
wxColour winCol = GetBackgroundColour();
+#else
+ wxColour winCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+#endif
dc.SetBrush(winCol);
dc.SetPen(winCol);
dc.DrawRectangle(rect);
if ( !m_btn )
+ {
// Standard button rendering
- DrawButton(dc,rectb,true);
+ DrawButton(dc,rectb);
+ }
// paint required portion on the control
if ( (!m_text || m_widthCustomPaint) )
}
+void wxGenericComboCtrl::SetCustomPaintWidth( int width )
+{
+#ifdef UNRELIABLE_TEXTCTRL_BORDER
+ //
+ // If starting/stopping to show an image in front
+ // of a writable text-field, then re-create textctrl
+ // with different kind of border (because we can't
+ // assume that textctrl fully supports wxNO_BORDER).
+ //
+ wxTextCtrl* tc = GetTextCtrl();
+
+ if ( tc && (m_iFlags & wxCC_BUTTON_OUTSIDE_BORDER) )
+ {
+ int borderType = tc->GetWindowStyle() & wxBORDER_MASK;
+ int tcCreateStyle = -1;
+
+ if ( width > 0 )
+ {
+ // Re-create textctrl with no border
+ if ( borderType != wxNO_BORDER )
+ {
+ m_widthCustomBorder = 1;
+ tcCreateStyle = wxNO_BORDER;
+ }
+ }
+ else if ( width == 0 )
+ {
+ // Re-create textctrl with normal border
+ if ( borderType == wxNO_BORDER )
+ {
+ m_widthCustomBorder = 0;
+ tcCreateStyle = 0;
+ }
+ }
+
+ // Common textctrl re-creation code
+ if ( tcCreateStyle != -1 )
+ {
+ tc->RemoveEventHandler(m_textEvtHandler);
+ delete m_textEvtHandler;
+
+ CreateTextCtrl( tcCreateStyle );
+
+ InstallInputHandlers();
+ }
+ }
+#endif // UNRELIABLE_TEXTCTRL_BORDER
+
+ wxComboCtrlBase::SetCustomPaintWidth( width );
+}
+
bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
{
int keycode = event.GetKeyCode();
}
else
{
- if ( keycode == WXK_DOWN && event.AltDown() )
+ if ( (keycode == WXK_DOWN && event.AltDown()) ||
+ (keycode == WXK_F4) )
return true;
}
bool processed = false;
if ( action == wxACTION_COMBOBOX_POPUP )
{
- if ( !m_isPopupShown )
+ if ( !IsPopupShown() )
{
ShowPopup();
}
else if ( action == wxACTION_COMBOBOX_DISMISS )
{
- if ( m_isPopupShown )
+ if ( IsPopupShown() )
{
HidePopup();