summaryrefslogtreecommitdiff
path: root/sc
diff options
context:
space:
mode:
authorKohei Yoshida <kohei@openoffice.org>2009-08-22 04:02:38 +0000
committerKohei Yoshida <kohei@openoffice.org>2009-08-22 04:02:38 +0000
commitf379d876d1a4894bd9767640c2329ba44f0e4820 (patch)
treeec4e11d291d2bbff736df8bf9e3226ce697e3ddc /sc
parent914141b32155e25a2d87ac00908bfb376ac30344 (diff)
Use ScAccessibleStateSet to share state set implementation.
Diffstat (limited to 'sc')
-rw-r--r--sc/inc/AccessibleFilterMenu.hxx26
-rw-r--r--sc/inc/AccessibleFilterMenuItem.hxx31
-rw-r--r--sc/inc/AccessibleGlobal.hxx3
-rw-r--r--sc/source/ui/Accessibility/AccessibleFilterMenu.cxx76
-rw-r--r--sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx126
5 files changed, 73 insertions, 189 deletions
diff --git a/sc/inc/AccessibleFilterMenu.hxx b/sc/inc/AccessibleFilterMenu.hxx
index c5049045d672..93cfe1a78b21 100644
--- a/sc/inc/AccessibleFilterMenu.hxx
+++ b/sc/inc/AccessibleFilterMenu.hxx
@@ -32,10 +32,9 @@
#define SC_ACCESSIBLEFILTERMENU_HXX
#include "AccessibleContextBase.hxx"
-#include "cppuhelper/implbase2.hxx"
+#include "cppuhelper/implbase1.hxx"
#include <com/sun/star/accessibility/XAccessibleSelection.hpp>
-#include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
#include <com/sun/star/accessibility/XAccessibleText.hpp>
#include <com/sun/star/accessibility/XAccessibleTextAttributes.hpp>
#include <com/sun/star/accessibility/TextSegment.hpp>
@@ -52,8 +51,7 @@ namespace com { namespace sun { namespace star {
class ScDocument;
class ScMenuFloatingWindow;
-typedef ::cppu::ImplHelper2<
- ::com::sun::star::accessibility::XAccessibleStateSet,
+typedef ::cppu::ImplHelper1<
::com::sun::star::accessibility::XAccessibleSelection > ScAccessibleFilterMenu_BASE;
class ScAccessibleFilterMenu :
@@ -120,20 +118,6 @@ public:
::com::sun::star::accessibility::XAccessibleEventListener>& xListener)
throw (com::sun::star::uno::RuntimeException);
- // XAccessibleStateSet
-
- virtual sal_Bool SAL_CALL isEmpty() throw (::com::sun::star::uno::RuntimeException);
-
- virtual sal_Bool SAL_CALL contains(sal_Int16 nState)
- throw (::com::sun::star::uno::RuntimeException);
-
- virtual sal_Bool SAL_CALL containsAll(
- const ::com::sun::star::uno::Sequence<sal_Int16>& aStateSet)
- throw (::com::sun::star::uno::RuntimeException);
-
- virtual ::com::sun::star::uno::Sequence<sal_Int16> SAL_CALL getStates()
- throw (::com::sun::star::uno::RuntimeException);
-
// XAccessibleSelection
virtual void SAL_CALL selectAccessibleChild(sal_Int32 nChildIndex)
@@ -177,16 +161,16 @@ public:
void appendMenuItem(const ::rtl::OUString& rName, bool bEnabled, size_t nMenuPos);
void setMenuPos(size_t nMenuPos);
void setEnabled(bool bEnabled);
- bool isSelected();
private:
- bool isFocused();
+ bool isSelected() const;
+ bool isFocused() const;
void updateStates();
private:
::std::vector< ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > > maMenuItems;
- ::std::set<sal_Int16> maStates;
+ ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > mxStateSet;
size_t mnMenuPos;
ScMenuFloatingWindow* mpWindow;
diff --git a/sc/inc/AccessibleFilterMenuItem.hxx b/sc/inc/AccessibleFilterMenuItem.hxx
index 3f7f58d3a818..10d471f4b245 100644
--- a/sc/inc/AccessibleFilterMenuItem.hxx
+++ b/sc/inc/AccessibleFilterMenuItem.hxx
@@ -32,16 +32,14 @@
#define SC_ACCESSIBLEFILTERMENUITEM_HXX
#include "AccessibleContextBase.hxx"
-#include "cppuhelper/implbase2.hxx"
+#include "cppuhelper/implbase1.hxx"
#include <com/sun/star/accessibility/XAccessibleAction.hpp>
-#include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
class ScMenuFloatingWindow;
-typedef ::cppu::ImplHelper2<
- ::com::sun::star::accessibility::XAccessibleAction,
- ::com::sun::star::accessibility::XAccessibleStateSet > ScAccessibleFilterMenuItem_BASE;
+typedef ::cppu::ImplHelper1<
+ ::com::sun::star::accessibility::XAccessibleAction > ScAccessibleFilterMenuItem_BASE;
class ScAccessibleFilterMenuItem :
public ScAccessibleContextBase,
@@ -72,21 +70,6 @@ public:
virtual ::rtl::OUString SAL_CALL getImplementationName()
throw (::com::sun::star::uno::RuntimeException);
- // XAccessibleStateSet
-
- virtual ::sal_Bool SAL_CALL isEmpty()
- throw (::com::sun::star::uno::RuntimeException);
-
- virtual ::sal_Bool SAL_CALL contains(sal_Int16 nState)
- throw (::com::sun::star::uno::RuntimeException);
-
- virtual ::sal_Bool SAL_CALL containsAll(
- const ::com::sun::star::uno::Sequence<sal_Int16>& aStateSet)
- throw (::com::sun::star::uno::RuntimeException);
-
- virtual ::com::sun::star::uno::Sequence<sal_Int16> SAL_CALL getStates()
- throw (::com::sun::star::uno::RuntimeException);
-
// XAccessibleAction
virtual ::sal_Int32 SAL_CALL getAccessibleActionCount()
@@ -114,11 +97,17 @@ public:
// Non-UNO Methods
- bool isSelected() const;
void setEnabled(bool bEnabled);
private:
+ bool isSelected() const;
+ bool isFocused() const;
+ void updateStateSet();
+
+private:
+ ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessibleStateSet > mxStateSet;
+
ScMenuFloatingWindow* mpWindow;
::rtl::OUString maName;
size_t mnMenuPos;
diff --git a/sc/inc/AccessibleGlobal.hxx b/sc/inc/AccessibleGlobal.hxx
index 83f5e0d2222c..9f17c2eaacae 100644
--- a/sc/inc/AccessibleGlobal.hxx
+++ b/sc/inc/AccessibleGlobal.hxx
@@ -36,6 +36,9 @@
#include <set>
+/**
+ * Generic XAccessibleStateSet implementation.
+ */
class ScAccessibleStateSet : public ::cppu::WeakImplHelper1< ::com::sun::star::accessibility::XAccessibleStateSet >
{
public:
diff --git a/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx b/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx
index 5a1253181a8f..ad50425db56e 100644
--- a/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx
+++ b/sc/source/ui/Accessibility/AccessibleFilterMenu.cxx
@@ -31,6 +31,7 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
+#include "AccessibleGlobal.hxx"
#include "AccessibleFilterMenu.hxx"
#include "AccessibleFilterMenuItem.hxx"
#include "unoguard.hxx"
@@ -173,7 +174,7 @@ Reference<XAccessibleStateSet> ScAccessibleFilterMenu::getAccessibleStateSet()
throw (RuntimeException)
{
updateStates();
- return this;
+ return mxStateSet;
}
OUString ScAccessibleFilterMenu::getImplementationName()
@@ -202,45 +203,6 @@ void ScAccessibleFilterMenu::removeEventListener(
for_each(maMenuItems.begin(), maMenuItems.end(), AddRemoveEventListener(xListener, false));
}
-// XAccessibleStateSet
-
-sal_Bool ScAccessibleFilterMenu::isEmpty() throw (RuntimeException)
-{
- return maStates.empty();
-}
-
-sal_Bool ScAccessibleFilterMenu::contains(sal_Int16 nState) throw (RuntimeException)
-{
- return maStates.count(nState) > 0;
-}
-
-sal_Bool ScAccessibleFilterMenu::containsAll(const Sequence<sal_Int16>& aStateSet)
- throw (RuntimeException)
-{
- sal_Int32 n = aStateSet.getLength();
- for (sal_Int32 i = 0; i < n; ++i)
- {
- if (!maStates.count(aStateSet[i]))
- // This state is not set.
- return false;
- }
- // All specified states are set.
- return true;
-}
-
-Sequence<sal_Int16> ScAccessibleFilterMenu::getStates() throw (RuntimeException)
-{
- updateStates();
- Sequence<sal_Int16> aSeq(0);
- set<sal_Int16>::const_iterator itr = maStates.begin(), itrEnd = maStates.end();
- for (size_t i = 0; itr != itrEnd; ++itr, ++i)
- {
- aSeq.realloc(i+1);
- aSeq[i] = *itr;
- }
- return aSeq;
-}
-
// XAccessibleSelection
void ScAccessibleFilterMenu::selectAccessibleChild(sal_Int32 nChildIndex)
@@ -358,28 +320,36 @@ void ScAccessibleFilterMenu::setEnabled(bool bEnabled)
mbEnabled = bEnabled;
}
-bool ScAccessibleFilterMenu::isFocused()
+bool ScAccessibleFilterMenu::isSelected() const
{
- return isSelected();
+ // Check to see if any of the child menu items is selected.
+ return mpWindow->isMenuItemSelected(mnMenuPos);
}
-bool ScAccessibleFilterMenu::isSelected()
+bool ScAccessibleFilterMenu::isFocused() const
{
- // Check to see if any of the child menu items is selected.
- return mpWindow->isMenuItemSelected(mnMenuPos);
+ return isSelected();
}
void ScAccessibleFilterMenu::updateStates()
{
- maStates.clear();
- maStates.insert(ENABLED);
- maStates.insert(FOCUSABLE);
- maStates.insert(SELECTABLE);
- maStates.insert(SENSITIVE);
- maStates.insert(OPAQUE);
+ if (!mxStateSet.is())
+ mxStateSet.set(new ScAccessibleStateSet);
+
+ ScAccessibleStateSet* p = static_cast<ScAccessibleStateSet*>(
+ mxStateSet.get());
+
+ p->clear();
+
+ p->insert(ENABLED);
+ p->insert(FOCUSABLE);
+ p->insert(SELECTABLE);
+ p->insert(SENSITIVE);
+ p->insert(OPAQUE);
if (isFocused())
- maStates.insert(FOCUSED);
+ p->insert(FOCUSED);
+
if (isSelected())
- maStates.insert(SELECTED);
+ p->insert(SELECTED);
}
diff --git a/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx b/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx
index 662e5303df48..76822ccb3820 100644
--- a/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx
+++ b/sc/source/ui/Accessibility/AccessibleFilterMenuItem.cxx
@@ -31,6 +31,7 @@
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
+#include "AccessibleGlobal.hxx"
#include "AccessibleFilterMenuItem.hxx"
#include "dpcontrol.hxx"
@@ -46,6 +47,7 @@
using namespace ::com::sun::star;
using namespace ::com::sun::star::accessibility;
+using namespace ::com::sun::star::accessibility::AccessibleStateType;
using ::com::sun::star::uno::Any;
using ::com::sun::star::uno::Reference;
@@ -87,7 +89,8 @@ Reference<XAccessible> ScAccessibleFilterMenuItem::getAccessibleChild(sal_Int32
Reference<XAccessibleStateSet> ScAccessibleFilterMenuItem::getAccessibleStateSet()
throw (RuntimeException)
{
- return this;
+ updateStateSet();
+ return mxStateSet;
}
OUString ScAccessibleFilterMenuItem::getImplementationName()
@@ -96,99 +99,6 @@ OUString ScAccessibleFilterMenuItem::getImplementationName()
return OUString::createFromAscii("ScAccessibleFilterMenuItem - implementation name");
}
-// XAccessibleStateSet
-
-sal_Bool ScAccessibleFilterMenuItem::isEmpty() throw (RuntimeException)
-{
- return false;
-}
-
-sal_Bool ScAccessibleFilterMenuItem::contains(sal_Int16 nState) throw (RuntimeException)
-{
- using namespace ::com::sun::star::accessibility::AccessibleStateType;
- if (mbEnabled)
- {
- switch (nState)
- {
- case ENABLED:
- case FOCUSABLE:
- case SELECTABLE:
- case SENSITIVE:
- return true;
- }
- }
-
- if (isSelected())
- {
- switch (nState)
- {
- case FOCUSED:
- case SELECTED:
- return true;
- }
- }
- return false;
-}
-
-sal_Bool ScAccessibleFilterMenuItem::containsAll(const Sequence<sal_Int16>& aStateSet)
- throw (RuntimeException)
-{
- using namespace ::com::sun::star::accessibility::AccessibleStateType;
- sal_Int32 n = aStateSet.getLength();
- for (sal_Int32 i = 0; i < n; ++i)
- {
- sal_Int16 nState = aStateSet[i];
- if (mbEnabled)
- {
- switch (nState)
- {
- case ENABLED:
- case FOCUSABLE:
- case SELECTABLE:
- case SENSITIVE:
- continue;
- }
- }
- if (isSelected())
- {
- switch (nState)
- {
- case FOCUSED:
- case SELECTED:
- continue;
- }
- }
- return false;
- }
- return true;
-}
-
-Sequence<sal_Int16> ScAccessibleFilterMenuItem::getStates() throw (RuntimeException)
-{
- using namespace ::com::sun::star::accessibility::AccessibleStateType;
- vector<sal_Int16> aStates;
- if (mbEnabled)
- {
- aStates.push_back(ENABLED);
- aStates.push_back(FOCUSABLE);
- aStates.push_back(SELECTABLE);
- aStates.push_back(SENSITIVE);
- }
-
- if (isSelected())
- {
- aStates.push_back(FOCUSED);
- aStates.push_back(SELECTED);
- }
-
- size_t n = aStates.size();
- Sequence<sal_Int16> aSeq(aStates.size());
- for (size_t i = 0; i < n; ++i)
- aSeq[i] = aStates[i];
-
- return aSeq;
-}
-
// XAccessibleAction
sal_Int32 ScAccessibleFilterMenuItem::getAccessibleActionCount() throw (RuntimeException)
@@ -240,8 +150,36 @@ bool ScAccessibleFilterMenuItem::isSelected() const
return mpWindow->isMenuItemSelected(mnMenuPos);
}
+bool ScAccessibleFilterMenuItem::isFocused() const
+{
+ return isSelected();
+}
+
void ScAccessibleFilterMenuItem::setEnabled(bool bEnabled)
{
mbEnabled = bEnabled;
}
+void ScAccessibleFilterMenuItem::updateStateSet()
+{
+ if (!mxStateSet.is())
+ mxStateSet.set(new ScAccessibleStateSet);
+
+ ScAccessibleStateSet* p = static_cast<ScAccessibleStateSet*>(
+ mxStateSet.get());
+
+ p->clear();
+
+ p->insert(ENABLED);
+ p->insert(FOCUSABLE);
+ p->insert(SELECTABLE);
+ p->insert(SENSITIVE);
+ p->insert(OPAQUE);
+
+ if (isFocused())
+ p->insert(FOCUSED);
+
+ if (isSelected())
+ p->insert(SELECTED);
+}
+