summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sc/inc/AccessibleFilterMenu.hxx6
-rw-r--r--sc/inc/AccessibleFilterMenuItem.hxx2
-rw-r--r--sc/source/ui/Accessibility/AccessibleFilterMenu.cxx105
-rw-r--r--sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx24
-rw-r--r--sc/source/ui/Accessibility/AccessibleFilterTopWindow.cxx4
-rw-r--r--sc/source/ui/cctrl/dpcontrol.cxx34
-rw-r--r--sc/source/ui/inc/dpcontrol.hxx7
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;