]> git.saurik.com Git - wxWidgets.git/commitdiff
Add help button support to wxRibbonBar.
authorVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Sep 2012 23:19:59 +0000 (23:19 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Sat, 15 Sep 2012 23:19:59 +0000 (23:19 +0000)
Optionally show standard "Help" question mark button in the ribbon top right
corner and generate the appropriate event for it.

Closes #14576.

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

13 files changed:
include/wx/ribbon/art.h
include/wx/ribbon/bar.h
include/wx/ribbon/page.h
include/wx/ribbon/panel.h
interface/wx/ribbon/art.h
interface/wx/ribbon/bar.h
samples/ribbon/ribbondemo.cpp
src/ribbon/art_msw.cpp
src/ribbon/bar.cpp
src/ribbon/buttonbar.cpp
src/ribbon/page.cpp
src/ribbon/panel.cpp
src/ribbon/toolbar.cpp

index 5d40437594763d11b5c5ac7d9c342d9733aba17a..5042f39d489b6b46c54dc0d546802acd20fa981b 100644 (file)
@@ -21,6 +21,7 @@
 #include "wx/font.h"
 #include "wx/pen.h"
 #include "wx/bitmap.h"
 #include "wx/font.h"
 #include "wx/pen.h"
 #include "wx/bitmap.h"
+#include "wx/ribbon/bar.h"
 
 class WXDLLIMPEXP_FWD_CORE wxDC;
 class WXDLLIMPEXP_FWD_CORE wxWindow;
 
 class WXDLLIMPEXP_FWD_CORE wxDC;
 class WXDLLIMPEXP_FWD_CORE wxWindow;
@@ -306,7 +307,12 @@ public:
                         wxDC& dc,
                         wxRibbonBar* wnd,
                         const wxRect& rect,
                         wxDC& dc,
                         wxRibbonBar* wnd,
                         const wxRect& rect,
-                        bool upBitmap) = 0;
+                        wxRibbonDisplayMode mode) = 0;
+
+    virtual void DrawHelpButton(
+                        wxDC& dc,
+                        wxRibbonBar* wnd,
+                        const wxRect& rect) = 0;
 
     virtual void GetBarTabWidth(
                         wxDC& dc,
 
     virtual void GetBarTabWidth(
                         wxDC& dc,
@@ -392,9 +398,9 @@ public:
                         bool is_last,
                         wxRect* dropdown_region) = 0;
 
                         bool is_last,
                         wxRect* dropdown_region) = 0;
 
-    virtual wxRect GetBarToggleButtonArea(wxDC& dc,
-                                          const wxRibbonBar* wnd,
-                                          wxRect rect)= 0;
+    virtual wxRect GetBarToggleButtonArea(const wxRect& rect)= 0;
+
+    virtual wxRect GetRibbonHelpButtonArea(const wxRect& rect) = 0;
 };
 
 class WXDLLIMPEXP_RIBBON wxRibbonMSWArtProvider : public wxRibbonArtProvider
 };
 
 class WXDLLIMPEXP_RIBBON wxRibbonMSWArtProvider : public wxRibbonArtProvider
@@ -510,7 +516,11 @@ public:
                         wxDC& dc,
                         wxRibbonBar* wnd,
                         const wxRect& rect,
                         wxDC& dc,
                         wxRibbonBar* wnd,
                         const wxRect& rect,
-                        bool upBitmap);
+                        wxRibbonDisplayMode mode);
+
+    void DrawHelpButton(wxDC& dc,
+                        wxRibbonBar* wnd,
+                        const wxRect& rect);
 
     void GetBarTabWidth(
                         wxDC& dc,
 
     void GetBarTabWidth(
                         wxDC& dc,
@@ -591,9 +601,9 @@ public:
                         bool is_last,
                         wxRect* dropdown_region);
 
                         bool is_last,
                         wxRect* dropdown_region);
 
-    wxRect GetBarToggleButtonArea(wxDC& dc,
-                                  const wxRibbonBar* wnd,
-                                  wxRect rect);
+    wxRect GetBarToggleButtonArea(const wxRect& rect);
+
+    wxRect GetRibbonHelpButtonArea(const wxRect& rect);
 
 protected:
     void ReallyDrawTabSeparator(wxWindow* wnd, const wxRect& rect, double visibility);
 
 protected:
     void ReallyDrawTabSeparator(wxWindow* wnd, const wxRect& rect, double visibility);
@@ -632,6 +642,8 @@ protected:
     wxBitmap m_panel_extension_bitmap[2];
     wxBitmap m_ribbon_toggle_up_bitmap[2];
     wxBitmap m_ribbon_toggle_down_bitmap[2];
     wxBitmap m_panel_extension_bitmap[2];
     wxBitmap m_ribbon_toggle_up_bitmap[2];
     wxBitmap m_ribbon_toggle_down_bitmap[2];
+    wxBitmap m_ribbon_toggle_pin_bitmap[2];
+    wxBitmap m_ribbon_bar_help_button_bitmap[2];
 
     wxColour m_primary_scheme_colour;
     wxColour m_secondary_scheme_colour;
 
     wxColour m_primary_scheme_colour;
     wxColour m_secondary_scheme_colour;
@@ -745,6 +757,8 @@ protected:
     int m_gallery_bitmap_padding_right_size;
     int m_gallery_bitmap_padding_top_size;
     int m_gallery_bitmap_padding_bottom_size;
     int m_gallery_bitmap_padding_right_size;
     int m_gallery_bitmap_padding_top_size;
     int m_gallery_bitmap_padding_bottom_size;
+    int m_toggle_button_offset;
+    int m_help_button_offset;
 };
 
 class WXDLLIMPEXP_RIBBON wxRibbonAUIArtProvider : public wxRibbonMSWArtProvider
 };
 
 class WXDLLIMPEXP_RIBBON wxRibbonAUIArtProvider : public wxRibbonMSWArtProvider
index 755358d15bdaacbdda4e4a02147eb74d09ed9b9b..8eac8e07718cfd710e94e0927f13da2d6d62178a 100644 (file)
@@ -29,11 +29,13 @@ enum wxRibbonBarOption
     wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS = 1 << 4,
     wxRIBBON_BAR_ALWAYS_SHOW_TABS = 1 << 5,
     wxRIBBON_BAR_SHOW_TOGGLE_BUTTON = 1 << 6,
     wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS = 1 << 4,
     wxRIBBON_BAR_ALWAYS_SHOW_TABS = 1 << 5,
     wxRIBBON_BAR_SHOW_TOGGLE_BUTTON = 1 << 6,
+    wxRIBBON_BAR_SHOW_HELP_BUTTON = 1 << 7,
 
     wxRIBBON_BAR_DEFAULT_STYLE =  wxRIBBON_BAR_FLOW_HORIZONTAL
                                 | wxRIBBON_BAR_SHOW_PAGE_LABELS
                                 | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
 
     wxRIBBON_BAR_DEFAULT_STYLE =  wxRIBBON_BAR_FLOW_HORIZONTAL
                                 | wxRIBBON_BAR_SHOW_PAGE_LABELS
                                 | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
