]> git.saurik.com Git - wxWidgets.git/blobdiff - src/generic/combog.cpp
move m_sizeSet out of wxWindow
[wxWidgets.git] / src / generic / combog.cpp
index 1ad84ee1db6f0576b51fd7a55f2ef938f769570c..29b9d21f9676c35de4842574caa98e61a2624697 100644 (file)
@@ -65,7 +65,7 @@
 #define TEXTCTRLXADJUST                 0 // position adjustment for wxTextCtrl, with zero indent
 #define TEXTCTRLYADJUST                 0
 #define TEXTXADJUST                     0 // how much is read-only text's x adjusted
 #define TEXTCTRLXADJUST                 0 // position adjustment for wxTextCtrl, with zero indent
 #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
 
 
 #else
 
@@ -110,15 +110,16 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
                                 const wxValidator& validator,
                                 const wxString& name)
 {
                                 const wxValidator& validator,
                                 const wxString& name)
 {
-
-    // Set border
+    //
+    // Note that technically we only support 'default' border and wxNO_BORDER.
     long border = style & wxBORDER_MASK;
     long border = style & wxBORDER_MASK;
+    int tcBorder = wxNO_BORDER;
 
 
-    if ( !border )
-    {
 #if defined(__WXUNIVERSAL__)
 #if defined(__WXUNIVERSAL__)
+    if ( !border )
         border = wxBORDER_SIMPLE;
 #elif defined(__WXMSW__)
         border = wxBORDER_SIMPLE;
 #elif defined(__WXMSW__)
+    if ( !border )
         // For XP, have 1-width custom border, for older version use sunken
         /*if ( wxUxThemeEngine::GetIfActive() )
         {
         // For XP, have 1-width custom border, for older version use sunken
         /*if ( wxUxThemeEngine::GetIfActive() )
         {
@@ -127,22 +128,43 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
         }
         else*/
             border = wxBORDER_SUNKEN;
         }
         else*/
             border = wxBORDER_SUNKEN;
-#elif defined(__WXGTK__)
-        border = wxBORDER_NONE;
-        //m_widthCustomBorder = 2;
-        m_widthCustomBorder = 1;
 #else
 #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;
+    }
+
+    // Because we are going to have button outside the border,
+    // let's use wxBORDER_NONE for the whole control.
+    border = wxBORDER_NONE;
 
 
-#if defined(__WXGTK__)
     Customize( wxCC_BUTTON_OUTSIDE_BORDER |
     Customize( wxCC_BUTTON_OUTSIDE_BORDER |
-               wxCC_NO_TEXT_AUTO_SELECT );
+               wxCC_NO_TEXT_AUTO_SELECT |
+               wxCC_BUTTON_STAYS_DOWN );
+
 #endif
 
 #endif
 
+    style = (style & ~(wxBORDER_MASK)) | border;
     if ( style & wxCC_STD_BUTTON )
         m_iFlags |= wxCC_POPUP_ON_MOUSE_UP;
 
     if ( style & wxCC_STD_BUTTON )
         m_iFlags |= wxCC_POPUP_ON_MOUSE_UP;
 
@@ -158,7 +180,7 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
         return false;
 
     // Create textctrl, if necessary
         return false;
 
     // Create textctrl, if necessary
-    CreateTextCtrl( wxNO_BORDER, validator );
+    CreateTextCtrl( tcBorder, validator );
 
     // Add keyboard input handlers for main control and textctrl
     InstallInputHandlers();
 
     // Add keyboard input handlers for main control and textctrl
     InstallInputHandlers();
@@ -166,8 +188,8 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
     // Set background
     SetBackgroundStyle( wxBG_STYLE_CUSTOM ); // for double-buffering
 
     // 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;
 }
 
     return true;
 }
@@ -201,7 +223,7 @@ void wxGenericComboCtrl::OnResize()
 void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 {
     wxSize sz = GetClientSize();
 void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 {
     wxSize sz = GetClientSize();
-    wxBufferedPaintDC dc(this,GetBufferBitmap(sz));
+    wxAutoBufferedPaintDC dc(this);
 
     const wxRect& rectb = m_btnArea;
     wxRect rect = m_tcArea;
 
     const wxRect& rectb = m_btnArea;
     wxRect rect = m_tcArea;
@@ -244,7 +266,11 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
         dc.DrawRectangle(rect2);
     }
 
         dc.DrawRectangle(rect2);
     }
 
