X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/ce9685190eecd78ce64b7bb5321fdde960800456..3a61f5db2c1292d1f6cbfc5bff1edfbdf7b1fc99:/include/wx/combo.h diff --git a/include/wx/combo.h b/include/wx/combo.h index 25dc298df4..6a190e524a 100644 --- a/include/wx/combo.h +++ b/include/wx/combo.h @@ -46,8 +46,8 @@ #include "wx/renderer.h" // this is needed for wxCONTROL_XXX flags #include "wx/bitmap.h" // wxBitmap used by-value -class WXDLLIMPEXP_CORE wxTextCtrl; -class WXDLLEXPORT wxComboPopup; +class WXDLLIMPEXP_FWD_CORE wxTextCtrl; +class WXDLLIMPEXP_FWD_CORE wxComboPopup; // // New window styles for wxComboCtrlBase @@ -75,22 +75,38 @@ enum wxCC_POPUP_ON_MOUSE_UP = 0x0002, // All text is not automatically selected on click wxCC_NO_TEXT_AUTO_SELECT = 0x0004, + // Drop-button stays down as long as popup is displayed. + wxCC_BUTTON_STAYS_DOWN = 0x0008, + // Drop-button covers the entire control. + wxCC_FULL_BUTTON = 0x0010, + // Drop-button goes over the custom-border (used under WinVista). + wxCC_BUTTON_COVERS_BORDER = 0x0020, // Internal use: signals creation is complete wxCC_IFLAG_CREATED = 0x0100, // Internal use: really put button outside wxCC_IFLAG_BUTTON_OUTSIDE = 0x0200, - // Internal use: SetTextIndent has been called - wxCC_IFLAG_INDENT_SET = 0x0400, + // Internal use: SetMargins has been succesfully called + wxCC_IFLAG_LEFT_MARGIN_SET = 0x0400, // 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). + wxCC_IFLAG_USE_ALT_POPUP = 0x1000, + // Internal use: Skip popup animation. + wxCC_IFLAG_DISABLE_POPUP_ANIM = 0x2000, + // Internal use: Drop-button is a bitmap button or has non-default size + // (but can still be on either side of the control), regardless whether + // specified by the platform or the application. + wxCC_IFLAG_HAS_NONSTANDARD_BUTTON = 0x4000 }; // Flags used by PreprocessMouseEvent and HandleButtonMouseEvent enum { - wxCC_MF_ON_BUTTON = 0x0001 // cursor is on dropbutton area + wxCC_MF_ON_BUTTON = 0x0001, // cursor is on dropbutton area + wxCC_MF_ON_CLICK_AREA = 0x0002 // cursor is on dropbutton or other area + // that can be clicked to show the popup. }; @@ -103,7 +119,8 @@ struct wxComboCtrlFeatures BitmapButton = 0x0002, // Button may be replaced with bitmap ButtonSpacing = 0x0004, // Button can have spacing from the edge // 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 PaintWritable = 0x0020, // A variable-width area in front of writable // combo control's textctrl can be custom @@ -122,9 +139,10 @@ struct wxComboCtrlFeatures }; -class WXDLLEXPORT wxComboCtrlBase : public wxControl +class WXDLLIMPEXP_CORE wxComboCtrlBase : public wxControl { friend class wxComboPopup; + friend class wxComboPopupEvtHandler; public: // ctors and such wxComboCtrlBase() : wxControl() { Init(); } @@ -142,13 +160,13 @@ public: // show/hide popup window virtual void ShowPopup(); - virtual void HidePopup(); + virtual void HidePopup(bool generateEvent=false); // Override for totally custom combo action virtual void OnButtonClick(); // return true if the popup is currently shown - bool IsPopupShown() const { return m_isPopupShown; } + bool IsPopupShown() const { return m_popupWinState == Visible; } // set interface class instance derived from wxComboPopup // NULL popup can be used to indicate default in a derived class @@ -178,6 +196,10 @@ public: virtual bool Enable(bool enable = true); virtual bool Show(bool show = true); virtual bool SetFont(const wxFont& font); +#if wxUSE_VALIDATORS + virtual void SetValidator(const wxValidator &validator); + virtual wxValidator *GetValidator(); +#endif // wxUSE_VALIDATORS // wxTextCtrl methods - for readonly combo they should return // without errors. @@ -283,19 +305,18 @@ public: const wxBitmap& bmpHover = wxNullBitmap, const wxBitmap& bmpDisabled = wxNullBitmap ); +#if WXWIN_COMPATIBILITY_2_8 // // 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. // Platform-specific default can be set with value-1. // Remarks // * This method may do nothing on some native implementations. - void SetTextIndent( int indent ); + wxDEPRECATED( void SetTextIndent( int indent ) ); // Returns actual indentation in pixels. - wxCoord GetTextIndent() const - { - return m_absIndent; - } + wxDEPRECATED( wxCoord GetTextIndent() const ); +#endif // Returns area covered by the text field. const wxRect& GetTextRect() const @@ -303,6 +324,30 @@ public: return m_tcArea; } + // Call with enable as true to use a type of popup window that guarantees ability + // to focus the popup control, and normal function of common native controls. + // This alternative popup window is usually a wxDialog, and as such it's parent + // frame will appear as if the focus has been lost from it. + void UseAltPopupWindow( bool enable = true ) + { + wxASSERT_MSG( !m_winPopup, + wxT("call this only before SetPopupControl") ); + + if ( enable ) + m_iFlags |= wxCC_IFLAG_USE_ALT_POPUP; + else + m_iFlags &= ~wxCC_IFLAG_USE_ALT_POPUP; + } + + // Call with false to disable popup animation, if any. + void EnablePopupAnimation( bool enable = true ) + { + if ( enable ) + m_iFlags &= ~wxCC_IFLAG_DISABLE_POPUP_ANIM; + else + m_iFlags |= wxCC_IFLAG_DISABLE_POPUP_ANIM; + } + // // Utilies needed by the popups or native implementations // @@ -331,8 +376,8 @@ public: bool ShouldDrawFocus() const { const wxWindow* curFocus = FindFocus(); - return ( !m_isPopupShown && - (curFocus == this || (m_btn && curFocus == m_btn)) && + return ( IsPopupWindowState(Hidden) && + (curFocus == m_mainCtrlWnd || (m_btn && curFocus == m_btn)) && (m_windowStyle & wxCB_READONLY) ); } @@ -342,6 +387,25 @@ public: const wxBitmap& GetBitmapHover() const { return m_bmpHover; } const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; } + // Hint functions mirrored from TextEntryBase + virtual bool SetHint(const wxString& hint); + virtual wxString GetHint() const; + + // 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(); } + + // Set custom style flags for embedded wxTextCtrl. Usually must be used + // with two-step creation, before Create() call. + void SetTextCtrlStyle( int style ); + // Return internal flags wxUint32 GetInternalFlags() const { return m_iFlags; } @@ -349,10 +413,40 @@ public: bool IsCreated() const { return m_iFlags & wxCC_IFLAG_CREATED ? true : false; } // common code to be called on popup hide/dismiss - void OnPopupDismiss(); + void OnPopupDismiss(bool generateEvent); + + // PopupShown states + enum + { + Hidden = 0, + //Closing = 1, + Animating = 2, + Visible = 3 + }; + + bool IsPopupWindowState( int state ) const { return (state == m_popupWinState) ? true : false; } + + wxByte GetPopupWindowState() const { return m_popupWinState; } + + // Set value returned by GetMainWindowOfCompositeControl + void SetCtrlMainWnd( wxWindow* wnd ) { m_mainCtrlWnd = wnd; } + + // This is public so we can access it from wxComboCtrlTextCtrl + virtual wxWindow *GetMainWindowOfCompositeControl() + { return m_mainCtrlWnd; } protected: + // Returns true if hint text should be drawn in the control + bool ShouldUseHintText(int flags = 0) const + { + return ( !m_text && + !(flags & wxCONTROL_ISSUBMENU) && + !m_valueString.length() && + m_hintText.length() && + !ShouldDrawFocus() ); + } + // // Override these for customization purposes // @@ -360,7 +454,8 @@ protected: // called from wxSizeEvent handler 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; // Called in syscolourchanged handler and base create @@ -373,8 +468,16 @@ protected: // Installs standard input handler to combo (and optionally to the textctrl) void InstallInputHandlers(); + // Flags for DrawButton + enum + { + Button_PaintBackground = 0x0001, // Paints control background below the button + Button_BitmapOnly = 0x0002 // Only paints the bitmap + }; + // Draws dropbutton. Using wxRenderer or bitmaps, as appropriate. - void DrawButton( wxDC& dc, const wxRect& rect, bool paintBg = true ); + // Flags are defined above. + virtual void DrawButton( wxDC& dc, const wxRect& rect, int flags = Button_PaintBackground ); // Call if cursor is on button area or mouse is captured for the button. //bool HandleButtonMouseEvent( wxMouseEvent& event, bool isInside ); @@ -400,6 +503,10 @@ protected: // override the base class virtuals involved in geometry calculations virtual wxSize DoGetBestSize() const; + // also set the embedded wxTextCtrl colours + virtual bool SetForegroundColour(const wxColour& colour); + virtual bool SetBackgroundColour(const wxColour& colour); + // NULL popup can be used to indicate default in a derived class virtual void DoSetPopupControl(wxComboPopup* popup); @@ -413,14 +520,16 @@ protected: // Standard textctrl positioning routine. Just give it platform-dependant // textctrl coordinate adjustment. - void PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust ); + virtual void PositionTextCtrl( int textCtrlXAdjust, int textCtrlYAdjust ); // event handlers void OnSizeEvent( wxSizeEvent& event ); void OnFocusEvent(wxFocusEvent& event); + void OnIdleEvent(wxIdleEvent& event); void OnTextCtrlEvent(wxCommandEvent& event); void OnSysColourChanged(wxSysColourChangedEvent& event); void OnKeyEvent(wxKeyEvent& event); + void OnCharEvent(wxKeyEvent& event); // Set customization flags (directs how wxComboCtrlBase helpers behave) void Customize( wxUint32 flags ) { m_iFlags |= flags; } @@ -428,16 +537,37 @@ protected: // Dispatches size event and refreshes void RecalcAndRefresh(); + // Flags for DoShowPopup and AnimateShow + enum + { + ShowBelow = 0x0000, // Showing popup below the control + ShowAbove = 0x0001, // Showing popup above the control + CanDeferShow = 0x0002 // Can only return true from AnimateShow if this is set + }; + + // Shows and positions the popup. + virtual void DoShowPopup( const wxRect& rect, int flags ); + + // Implement in derived class to create a drop-down animation. + // Return true if finished immediately. Otherwise popup is only + // shown when the derived class call DoShowPopup. + // Flags are same as for DoShowPopup. + virtual bool AnimateShow( const wxRect& rect, int flags ); + #if wxUSE_TOOLTIPS virtual void DoSetToolTip( wxToolTip *tip ); #endif - // Used by OnPaints of derived classes - wxBitmap& GetBufferBitmap(const wxSize& sz) const; + // margins functions + virtual bool DoSetMargins(const wxPoint& pt); + virtual wxPoint DoGetMargins() const; // This is used when m_text is hidden (readonly). wxString m_valueString; + // This is used when control is unfocused and m_valueString is empty + wxString m_hintText; + // the text control and button we show all the time wxTextCtrl* m_text; wxWindow* m_btn; @@ -458,7 +588,13 @@ protected: wxEvtHandler* m_toplevEvtHandler; // this is for the control in popup - wxEvtHandler* m_popupExtraHandler; + wxEvtHandler* m_popupEvtHandler; + + // this is for the popup window + wxEvtHandler* m_popupWinEvtHandler; + + // main (ie. topmost) window of a composite control (default = this) + wxWindow* m_mainCtrlWnd; // used to prevent immediate re-popupping incase closed popup // by clicking on the combo control (needed because of inconsistent @@ -480,8 +616,8 @@ protected: // selection indicator. wxCoord m_widthCustomPaint; - // absolute text indentation, in pixels - wxCoord m_absIndent; + // left margin, in pixels + wxCoord m_marginLeft; // side on which the popup is aligned int m_anchorSide; @@ -517,17 +653,26 @@ protected: // platform-dependant customization and other flags wxUint32 m_iFlags; + // custom style for m_text + int m_textCtrlStyle; + // draw blank button background under bitmap? bool m_blankButtonBg; // is the popup window currenty shown? - bool m_isPopupShown; + wxByte m_popupWinState; + + // should the focus be reset to the textctrl in idle time? + bool m_resetFocus; private: void Init(); wxByte m_ignoreEvtText; // Number of next EVT_TEXTs to ignore + // Is popup window wxPopupTransientWindow, wxPopupWindow or wxDialog? + wxByte m_popupWinType; + DECLARE_EVENT_TABLE() DECLARE_ABSTRACT_CLASS(wxComboCtrlBase) @@ -546,14 +691,16 @@ enum wxCP_IFLAG_CREATED = 0x0001 // Set by wxComboCtrlBase after Create is called }; +class WXDLLIMPEXP_FWD_CORE wxComboCtrl; + -class WXDLLEXPORT wxComboPopup +class WXDLLIMPEXP_CORE wxComboPopup { friend class wxComboCtrlBase; public: wxComboPopup() { - m_combo = (wxComboCtrlBase*) NULL; + m_combo = NULL; m_iFlags = 0; } @@ -561,7 +708,7 @@ public: // variable has been initialized before the call. // NOTE: It is not in constructor so the derived class doesn't need to redefine // a default constructor of its own. - virtual void Init() { }; + virtual void Init() { } virtual ~wxComboPopup(); @@ -589,10 +736,14 @@ public: // Default implementation draws value as string. virtual void PaintComboControl( wxDC& dc, const wxRect& rect ); - // Receives key events from the parent wxComboCtrl. + // Receives wxEVT_KEY_DOWN key events from the parent wxComboCtrl. // Events not handled should be skipped, as usual. virtual void OnComboKeyEvent( wxKeyEvent& event ); + // Receives wxEVT_CHAR key events from the parent wxComboCtrl. + // Events not handled should be skipped, as usual. + virtual void OnComboCharEvent( wxKeyEvent& event ); + // Implement if you need to support special action when user // double-clicks on the parent wxComboCtrl. virtual void OnComboDoubleClick(); @@ -623,6 +774,9 @@ public: return (m_iFlags & wxCP_IFLAG_CREATED) ? true : false; } + // Returns pointer to the associated parent wxComboCtrl. + wxComboCtrl* GetComboCtrl() const; + // Default PaintComboControl behaviour static void DefaultPaintComboControl( wxComboCtrlBase* combo, wxDC& dc,