-                                | wxRIBBON_BAR_SHOW_TOGGLE_BUTTON,
+                                | wxRIBBON_BAR_SHOW_TOGGLE_BUTTON
+                                | wxRIBBON_BAR_SHOW_HELP_BUTTON,
 
     wxRIBBON_BAR_FOLDBAR_STYLE =  wxRIBBON_BAR_FLOW_VERTICAL
                                 | wxRIBBON_BAR_SHOW_PAGE_ICONS
 
     wxRIBBON_BAR_FOLDBAR_STYLE =  wxRIBBON_BAR_FLOW_VERTICAL
                                 | wxRIBBON_BAR_SHOW_PAGE_ICONS
@@ -41,6 +43,13 @@ enum wxRibbonBarOption
                                 | wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS
 };
 
                                 | wxRIBBON_BAR_SHOW_PANEL_MINIMISE_BUTTONS
 };
 
+enum wxRibbonDisplayMode
+{
+    wxRIBBON_BAR_PINNED,
+    wxRIBBON_BAR_MINIMIZED,
+    wxRIBBON_BAR_EXPANDED
+};
+
 class WXDLLIMPEXP_RIBBON wxRibbonBarEvent : public wxNotifyEvent
 {
 public:
 class WXDLLIMPEXP_RIBBON wxRibbonBarEvent : public wxNotifyEvent
 {
 public:
@@ -144,6 +153,9 @@ public:
 
     // Implementation only.
     bool IsToggleButtonHovered() const { return m_toggle_button_hovered; }
 
     // Implementation only.
     bool IsToggleButtonHovered() const { return m_toggle_button_hovered; }
+    bool IsHelpButtonHovered() const { return m_help_button_hovered; }
+
+    void HideIfExpanded();
 
 protected:
     friend class wxRibbonPage;
 
 protected:
     friend class wxRibbonPage;
@@ -151,7 +163,7 @@ protected:
     virtual wxSize DoGetBestSize() const;
     wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
     wxRibbonPageTabInfo* HitTestTabs(wxPoint position, int* index = NULL);
     virtual wxSize DoGetBestSize() const;
     wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
     wxRibbonPageTabInfo* HitTestTabs(wxPoint position, int* index = NULL);
-    void HitTestToggleButton(wxPoint position);
+    void HitTestRibbonButton(const wxRect& rect, const wxPoint& position, bool &hover_flag);
 
     void CommonInit(long style);
     void AddPage(wxRibbonPage *page);
 
     void CommonInit(long style);
     void AddPage(wxRibbonPage *page);
@@ -175,11 +187,13 @@ protected:
     void OnMouseLeave(wxMouseEvent& evt);
     void OnMouseDoubleClick(wxMouseEvent& evt);
     void DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type);
     void OnMouseLeave(wxMouseEvent& evt);
     void OnMouseDoubleClick(wxMouseEvent& evt);
     void DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type);
+    void OnKillFocus(wxFocusEvent& evt);
 
     wxRibbonPageTabInfoArray m_pages;
     wxRect m_tab_scroll_left_button_rect;
     wxRect m_tab_scroll_right_button_rect;
     wxRect m_toggle_button_rect;
 
     wxRibbonPageTabInfoArray m_pages;
     wxRect m_tab_scroll_left_button_rect;
     wxRect m_tab_scroll_right_button_rect;
     wxRect m_toggle_button_rect;
+    wxRect m_help_button_rect;
     long m_flags;
     int m_tabs_total_width_ideal;
     int m_tabs_total_width_minimum;
     long m_flags;
     int m_tabs_total_width_ideal;
     int m_tabs_total_width_minimum;
@@ -195,6 +209,9 @@ protected:
     bool m_arePanelsShown;
     bool m_bar_hovered;
     bool m_toggle_button_hovered;
     bool m_arePanelsShown;
     bool m_bar_hovered;
     bool m_toggle_button_hovered;
+    bool m_help_button_hovered;
+
+    wxRibbonDisplayMode m_ribbon_state;
 
 #ifndef SWIG
     DECLARE_CLASS(wxRibbonBar)
 
 #ifndef SWIG
     DECLARE_CLASS(wxRibbonBar)
@@ -212,6 +229,7 @@ wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_D
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
 wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
+wxDECLARE_EXPORTED_EVENT(WXDLLIMPEXP_RIBBON, wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, wxRibbonBarEvent);
 
 typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
 
 
 typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
 
@@ -234,6 +252,8 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
     wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, winid, wxRibbonBarEventHandler(fn))
 #define EVT_RIBBONBAR_TOGGLED(winid, fn) \
     wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TOGGLED, winid, wxRibbonBarEventHandler(fn))
     wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, winid, wxRibbonBarEventHandler(fn))
 #define EVT_RIBBONBAR_TOGGLED(winid, fn) \
     wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_TOGGLED, winid, wxRibbonBarEventHandler(fn))
+#define EVT_RIBBONBAR_HELP_CLICK(winid, fn) \
+    wx__DECLARE_EVT1(wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, winid, wxRibbonBarEventHandler(fn))
 #else
 
 // wxpython/swig event work
 #else
 
 // wxpython/swig event work
@@ -245,6 +265,7 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TOGGLED;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK;
 %constant wxEventType wxEVT_COMMAND_RIBBONBAR_TOGGLED;
+%constant wxEventType wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED;
 
 %pythoncode {
     EVT_RIBBONBAR_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED, 1 )
 
 %pythoncode {
     EVT_RIBBONBAR_PAGE_CHANGED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGED, 1 )
@@ -255,6 +276,7 @@ typedef void (wxEvtHandler::*wxRibbonBarEventFunction)(wxRibbonBarEvent&);
     EVT_RIBBONBAR_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, 1 )
     EVT_RIBBONBAR_TAB_LEFT_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, 1 )
     EVT_RIBBONBAR_TOGGLED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TOGGLED, 1 )
     EVT_RIBBONBAR_TAB_RIGHT_UP = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, 1 )
     EVT_RIBBONBAR_TAB_LEFT_DCLICK = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, 1 )
     EVT_RIBBONBAR_TOGGLED = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_TOGGLED, 1 )
+    EVT_RIBBONBAR_HELP_CLICK = wx.PyEventBinder( wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, 1 )
 }
 #endif
 
 }
 #endif
 
index 6fc54ac2edf5fa6ca7ed549f1ce7696b862ba851..5d3fed58c32bff0a9d2e69d0412b5235dad58ca9 100644 (file)
@@ -61,6 +61,8 @@ public:
 
     virtual void RemoveChild(wxWindowBase *child);
 
 
     virtual void RemoveChild(wxWindowBase *child);
 
+    void HideIfExpanded();
+
 protected:
     virtual wxSize DoGetBestSize() const;
     virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
 protected:
     virtual wxSize DoGetBestSize() const;
     virtual wxBorder GetDefaultBorder() const { return wxBORDER_NONE; }
index 5e9635b94e7641ddb04b8641b1f053c021611250..27bb78ea3093ba96106b63e736483bcadd1c44cb 100644 (file)
@@ -84,6 +84,8 @@ public:
 
     long GetFlags() { return m_flags; }
 
 
     long GetFlags() { return m_flags; }
 
