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