1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_dbaccess.hxx"
30 #ifndef DBACCESS_CONNECTIONLINEACCESS_HXX
31 #include "ConnectionLineAccess.hxx"
32 #endif
33 #ifndef DBAUI_JOINTABLEVIEW_HXX
34 #include "JoinTableView.hxx"
35 #endif
36 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLEROLE_HPP_
37 #include <com/sun/star/accessibility/AccessibleRole.hpp>
38 #endif
39 #ifndef _COM_SUN_STAR_ACCESSIBILITY_ACCESSIBLERELATIONTYPE_HPP_
40 #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
41 #endif
42 #ifndef _TOOLKIT_AWT_VCLXWINDOW_HXX_
43 #include <toolkit/awt/vclxwindow.hxx>
44 #endif
45 #ifndef DBAUI_TABLECONNECTION_HXX
46 #include "TableConnection.hxx"
47 #endif
48 #ifndef DBAUI_TABLEWINDOW_HXX
49 #include "TableWindow.hxx"
50 #endif
51 #ifndef _COMPHELPER_UNO3_HXX_
52 #include <comphelper/uno3.hxx>
53 #endif
54 #ifndef DBAUI_JOINDESIGNVIEW_HXX
55 #include "JoinDesignView.hxx"
56 #endif
57 #ifndef DBAUI_JOINCONTROLLER_HXX
58 #include "JoinController.hxx"
59 #endif
60 #ifndef _COMPHELPER_SEQUENCE_HXX_
61 #include <comphelper/sequence.hxx>
62 #endif
63 
64 namespace dbaui
65 {
66 	using namespace ::com::sun::star::accessibility;
67 	using namespace ::com::sun::star::uno;
68 	using namespace ::com::sun::star::beans;
69 	using namespace ::com::sun::star::lang;
70 	//	using namespace ::com::sun::star::awt;
71 	using namespace ::com::sun::star;
72 
73 	OConnectionLineAccess::OConnectionLineAccess(OTableConnection* _pLine)
74 		: VCLXAccessibleComponent(_pLine->GetComponentInterface().is() ? _pLine->GetWindowPeer() : NULL)
75 		,m_pLine(_pLine)
76 	{
77 	}
78 	// -----------------------------------------------------------------------------
79 	void SAL_CALL OConnectionLineAccess::disposing()
80 	{
81 		m_pLine = NULL;
82 		VCLXAccessibleComponent::disposing();
83 	}
84 	// -----------------------------------------------------------------------------
85 	Any SAL_CALL OConnectionLineAccess::queryInterface( const Type& aType ) throw (RuntimeException)
86 	{
87 		Any aRet(VCLXAccessibleComponent::queryInterface( aType ));
88 		return aRet.hasValue() ? aRet : OConnectionLineAccess_BASE::queryInterface( aType );
89 	}
90 	// -----------------------------------------------------------------------------
91 	Sequence< Type > SAL_CALL OConnectionLineAccess::getTypes(  ) throw (RuntimeException)
92 	{
93 		return ::comphelper::concatSequences(VCLXAccessibleComponent::getTypes(),OConnectionLineAccess_BASE::getTypes());
94 	}
95 	// -----------------------------------------------------------------------------
96 	::rtl::OUString SAL_CALL OConnectionLineAccess::getImplementationName() throw(RuntimeException)
97 	{
98 		return getImplementationName_Static();
99 	}
100 	// -----------------------------------------------------------------------------
101 	// XServiceInfo - static methods
102 	// -----------------------------------------------------------------------------
103 	::rtl::OUString OConnectionLineAccess::getImplementationName_Static(void) throw( RuntimeException )
104 	{
105 		return ::rtl::OUString::createFromAscii("org.openoffice.comp.dbu.ConnectionLineAccessibility");
106 	}
107 	// -----------------------------------------------------------------------------
108 	// XAccessibleContext
109 	sal_Int32 SAL_CALL OConnectionLineAccess::getAccessibleChildCount(  ) throw (RuntimeException)
110 	{
111 		return 0;
112 	}
113 	// -----------------------------------------------------------------------------
114 	Reference< XAccessible > SAL_CALL OConnectionLineAccess::getAccessibleChild( sal_Int32 /*i*/ ) throw (RuntimeException)
115 	{
116 		return Reference< XAccessible >();
117 	}
118 	// -----------------------------------------------------------------------------
119 	sal_Int32 SAL_CALL OConnectionLineAccess::getAccessibleIndexInParent(  ) throw (RuntimeException)
120 	{
121 		::osl::MutexGuard aGuard( m_aMutex  );
122 		sal_Int32 nIndex = -1;
123 		if( m_pLine )
124 		{
125 			// search the postion of our table window in the table window map
126 			nIndex = m_pLine->GetParent()->GetTabWinMap()->size();
127 			const ::std::vector<OTableConnection*>* pVec = m_pLine->GetParent()->getTableConnections();
128 			::std::vector<OTableConnection*>::const_iterator aIter = pVec->begin();
129             ::std::vector<OTableConnection*>::const_iterator aEnd = pVec->end();
130 			for (; aIter != aEnd && (*aIter) != m_pLine; ++nIndex,++aIter)
131 				;
132 			nIndex = ( aIter != aEnd ) ? nIndex : -1;
133 		}
134 		return nIndex;
135 	}
136 	// -----------------------------------------------------------------------------
137 	sal_Int16 SAL_CALL OConnectionLineAccess::getAccessibleRole(  ) throw (RuntimeException)
138 	{
139 		return AccessibleRole::UNKNOWN; // ? or may be an AccessibleRole::WINDOW
140 	}
141 	// -----------------------------------------------------------------------------
142 	::rtl::OUString SAL_CALL OConnectionLineAccess::getAccessibleDescription(  ) throw (RuntimeException)
143 	{
144 		static ::rtl::OUString sDescription(RTL_CONSTASCII_USTRINGPARAM("Relation"));
145 		return sDescription;
146 	}
147 	// -----------------------------------------------------------------------------
148 	Reference< XAccessibleRelationSet > SAL_CALL OConnectionLineAccess::getAccessibleRelationSet(  ) throw (RuntimeException)
149 	{
150 		::osl::MutexGuard aGuard( m_aMutex  );
151 		return this;
152 	}
153 	// -----------------------------------------------------------------------------
154 	// XAccessibleComponent
155 	sal_Bool SAL_CALL OConnectionLineAccess::contains( const awt::Point& _aPoint ) throw (RuntimeException)
156 	{
157 		::osl::MutexGuard aGuard( m_aMutex  );
158 		Point aPoint(_aPoint.X,_aPoint.Y);
159 		return m_pLine ? m_pLine->CheckHit(aPoint) : sal_False;
160 	}
161 	// -----------------------------------------------------------------------------
162 	Reference< XAccessible > SAL_CALL OConnectionLineAccess::getAccessibleAtPoint( const awt::Point& /*_aPoint*/ ) throw (RuntimeException)
163 	{
164 		return Reference< XAccessible >();
165 	}
166 	// -----------------------------------------------------------------------------
167 	awt::Rectangle SAL_CALL OConnectionLineAccess::getBounds(  ) throw (RuntimeException)
168 	{
169 		::osl::MutexGuard aGuard( m_aMutex  );
170 		Rectangle aRect(m_pLine ? m_pLine->GetBoundingRect() : Rectangle());
171 		return awt::Rectangle(aRect.getX(),aRect.getY(),aRect.getWidth(),aRect.getHeight());
172 	}
173 	// -----------------------------------------------------------------------------
174 	awt::Point SAL_CALL OConnectionLineAccess::getLocation(  ) throw (RuntimeException)
175 	{
176 		::osl::MutexGuard aGuard( m_aMutex  );
177 		Point aPoint(m_pLine ? m_pLine->GetBoundingRect().TopLeft() : Point());
178 		return awt::Point(aPoint.X(),aPoint.Y());
179 	}
180 	// -----------------------------------------------------------------------------
181 	awt::Point SAL_CALL OConnectionLineAccess::getLocationOnScreen(  ) throw (RuntimeException)
182 	{
183 		::osl::MutexGuard aGuard( m_aMutex  );
184 		Point aPoint(m_pLine ? m_pLine->GetParent()->ScreenToOutputPixel(m_pLine->GetBoundingRect().TopLeft()) : Point());
185 		return awt::Point(aPoint.X(),aPoint.Y());
186 	}
187 	// -----------------------------------------------------------------------------
188 	awt::Size SAL_CALL OConnectionLineAccess::getSize(  ) throw (RuntimeException)
189 	{
190 		::osl::MutexGuard aGuard( m_aMutex  );
191 		Size aSize(m_pLine ? m_pLine->GetBoundingRect().GetSize() : Size());
192 		return awt::Size(aSize.Width(),aSize.Height());
193 	}
194 	// -----------------------------------------------------------------------------
195 	sal_Bool SAL_CALL OConnectionLineAccess::isShowing(  ) throw (RuntimeException)
196 	{
197 		::osl::MutexGuard aGuard( m_aMutex  );
198 		return m_pLine ? m_pLine->GetParent()->GetWindowRegionPixel().IsInside(m_pLine->GetBoundingRect()) : sal_False;
199 	}
200 	// -----------------------------------------------------------------------------
201 	sal_Bool SAL_CALL OConnectionLineAccess::isVisible(  ) throw (RuntimeException)
202 	{
203 		return sal_True;
204 	}
205 	// -----------------------------------------------------------------------------
206 	sal_Bool SAL_CALL OConnectionLineAccess::isFocusTraversable(  ) throw (RuntimeException)
207 	{
208 		return sal_True;
209 	}
210 	// -----------------------------------------------------------------------------
211 	// XAccessibleRelationSet
212 	// -----------------------------------------------------------------------------
213 	sal_Int32 SAL_CALL OConnectionLineAccess::getRelationCount(  ) throw (RuntimeException)
214 	{
215 		return 1;
216 	}
217 	// -----------------------------------------------------------------------------
218 	AccessibleRelation SAL_CALL OConnectionLineAccess::getRelation( sal_Int32 nIndex ) throw (IndexOutOfBoundsException, RuntimeException)
219 	{
220 		::osl::MutexGuard aGuard( m_aMutex  );
221 		if( nIndex < 0 || nIndex >= getRelationCount() )
222 			throw IndexOutOfBoundsException();
223 
224 		Sequence< Reference<XInterface> > aSeq(m_pLine ? 2 : 0);
225 		if( m_pLine )
226 		{
227 			aSeq[0] = m_pLine->GetSourceWin()->GetAccessible();
228 			aSeq[1] = m_pLine->GetDestWin()->GetAccessible();
229 		}
230 
231 		return AccessibleRelation(AccessibleRelationType::CONTROLLED_BY,aSeq);
232 	}
233 	// -----------------------------------------------------------------------------
234 	sal_Bool SAL_CALL OConnectionLineAccess::containsRelation( sal_Int16 aRelationType ) throw (RuntimeException)
235 	{
236 		return AccessibleRelationType::CONTROLLED_BY == aRelationType;
237 	}
238 	// -----------------------------------------------------------------------------
239 	AccessibleRelation SAL_CALL OConnectionLineAccess::getRelationByType( sal_Int16 aRelationType ) throw (RuntimeException)
240 	{
241 		if( AccessibleRelationType::CONTROLLED_BY == aRelationType )
242 			return getRelation(0);
243 		return AccessibleRelation();
244 	}
245 	// -----------------------------------------------------------------------------
246 	Reference< XAccessible > OTableConnection::CreateAccessible()
247 	{
248 		return new OConnectionLineAccess(this);
249 	}
250 	// -----------------------------------------------------------------------------
251 	OTableConnection::~OTableConnection()
252 	{
253 		DBG_DTOR(OTableConnection,NULL);
254 		//////////////////////////////////////////////////////////////////////
255 		// clear vector
256 		clearLineData();
257 	}
258 	// -----------------------------------------------------------------------------
259 	sal_Bool OConnectionLineAccess::isEditable() const
260 	{
261 
262 		return m_pLine ? !m_pLine->GetParent()->getDesignView()->getController().isReadOnly() : sal_False;
263 	}
264 	// -----------------------------------------------------------------------------
265 	Reference< XAccessibleContext > SAL_CALL OConnectionLineAccess::getAccessibleContext(  ) throw (::com::sun::star::uno::RuntimeException)
266 	{
267 		return this;
268 	}
269 	// -----------------------------------------------------------------------------
270 }
271 // -----------------------------------------------------------------------------
272 
273