+    void HideIfExpanded();
+
 protected:
     virtual wxSize DoGetBestSize() const;
     virtual wxSize GetPanelSizerBestSize() const;
 protected:
     virtual wxSize DoGetBestSize() const;
     virtual wxSize GetPanelSizerBestSize() const;
index 2caacc97ce0dfac0ca5bfcb78fab6688fd043e74..a5fd62f1cd4eed8def258978d6864f7cbba75f65 100644 (file)
@@ -661,6 +661,47 @@ public:
                         wxRibbonButtonKind kind,
                         long state) = 0;
 
                         wxRibbonButtonKind kind,
                         long state) = 0;
 
+    /**
+        Draw toggle button on wxRibbonBar. This should draw a small toggle button
+        at top right corner of ribbon bar.
+
+        @param dc
+            The device context to draw onto.
+        @param wnd
+            The window which is being drawn onto, which is always the panel
+            whose background and chrome is being drawn. The panel label and
+            other panel attributes can be obtained by querying this.
+        @param rect
+            The rectangle within which to draw.
+        @param mode
+            The wxRibbonDisplayMode which should be applied to display button
+
+        @since 2.9.5
+    */
+    virtual void DrawToggleButton(wxDC& dc,
+                                  wxRibbonBar* wnd,
+                                  const wxRect& rect,
+                                  wxRibbonDisplayMode mode) = 0;
+
+    /**
+        Draw help button on wxRibbonBar. This should draw a help button
+        at top right corner of ribbon bar.
+
+        @param dc
+            The device context to draw onto.
+        @param wnd
+            The window which is being drawn onto, which is always the panel
+            whose background and chrome is being drawn. The panel label and
+            other panel attributes can be obtained by querying this.
+        @param rect
+            The rectangle within which to draw.
+
+        @since 2.9.5
+    */
+    virtual void DrawHelpButton(wxDC& dc,
+                                wxRibbonBar* wnd,
+                                const wxRect& rect) = 0;
+
     /**
         Calculate the ideal and minimum width (in pixels) of a tab in a ribbon
         bar.
     /**
         Calculate the ideal and minimum width (in pixels) of a tab in a ribbon
         bar.
@@ -961,4 +1002,24 @@ public:
                         bool is_first,
                         bool is_last,
                         wxRect* dropdown_region) = 0;
                         bool is_first,
                         bool is_last,
                         wxRect* dropdown_region) = 0;
+
+    /**
+        Calculate the position and size of the ribbon's toggle button.
+
+        @param rect
+            The ribbon bar rectangle from which calculate toggle button rectangle.
+
+        @since 2.9.5
+    */
+    virtual wxRect GetBarToggleButtonArea(const wxRect& rect) = 0;
+
+    /**
+        Calculate the position and size of the ribbon's help button.
+
+        @param rect
+            The ribbon bar rectangle from which calculate help button rectangle.
+
+        @since 2.9.5
+    */
+    virtual wxRect GetRibbonHelpButtonArea(const wxRect& rect) = 0;
 };
 };
index cfc9af0a6f7b901e76276a0496b459d87ccde52f..4830aacf5aba7895c6f3eeb21fce7591a6e70829 100644 (file)
@@ -65,7 +65,7 @@ public:
     @style{wxRIBBON_BAR_DEFAULT_STYLE}
         Defined as wxRIBBON_BAR_FLOW_HORIZONTAL |
         wxRIBBON_BAR_SHOW_PAGE_LABELS | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
     @style{wxRIBBON_BAR_DEFAULT_STYLE}
         Defined as wxRIBBON_BAR_FLOW_HORIZONTAL |
         wxRIBBON_BAR_SHOW_PAGE_LABELS | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
-        wxRIBBON_BAR_SHOW_TOGGLE_BUTTON.
+        wxRIBBON_BAR_SHOW_TOGGLE_BUTTON | wxRIBBON_BAR_SHOW_HELP_BUTTON.
     @style{wxRIBBON_BAR_FOLDBAR_STYLE}
         Defined as wxRIBBON_BAR_FLOW_VERTICAL | wxRIBBON_BAR_SHOW_PAGE_ICONS
         | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
     @style{wxRIBBON_BAR_FOLDBAR_STYLE}
         Defined as wxRIBBON_BAR_FLOW_VERTICAL | wxRIBBON_BAR_SHOW_PAGE_ICONS
         | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS |
@@ -87,6 +87,9 @@ public:
     @style{wxRIBBON_BAR_SHOW_TOGGLE_BUTTON}
         Causes a toggle button to appear on the ribbon bar at top-right corner.
         This style is new since wxWidgets 2.9.5.
     @style{wxRIBBON_BAR_SHOW_TOGGLE_BUTTON}
         Causes a toggle button to appear on the ribbon bar at top-right corner.
         This style is new since wxWidgets 2.9.5.
+    @style{wxRIBBON_BAR_SHOW_HELP_BUTTON)
+        Causes a help button to appear on the ribbon bar at the top-right corner.
+        This style is new since wxWidgets 2.9.5.
     @endStyleTable
 
 
     @endStyleTable
 
 
@@ -107,9 +110,12 @@ public:
         Triggered when the right mouse button is released on a tab.
     @event{EVT_RIBBONBAR_TAB_LEFT_DCLICK(id, func)}
         Triggered when the left mouse button is double clicked on a tab.
         Triggered when the right mouse button is released on a tab.
     @event{EVT_RIBBONBAR_TAB_LEFT_DCLICK(id, func)}
         Triggered when the left mouse button is double clicked on a tab.
-    @event{EVT_RIBBONBAR_TOGGLE_BUTTON_CLICK(id, func)}
+    @event{EVT_RIBBONBAR_TOGGLED(id, func)}
         Triggered when the button triggering the ribbon bar is clicked. This
         event is new since wxWidgets 2.9.5.
         Triggered when the button triggering the ribbon bar is clicked. This
         event is new since wxWidgets 2.9.5.
+    @event{EVT_RIBBONBAR_HELP_CLICK(id, func)}
+        Triggered when the help button is clicked. This even is new since
+        wxWidgets 2.9.5.
     @endEventTable
 
     @library{wxribbon}
     @endEventTable
 
     @library{wxribbon}
index 3fbffc2747c3d2213b2d44dd108b32e0a5181697..c29360c3dc8aedd04f447681ef08a3de9c4ff33b 100644 (file)
@@ -135,6 +135,9 @@ public:
     void OnShowPages(wxRibbonButtonBarEvent& evt);
     void OnTogglePanels(wxCommandEvent& evt);
     void OnRibbonBarToggled(wxRibbonBarEvent& evt);
     void OnShowPages(wxRibbonButtonBarEvent& evt);
     void OnTogglePanels(wxCommandEvent& evt);
     void OnRibbonBarToggled(wxRibbonBarEvent& evt);
+    void OnRibbonBarHelpClicked(wxRibbonBarEvent& evt);
+
+    void OnSizeEvent(wxSizeEvent& evt);
 
     void OnExtButton(wxRibbonPanelEvent& evt);
 
 
     void OnExtButton(wxRibbonPanelEvent& evt);
 
