xref: /aoo41x/main/sc/source/ui/inc/dpcontrol.hxx (revision 38d50f7b)
1*38d50f7bSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*38d50f7bSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*38d50f7bSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*38d50f7bSAndrew Rist  * distributed with this work for additional information
6*38d50f7bSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*38d50f7bSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*38d50f7bSAndrew Rist  * "License"); you may not use this file except in compliance
9*38d50f7bSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*38d50f7bSAndrew Rist  *
11*38d50f7bSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*38d50f7bSAndrew Rist  *
13*38d50f7bSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*38d50f7bSAndrew Rist  * software distributed under the License is distributed on an
15*38d50f7bSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*38d50f7bSAndrew Rist  * KIND, either express or implied.  See the License for the
17*38d50f7bSAndrew Rist  * specific language governing permissions and limitations
18*38d50f7bSAndrew Rist  * under the License.
19*38d50f7bSAndrew Rist  *
20*38d50f7bSAndrew Rist  *************************************************************/
21*38d50f7bSAndrew Rist 
22*38d50f7bSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #ifndef SC_DPCONTROL_HXX
25cdf0e10cSrcweir #define SC_DPCONTROL_HXX
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include "rtl/ustring.hxx"
28cdf0e10cSrcweir #include "tools/gen.hxx"
29cdf0e10cSrcweir #include "tools/fract.hxx"
30cdf0e10cSrcweir #include "vcl/popupmenuwindow.hxx"
31cdf0e10cSrcweir #include "vcl/button.hxx"
32cdf0e10cSrcweir #include "vcl/scrbar.hxx"
33cdf0e10cSrcweir #include "vcl/timer.hxx"
34cdf0e10cSrcweir #include "svx/checklbx.hxx"
35cdf0e10cSrcweir 
36cdf0e10cSrcweir #include <boost/shared_ptr.hpp>
37cdf0e10cSrcweir #include <memory>
38cdf0e10cSrcweir #include <hash_map>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir namespace com { namespace sun { namespace star {
41cdf0e10cSrcweir 
42cdf0e10cSrcweir     namespace accessibility {
43cdf0e10cSrcweir         class XAccessible;
44cdf0e10cSrcweir     }
45cdf0e10cSrcweir 
46cdf0e10cSrcweir }}}
47cdf0e10cSrcweir 
48cdf0e10cSrcweir class OutputDevice;
49cdf0e10cSrcweir class Point;
50cdf0e10cSrcweir class Size;
51cdf0e10cSrcweir class StyleSettings;
52cdf0e10cSrcweir class Window;
53cdf0e10cSrcweir class ScDocument;
54cdf0e10cSrcweir class ScAccessibleFilterMenu;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir /**
57cdf0e10cSrcweir  * This class takes care of physically drawing field button controls inside
58cdf0e10cSrcweir  * data pilot tables.
59cdf0e10cSrcweir  */
60cdf0e10cSrcweir class ScDPFieldButton
61cdf0e10cSrcweir {
62cdf0e10cSrcweir public:
63cdf0e10cSrcweir     ScDPFieldButton(OutputDevice* pOutDev, const StyleSettings* pStyle, const Fraction* pZoomX = NULL, const Fraction* pZoomY = NULL,
64cdf0e10cSrcweir                     ScDocument* pDoc = NULL);
65cdf0e10cSrcweir     ~ScDPFieldButton();
66cdf0e10cSrcweir 
67cdf0e10cSrcweir     void setText(const ::rtl::OUString& rText);
68cdf0e10cSrcweir     void setBoundingBox(const Point& rPos, const Size& rSize, bool bLayoutRTL);
69cdf0e10cSrcweir     void setDrawBaseButton(bool b);
70cdf0e10cSrcweir     void setDrawPopupButton(bool b);
71cdf0e10cSrcweir     void setHasHiddenMember(bool b);
72cdf0e10cSrcweir     void setPopupPressed(bool b);
73cdf0e10cSrcweir     void setPopupLeft(bool b);
74cdf0e10cSrcweir     void draw();
75cdf0e10cSrcweir 
76cdf0e10cSrcweir     void getPopupBoundingBox(Point& rPos, Size& rSize) const;
77cdf0e10cSrcweir 
78cdf0e10cSrcweir private:
79cdf0e10cSrcweir     void drawPopupButton();
80cdf0e10cSrcweir 
81cdf0e10cSrcweir private:
82cdf0e10cSrcweir     Point                   maPos;
83cdf0e10cSrcweir     Size                    maSize;
84cdf0e10cSrcweir     ::rtl::OUString         maText;
85cdf0e10cSrcweir     Fraction                maZoomX;
86cdf0e10cSrcweir     Fraction                maZoomY;
87cdf0e10cSrcweir     ScDocument*             mpDoc;
88cdf0e10cSrcweir     OutputDevice*           mpOutDev;
89cdf0e10cSrcweir     const StyleSettings*    mpStyle;
90cdf0e10cSrcweir     bool                    mbBaseButton;
91cdf0e10cSrcweir     bool                    mbPopupButton;
92cdf0e10cSrcweir     bool                    mbHasHiddenMember;
93cdf0e10cSrcweir     bool                    mbPopupPressed;
94cdf0e10cSrcweir     bool                    mbPopupLeft;
95cdf0e10cSrcweir };
96cdf0e10cSrcweir 
97cdf0e10cSrcweir // ============================================================================
98cdf0e10cSrcweir 
99cdf0e10cSrcweir class ScMenuFloatingWindow : public PopupMenuFloatingWindow
100cdf0e10cSrcweir {
101cdf0e10cSrcweir public:
102cdf0e10cSrcweir     static size_t MENU_NOT_SELECTED;
103cdf0e10cSrcweir     /**
104cdf0e10cSrcweir      * Action to perform when an event takes place.  Create a sub-class of
105cdf0e10cSrcweir      * this to implement the desired action.
106cdf0e10cSrcweir      */
107cdf0e10cSrcweir     class Action
108cdf0e10cSrcweir     {
109cdf0e10cSrcweir     public:
110cdf0e10cSrcweir         virtual void execute() = 0;
111cdf0e10cSrcweir     };
112cdf0e10cSrcweir 
113cdf0e10cSrcweir     explicit ScMenuFloatingWindow(Window* pParent, ScDocument* pDoc, sal_uInt16 nMenuStackLevel = 0);
114cdf0e10cSrcweir     virtual ~ScMenuFloatingWindow();
115cdf0e10cSrcweir 
116cdf0e10cSrcweir     virtual void MouseMove(const MouseEvent& rMEvt);
117cdf0e10cSrcweir     virtual void MouseButtonDown(const MouseEvent& rMEvt);
118cdf0e10cSrcweir     virtual void MouseButtonUp(const MouseEvent& rMEvt);
119cdf0e10cSrcweir     virtual void KeyInput(const KeyEvent& rKEvt);
120cdf0e10cSrcweir     virtual void Paint(const Rectangle& rRect);
121cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
122cdf0e10cSrcweir 
123cdf0e10cSrcweir     void addMenuItem(const ::rtl::OUString& rText, bool bEnabled, Action* pAction);
124cdf0e10cSrcweir     ScMenuFloatingWindow* addSubMenuItem(const ::rtl::OUString& rText, bool bEnabled);
125cdf0e10cSrcweir     void setSelectedMenuItem(size_t nPos, bool bSubMenuTimer, bool bEnsureSubMenu);
126cdf0e10cSrcweir     void selectMenuItem(size_t nPos, bool bSelected, bool bSubMenuTimer);
127cdf0e10cSrcweir     void clearSelectedMenuItem();
128cdf0e10cSrcweir     ScMenuFloatingWindow* getSubMenuWindow(size_t nPos) const;
129cdf0e10cSrcweir     bool isMenuItemSelected(size_t nPos) const;
130cdf0e10cSrcweir     size_t getSelectedMenuItem() const;
131cdf0e10cSrcweir 
132cdf0e10cSrcweir     void setName(const ::rtl::OUString& rName);
133cdf0e10cSrcweir     const ::rtl::OUString& getName() const;
134cdf0e10cSrcweir 
135cdf0e10cSrcweir     void executeMenuItem(size_t nPos);
136cdf0e10cSrcweir     void getMenuItemPosSize(size_t nPos, Point& rPos, Size& rSize) const;
137cdf0e10cSrcweir     ScMenuFloatingWindow* getParentMenuWindow() const;
138cdf0e10cSrcweir 
139cdf0e10cSrcweir protected:
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     void drawMenuItem(size_t nPos);
142cdf0e10cSrcweir     void drawAllMenuItems();
143cdf0e10cSrcweir     const Font& getLabelFont() const;
144cdf0e10cSrcweir 
145cdf0e10cSrcweir     void queueLaunchSubMenu(size_t nPos, ScMenuFloatingWindow* pMenu);
146cdf0e10cSrcweir     void queueCloseSubMenu();
147cdf0e10cSrcweir     void launchSubMenu(bool bSetMenuPos);
148cdf0e10cSrcweir     void endSubMenu(ScMenuFloatingWindow* pSubMenu);
149cdf0e10cSrcweir 
150cdf0e10cSrcweir     void fillMenuItemsToAccessible(ScAccessibleFilterMenu* pAccMenu) const;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir     ScDocument* getDoc();
153cdf0e10cSrcweir 
154cdf0e10cSrcweir protected:
155cdf0e10cSrcweir     ::com::sun::star::uno::Reference<
156cdf0e10cSrcweir         ::com::sun::star::accessibility::XAccessible > mxAccessible;
157cdf0e10cSrcweir 
158cdf0e10cSrcweir private:
159cdf0e10cSrcweir     struct SubMenuItemData;
160cdf0e10cSrcweir     void handleMenuTimeout(SubMenuItemData* pTimer);
161cdf0e10cSrcweir 
162cdf0e10cSrcweir     void resizeToFitMenuItems();
163cdf0e10cSrcweir     void highlightMenuItem(size_t nPos, bool bSelected);
164cdf0e10cSrcweir 
165cdf0e10cSrcweir     size_t getEnclosingMenuItem(const Point& rPos) const;
166cdf0e10cSrcweir     size_t getSubMenuPos(ScMenuFloatingWindow* pSubMenu);
167cdf0e10cSrcweir 
168cdf0e10cSrcweir     /**
169cdf0e10cSrcweir      * Fire a menu highlight event since the accessibility framework needs
170cdf0e10cSrcweir      * this to track focus on menu items.
171cdf0e10cSrcweir      */
172cdf0e10cSrcweir     void fireMenuHighlightedEvent();
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     /**
175cdf0e10cSrcweir      * Make sure that the specified submenu is permanently up, the submenu
176cdf0e10cSrcweir      * close timer is not active, and the correct menu item associated with
177cdf0e10cSrcweir      * the submenu is highlighted.
178cdf0e10cSrcweir      */
179cdf0e10cSrcweir     void setSubMenuFocused(ScMenuFloatingWindow* pSubMenu);
180cdf0e10cSrcweir 
181cdf0e10cSrcweir     /**
182cdf0e10cSrcweir      * When a menu item of an invisible submenu is selected, we need to make
183cdf0e10cSrcweir      * sure that all its parent menu(s) are visible, with the right menu item
184cdf0e10cSrcweir      * highlighted in each of the parents.  Calling this method ensures it.
185cdf0e10cSrcweir      */
186cdf0e10cSrcweir     void ensureSubMenuVisible(ScMenuFloatingWindow* pSubMenu);
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     /**
189cdf0e10cSrcweir      * Dismiss any visible child submenus when a menu item of a parent menu is
190cdf0e10cSrcweir      * selected.
191cdf0e10cSrcweir      */
192cdf0e10cSrcweir     void ensureSubMenuNotVisible();
193cdf0e10cSrcweir 
194cdf0e10cSrcweir     /**
195cdf0e10cSrcweir      * Dismiss all visible popup menus and set focus back to the application
196cdf0e10cSrcweir      * window.  This method is called e.g. when a menu action is fired.
197cdf0e10cSrcweir      */
198cdf0e10cSrcweir     void terminateAllPopupMenus();
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     DECL_LINK( PopupEndHdl, void* );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir private:
203cdf0e10cSrcweir 
204cdf0e10cSrcweir     struct MenuItemData
205cdf0e10cSrcweir     {
206cdf0e10cSrcweir         ::rtl::OUString maText;
207cdf0e10cSrcweir         bool            mbEnabled;
208cdf0e10cSrcweir 
209cdf0e10cSrcweir         ::boost::shared_ptr<Action> mpAction;
210cdf0e10cSrcweir         ::boost::shared_ptr<ScMenuFloatingWindow> mpSubMenuWin;
211cdf0e10cSrcweir 
212cdf0e10cSrcweir         MenuItemData();
213cdf0e10cSrcweir     };
214cdf0e10cSrcweir 
215cdf0e10cSrcweir     ::std::vector<MenuItemData>         maMenuItems;
216cdf0e10cSrcweir 
217cdf0e10cSrcweir     struct SubMenuItemData
218cdf0e10cSrcweir     {
219cdf0e10cSrcweir         Timer                   maTimer;
220cdf0e10cSrcweir         ScMenuFloatingWindow*   mpSubMenu;
221cdf0e10cSrcweir         size_t                  mnMenuPos;
222cdf0e10cSrcweir 
223cdf0e10cSrcweir         DECL_LINK( TimeoutHdl, void* );
224cdf0e10cSrcweir 
225cdf0e10cSrcweir         SubMenuItemData(ScMenuFloatingWindow* pParent);
226cdf0e10cSrcweir         void reset();
227cdf0e10cSrcweir 
228cdf0e10cSrcweir     private:
229cdf0e10cSrcweir         ScMenuFloatingWindow* mpParent;
230cdf0e10cSrcweir     };
231cdf0e10cSrcweir     SubMenuItemData   maOpenTimer;
232cdf0e10cSrcweir     SubMenuItemData   maCloseTimer;
233cdf0e10cSrcweir 
234cdf0e10cSrcweir     Font    maLabelFont;
235cdf0e10cSrcweir 
236cdf0e10cSrcweir     // Name of this menu window, taken from the menu item of the parent window
237cdf0e10cSrcweir     // that launches it (if this is a sub menu).  If this is a top-level menu
238cdf0e10cSrcweir     // window, then this name can be anything.
239cdf0e10cSrcweir     ::rtl::OUString maName;
240cdf0e10cSrcweir 
241cdf0e10cSrcweir     size_t  mnSelectedMenu;
242cdf0e10cSrcweir     size_t  mnClickedMenu;
243cdf0e10cSrcweir 
244cdf0e10cSrcweir     ScDocument* mpDoc;
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     ScMenuFloatingWindow* mpParentMenu;
247cdf0e10cSrcweir     ScMenuFloatingWindow* mpActiveSubMenu;
248cdf0e10cSrcweir };
249cdf0e10cSrcweir 
250cdf0e10cSrcweir // ============================================================================
251cdf0e10cSrcweir 
252cdf0e10cSrcweir /**
253cdf0e10cSrcweir  * This class implements a popup window for field button, for quick access
254cdf0e10cSrcweir  * of hide-item list, and possibly more stuff related to field options.
255cdf0e10cSrcweir  */
256cdf0e10cSrcweir class ScDPFieldPopupWindow : public ScMenuFloatingWindow
257cdf0e10cSrcweir {
258cdf0e10cSrcweir public:
259cdf0e10cSrcweir     /**
260cdf0e10cSrcweir      * Extended data that the client code may need to store.  Create a
261cdf0e10cSrcweir      * sub-class of this and store data there.
262cdf0e10cSrcweir      */
263cdf0e10cSrcweir     struct ExtendedData {};
264cdf0e10cSrcweir 
265cdf0e10cSrcweir     explicit ScDPFieldPopupWindow(Window* pParent, ScDocument* pDoc);
266cdf0e10cSrcweir     virtual ~ScDPFieldPopupWindow();
267cdf0e10cSrcweir 
268cdf0e10cSrcweir     virtual void MouseMove(const MouseEvent& rMEvt);
269cdf0e10cSrcweir     virtual long Notify(NotifyEvent& rNEvt);
270cdf0e10cSrcweir     virtual void Paint(const Rectangle& rRect);
271cdf0e10cSrcweir     virtual Window* GetPreferredKeyInputWindow();
272cdf0e10cSrcweir     virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
273cdf0e10cSrcweir 
274cdf0e10cSrcweir     void setMemberSize(size_t n);
275cdf0e10cSrcweir     void addMember(const ::rtl::OUString& rName, bool bVisible);
276cdf0e10cSrcweir     void initMembers();
277cdf0e10cSrcweir 
278cdf0e10cSrcweir     const Size& getWindowSize() const;
279cdf0e10cSrcweir 
280cdf0e10cSrcweir     void getResult(::std::hash_map< ::rtl::OUString, bool, ::rtl::OUStringHash>& rResult);
281cdf0e10cSrcweir     void close(bool bOK);
282cdf0e10cSrcweir 
283cdf0e10cSrcweir     /**
284cdf0e10cSrcweir      * Set auxiliary data that the client code might need.  Note that this
285cdf0e10cSrcweir      * popup window class manages its life time; no explicit deletion of the
286cdf0e10cSrcweir      * instance is needed in the client code.
287cdf0e10cSrcweir      */
288cdf0e10cSrcweir     void setExtendedData(ExtendedData* p);
289cdf0e10cSrcweir 
290cdf0e10cSrcweir     /**
291cdf0e10cSrcweir      * Get the store auxiliary data, or NULL if no such data is stored.
292cdf0e10cSrcweir      */
293cdf0e10cSrcweir     ExtendedData* getExtendedData();
294cdf0e10cSrcweir 
295cdf0e10cSrcweir     void setOKAction(Action* p);
296cdf0e10cSrcweir 
297cdf0e10cSrcweir private:
298cdf0e10cSrcweir     struct Member
299cdf0e10cSrcweir     {
300cdf0e10cSrcweir         ::rtl::OUString maName;
301cdf0e10cSrcweir         bool            mbVisible;
302cdf0e10cSrcweir 
303cdf0e10cSrcweir         Member();
304cdf0e10cSrcweir     };
305cdf0e10cSrcweir 
306cdf0e10cSrcweir     class CancelButton : public ::CancelButton
307cdf0e10cSrcweir     {
308cdf0e10cSrcweir     public:
309cdf0e10cSrcweir         CancelButton(ScDPFieldPopupWindow* pParent);
310cdf0e10cSrcweir 
311cdf0e10cSrcweir         virtual void Click();
312cdf0e10cSrcweir 
313cdf0e10cSrcweir     private:
314cdf0e10cSrcweir         ScDPFieldPopupWindow* mpParent;
315cdf0e10cSrcweir     };
316cdf0e10cSrcweir 
317cdf0e10cSrcweir     enum SectionType {
318cdf0e10cSrcweir         WHOLE,                // entire window
319cdf0e10cSrcweir         LISTBOX_AREA_OUTER,   // box enclosing the check box items.
320cdf0e10cSrcweir         LISTBOX_AREA_INNER,   // box enclosing the check box items.
321cdf0e10cSrcweir         SINGLE_BTN_AREA,      // box enclosing the single-action buttons.
322cdf0e10cSrcweir         CHECK_TOGGLE_ALL,     // check box for toggling all items.
323cdf0e10cSrcweir         BTN_SINGLE_SELECT,
324cdf0e10cSrcweir         BTN_SINGLE_UNSELECT,
325cdf0e10cSrcweir         BTN_OK,               // OK button
326cdf0e10cSrcweir         BTN_CANCEL,           // Cancel button
327cdf0e10cSrcweir     };
328cdf0e10cSrcweir     void getSectionPosSize(Point& rPos, Size& rSize, SectionType eType) const;
329cdf0e10cSrcweir 
330cdf0e10cSrcweir     void setAllMemberState(bool bSet);
331cdf0e10cSrcweir     void selectCurrentMemberOnly(bool bSet);
332cdf0e10cSrcweir     void cycleFocus(bool bReverse = false);
333cdf0e10cSrcweir 
334cdf0e10cSrcweir     DECL_LINK( ButtonHdl, Button* );
335cdf0e10cSrcweir     DECL_LINK( TriStateHdl, TriStateBox* );
336cdf0e10cSrcweir     DECL_LINK( CheckHdl, SvTreeListBox* );
337cdf0e10cSrcweir 
338cdf0e10cSrcweir private:
339cdf0e10cSrcweir     SvxCheckListBox maChecks;
340cdf0e10cSrcweir 
341cdf0e10cSrcweir     TriStateBox     maChkToggleAll;
342cdf0e10cSrcweir     ImageButton     maBtnSelectSingle;
343cdf0e10cSrcweir     ImageButton     maBtnUnselectSingle;
344cdf0e10cSrcweir 
345cdf0e10cSrcweir     OKButton        maBtnOk;
346cdf0e10cSrcweir     CancelButton    maBtnCancel;
347cdf0e10cSrcweir 
348cdf0e10cSrcweir     ::std::vector<Window*>          maTabStopCtrls;
349cdf0e10cSrcweir     size_t                          mnCurTabStop;
350cdf0e10cSrcweir 
351cdf0e10cSrcweir     ::std::vector<Member>           maMembers;
352cdf0e10cSrcweir     ::std::auto_ptr<ExtendedData>   mpExtendedData;
353cdf0e10cSrcweir     ::std::auto_ptr<Action>         mpOKAction;
354cdf0e10cSrcweir 
355cdf0e10cSrcweir     const Size      maWndSize;  /// hard-coded window size.
356cdf0e10cSrcweir     TriState mePrevToggleAllState;
357cdf0e10cSrcweir };
358cdf0e10cSrcweir 
359cdf0e10cSrcweir #endif
360