xref: /AOO41X/main/dbaccess/source/ui/querydesign/TableWindowAccess.cxx (revision 96de54900b79e13b861fbc62cbf36018b54e21b7)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_dbaccess.hxx"
26 #ifndef DBACCESS_TABLEWINDOWACCESS_HXX
27 #include "TableWindowAccess.hxx"
28 #endif
29 #ifndef DBACCESS_JACCESS_HXX
30 #include "JAccess.hxx"
31 #endif
32 #ifndef DBAUI_TABLEWINDOW_HXX
33 #include "TableWindow.hxx"
34 #endif
35 #ifndef DBAUI_TABLEWINDOWLISTBOX_HXX
36 #include "TableWindowListBox.hxx"
37 #endif
38 #ifndef DBAUI_JOINDESIGNVIEW_HXX
39 #include "JoinDesignView.hxx"
40 #endif
41 #ifndef DBAUI_JOINCONTROLLER_HXX
42 #include "JoinController.hxx"
43 #endif
44 #ifndef DBAUI_JOINTABLEVIEW_HXX
45 #include "JoinTableView.hxx"
46 #endif
47 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
48 #include <com/sun/star/accessibility/AccessibleRole.hpp>
49 #endif
50 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLERELATIONTYPE_HPP_
51 #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
52 #endif
53 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLESTATETYPE_HPP_
54 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
55 #endif
56 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEEVENTID_HPP_
57 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
58 #endif
59 #ifndef _COMPHELPER_SEQUENCE_HXX_
60 #include <comphelper/sequence.hxx>
61 #endif
62 #ifndef _DBU_QRY_HRC_
63 #include "dbu_qry.hrc"
64 #endif
65 
66 
67 namespace dbaui
68 {
69     using namespace ::com::sun::star::accessibility;
70     using namespace ::com::sun::star::uno;
71     using namespace ::com::sun::star::beans;
72     using namespace ::com::sun::star::lang;
73     //  using namespace ::com::sun::star::awt;
74     using namespace ::com::sun::star;
75 
OTableWindowAccess(OTableWindow * _pTable)76     OTableWindowAccess::OTableWindowAccess(OTableWindow* _pTable)
77         :VCLXAccessibleComponent(_pTable->GetComponentInterface().is() ? _pTable->GetWindowPeer() : NULL)
78         ,m_pTable(_pTable)
79     {
80     }
81     // -----------------------------------------------------------------------------
disposing()82     void SAL_CALL OTableWindowAccess::disposing()
83     {
84         m_pTable = NULL;
85         VCLXAccessibleComponent::disposing();
86     }
87     // -----------------------------------------------------------------------------
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)88     void OTableWindowAccess::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
89     {
90         if ( rVclWindowEvent.GetId() == VCLEVENT_OBJECT_DYING )
91         {
92             ::osl::MutexGuard aGuard( m_aMutex );
93             m_pTable = NULL;
94         }
95 
96         VCLXAccessibleComponent::ProcessWindowEvent( rVclWindowEvent );
97     }
98     // -----------------------------------------------------------------------------
queryInterface(const Type & aType)99     Any SAL_CALL OTableWindowAccess::queryInterface( const Type& aType ) throw (RuntimeException)
100     {
101         Any aRet(VCLXAccessibleComponent::queryInterface( aType ));
102         return aRet.hasValue() ? aRet : OTableWindowAccess_BASE::queryInterface( aType );
103     }
104     // -----------------------------------------------------------------------------
getTypes()105     Sequence< Type > SAL_CALL OTableWindowAccess::getTypes(  ) throw (RuntimeException)
106     {
107         return ::comphelper::concatSequences(VCLXAccessibleComponent::getTypes(),OTableWindowAccess_BASE::getTypes());
108     }
109     // -----------------------------------------------------------------------------
getImplementationName()110     ::rtl::OUString SAL_CALL OTableWindowAccess::getImplementationName() throw(RuntimeException)
111     {
112         return getImplementationName_Static();
113     }
114     // -----------------------------------------------------------------------------
getSupportedServiceNames()115     Sequence< ::rtl::OUString > SAL_CALL OTableWindowAccess::getSupportedServiceNames() throw(RuntimeException)
116     {
117         return getSupportedServiceNames_Static();
118     }
119     // -----------------------------------------------------------------------------
120     // XServiceInfo - static methods
getSupportedServiceNames_Static(void)121     Sequence< ::rtl::OUString > OTableWindowAccess::getSupportedServiceNames_Static(void) throw( RuntimeException )
122     {
123         Sequence< ::rtl::OUString > aSupported(2);
124         aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.accessibility.Accessible");
125         aSupported[1] = ::rtl::OUString::createFromAscii("com.sun.star.accessibility.AccessibleContext");
126         return aSupported;
127     }
128     // -----------------------------------------------------------------------------
getImplementationName_Static(void)129     ::rtl::OUString OTableWindowAccess::getImplementationName_Static(void) throw( RuntimeException )
130     {
131         return ::rtl::OUString::createFromAscii("org.openoffice.comp.dbu.TableWindowAccessibility");
132     }
133     // -----------------------------------------------------------------------------
134     // XAccessibleContext
getAccessibleChildCount()135     sal_Int32 SAL_CALL OTableWindowAccess::getAccessibleChildCount(  ) throw (RuntimeException)
136     {
137         ::osl::MutexGuard aGuard( m_aMutex );
138         sal_Int32 nCount = 0;
139         if(m_pTable)
140         {
141             if(m_pTable->GetTitleCtrl())
142                 ++nCount;
143             if(m_pTable->GetListBox())
144                 ++nCount;
145         }
146         return nCount;
147     }
148     // -----------------------------------------------------------------------------
getAccessibleChild(sal_Int32 i)149     Reference< XAccessible > SAL_CALL OTableWindowAccess::getAccessibleChild( sal_Int32 i ) throw (IndexOutOfBoundsException,RuntimeException)
150     {
151         ::osl::MutexGuard aGuard( m_aMutex );
152         Reference< XAccessible > aRet;
153         if(m_pTable)
154         {
155             switch(i)
156             {
157                 case 0:
158                     if(m_pTable->GetTitleCtrl())
159                     {
160                         aRet = m_pTable->GetTitleCtrl()->GetAccessible();
161                         break;
162                     } // fall through if title control does not exist
163                 case 1:
164                     if(m_pTable->GetListBox())
165                         aRet = m_pTable->GetListBox()->GetAccessible();
166                     break;
167                 default:
168                     throw IndexOutOfBoundsException();
169             }
170         }
171         return aRet;
172     }
173     // -----------------------------------------------------------------------------
getAccessibleIndexInParent()174     sal_Int32 SAL_CALL OTableWindowAccess::getAccessibleIndexInParent(  ) throw (RuntimeException)
175     {
176         ::osl::MutexGuard aGuard( m_aMutex  );
177         sal_Int32 nIndex = -1;
178         if( m_pTable )
179         {
180             // search the postion of our table window in the table window map
181             OJoinTableView::OTableWindowMap* pMap = m_pTable->getTableView()->GetTabWinMap();
182             OJoinTableView::OTableWindowMap::iterator aIter = pMap->begin();
183             OJoinTableView::OTableWindowMap::iterator aEnd = pMap->end();
184             for (nIndex = 0; aIter != aEnd && aIter->second != m_pTable; ++nIndex,++aIter)
185                 ;
186             nIndex = aIter != aEnd ? nIndex : -1;
187         }
188         return nIndex;
189     }
190     // -----------------------------------------------------------------------------
getAccessibleRole()191     sal_Int16 SAL_CALL OTableWindowAccess::getAccessibleRole(  ) throw (RuntimeException)
192     {
193         return AccessibleRole::PANEL; // ? or may be an AccessibleRole::WINDOW
194     }
195     // -----------------------------------------------------------------------------
getAccessibleRelationSet()196     Reference< XAccessibleRelationSet > SAL_CALL OTableWindowAccess::getAccessibleRelationSet(  ) throw (RuntimeException)
197     {
198         ::osl::MutexGuard aGuard( m_aMutex  );
199         return this;
200     }
201     // -----------------------------------------------------------------------------
202     // XAccessibleComponent
getAccessibleAtPoint(const awt::Point & _aPoint)203     Reference< XAccessible > SAL_CALL OTableWindowAccess::getAccessibleAtPoint( const awt::Point& _aPoint ) throw (RuntimeException)
204     {
205         ::osl::MutexGuard aGuard( m_aMutex  );
206         Reference< XAccessible > aRet;
207         if( m_pTable )
208         {
209             Point aPoint(_aPoint.X,_aPoint.Y);
210             Rectangle aRect(m_pTable->GetDesktopRectPixel());
211             if( aRect.IsInside(aPoint) )
212                 aRet = this;
213             else if( m_pTable->GetListBox()->GetDesktopRectPixel().IsInside(aPoint))
214                 aRet = m_pTable->GetListBox()->GetAccessible();
215         }
216         return aRet;
217     }
218     // -----------------------------------------------------------------------------
getParentChild(sal_Int32 _nIndex)219     Reference< XAccessible > OTableWindowAccess::getParentChild(sal_Int32 _nIndex)
220     {
221         Reference< XAccessible > xReturn;
222         Reference< XAccessible > xParent = getAccessibleParent();
223         if ( xParent.is() )
224         {
225             Reference< XAccessibleContext > xParentContext = xParent->getAccessibleContext();
226             if ( xParentContext.is() )
227             {
228                 xReturn = xParentContext->getAccessibleChild(_nIndex);
229             }
230         }
231         return xReturn;
232     }
233     // -----------------------------------------------------------------------------
234 
getRelationCount()235     sal_Int32 SAL_CALL OTableWindowAccess::getRelationCount(  ) throw (RuntimeException)
236     {
237         ::osl::MutexGuard aGuard( m_aMutex  );
238         return m_pTable ? m_pTable->getTableView()->getConnectionCount(m_pTable) : sal_Int32(0);
239     }
240     // -----------------------------------------------------------------------------
getRelation(sal_Int32 nIndex)241     AccessibleRelation SAL_CALL OTableWindowAccess::getRelation( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
242     {
243         ::osl::MutexGuard aGuard( m_aMutex  );
244         if( nIndex < 0 || nIndex >= getRelationCount() )
245             throw IndexOutOfBoundsException();
246 
247         AccessibleRelation aRet;
248         if( m_pTable )
249         {
250             OJoinTableView* pView = m_pTable->getTableView();
251             ::std::vector<OTableConnection*>::const_iterator aIter = pView->getTableConnections(m_pTable) + nIndex;
252             aRet.TargetSet.realloc(1);
253             aRet.TargetSet[0] = getParentChild(aIter - pView->getTableConnections()->begin());
254             aRet.RelationType = AccessibleRelationType::CONTROLLER_FOR;
255         }
256         return aRet;
257     }
258     // -----------------------------------------------------------------------------
containsRelation(sal_Int16 aRelationType)259     sal_Bool SAL_CALL OTableWindowAccess::containsRelation( sal_Int16 aRelationType ) throw (RuntimeException)
260     {
261         ::osl::MutexGuard aGuard( m_aMutex  );
262         return      AccessibleRelationType::CONTROLLER_FOR == aRelationType
263                 &&  m_pTable && m_pTable->getTableView()->ExistsAConn(m_pTable);
264     }
265     // -----------------------------------------------------------------------------
getRelationByType(sal_Int16 aRelationType)266     AccessibleRelation SAL_CALL OTableWindowAccess::getRelationByType( sal_Int16 aRelationType ) throw (RuntimeException)
267     {
268         ::osl::MutexGuard aGuard( m_aMutex  );
269         if( AccessibleRelationType::CONTROLLER_FOR == aRelationType && m_pTable)
270         {
271             OJoinTableView* pView = m_pTable->getTableView();
272             const ::std::vector<OTableConnection*>* pConnectionList = pView->getTableConnections();
273 
274             ::std::vector<OTableConnection*>::const_iterator aIter = pView->getTableConnections(m_pTable);
275             ::std::vector<OTableConnection*>::const_iterator aEnd = pConnectionList->end();
276             ::std::vector< Reference<XInterface> > aRelations;
277             aRelations.reserve(5); // just guessing
278             for (; aIter != aEnd ; ++aIter )
279                 aRelations.push_back(getParentChild(aIter - pConnectionList->begin()));
280 
281             Reference<XInterface> *pRelations = aRelations.empty() ? 0 : &aRelations[0];
282             Sequence< Reference<XInterface> > aSeq(pRelations, aRelations.size());
283             return AccessibleRelation(AccessibleRelationType::CONTROLLER_FOR,aSeq);
284         }
285         return AccessibleRelation();
286     }
287     // -----------------------------------------------------------------------------
isEditable() const288     sal_Bool OTableWindowAccess::isEditable() const
289     {
290         return m_pTable && !m_pTable->getTableView()->getDesignView()->getController().isReadOnly();
291     }
292     // -----------------------------------------------------------------------------
getTitledBorderText()293     ::rtl::OUString SAL_CALL OTableWindowAccess::getTitledBorderText(  ) throw (RuntimeException)
294     {
295         return getAccessibleName(  );
296     }
297     // -----------------------------------------------------------------------------
getAccessibleName()298     ::rtl::OUString SAL_CALL OTableWindowAccess::getAccessibleName(  ) throw (RuntimeException)
299     {
300         ::osl::MutexGuard aGuard( m_aMutex  );
301         ::rtl::OUString sAccessibleName;
302         if ( m_pTable )
303             sAccessibleName = m_pTable->getTitle();
304         return sAccessibleName;
305     }
306     // -----------------------------------------------------------------------------
getAccessibleContext()307     Reference< XAccessibleContext > SAL_CALL OTableWindowAccess::getAccessibleContext(  ) throw (::com::sun::star::uno::RuntimeException)
308     {
309         return this;
310     }
311     // -----------------------------------------------------------------------------
312 
313 }
314 // -----------------------------------------------------------------------------
315 
316