@@ -236,6 +239,8 @@ EVT_RIBBONBUTTONBAR_CLICKED(ID_REMOVE_PAGE, MyFrame::OnRemovePage)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_HIDE_PAGES, MyFrame::OnHidePages)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_SHOW_PAGES, MyFrame::OnShowPages)
 EVT_RIBBONBAR_TOGGLED(wxID_ANY, MyFrame::OnRibbonBarToggled)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_HIDE_PAGES, MyFrame::OnHidePages)
 EVT_RIBBONBUTTONBAR_CLICKED(ID_SHOW_PAGES, MyFrame::OnShowPages)
 EVT_RIBBONBAR_TOGGLED(wxID_ANY, MyFrame::OnRibbonBarToggled)
+EVT_RIBBONBAR_HELP_CLICK(wxID_ANY, MyFrame::OnRibbonBarHelpClicked)
+EVT_SIZE(MyFrame::OnSizeEvent)
 END_EVENT_TABLE()
 
 #include "align_center.xpm"
 END_EVENT_TABLE()
 
 #include "align_center.xpm"
@@ -264,7 +269,12 @@ END_EVENT_TABLE()
 MyFrame::MyFrame()
     : wxFrame(NULL, wxID_ANY, wxT("wxRibbon Sample Application"), wxDefaultPosition, wxSize(800, 600), wxDEFAULT_FRAME_STYLE)
 {
 MyFrame::MyFrame()
     : wxFrame(NULL, wxID_ANY, wxT("wxRibbon Sample Application"), wxDefaultPosition, wxSize(800, 600), wxDEFAULT_FRAME_STYLE)
 {
-    m_ribbon = new wxRibbonBar(this);
+    m_ribbon = new wxRibbonBar(this,-1,wxDefaultPosition, wxDefaultSize, wxRIBBON_BAR_FLOW_HORIZONTAL
+                                | wxRIBBON_BAR_SHOW_PAGE_LABELS
+                                | wxRIBBON_BAR_SHOW_PANEL_EXT_BUTTONS
+                                | wxRIBBON_BAR_SHOW_TOGGLE_BUTTON
+                                | wxRIBBON_BAR_SHOW_HELP_BUTTON
+                                );
 
     {
         wxRibbonPage* home = new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Examples"), ribbon_xpm);
 
     {
         wxRibbonPage* home = new wxRibbonPage(m_ribbon, wxID_ANY, wxT("Examples"), ribbon_xpm);
@@ -1017,3 +1027,19 @@ void MyFrame::OnRibbonBarToggled(wxRibbonBarEvent& WXUNUSED(evt))
                                 ? "expanded"
                                 : "collapsed"));
 }
                                 ? "expanded"
                                 : "collapsed"));
 }
+
+void MyFrame::OnRibbonBarHelpClicked(wxRibbonBarEvent& WXUNUSED(evt))
+{
+    AddText("Ribbon bar help clicked");
+}
+
+// This shows how to hide ribbon dynamically if there is not enough space.
+void MyFrame::OnSizeEvent(wxSizeEvent& evt)
+{
+    if ( evt.GetSize().GetWidth() < 200 )
+        m_ribbon->Hide();
+    else
+        m_ribbon->Show();
+
+    evt.Skip();
+}
\ No newline at end of file
index 9318b309c2dae27f1eb289dd80420f815a7a4eb5..8bd4273eeb10097913d23e75457a6e23e921d208 100644 (file)
@@ -19,7 +19,6 @@
 
 #include "wx/ribbon/art.h"
 #include "wx/ribbon/art_internal.h"
 
 #include "wx/ribbon/art.h"
 #include "wx/ribbon/art_internal.h"
-#include "wx/ribbon/bar.h"
 #include "wx/ribbon/buttonbar.h"
 #include "wx/ribbon/gallery.h"
 #include "wx/ribbon/toolbar.h"
 #include "wx/ribbon/buttonbar.h"
 #include "wx/ribbon/gallery.h"
 #include "wx/ribbon/toolbar.h"
@@ -122,6 +121,151 @@ static const char* const panel_toggle_up_xpm[] = {
   "x     x",
   "       ",};
 
   "x     x",
   "       ",};
 
+static const char* const ribbon_toggle_pin_xpm[] = {
+  "12 9 3 1",
+  "  c None",
+  "x c #FF00FF",
+  ". c #FF00FF",
+  "   xx       ",
+  "   x.x   xxx",
+  "   x..xxx..x",
+  "xxxx.......x",
+  "x..........x",
+  "xxxx.......x",
+  "   x..xxx..x",
+  "   x.x   xxx",
+  "   xx       "
+};
+
+static const char * const ribbon_help_button_xpm[] = {
+"12 12 112 2",
+"   c #163B95",
+".  c none",
+"X  c #1B3F98",
+"o  c #1B4097",
+"O  c #1D4198",
+"+  c #1E4298",
+"@  c #1E439B",
+"#  c #1A419F",
+"$  c #1E439D",
+"%  c #204398",
+"&  c #204399",
+"*  c #25479B",
+"=  c #25489A",
+"-  c #284A9D",
+";  c #2A4C9D",
+":  c #30519E",
+">  c #3B589A",
+",  c #3D599B",
+"<  c #1840A2",
+"1  c #1E45A1",
+"2  c #1E4AB4",
+"3  c #2D4FA0",
+"4  c #224AAC",
+"5  c #254DAC",
+"6  c #294FA9",
+"7  c #2B52AE",
+"8  c #3051A0",
+"9  c #3354A0",
+"0  c #3354A2",
+"q  c #3454A3",
+"w  c #3456A4",
+"e  c #3556A4",
+"r  c #3C5BA3",
+"t  c #395AA6",
+"y  c #3E5CA6",
+"u  c #3E5DA7",
+"i  c #3F5EA6",
+"p  c #2A51B0",
+"a  c #2E55B5",
+"s  c #2752BA",
+"d  c #3058B8",
+"f  c #3F61B2",
+"g  c #415FA7",
+"h  c #4562A7",
+"j  c #4864A7",
+"k  c #4D67A5",
+"l  c #4361A8",
+"z  c #4361A9",
+"x  c #4663A8",
+"c  c #4563AA",
+"v  c #4764AA",
+"b  c #4B68AE",
+"n  c #506AA8",
+"m  c #516DAD",
+"M  c #546EAC",
+"N  c #5F75AB",
+"B  c #5A72AC",
+"V  c #5C77B6",
+"C  c #6C7DA7",
+"Z  c #6077AD",
+"A  c #687DAF",
+"S  c #637BB4",
+"D  c #687FB7",
+"F  c #2D59C1",
+"G  c #2E5AC2",
+"H  c #2F5ECE",
+"J  c #3763CC",
+"K  c #4169CB",
+"L  c #7787AC",
+"P  c #7E8CAE",
+"I  c #7A8BB5",
+"U  c #7B8CB4",
+"Y  c #7C8FBD",
+"T  c #758FCA",
+"R  c #808CA8",
+"E  c #969DAF",
+"W  c #8291B4",
+"Q  c #8A95B0",
+"!  c #8B96B1",
+"~  c #8F9AB3",
+"^  c #8D98B5",
+"/  c #8E9AB7",
+"(  c #8997B8",
+")  c #949EB9",
+"_  c #99A1B4",
+"`  c #ADAFB7",
+"'  c #A5ABB8",
+"]  c #A6ABB8",
+"[  c #AAAFBE",
+"{  c #AFB2BE",
+"}  c #B0B1B6",
+"|  c #BAB8B6",
+" . c #B4B5BC",
+".. c #B6B9BF",
+"X. c #BBB9B8",
+"o. c #8C9DC3",
+"O. c #8EA3D4",
+"+. c #97AAD4",
+"@. c #ACB5C9",
+"#. c #B3B7C0",
+"$. c #A1B1D5",
+"%. c #BAC3D7",
+"&. c #BEC6D6",
+"*. c #D7D2C7",
+"=. c #C2C8D6",
+"-. c #D2D6DF",
+";. c #E8E4DA",
+":. c #CED5E4",
+">. c #FFF9EC",
+",. c #F3F4F5",
+"<. c #F6F8FB",
+"1. c None",
+/* pixels */
+"1.1.1.1.#./ W ~ } 1.1.1.",
+"1.1.1.U r c b t h Q 1.1.",
+"1.1.A 3 $.<.,.&.m w ^ 1.",
+"1.( 0 z :.%.=.;.) e x ` ",
+"1.n u v M * B *.R O @ P ",
+"' i z l - 9 { | > $ # Z ",
+"_ y l ; & [ X., 1 6 4 D ",
+"] g 8 o :  .C < 7 a s o.",
+"1.k X % = I S 5 d G K ..",
+"1.! .   j >.-.p F H +.1.",
+"1.1.L X + Y V 2 J O.1.1.",
+"1.1.1.E N q f T @.1.1.1."
+};
+
 wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
 {
     m_flags = 0;
 wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
 {
     m_flags = 0;
@@ -154,6 +298,8 @@ wxRibbonMSWArtProvider::wxRibbonMSWArtProvider(bool set_colour_scheme)
     m_gallery_bitmap_padding_right_size = 4;
     m_gallery_bitmap_padding_top_size = 4;
     m_gallery_bitmap_padding_bottom_size = 4;
     m_gallery_bitmap_padding_right_size = 4;
     m_gallery_bitmap_padding_top_size = 4;
     m_gallery_bitmap_padding_bottom_size = 4;
+    m_toggle_button_offset = 22;
+    m_help_button_offset = 22;
 }
 
 wxRibbonMSWArtProvider::~wxRibbonMSWArtProvider()
 }
 
 wxRibbonMSWArtProvider::~wxRibbonMSWArtProvider()
