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 #ifndef DBAUI_JOINTABLEVIEW_HXX
24 #define DBAUI_JOINTABLEVIEW_HXX
25 
26 #ifndef _SV_WINDOW_HXX
27 #include <vcl/window.hxx>
28 #endif
29 #ifndef _SV_TIMER_HXX
30 #include <vcl/timer.hxx>
31 #endif
32 #ifndef _SV_SCRBAR_HXX
33 #include <vcl/scrbar.hxx>
34 #endif
35 #ifndef _RTTI_HXX
36 #include <tools/rtti.hxx>
37 #endif
38 #ifndef _TRANSFER_HXX
39 #include <svtools/transfer.hxx>
40 #endif
41 
42 #ifndef _COMPHELPER_STLTYPES_HXX_
43 #include <comphelper/stl_types.hxx>
44 #endif
45 #ifndef _DBACCESS_UI_CALLBACKS_HXX_
46 #include "callbacks.hxx"
47 #endif
48 #include "TableConnectionData.hxx"
49 #include "TableWindowData.hxx"
50 #include <memory>
51 #include <vector>
52 
53 struct AcceptDropEvent;
54 struct ExecuteDropEvent;
55 class SfxUndoAction;
56 namespace dbaui
57 {
58 	class OTableConnection;
59 	class OTableWindow;
60 	struct OJoinExchangeData;
61 	class OJoinDesignView;
62 	class OTableWindowData;
63 	class OJoinDesignViewAccess;
64 
65 	// this class conatins only the scrollbars to avoid that the tablewindows clip the scrollbars
66 	class OJoinTableView;
67 	class OScrollWindowHelper : public Window
68 	{
69 		ScrollBar			m_aHScrollBar;
70 		ScrollBar			m_aVScrollBar;
71 		Window*				m_pCornerWindow;
72 		OJoinTableView*		m_pTableView;
73 
74 	protected:
75 		virtual void Resize();
76 	public:
77 		OScrollWindowHelper( Window* pParent);
78 		~OScrollWindowHelper();
79 
80 		void setTableView(OJoinTableView* _pTableView);
81 
82         void resetRange(const Point& _aSize);
83 
84 		// own methods
85 		ScrollBar* GetHScrollBar() { return &m_aHScrollBar; }
86 		ScrollBar* GetVScrollBar() { return &m_aVScrollBar; }
87 	};
88 
89 
90 	class OJoinTableView :	public Window
91 							,public IDragTransferableListener
92 							,public DropTargetHelper
93 	{
94 		friend class OJoinMoveTabWinUndoAct;
95 	public:
96 		DECLARE_STL_USTRINGACCESS_MAP(OTableWindow*,OTableWindowMap);
97 	private:
98 		OTableWindowMap		m_aTableMap;
99 		::std::vector<OTableConnection*>	m_vTableConnection;
100 
101 		Timer				m_aDragScrollTimer;
102 		Rectangle			m_aDragRect;
103 		Rectangle			m_aSizingRect;
104 		Point				m_aDragOffset;
105 		Point				m_aScrollOffset;
106 		Point				m_ptPrevDraggingPos;
107 		Size				m_aOutputSize;
108 
109 
110 		OTableWindow*			m_pDragWin;
111 		OTableWindow*			m_pSizingWin;
112 		OTableConnection*		m_pSelectedConn;
113 
114 
115 		sal_Bool					m_bTrackingInitiallyMoved;
116 
117 		DECL_LINK(OnDragScrollTimer, void*);
118 
119 	protected:
120 		OTableWindow*				m_pLastFocusTabWin;
121 		OJoinDesignView*			m_pView;
122 		OJoinDesignViewAccess*		m_pAccessible;
123 
124 	public:
125 		OJoinTableView( Window* pParent, OJoinDesignView* pView );
126 		virtual ~OJoinTableView();
127 
128 		// window override
129 		virtual void StateChanged( StateChangedType nStateChange );
130 		virtual void GetFocus();
131 		virtual void LoseFocus();
132 		virtual void KeyInput( const KeyEvent& rEvt );
133 		// Accessibility
134 		virtual ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible();
135 
136 		// own methods
137 		ScrollBar* GetHScrollBar() { return static_cast<OScrollWindowHelper*>(GetParent())->GetHScrollBar(); }
138 		ScrollBar* GetVScrollBar() { return static_cast<OScrollWindowHelper*>(GetParent())->GetVScrollBar(); }
139 		DECL_LINK( ScrollHdl, ScrollBar* );
140 
141 		void DrawConnections( const Rectangle& rRect );
142 		void InvalidateConnections();
143 
144 		void BeginChildMove( OTableWindow* pTabWin, const Point& rMousePos );
145 		void BeginChildSizing( OTableWindow* pTabWin, const Pointer& rPointer );
146 
147 		void NotifyTitleClicked( OTableWindow* pTabWin, const Point rMousePos );
148 
149 		virtual void AddTabWin(const ::rtl::OUString& _rComposedName, const ::rtl::OUString& rWinName, sal_Bool bNewTable = sal_False);
150 		virtual void RemoveTabWin( OTableWindow* pTabWin );
151 
152 		// alle TabWins verstecken (NICHT loeschen, sie werden in eine Undo-Action gepackt)
153 		virtual void	HideTabWins();
154 
155 		virtual void AddConnection(const OJoinExchangeData& jxdSource, const OJoinExchangeData& jxdDest) = 0;
156 
157 		/** RemoveConnection allows to remove connections from join table view, it implies that the same as addConnection
158 
159 			@param	_pConnection
160 					the connection which should be removed
161 			@param	_bDelete
162 					when truie then the connection will be deleted
163 
164 			@return an iterator to next valid connection, so it can be used in any loop
165 		*/
166 		virtual bool RemoveConnection(OTableConnection* _pConnection,sal_Bool _bDelete);
167 
168 		/** allows to add new connections to join table view, it implies an invalidation of the features
169 			ID_BROWSER_ADDTABLE and SID_RELATION_ADD_RELATION also the modified flag will be set to true
170 			@param	_pConnection
171 					the connection which should be added
172 			@param	_bAddData
173 					<TRUE/> when the data should also be appended
174 		*/
175 		void addConnection(OTableConnection* _pConnection,sal_Bool _bAddData = sal_True);
176 
177 		sal_Bool			ScrollPane( long nDelta, sal_Bool bHoriz, sal_Bool bPaintScrollBars );
178 		sal_uLong			GetTabWinCount();
179 		Point			GetScrollOffset() const { return m_aScrollOffset; }
180 
181 		OJoinDesignView*			getDesignView() const { return m_pView; }
182 		OTableWindow*				GetTabWindow( const String& rName );
183 
184 		OTableConnection*			GetSelectedConn() { return m_pSelectedConn; }
185 		void						DeselectConn(OTableConnection* pConn);	// NULL ist ausdruecklich zugelassen, dann passiert nichts
186 		void						SelectConn(OTableConnection* pConn);
187 
188 		OTableWindowMap*			GetTabWinMap() { return &m_aTableMap; }
189 		const OTableWindowMap*		GetTabWinMap() const { return &m_aTableMap; }
190 
191 		/** gives a read only access to the connection vector
192 		*/
193 		const ::std::vector<OTableConnection*>*	getTableConnections() const { return &m_vTableConnection; }
194 
195 
196 		sal_Bool						ExistsAConn(const OTableWindow* pFromWin) const;
197 
198 		/** getTableConnections searchs for all connections of a table
199 			@param	_pFromWin	the table for which connections should be found
200 
201 			@return an iterator which can be used to travel all connections of the table
202 		*/
203 		::std::vector<OTableConnection*>::const_iterator getTableConnections(const OTableWindow* _pFromWin) const;
204 
205 		/** getConnectionCount returns how many connection belongs to single table
206 			@param	_pFromWin	the table for which connections should be found
207 
208 			@return	the count of connections wich belongs to this table
209 		*/
210 		sal_Int32 getConnectionCount(const OTableWindow* _pFromWin) const;
211 
212 		OTableConnection* GetTabConn(const OTableWindow* pLhs,const OTableWindow* pRhs,bool _bSupressCrossOrNaturalJoin = false,const OTableConnection* _rpFirstAfter = NULL) const;
213 
214 		// clears the window map and connection vector without destroying it
215 		// that means the data of the windows and connection will be untouched
216 		void clearLayoutInformation();
217 
218 		// set the focus to that tab win which most recently had it (or to the first available one)
219 		void GrabTabWinFocus();
220 
221 		// ReSync ist dazu gedacht, aus dem Dokument alle WinData und ConnData zu holen und entsprechend Wins und Conns anzulegen
222 		virtual void ReSync() { }
223 		// ClearAll implementiert ein hartes Loeschen, es werden alle Conns und alle Wins aus ihren jeweiligen Listen geloescht
224 		// sowie die entsprechenden Datas aus dem Dokument ausgetragen
225 		virtual void ClearAll();
226 
227 		// wird vom AddTabDlg benutzt, um festzustellen, ob noch Tabellen hinzugefuegt werden duerfen
228 		virtual sal_Bool IsAddAllowed();
229 		virtual long PreNotify(NotifyEvent& rNEvt);
230 
231 		// DnD stuff
232 		virtual void		StartDrag( sal_Int8 nAction, const Point& rPosPixel );
233 		virtual sal_Int8	AcceptDrop( const AcceptDropEvent& rEvt );
234 		virtual sal_Int8	ExecuteDrop( const ExecuteDropEvent& rEvt );
235 
236 		/**
237 			can be used in derevied classes to make some special ui handling
238 			after d&d
239 		*/
240 		virtual void lookForUiActivities();
241 
242 		// wird nach Verschieben/Groessenaenderung der TabWins aufgerufen (die Standardimplementation reicht die neuen Daten einfach
243 		// an die Daten des Wins weiter)
244 		virtual void TabWinMoved(OTableWindow* ptWhich, const Point& ptOldPosition);
245 			// die Position ist "virtuell" : der Container hat sozusagen eine virtuelle Flaeche, von der immer nur ein bestimmter Bereich
246 			// - der mittels der Scrollbar veraendert werden kann - zu sehen ist. Insbesondere hat ptOldPosition immer positive Koordinaten,
247 			// auch wenn er einen Punkt oberhalb des aktuell sichtbaren Bereichs bezeichnet, dessen physische Ordinate eigentlich
248 			// negativ ist.
249 		virtual void TabWinSized(OTableWindow* ptWhich, const Point& ptOldPosition, const Size& szOldSize);
250 
251 		void modified();
252 
253 		/** returns if the given window is visible.
254 			@param	_rPoint
255 				The Point to check
256 			@param	_rSize
257 				The Size to be check as well
258 			@return
259 				<TRUE/> if the area is visible otherwise <FALSE/>
260 
261 		*/
262 		sal_Bool isMovementAllowed(const Point& _rPoint,const Size& _rSize);
263 
264 		Size getRealOutputSize() const { return m_aOutputSize; }
265 
266 
267 
268 		virtual void EnsureVisible(const OTableWindow* _pWin);
269 		virtual void EnsureVisible(const Point& _rPoint,const Size& _rSize);
270 
271         TTableWindowData::value_type createTableWindowData(const ::rtl::OUString& _rComposedName
272                                             ,const ::rtl::OUString& _sTableName
273 											,const ::rtl::OUString& _rWinName);
274 
275 	protected:
276 		virtual void MouseButtonUp( const MouseEvent& rEvt );
277 		virtual void MouseButtonDown( const MouseEvent& rEvt );
278 		virtual void Tracking( const TrackingEvent& rTEvt );
279 		virtual void Paint( const Rectangle& rRect );
280 		virtual void ConnDoubleClicked( OTableConnection* pConnection );
281 		virtual void SetDefaultTabWinPosSize( OTableWindow* pTabWin );
282 		virtual void DataChanged( const DataChangedEvent& rDCEvt );
283 
284 		virtual void Resize();
285 
286 		virtual void dragFinished( );
287 		// hier ist die Position (die sich waehrend des Sizings aendern kann) physisch, da waehrend des Sizens nicht gescrollt wird
288 		virtual void Command(const CommandEvent& rEvt);
289 
290 		virtual OTableWindowData* CreateImpl(const ::rtl::OUString& _rComposedName
291                                             ,const ::rtl::OUString& _sTableName
292 											,const ::rtl::OUString& _rWinName);
293 
294 		/** factory method to create table windows
295 			@param	_pData
296 				The data corresponding to the window.
297 			@return
298 				The new TableWindow
299 		*/
300 		virtual OTableWindow* createWindow(const TTableWindowData::value_type& _pData) = 0;
301 
302         /** determines whether the classes Init method should accept a query name, or only table names
303         */
304         virtual bool    allowQueries() const;
305 
306         /** called when init fails at the tablewindowdata because the m_xTable object could not provide columns, but no
307             exception was thrown. Expected to throw.
308         */
309         virtual void    onNoColumns_throw();
310 
311         virtual bool supressCrossNaturalJoin(const TTableConnectionData::value_type& _pData) const;
312 
313 	private:
314 		void	InitColors();
315 		sal_Bool	ScrollWhileDragging();
316 
317 		/** executePopup opens the context menu to delate a connection
318 			@param	_aPos				the position where the popup menu should appear
319 			@param	_pSelConnection		the connection which should be deleted
320 		*/
321 		void executePopup(const Point& _aPos,OTableConnection* _pSelConnection);
322 
323 		/** invalidateAndModify invalidates this window without children and
324 			set the controller modified
325 			@param	_pAction a possible undo action to add at the controller
326 		*/
327 		void invalidateAndModify(SfxUndoAction *_pAction=NULL);
328 
329     private:
330         using Window::Scroll;
331 	};
332 }
333 #endif // DBAUI_JOINTABLEVIEW_HXX
334