+#ifndef __WXMAC__  // see note in OnThemeChange
     wxColour winCol = GetBackgroundColour();
     wxColour winCol = GetBackgroundColour();
+#else
+    wxColour winCol = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+#endif
     dc.SetBrush(winCol);
     dc.SetPen(winCol);
 
     dc.SetBrush(winCol);
     dc.SetPen(winCol);
 
@@ -253,10 +279,12 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 
     // clear main background
     dc.DrawRectangle(rect);
 
     // clear main background
     dc.DrawRectangle(rect);
-
+    
     if ( !m_btn )
     if ( !m_btn )
+    {
         // Standard button rendering
         // Standard button rendering
-        DrawButton(dc,rectb,true);
+        DrawButton(dc,rectb);
+    }
 
     // paint required portion on the control
     if ( (!m_text || m_widthCustomPaint) )
 
     // paint required portion on the control
     if ( (!m_text || m_widthCustomPaint) )
@@ -280,11 +308,10 @@ void wxGenericComboCtrl::OnPaintEvent( wxPaintEvent& WXUNUSED(event) )
 
 void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
 {
 
 void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
 {
-    bool isOnButtonArea = m_btnArea.Contains(event.m_x,event.m_y);
+    int mx = event.m_x;
+    bool isOnButtonArea = m_btnArea.Contains(mx,event.m_y);
     int handlerFlags = isOnButtonArea ? wxCC_MF_ON_BUTTON : 0;
 
     int handlerFlags = isOnButtonArea ? wxCC_MF_ON_BUTTON : 0;
 
-    // Preprocessing fabricates double-clicks and prevents
-    // (it may also do other common things in future)
     if ( PreprocessMouseEvent(event,handlerFlags) )
         return;
 
     if ( PreprocessMouseEvent(event,handlerFlags) )
         return;
 
@@ -301,8 +328,11 @@ void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
     }
     else
     {
     }
     else
     {
-        if ( isOnButtonArea || HasCapture() )
+        if ( isOnButtonArea || HasCapture() ||
+             (m_widthCustomPaint && mx < (m_tcArea.x+m_widthCustomPaint)) )
         {
         {
+            handlerFlags |= wxCC_MF_ON_CLICK_AREA;
+
             if ( HandleButtonMouseEvent(event,handlerFlags) )
                 return;
         }
             if ( HandleButtonMouseEvent(event,handlerFlags) )
                 return;
         }
@@ -321,6 +351,69 @@ void wxGenericComboCtrl::OnMouseEvent( wxMouseEvent& event )
 
 }
 
 
 }
 
+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;
+
+#if wxUSE_VALIDATORS
+            wxValidator* pValidator = tc->GetValidator();
+            if ( pValidator )
+            {
+                pValidator = (wxValidator*) pValidator->Clone();
+                CreateTextCtrl( tcCreateStyle, *pValidator );
+                delete pValidator;
+            }
+            else
+#endif
+            {
+                CreateTextCtrl( tcCreateStyle, wxDefaultValidator );
+            }
+
+            InstallInputHandlers();
+        }
+    }
+#endif // UNRELIABLE_TEXTCTRL_BORDER
+
+    wxComboCtrlBase::SetCustomPaintWidth( width );
+}
+
 bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
 {
     int keycode = event.GetKeyCode();
 bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
 {
     int keycode = event.GetKeyCode();
@@ -352,7 +445,7 @@ bool wxGenericComboCtrl::PerformAction(const wxControlAction& action,
     bool processed = false;
     if ( action == wxACTION_COMBOBOX_POPUP )
     {
     bool processed = false;
     if ( action == wxACTION_COMBOBOX_POPUP )
     {
-        if ( !m_isPopupShown )
+        if ( !IsPopupShown() )
         {
             ShowPopup();
 
         {
             ShowPopup();
 
@@ -361,7 +454,7 @@ bool wxGenericComboCtrl::PerformAction(const wxControlAction& action,
     }
     else if ( action == wxACTION_COMBOBOX_DISMISS )
     {
     }
     else if ( action == wxACTION_COMBOBOX_DISMISS )
     {
-        if ( m_isPopupShown )
+        if ( IsPopupShown() )
         {
             HidePopup();
 
         {
             HidePopup();