diff options
-rw-r--r-- | sc/inc/AccessibleFilterMenu.hxx | 6 | ||||
-rw-r--r-- | sc/inc/AccessibleFilterMenuItem.hxx | 2 | ||||
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleFilterMenu.cxx | 105 | ||||
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx | 24 | ||||
-rw-r--r-- | sc/source/ui/Accessibility/AccessibleFilterTopWindow.cxx | 4 | ||||
-rw-r--r-- | sc/source/ui/cctrl/dpcontrol.cxx | 34 | ||||
-rw-r--r-- | sc/source/ui/inc/dpcontrol.hxx | 7 |
7 files changed, 88 insertions, 94 deletions
diff --git a/sc/inc/AccessibleFilterMenu.hxx b/sc/inc/AccessibleFilterMenu.hxx index 1489f3bbdca1..9579e5213cb0 100644 --- a/sc/inc/AccessibleFilterMenu.hxx +++ b/sc/inc/AccessibleFilterMenu.hxx @@ -73,7 +73,7 @@ public: ScAccessibleFilterMenu( const ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible>& rxParent, - ScMenuFloatingWindow* pWin, const ::rtl::OUString& rName, ScDocument* pDoc); + ScMenuFloatingWindow* pWin, const ::rtl::OUString& rName, size_t nMenuPos, ScDocument* pDoc); virtual ~ScAccessibleFilterMenu(); // XAccessibleComponent @@ -166,9 +166,8 @@ public: // non-UNO methods - void selectMenuItem(size_t nIndex, bool bSelect); void appendMenuItem(const ::rtl::OUString& rName, bool bEnabled, size_t nMenuPos); - + void setMenuPos(size_t nMenuPos); void setEnabled(bool bEnabled); private: @@ -181,6 +180,7 @@ private: ::std::vector<MenuItem> maMenuItems; ::std::set<sal_Int16> maStates; + size_t mnMenuPos; ScMenuFloatingWindow* mpWindow; ScDocument* mpDoc; diff --git a/sc/inc/AccessibleFilterMenuItem.hxx b/sc/inc/AccessibleFilterMenuItem.hxx index 740cfd4e30c9..2dc6f954114a 100644 --- a/sc/inc/AccessibleFilterMenuItem.hxx +++ b/sc/inc/AccessibleFilterMenuItem.hxx @@ -94,8 +94,6 @@ public: // Non-UNO Methods - void select(); - void unselect(); bool isSelected() const; void setEnabled(bool bEnabled); diff --git a/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx b/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx index bbc3ab91e450..3b2317b89515 100644 --- a/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx +++ b/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx @@ -70,28 +70,53 @@ using ::std::for_each; using ::std::vector; using ::std::set; -// ============================================================================ + +#include <stdio.h> +#include <string> +#include <sys/time.h> namespace { -class SelectMenuItem : public ::std::unary_function<void, ScAccessibleFilterMenu::MenuItem> +class StackPrinter { public: - explicit SelectMenuItem(bool bSelect) : mbSelect(bSelect) {} + explicit StackPrinter(const char* msg) : + msMsg(msg) + { + fprintf(stdout, "%s: --begin\n", msMsg.c_str()); + mfStartTime = getTime(); + } - void operator() (ScAccessibleFilterMenu::MenuItem& rItem) const + ~StackPrinter() { - rItem.mbSelected = mbSelect; - ScAccessibleFilterMenuItem* p = static_cast<ScAccessibleFilterMenuItem*>(rItem.mxAccessible.get()); - if (mbSelect) - p->select(); - else - p->unselect(); + double fEndTime = getTime(); + fprintf(stdout, "%s: --end (duration: %g sec)\n", msMsg.c_str(), (fEndTime-mfStartTime)); + } + + void printTime(int line) const + { + double fEndTime = getTime(); + fprintf(stdout, "%s: --(%d) (duration: %g sec)\n", msMsg.c_str(), line, (fEndTime-mfStartTime)); } + private: - bool mbSelect; + double getTime() const + { + timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec + tv.tv_usec / 1000000.0; + } + + ::std::string msMsg; + double mfStartTime; }; +} + +// ============================================================================ + +namespace { + class AddRemoveEventListener : public ::std::unary_function<void, ScAccessibleFilterMenu::MenuItem> { public: @@ -143,29 +168,33 @@ private: // ============================================================================ ScAccessibleFilterMenu::MenuItem::MenuItem() : + mxAccessible(NULL), mbSelected(false) { } // ============================================================================ -ScAccessibleFilterMenu::ScAccessibleFilterMenu(const Reference<XAccessible>& rxParent, ScMenuFloatingWindow* pWin, const OUString& rName, ScDocument* pDoc) : +ScAccessibleFilterMenu::ScAccessibleFilterMenu(const Reference<XAccessible>& rxParent, ScMenuFloatingWindow* pWin, const OUString& rName, size_t nMenuPos, ScDocument* pDoc) : ScAccessibleContextBase(rxParent, AccessibleRole::MENU), + mnMenuPos(nMenuPos), mpWindow(pWin), mpDoc(pDoc), mbEnabled(true), mbSelected(false) { + fprintf(stdout, "ScAccessibleFilterMenu::ScAccessibleFilterMenu: ctor (%p)\n", this); SetName(rName); } ScAccessibleFilterMenu::~ScAccessibleFilterMenu() { + fprintf(stdout, "ScAccessibleFilterMenu::~ScAccessibleFilterMenu: dtor (%p)\n", this); } // XAccessibleComponent -Reference<XAccessible> ScAccessibleFilterMenu::getAccessibleAtPoint( const ::com::sun::star::awt::Point& rPoint ) +Reference<XAccessible> ScAccessibleFilterMenu::getAccessibleAtPoint( const ::com::sun::star::awt::Point& /*rPoint*/ ) throw (RuntimeException) { return this; @@ -209,7 +238,7 @@ sal_Int32 ScAccessibleFilterMenu::getAccessibleChildCount() Reference<XAccessible> ScAccessibleFilterMenu::getAccessibleChild(sal_Int32 nIndex) throw (RuntimeException, IndexOutOfBoundsException) { - if (maMenuItems.size() <= nIndex) + if (maMenuItems.size() <= static_cast<size_t>(nIndex)) throw IndexOutOfBoundsException(); return maMenuItems[nIndex].mxAccessible; @@ -295,17 +324,17 @@ Sequence<sal_Int16> ScAccessibleFilterMenu::getStates() throw (RuntimeException) void ScAccessibleFilterMenu::selectAccessibleChild(sal_Int32 nChildIndex) throw (IndexOutOfBoundsException, RuntimeException) { - if (nChildIndex >= maMenuItems.size()) + if (static_cast<size_t>(nChildIndex) >= maMenuItems.size()) throw IndexOutOfBoundsException(); maMenuItems[nChildIndex].mbSelected = true; - mpWindow->setSelectedMenuItem(nChildIndex, false, false); + mpWindow->setSelectedMenuItem(nChildIndex, false); } sal_Bool ScAccessibleFilterMenu::isAccessibleChildSelected(sal_Int32 nChildIndex) throw (IndexOutOfBoundsException, RuntimeException) { - if (nChildIndex >= maMenuItems.size()) + if (static_cast<size_t>(nChildIndex) >= maMenuItems.size()) throw IndexOutOfBoundsException(); return maMenuItems[nChildIndex].mbSelected; @@ -313,8 +342,7 @@ sal_Bool ScAccessibleFilterMenu::isAccessibleChildSelected(sal_Int32 nChildIndex void ScAccessibleFilterMenu::clearAccessibleSelection() throw (RuntimeException) { - for_each(maMenuItems.begin(), maMenuItems.end(), SelectMenuItem(false)); - mpWindow->clearSelectedMenuItem(false); + mpWindow->clearSelectedMenuItem(); } void ScAccessibleFilterMenu::selectAllAccessibleChildren() throw (RuntimeException) @@ -342,12 +370,7 @@ void ScAccessibleFilterMenu::deselectAccessibleChild(sal_Int32 nChildIndex) thro if (static_cast<size_t>(nChildIndex) >= maMenuItems.size()) throw IndexOutOfBoundsException(); - maMenuItems[nChildIndex].mbSelected = false; - ScAccessibleFilterMenuItem* p = static_cast<ScAccessibleFilterMenuItem*>( - maMenuItems[nChildIndex].mxAccessible.get()); - p->unselect(); - - mpWindow->selectMenuItem(nChildIndex, false, false, false); + mpWindow->selectMenuItem(nChildIndex, false, false); } // XInterface @@ -381,28 +404,9 @@ Sequence<sal_Int8> ScAccessibleFilterMenu::getImplementationId() return aId; } -void ScAccessibleFilterMenu::selectMenuItem(size_t nIndex, bool bSelect) -{ - if (maMenuItems.size() <= nIndex) - return; - - AccessibleEventObject aEvent; - aEvent.EventId = AccessibleEventId::SELECTION_CHANGED; - CommitChange(aEvent); - - maMenuItems[nIndex].mbSelected = bSelect; - ScAccessibleFilterMenuItem* p = static_cast<ScAccessibleFilterMenuItem*>( - maMenuItems[nIndex].mxAccessible.get()); - if (bSelect) - p->select(); - else - p->unselect(); - - isSelected(); -} - void ScAccessibleFilterMenu::appendMenuItem(const OUString& rName, bool bEnabled, size_t nMenuPos) { +// StackPrinter __stack_printer__("ScAccessibleFilterMenu::appendMenuItem"); // Check weather this menu item is a sub menu or a regular menu item. ScMenuFloatingWindow* pSubMenu = mpWindow->getSubMenuWindow(nMenuPos); MenuItem aItem; @@ -412,6 +416,7 @@ void ScAccessibleFilterMenu::appendMenuItem(const OUString& rName, bool bEnabled ScAccessibleFilterMenu* p = static_cast<ScAccessibleFilterMenu*>( aItem.mxAccessible.get()); p->setEnabled(bEnabled); + p->setMenuPos(nMenuPos); } else { @@ -423,6 +428,11 @@ void ScAccessibleFilterMenu::appendMenuItem(const OUString& rName, bool bEnabled maMenuItems.push_back(aItem); } +void ScAccessibleFilterMenu::setMenuPos(size_t nMenuPos) +{ + mnMenuPos = nMenuPos; +} + void ScAccessibleFilterMenu::setEnabled(bool bEnabled) { mbEnabled = bEnabled; @@ -436,8 +446,9 @@ bool ScAccessibleFilterMenu::isFocused() bool ScAccessibleFilterMenu::isSelected() { // Check to see if any of the child menu items is selected. - size_t nSelectCount = for_each(maMenuItems.begin(), maMenuItems.end(), CountSelectedMenuItem()).getCount(); - return nSelectCount == 0; +// size_t nSelectCount = for_each(maMenuItems.begin(), maMenuItems.end(), CountSelectedMenuItem()).getCount(); +// return nSelectCount == 0; + return mpWindow->isMenuItemSelected(mnMenuPos); } void ScAccessibleFilterMenu::updateStates() diff --git a/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx b/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx index 45197df153ef..414169854dc6 100644 --- a/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx +++ b/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx @@ -65,11 +65,13 @@ ScAccessibleFilterMenuItem::ScAccessibleFilterMenuItem( mbSelected(false), mbEnabled(true) { + fprintf(stdout, "ScAccessibleFilterMenuItem::ScAccessibleFilterMenuItem: ctor (%p)\n", this); SetName(rName); } ScAccessibleFilterMenuItem::~ScAccessibleFilterMenuItem() { + fprintf(stdout, "ScAccessibleFilterMenuItem::~ScAccessibleFilterMenuItem: dtor (%p)\n", this); } sal_Int32 ScAccessibleFilterMenuItem::getAccessibleChildCount() @@ -78,7 +80,7 @@ sal_Int32 ScAccessibleFilterMenuItem::getAccessibleChildCount() return 0; } -Reference<XAccessible> ScAccessibleFilterMenuItem::getAccessibleChild(sal_Int32 nIndex) +Reference<XAccessible> ScAccessibleFilterMenuItem::getAccessibleChild(sal_Int32 /*nIndex*/) throw (RuntimeException, IndexOutOfBoundsException) { throw IndexOutOfBoundsException(); @@ -197,20 +199,20 @@ sal_Int32 ScAccessibleFilterMenuItem::getAccessibleActionCount() throw (RuntimeE return 1; } -sal_Bool ScAccessibleFilterMenuItem::doAccessibleAction(sal_Int32 nIndex) +sal_Bool ScAccessibleFilterMenuItem::doAccessibleAction(sal_Int32 /*nIndex*/) throw (IndexOutOfBoundsException, RuntimeException) { return false; } -OUString ScAccessibleFilterMenuItem::getAccessibleActionDescription(sal_Int32 nIndex) +OUString ScAccessibleFilterMenuItem::getAccessibleActionDescription(sal_Int32 /*nIndex*/) throw (IndexOutOfBoundsException, RuntimeException) { return OUString::createFromAscii("Add some action here..."); } Reference<XAccessibleKeyBinding> ScAccessibleFilterMenuItem::getAccessibleActionKeyBinding( - sal_Int32 nIndex) throw (IndexOutOfBoundsException, RuntimeException) + sal_Int32 /*nIndex*/) throw (IndexOutOfBoundsException, RuntimeException) { return Reference<XAccessibleKeyBinding>(); } @@ -235,21 +237,9 @@ void SAL_CALL ScAccessibleFilterMenuItem::release() throw () ScAccessibleContextBase::release(); } -void ScAccessibleFilterMenuItem::select() -{ - mbSelected = true; - CommitFocusGained(); -} - -void ScAccessibleFilterMenuItem::unselect() -{ - mbSelected = false; - CommitFocusLost(); -} - bool ScAccessibleFilterMenuItem::isSelected() const { - return mbSelected; + return mpWindow->isMenuItemSelected(mnMenuPos); } void ScAccessibleFilterMenuItem::setEnabled(bool bEnabled) diff --git a/sc/source/ui/Accessibility/AccessibleFilterTopWindow.cxx b/sc/source/ui/Accessibility/AccessibleFilterTopWindow.cxx index 3e8ab00427b0..02fafd87e138 100644 --- a/sc/source/ui/Accessibility/AccessibleFilterTopWindow.cxx +++ b/sc/source/ui/Accessibility/AccessibleFilterTopWindow.cxx @@ -50,11 +50,13 @@ ScAccessibleFilterTopWindow::ScAccessibleFilterTopWindow( mpWindow(pWin), mpDoc(pDoc) { + fprintf(stdout, "ScAccessibleFilterTopWindow::ScAccessibleFilterTopWindow: ctor (%p)\n", this); SetName(rName); } ScAccessibleFilterTopWindow::~ScAccessibleFilterTopWindow() { + fprintf(stdout, "ScAccessibleFilterTopWindow::~ScAccessibleFilterTopWindow: dtor (%p)\n", this); } // XAccessibleContext @@ -101,7 +103,7 @@ OUString ScAccessibleFilterTopWindow::getImplementationName() throw (RuntimeExce Reference<XAccessible> ScAccessibleFilterTopWindow::getAccessibleChildMenu() { if (!mxAccMenu.is()) - mxAccMenu.set(new ScAccessibleFilterMenu(this, mpWindow, getAccessibleName(), mpDoc)); + mxAccMenu.set(new ScAccessibleFilterMenu(this, mpWindow, getAccessibleName(), 999, mpDoc)); return mxAccMenu; } diff --git a/sc/source/ui/cctrl/dpcontrol.cxx b/sc/source/ui/cctrl/dpcontrol.cxx index 685ead25b47e..541d573f4e23 100644 --- a/sc/source/ui/cctrl/dpcontrol.cxx +++ b/sc/source/ui/cctrl/dpcontrol.cxx @@ -424,7 +424,7 @@ Reference<XAccessible> ScMenuFloatingWindow::CreateAccessible() Reference<XAccessible> xAccParent = mpParentMenu ? mpParentMenu->GetAccessible() : GetAccessibleParentWindow()->GetAccessible(); - mxAccessible.set(new ScAccessibleFilterMenu(xAccParent, this, maName, getDoc())); + mxAccessible.set(new ScAccessibleFilterMenu(xAccParent, this, maName, 999, getDoc())); ScAccessibleFilterMenu* p = static_cast<ScAccessibleFilterMenu*>( mxAccessible.get()); @@ -512,12 +512,12 @@ void ScMenuFloatingWindow::executeMenu(size_t nPos) EndPopupMode(); } -void ScMenuFloatingWindow::setSelectedMenuItem(size_t nPos, bool bSubMenuTimer, bool bNotifyAccessible) +void ScMenuFloatingWindow::setSelectedMenuItem(size_t nPos, bool bSubMenuTimer) { if (mnSelectedMenu != nPos) { - selectMenuItem(mnSelectedMenu, false, bSubMenuTimer, bNotifyAccessible); - selectMenuItem(nPos, true, bSubMenuTimer, bNotifyAccessible); + selectMenuItem(mnSelectedMenu, false, bSubMenuTimer); + selectMenuItem(nPos, true, bSubMenuTimer); mnSelectedMenu = nPos; } } @@ -661,7 +661,7 @@ void ScMenuFloatingWindow::resetMenu(bool bSetMenuPos) { resizeToFitMenuItems(); if (bSetMenuPos) - setSelectedMenuItem(0, false, true); + setSelectedMenuItem(0, false); } void ScMenuFloatingWindow::resizeToFitMenuItems() @@ -683,7 +683,7 @@ void ScMenuFloatingWindow::resizeToFitMenuItems() SetOutputSizePixel(Size(aPos.X(), aPos.Y())); } -void ScMenuFloatingWindow::selectMenuItem(size_t nPos, bool bSelected, bool bSubMenuTimer, bool bNotifyAccessible) +void ScMenuFloatingWindow::selectMenuItem(size_t nPos, bool bSelected, bool bSubMenuTimer) { if (nPos >= maMenuItems.size() || nPos == MENU_NOT_SELECTED) { @@ -715,24 +715,11 @@ void ScMenuFloatingWindow::selectMenuItem(size_t nPos, bool bSelected, bool bSub queueCloseSubMenu(); } } - - if (bNotifyAccessible && mxAccessible.is()) - { - ScAccessibleFilterMenu* p = static_cast<ScAccessibleFilterMenu*>(mxAccessible.get()); - p->selectMenuItem(nPos, bSelected); - } } -void ScMenuFloatingWindow::clearSelectedMenuItem(bool bNotifyAccessible) +void ScMenuFloatingWindow::clearSelectedMenuItem() { - selectMenuItem(mnSelectedMenu, false, false, bNotifyAccessible); - - if (bNotifyAccessible && mxAccessible.is()) - { - ScAccessibleFilterMenu* p = static_cast<ScAccessibleFilterMenu*>(mxAccessible.get()); - p->selectMenuItem(mnSelectedMenu, false); - } - + selectMenuItem(mnSelectedMenu, false, false); mnSelectedMenu = MENU_NOT_SELECTED; } @@ -765,6 +752,11 @@ bool ScMenuFloatingWindow::isMenuItemEnabled(size_t nPos) const return maMenuItems[nPos].mbEnabled; } +bool ScMenuFloatingWindow::isMenuItemSelected(size_t nPos) const +{ + return nPos == mnSelectedMenu; +} + void ScMenuFloatingWindow::setName(const OUString& rName) { maName = rName; diff --git a/sc/source/ui/inc/dpcontrol.hxx b/sc/source/ui/inc/dpcontrol.hxx index 0071be51fc9d..1e980a778434 100644 --- a/sc/source/ui/inc/dpcontrol.hxx +++ b/sc/source/ui/inc/dpcontrol.hxx @@ -125,13 +125,14 @@ public: void addMenuItem(const ::rtl::OUString& rText, bool bEnabled, Action* pAction); ScMenuFloatingWindow* addSubMenuItem(const ::rtl::OUString& rText, bool bEnabled); - void setSelectedMenuItem(size_t nPos, bool bSubMenuTimer = true, bool bNotifyAccessible = true); - void selectMenuItem(size_t nPos, bool bSelected, bool bSubMenuTimer, bool bNotifyAccessible); - void clearSelectedMenuItem(bool bNotifyAccessible); + void setSelectedMenuItem(size_t nPos, bool bSubMenuTimer = true); + void selectMenuItem(size_t nPos, bool bSelected, bool bSubMenuTimer); + void clearSelectedMenuItem(); ScMenuFloatingWindow* getSubMenuWindow(size_t nPos) const; size_t getMenuItemCount() const; ::rtl::OUString getMenuItemName(size_t nPos) const; bool isMenuItemEnabled(size_t nPos) const; + bool isMenuItemSelected(size_t nPos) const; void setName(const ::rtl::OUString& rName); const ::rtl::OUString& getName() const; |