@@ -343,6 +489,8 @@ void wxRibbonMSWArtProvider::CloneTo(wxRibbonMSWArtProvider* copy) const
         copy->m_panel_extension_bitmap[i] = m_panel_extension_bitmap[i];
         copy->m_ribbon_toggle_up_bitmap[i] = m_ribbon_toggle_up_bitmap[i];
         copy->m_ribbon_toggle_down_bitmap[i] = m_ribbon_toggle_down_bitmap[i];
         copy->m_panel_extension_bitmap[i] = m_panel_extension_bitmap[i];
         copy->m_ribbon_toggle_up_bitmap[i] = m_ribbon_toggle_up_bitmap[i];
         copy->m_ribbon_toggle_down_bitmap[i] = m_ribbon_toggle_down_bitmap[i];
+        copy->m_ribbon_toggle_pin_bitmap[i] = m_ribbon_toggle_pin_bitmap[i];
+        copy->m_ribbon_bar_help_button_bitmap[i] = m_ribbon_bar_help_button_bitmap[i];
     }
     copy->m_toolbar_drop_bitmap = m_toolbar_drop_bitmap;
 
     }
     copy->m_toolbar_drop_bitmap = m_toolbar_drop_bitmap;
 
@@ -1023,11 +1171,15 @@ void wxRibbonMSWArtProvider::SetColour(int id, const wxColor& colour)
             m_page_toggle_face_colour = colour;
             m_ribbon_toggle_down_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour);
             m_ribbon_toggle_up_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
             m_page_toggle_face_colour = colour;
             m_ribbon_toggle_down_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour);
             m_ribbon_toggle_up_bitmap[0] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
+            m_ribbon_toggle_pin_bitmap[0] = wxRibbonLoadPixmap(ribbon_toggle_pin_xpm, colour);
+            m_ribbon_bar_help_button_bitmap[0] = wxRibbonLoadPixmap(ribbon_help_button_xpm, colour);
             break;
         case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR:
             m_page_toggle_hover_face_colour = colour;
             m_ribbon_toggle_down_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour);
             m_ribbon_toggle_up_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
             break;
         case wxRIBBON_ART_PAGE_TOGGLE_HOVER_FACE_COLOUR:
             m_page_toggle_hover_face_colour = colour;
             m_ribbon_toggle_down_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_down_xpm, colour);
             m_ribbon_toggle_up_bitmap[1] = wxRibbonLoadPixmap(panel_toggle_up_xpm, colour);
+            m_ribbon_toggle_pin_bitmap[1] = wxRibbonLoadPixmap(ribbon_toggle_pin_xpm, colour);
+            m_ribbon_bar_help_button_bitmap[1] = wxRibbonLoadPixmap(ribbon_help_button_xpm, colour);
             break;
         default:
             wxFAIL_MSG(wxT("Invalid Metric Ordinal"));
             break;
         default:
             wxFAIL_MSG(wxT("Invalid Metric Ordinal"));
@@ -2517,8 +2669,9 @@ void
 wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc,
                                          wxRibbonBar* wnd,
                                          const wxRect& rect,
 wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc,
                                          wxRibbonBar* wnd,
                                          const wxRect& rect,
