]> git.saurik.com Git - wxWidgets.git/commitdiff
[ 1573855 ] Improved appearance of wxComboCtrl's wxTextCtrl
authorRobert Roebling <robert@roebling.de>
Mon, 9 Oct 2006 20:12:19 +0000 (20:12 +0000)
committerRobert Roebling <robert@roebling.de>
Mon, 9 Oct 2006 20:12:19 +0000 (20:12 +0000)
 More work needs to be done for the version with
 images.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@41835 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/generic/combo.h
src/common/combocmn.cpp
src/generic/combog.cpp

index 6d19c7580818a12c8c56b4ef68cae7db2283e87f..8ed30e4e3253da77ab24ae3ec4a52f1791cf0768 100644 (file)
@@ -65,6 +65,8 @@ public:
 
     virtual ~wxGenericComboCtrl();
 
+    void SetCustomPaintWidth( int width );
+
     virtual bool IsKeyPopupToggle(const wxKeyEvent& event) const;
 
     static int GetFeatures() { return wxComboCtrlFeatures::All; }
index 7f613330e3f7934d7f74858fec0c9b95fa41c2cb..84a4a7e9c5be41e6a50b577e2958c31ae5eb47fc 100644 (file)
@@ -697,6 +697,9 @@ wxComboCtrlBase::CreateTextCtrl(int style, const wxValidator& validator)
 {
     if ( !(m_windowStyle & wxCB_READONLY) )
     {
+        if ( m_text )
+            m_text->Destroy();
+
         // wxTE_PROCESS_TAB is needed because on Windows, wxTAB_TRAVERSAL is
         // not used by the wxPropertyGrid and therefore the tab is processed by
         // looking at ancestors to see if they have wxTAB_TRAVERSAL. The
@@ -906,9 +909,10 @@ void wxComboCtrlBase::PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust
     }
     else
     {
+        // If it has border, have textctrl will the entire text field.
         m_text->SetSize( m_tcArea.x,
                          0,
-                         sz.x - m_btnArea.x - m_widthCustomPaint - customBorder,
+                         sz.x - m_btnArea.width - m_widthCustomPaint - customBorder,
                          sz.y );
     }
 }
index b8a193a68c8370f461146bc9cf47910e5940c367..0db207c1528740d9ca55c78e2b2a07e05700cc71 100644 (file)
@@ -110,15 +110,16 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
                                 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() )
         {
@@ -127,22 +128,42 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
         }
         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 );
+
 #endif
 
+    style = (style & ~(wxBORDER_MASK)) | border;
     if ( style & wxCC_STD_BUTTON )
         m_iFlags |= wxCC_POPUP_ON_MOUSE_UP;
 
@@ -158,7 +179,7 @@ bool wxGenericComboCtrl::Create(wxWindow *parent,
         return false;
 
     // Create textctrl, if necessary
-    CreateTextCtrl( wxNO_BORDER, validator );
+    CreateTextCtrl( tcBorder, validator );
 
     // Add keyboard input handlers for main control and textctrl
     InstallInputHandlers();
@@ -323,6 +344,67 @@ 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;
+
+            wxValidator* pValidator = tc->GetValidator();
+            if ( pValidator )
+            {
+                pValidator = (wxValidator*) pValidator->Clone();
+                CreateTextCtrl( tcCreateStyle, *pValidator );
+                delete pValidator;
+            }
+            else
+            {
+                CreateTextCtrl( tcCreateStyle, wxDefaultValidator );
+            }
+
+            InstallInputHandlers();
+        }
+    }
+#endif // UNRELIABLE_TEXTCTRL_BORDER
+
+    wxComboCtrlBase::SetCustomPaintWidth( width );
+}
+
 bool wxGenericComboCtrl::IsKeyPopupToggle(const wxKeyEvent& event) const
 {
     int keycode = event.GetKeyCode();