-                                         bool upBitmap)
+                                         wxRibbonDisplayMode mode)
 {
 {
+    int bindex = 0;
     DrawPartialPageBackground(dc, wnd, rect, false);
 
     dc.DestroyClippingRegion();
     DrawPartialPageBackground(dc, wnd, rect, false);
 
     dc.DestroyClippingRegion();
@@ -2528,19 +2681,44 @@ wxRibbonMSWArtProvider::DrawToggleButton(wxDC& dc,
     {
         dc.SetPen(m_ribbon_toggle_pen);
         dc.SetBrush(m_ribbon_toggle_brush);
     {
         dc.SetPen(m_ribbon_toggle_pen);
         dc.SetBrush(m_ribbon_toggle_brush);
-        dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 12, 12, 1.0);
-        if(upBitmap)
-            dc.DrawBitmap(m_ribbon_toggle_up_bitmap[1], rect.GetX()+2, rect.GetY()+2, true);
-        else
-            dc.DrawBitmap(m_ribbon_toggle_down_bitmap[1], rect.GetX()+2, rect.GetY()+2, true);
+        dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 20, 20, 1.0);
+        bindex = 1;
+    }
+    switch(mode)
+    {
+        case wxRIBBON_BAR_PINNED:
+            dc.DrawBitmap(m_ribbon_toggle_up_bitmap[bindex], rect.GetX()+7, rect.GetY()+6, true);
+            break;
+        case wxRIBBON_BAR_MINIMIZED:
+            dc.DrawBitmap(m_ribbon_toggle_down_bitmap[bindex], rect.GetX()+7, rect.GetY()+6, true);
+            break;
+        case wxRIBBON_BAR_EXPANDED:
+            dc.DrawBitmap(m_ribbon_toggle_pin_bitmap[bindex], rect.GetX ()+4, rect.GetY ()+5, true);
+            break;
+    }
+}
+
+void wxRibbonMSWArtProvider::DrawHelpButton(wxDC& dc,
+                                       wxRibbonBar* wnd,
+                                       const wxRect& rect)
+{
+    DrawPartialPageBackground(dc, wnd, rect, false);
+
+    dc.DestroyClippingRegion();
+    dc.SetClippingRegion(rect);
+
+    if ( wnd->IsHelpButtonHovered() )
+    {
+        dc.SetPen(m_ribbon_toggle_pen);
+        dc.SetBrush(m_ribbon_toggle_brush);
+        dc.DrawRoundedRectangle(rect.GetX(), rect.GetY(), 20, 20, 1.0);
+        dc.DrawBitmap(m_ribbon_bar_help_button_bitmap[1], rect.GetX ()+4, rect.GetY()+5, true);
     }
     else
     {
     }
     else
     {
-        if(upBitmap)
-            dc.DrawBitmap(m_ribbon_toggle_up_bitmap[0], rect.GetX()+2, rect.GetY()+2, true);
-        else
-            dc.DrawBitmap(m_ribbon_toggle_down_bitmap[0], rect.GetX()+2, rect.GetY()+2, true);
+        dc.DrawBitmap(m_ribbon_bar_help_button_bitmap[0], rect.GetX ()+4, rect.GetY()+5, true);
     }
     }
+
 }
 
 void wxRibbonMSWArtProvider::GetBarTabWidth(
 }
 
 void wxRibbonMSWArtProvider::GetBarTabWidth(
@@ -2998,12 +3176,21 @@ wxSize wxRibbonMSWArtProvider::GetToolSize(
 }
 
 wxRect
 }
 
 wxRect
-wxRibbonMSWArtProvider::GetBarToggleButtonArea(wxDC& WXUNUSED(dc),
-                                               const wxRibbonBar* WXUNUSED(wnd),
-                                               wxRect rect)
+wxRibbonMSWArtProvider::GetBarToggleButtonArea(const wxRect& rect)
 {
 {
-    rect = wxRect(rect.GetWidth()-30, 6, 12, 12);
-    return rect;
+    wxRect rectOut = wxRect(rect.GetWidth()-m_toggle_button_offset, 2, 20, 20);
+    if ( (m_toggle_button_offset==22) && (m_help_button_offset==22) )
+        m_help_button_offset += 22;
+    return rectOut;
+}
+
+wxRect
+wxRibbonMSWArtProvider::GetRibbonHelpButtonArea(const wxRect& rect)
+{
+    wxRect rectOut = wxRect(rect.GetWidth()-m_help_button_offset, 2, 20, 20);
+    if ( (m_toggle_button_offset==22) && (m_help_button_offset==22) )
+        m_toggle_button_offset += 22;
+    return rectOut;
 }
 
 #endif // wxUSE_RIBBON
 }
 
 #endif // wxUSE_RIBBON
index e64b381778e028d1ce94e29e5e44fe3860594bf1..0970d3b43b08b7ffcdd9a2e7852f3efd8e2aaa32 100644 (file)
@@ -41,6 +41,7 @@ wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_DOWN, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_RIGHT_UP, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK, wxRibbonBarEvent);
 wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_TOGGLED, wxRibbonBarEvent);
+wxDEFINE_EVENT(wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, wxRibbonBarEvent);
 
 IMPLEMENT_CLASS(wxRibbonBar, wxRibbonControl)
 IMPLEMENT_DYNAMIC_CLASS(wxRibbonBarEvent, wxNotifyEvent)
 
 IMPLEMENT_CLASS(wxRibbonBar, wxRibbonControl)
 IMPLEMENT_DYNAMIC_CLASS(wxRibbonBarEvent, wxNotifyEvent)
@@ -58,6 +59,7 @@ BEGIN_EVENT_TABLE(wxRibbonBar, wxRibbonControl)
   EVT_RIGHT_UP(wxRibbonBar::OnMouseRightUp)
   EVT_LEFT_DCLICK(wxRibbonBar::OnMouseDoubleClick)
   EVT_SIZE(wxRibbonBar::OnSize)
   EVT_RIGHT_UP(wxRibbonBar::OnMouseRightUp)
   EVT_LEFT_DCLICK(wxRibbonBar::OnMouseDoubleClick)
   EVT_SIZE(wxRibbonBar::OnSize)
+  EVT_KILL_FOCUS(wxRibbonBar::OnKillFocus)
 END_EVENT_TABLE()
 
 void wxRibbonBar::AddPage(wxRibbonPage *page)
 END_EVENT_TABLE()
 
 void wxRibbonBar::AddPage(wxRibbonPage *page)
@@ -245,7 +247,10 @@ void wxRibbonBar::OnMouseMove(wxMouseEvent& evt)
     {
         RefreshTabBar();
     }
     {
         RefreshTabBar();
     }
-    HitTestToggleButton(evt.GetPosition());
+    if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON )
+        HitTestRibbonButton(m_toggle_button_rect, evt.GetPosition(), m_toggle_button_hovered);
+    if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON )
+        HitTestRibbonButton(m_help_button_rect, evt.GetPosition(), m_help_button_hovered);
 }
 
 void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
 }
 
 void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
@@ -279,6 +284,12 @@ void wxRibbonBar::OnMouseLeave(wxMouseEvent& WXUNUSED(evt))
         m_toggle_button_hovered = false;
         Refresh(false);
     }
         m_toggle_button_hovered = false;
         Refresh(false);
     }
+    if ( m_help_button_hovered )
+    {
+        m_help_button_hovered = false;
+        m_bar_hovered = false;
+        Refresh(false);
+    }
 }
 
 wxRibbonPage* wxRibbonBar::GetPage(int n)
 }
 
 wxRibbonPage* wxRibbonBar::GetPage(int n)
@@ -513,13 +524,17 @@ void wxRibbonBar::RecalculateTabSizes()
         }
         {
             wxClientDC temp_dc(this);
         }
         {
             wxClientDC temp_dc(this);
+            int right_button_pos = GetClientSize().GetWidth() - m_tab_margin_right - m_tab_scroll_right_button_rect.GetWidth();
+            if ( right_button_pos < m_tab_margin_left )
+                right_button_pos = m_tab_margin_left;
+
             m_tab_scroll_left_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_LEFT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth());
             m_tab_scroll_left_button_rect.SetHeight(m_tab_height);
             m_tab_scroll_left_button_rect.SetX(m_tab_margin_left);
             m_tab_scroll_left_button_rect.SetY(0);
             m_tab_scroll_right_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_RIGHT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth());
             m_tab_scroll_right_button_rect.SetHeight(m_tab_height);
             m_tab_scroll_left_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_LEFT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth());
             m_tab_scroll_left_button_rect.SetHeight(m_tab_height);
             m_tab_scroll_left_button_rect.SetX(m_tab_margin_left);
             m_tab_scroll_left_button_rect.SetY(0);
             m_tab_scroll_right_button_rect.SetWidth(m_art->GetScrollButtonMinimumSize(temp_dc, this, wxRIBBON_SCROLL_BTN_RIGHT | wxRIBBON_SCROLL_BTN_NORMAL | wxRIBBON_SCROLL_BTN_FOR_TABS).GetWidth());
             m_tab_scroll_right_button_rect.SetHeight(m_tab_height);
-            m_tab_scroll_right_button_rect.SetX(GetClientSize().GetWidth() - m_tab_margin_right - m_tab_scroll_right_button_rect.GetWidth());
+            m_tab_scroll_right_button_rect.SetX(right_button_pos);
             m_tab_scroll_right_button_rect.SetY(0);
         }
         if(m_tab_scroll_amount == 0)
             m_tab_scroll_right_button_rect.SetY(0);
         }
         if(m_tab_scroll_amount == 0)
@@ -729,6 +744,10 @@ void wxRibbonBar::CommonInit(long style)
     m_tabs_total_width_minimum = 0;
     m_tab_margin_left = 50;
     m_tab_margin_right = 20;
     m_tabs_total_width_minimum = 0;
     m_tab_margin_left = 50;
     m_tab_margin_right = 20;
+    if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON )
+        m_tab_margin_right += 20;
+    if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON )
+        m_tab_margin_right += 20;
     m_tab_height = 20; // initial guess
     m_tab_scroll_amount = 0;
     m_current_page = -1;
     m_tab_height = 20; // initial guess
     m_tab_scroll_amount = 0;
     m_current_page = -1;
@@ -746,6 +765,8 @@ void wxRibbonBar::CommonInit(long style)
 
     m_toggle_button_hovered = false;
     m_bar_hovered = false;
 
     m_toggle_button_hovered = false;
     m_bar_hovered = false;
+
+    m_ribbon_state = wxRIBBON_BAR_PINNED;
 }
 
 void wxRibbonBar::SetArtProvider(wxRibbonArtProvider* art)
 }
 
 void wxRibbonBar::SetArtProvider(wxRibbonArtProvider* art)
@@ -783,7 +804,10 @@ void wxRibbonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
 
     DoEraseBackground(dc);
 
 
     DoEraseBackground(dc);
 
-    m_toggle_button_rect = m_art->GetBarToggleButtonArea(dc, this, GetSize());
+    if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON  )
+        m_help_button_rect = m_art->GetRibbonHelpButtonArea(GetSize());
+    if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON  )
+        m_toggle_button_rect = m_art->GetBarToggleButtonArea(GetSize());
 
     size_t numtabs = m_pages.GetCount();
     double sep_visibility = 0.0;
 
     size_t numtabs = m_pages.GetCount();
     double sep_visibility = 0.0;
@@ -848,19 +872,25 @@ void wxRibbonBar::OnPaint(wxPaintEvent& WXUNUSED(evt))
     }
     if(m_tab_scroll_buttons_shown)
     {
     }
     if(m_tab_scroll_buttons_shown)
     {
-        dc.DestroyClippingRegion();
         if(m_tab_scroll_left_button_rect.GetWidth() != 0)
         {
         if(m_tab_scroll_left_button_rect.GetWidth() != 0)
         {
+            dc.DestroyClippingRegion();
+            dc.SetClippingRegion(m_tab_scroll_left_button_rect);
             m_art->DrawScrollButton(dc, this, m_tab_scroll_left_button_rect, wxRIBBON_SCROLL_BTN_LEFT | m_tab_scroll_left_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS);
         }
         if(m_tab_scroll_right_button_rect.GetWidth() != 0)
         {
             m_art->DrawScrollButton(dc, this, m_tab_scroll_left_button_rect, wxRIBBON_SCROLL_BTN_LEFT | m_tab_scroll_left_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS);
         }
         if(m_tab_scroll_right_button_rect.GetWidth() != 0)
         {
+            dc.DestroyClippingRegion();
+            dc.SetClippingRegion(m_tab_scroll_right_button_rect);
             m_art->DrawScrollButton(dc, this, m_tab_scroll_right_button_rect, wxRIBBON_SCROLL_BTN_RIGHT | m_tab_scroll_right_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS);
         }
     }
             m_art->DrawScrollButton(dc, this, m_tab_scroll_right_button_rect, wxRIBBON_SCROLL_BTN_RIGHT | m_tab_scroll_right_button_state | wxRIBBON_SCROLL_BTN_FOR_TABS);
         }
     }
-    wxRect rect(GetClientSize().GetWidth() - 30, 6, 12, 12);
+
+    if ( m_flags & wxRIBBON_BAR_SHOW_HELP_BUTTON  )
+        m_art->DrawHelpButton(dc, this, m_help_button_rect);
     if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON  )
     if ( m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON  )
-        m_art->DrawToggleButton(dc, this, rect, ArePanelsShown());
+        m_art->DrawToggleButton(dc, this, m_toggle_button_rect, m_ribbon_state);
+
 }
 
 void wxRibbonBar::OnEraseBackground(wxEraseEvent& WXUNUSED(evt))
 }
 
 void wxRibbonBar::OnEraseBackground(wxEraseEvent& WXUNUSED(evt))
@@ -931,6 +961,28 @@ wxRibbonPageTabInfo* wxRibbonBar::HitTestTabs(wxPoint position, int* index)
 void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt)
 {
     wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition());
 void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt)
 {
     wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition());
+    SetFocus();
+    if ( tab )
+    {
+        if ( m_ribbon_state == wxRIBBON_BAR_MINIMIZED )
+        {
+            ShowPanels();
+            m_ribbon_state = wxRIBBON_BAR_EXPANDED;
+        }
+        else if ( (tab == &m_pages.Item(m_current_page)) && (m_ribbon_state == wxRIBBON_BAR_EXPANDED) )
+        {
+            HidePanels();
+            m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
+        }
+    }
+    else
+    {
+        if ( m_ribbon_state == wxRIBBON_BAR_EXPANDED )
+        {
+            HidePanels();
+            m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
+        }
+    }
     if(tab && tab != &m_pages.Item(m_current_page))
     {
         wxRibbonBarEvent query(wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGING, GetId(), tab->page);
     if(tab && tab != &m_pages.Item(m_current_page))
     {
         wxRibbonBarEvent query(wxEVT_COMMAND_RIBBONBAR_PAGE_CHANGING, GetId(), tab->page);
@@ -968,11 +1020,22 @@ void wxRibbonBar::OnMouseLeftDown(wxMouseEvent& evt)
         {
             if(m_toggle_button_rect.Contains(position))
             {
         {
             if(m_toggle_button_rect.Contains(position))
             {
-                ShowPanels(!ArePanelsShown());
+                bool pshown = ArePanelsShown();
+                ShowPanels(!pshown);
+                if ( pshown )
+                    m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
+                else
+                    m_ribbon_state = wxRIBBON_BAR_PINNED;
                 wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_TOGGLED, GetId());
                 event.SetEventObject(this);
                 ProcessWindowEvent(event);
             }
                 wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_TOGGLED, GetId());
                 event.SetEventObject(this);
                 ProcessWindowEvent(event);
             }
+            if ( m_help_button_rect.Contains(position) )
+            {
+                wxRibbonBarEvent event(wxEVT_COMMAND_RIBBONBAR_HELP_CLICKED, GetId());
+                event.SetEventObject(this);
+                ProcessWindowEvent(event);
+            }
         }
     }
 }
         }
     }
 }
@@ -1091,7 +1154,21 @@ void wxRibbonBar::OnMouseRightUp(wxMouseEvent& evt)
 
 void wxRibbonBar::OnMouseDoubleClick(wxMouseEvent& evt)
 {
 
 void wxRibbonBar::OnMouseDoubleClick(wxMouseEvent& evt)
 {
-    DoMouseButtonCommon(evt, wxEVT_COMMAND_RIBBONBAR_TAB_LEFT_DCLICK);
+    wxRibbonPageTabInfo *tab = HitTestTabs(evt.GetPosition());
+    SetFocus();
+    if ( tab && tab == &m_pages.Item(m_current_page) )
+    {
+        if ( m_ribbon_state == wxRIBBON_BAR_PINNED )
+        {
+            m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
+            HidePanels();
+        }
+        else
+        {
+            m_ribbon_state = wxRIBBON_BAR_PINNED;
+            ShowPanels();
+        }
+    }
 }
 
 void wxRibbonBar::DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type)
 }
 
 void wxRibbonBar::DoMouseButtonCommon(wxMouseEvent& evt, wxEventType tab_event_type)
@@ -1158,7 +1235,7 @@ wxSize wxRibbonBar::DoGetBestSize() const
     return best;
 }
 
     return best;
 }
 
-void wxRibbonBar::HitTestToggleButton(wxPoint position)
+void wxRibbonBar::HitTestRibbonButton(const wxRect& rect, const wxPoint& position, bool &hover_flag)
 {
     bool hovered = false, toggle_button_hovered = false;
     if(position.x >= 0 && position.y >= 0)
 {
     bool hovered = false, toggle_button_hovered = false;
     if(position.x >= 0 && position.y >= 0)
@@ -1171,16 +1248,34 @@ void wxRibbonBar::HitTestToggleButton(wxPoint position)
     }
     if(hovered)
     {
     }
     if(hovered)
     {
-        toggle_button_hovered = (m_flags & wxRIBBON_BAR_SHOW_TOGGLE_BUTTON) &&
-                                    m_toggle_button_rect.Contains(position);
+        toggle_button_hovered = rect.Contains(position);
 
 
-        if(hovered != m_bar_hovered || toggle_button_hovered != m_toggle_button_hovered)
+        if ( hovered != m_bar_hovered || toggle_button_hovered != hover_flag )
         {
             m_bar_hovered = hovered;
         {
             m_bar_hovered = hovered;
-            m_toggle_button_hovered = toggle_button_hovered;
+            hover_flag = toggle_button_hovered;
             Refresh(false);
         }
     }
 }
 
             Refresh(false);
         }
     }
 }
 
+void wxRibbonBar::HideIfExpanded()
+{
+    if ( m_ribbon_state == wxRIBBON_BAR_EXPANDED )
+    {
+        HidePanels();
+        m_ribbon_state = wxRIBBON_BAR_MINIMIZED;
+    }
+    else
+    {
+        ShowPanels();
+        m_ribbon_state = wxRIBBON_BAR_PINNED;
+    }
+}
+
+void wxRibbonBar::OnKillFocus(wxFocusEvent& WXUNUSED(evt))
+{
+    HideIfExpanded();
+}
+
 #endif // wxUSE_RIBBON
 #endif // wxUSE_RIBBON
index ad44278f146d2e79928424b4ec768fae0c725e07..a40938b9e01a901daff58d53bc7bb0b1c2939b7c 100644 (file)
@@ -17,6 +17,7 @@
 
 #if wxUSE_RIBBON
 
 
 #if wxUSE_RIBBON
 
+#include "wx/ribbon/panel.h"
 #include "wx/ribbon/buttonbar.h"
 #include "wx/ribbon/art.h"
 #include "wx/dcbuffer.h"
 #include "wx/ribbon/buttonbar.h"
 #include "wx/ribbon/art.h"
 #include "wx/dcbuffer.h"
@@ -1100,6 +1101,8 @@ void wxRibbonButtonBar::OnMouseUp(wxMouseEvent& evt)
                 m_lock_active_state = true;
                 ProcessWindowEvent(notification);
                 m_lock_active_state = false;
                 m_lock_active_state = true;
                 ProcessWindowEvent(notification);
                 m_lock_active_state = false;
+
+                wxStaticCast(m_parent, wxRibbonPanel)->HideIfExpanded();
             } while(false);
             if(m_active_button) // may have been NULLed by event handler
             {
             } while(false);
             if(m_active_button) // may have been NULLed by event handler
             {
index 17d8c316dc3f359946dd5ad4901a044dd9cb3756..215866213bbe69ab075fec441ed94dd3b417aa92 100644 (file)
@@ -1091,4 +1091,9 @@ wxSize wxRibbonPage::DoGetBestSize() const
     return best;
 }
 
     return best;
 }
 
+void wxRibbonPage::HideIfExpanded()
+{
+    wxStaticCast(m_parent, wxRibbonBar)->HideIfExpanded();
+}
+
 #endif // wxUSE_RIBBON
 #endif // wxUSE_RIBBON
index ca7d7e13aee05a7f65b3b3479e0b349469a9d7fa..341661f41fbdac2537b360974a7b63cf7ad829c9 100644 (file)
@@ -1099,4 +1099,9 @@ wxRect wxRibbonPanel::GetExpandedPosition(wxRect panel,
     return best;
 }
 
     return best;
 }
 
+void wxRibbonPanel::HideIfExpanded()
+{
+    wxStaticCast(m_parent, wxRibbonPage)->HideIfExpanded();
+}
+
 #endif // wxUSE_RIBBON
 #endif // wxUSE_RIBBON
index 791da940eaddc7c6025f265cc7335a203ab61368..c64b60a99763137db3777262ee8e533e0fb551e9 100644 (file)
@@ -1149,6 +1149,8 @@ void wxRibbonToolBar::OnMouseUp(wxMouseEvent& WXUNUSED(evt))
             notification.SetEventObject(this);
             notification.SetBar(this);
             ProcessEvent(notification);
             notification.SetEventObject(this);
             notification.SetBar(this);
             ProcessEvent(notification);
+
+            wxStaticCast(m_parent, wxRibbonPanel)->HideIfExpanded();
         }
 
         // Notice that m_active_tool could have been reset by the event handler
         }
 
         // Notice that m_active_tool could have been reset by the event handler