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 DBAUI_TABLEDESIGNVIEW_HXX
27 #include "TableDesignView.hxx"
28 #endif
29 #ifndef _TOOLS_DEBUG_HXX
30 #include <tools/debug.hxx>
31 #endif
32 #ifndef DBUI_TABLECONTROLLER_HXX
33 #include "TableController.hxx"
34 #endif
35 #ifndef _DBA_DBACCESS_HELPID_HRC_
36 #include "dbaccess_helpid.hrc"
37 #endif
38 #ifndef DBAUI_FIELDDESCRIPTIONS_HXX
39 #include "FieldDescriptions.hxx"
40 #endif
41 #ifndef DBAUI_TABLEEDITORCONTROL_HXX
42 #include "TEditControl.hxx"
43 #endif
44 #ifndef DBAUI_TABLEFIELDDESCRIPTION_HXX
45 #include "TableFieldDescWin.hxx"
46 #endif
47 #ifndef DBAUI_TABLEROW_HXX
48 #include "TableRow.hxx"
49 #endif
50 #ifndef _UTL_CONFIGMGR_HXX_
51 #include <unotools/configmgr.hxx>
52 #endif
53 #ifndef _COMPHELPER_TYPES_HXX_
54 #include <comphelper/types.hxx>
55 #endif
56 #ifndef _COM_SUN_STAR_DATATRANSFER_CLIPBOARD_XCLIPBOARD_HPP_
57 #include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
58 #endif
59 #ifndef INCLUDED_SVTOOLS_SYSLOCALE_HXX
60 #include <unotools/syslocale.hxx>
61 #endif
62 #ifndef DBAUI_TOOLS_HXX
63 #include "UITools.hxx"
64 #endif
65 
66 
67 using namespace ::dbaui;
68 using namespace ::utl;
69 using namespace ::com::sun::star::uno;
70 using namespace ::com::sun::star::datatransfer::clipboard;
71 using namespace ::com::sun::star::lang;
72 using namespace ::com::sun::star::beans;
73 
74 //==================================================================
75 // class OTableBorderWindow
76 DBG_NAME(OTableBorderWindow)
77 //==================================================================
78 OTableBorderWindow::OTableBorderWindow(Window* pParent) : Window(pParent,WB_BORDER)
79 	,m_aHorzSplitter( this )
80 {
81     DBG_CTOR(OTableBorderWindow,NULL);
82 
83 	ImplInitSettings( sal_True, sal_True, sal_True );
84 	//////////////////////////////////////////////////////////////////////
85 	// Childs erzeugen
86 	m_pEditorCtrl	= new OTableEditorCtrl( this);
87 	m_pFieldDescWin = new OTableFieldDescWin( this );
88 
89 	m_pFieldDescWin->SetHelpId(HID_TAB_DESIGN_DESCWIN);
90 
91 	// set depending windows and controls
92 	m_pEditorCtrl->SetDescrWin(m_pFieldDescWin);
93 
94 	//////////////////////////////////////////////////////////////////////
95 	// Splitter einrichten
96 	m_aHorzSplitter.SetSplitHdl( LINK(this, OTableBorderWindow, SplitHdl) );
97 	m_aHorzSplitter.Show();
98 }
99 // -----------------------------------------------------------------------------
100 OTableBorderWindow::~OTableBorderWindow()
101 {
102 	//////////////////////////////////////////////////////////////////////
103 	// Childs zerstoeren
104 	//	::dbaui::notifySystemWindow(this,m_pFieldDescWin,::comphelper::mem_fun(&TaskPaneList::RemoveWindow));
105 	m_pEditorCtrl->Hide();
106 	m_pFieldDescWin->Hide();
107 
108 	{
109 		::std::auto_ptr<Window> aTemp(m_pEditorCtrl);
110 		m_pEditorCtrl = NULL;
111 	}
112 	{
113 		::std::auto_ptr<Window> aTemp(m_pFieldDescWin);
114 		m_pFieldDescWin = NULL;
115 	}
116 
117     DBG_DTOR(OTableBorderWindow,NULL);
118 }
119 // -----------------------------------------------------------------------------
120 void OTableBorderWindow::Resize()
121 {
122 	const long nSplitterHeight(3);
123 
124 	//////////////////////////////////////////////////////////////////////
125 	// Abmessungen parent window
126 	Size aOutputSize( GetOutputSize() );
127 	long nOutputWidth	= aOutputSize.Width();
128 	long nOutputHeight	= aOutputSize.Height();
129 	long nSplitPos		= m_aHorzSplitter.GetSplitPosPixel();
130 
131 	//////////////////////////////////////////////////////////////////////
132 	// Verschiebebereich Splitter mittleres Drittel des Outputs
133 	long nDragPosY = nOutputHeight/3;
134 	long nDragSizeHeight = nOutputHeight/3;
135 	m_aHorzSplitter.SetDragRectPixel( Rectangle(Point(0,nDragPosY), Size(nOutputWidth,nDragSizeHeight) ), this );
136 	if( (nSplitPos < nDragPosY) || (nSplitPos > (nDragPosY+nDragSizeHeight)) )
137 		nSplitPos = nDragPosY+nDragSizeHeight-5;
138 
139 	//////////////////////////////////////////////////////////////////////
140 	// Splitter setzen
141 	m_aHorzSplitter.SetPosSizePixel( Point( 0, nSplitPos ), Size(nOutputWidth, nSplitterHeight));
142 	m_aHorzSplitter.SetSplitPosPixel( nSplitPos );
143 
144 	//////////////////////////////////////////////////////////////////////
145 	// Fenster setzen
146 	m_pEditorCtrl->SetPosSizePixel( Point(0, 0), Size(nOutputWidth , nSplitPos) );
147 
148 	m_pFieldDescWin->SetPosSizePixel(	Point(0, nSplitPos+nSplitterHeight),
149 						Size(nOutputWidth, nOutputHeight-nSplitPos-nSplitterHeight) );
150 }
151 //------------------------------------------------------------------------------
152 IMPL_LINK( OTableBorderWindow, SplitHdl, Splitter*, pSplit )
153 {
154 	if(pSplit == &m_aHorzSplitter)
155 	{
156 		m_aHorzSplitter.SetPosPixel( Point( m_aHorzSplitter.GetPosPixel().X(),m_aHorzSplitter.GetSplitPosPixel() ) );
157 		Resize();
158 	}
159 	return 0;
160 }
161 // -----------------------------------------------------------------------------
162 void OTableBorderWindow::ImplInitSettings( sal_Bool bFont, sal_Bool bForeground, sal_Bool bBackground )
163 {
164 	const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
165 
166 	if ( bFont )
167 	{
168 		Font aFont = rStyleSettings.GetAppFont();
169 		if ( IsControlFont() )
170 			aFont.Merge( GetControlFont() );
171 		SetPointFont( aFont );
172 //		Set/*Zoomed*/PointFont( aFont );
173 	}
174 
175 	if ( bFont || bForeground )
176 	{
177 		Color aTextColor = rStyleSettings.GetButtonTextColor();
178 		if ( IsControlForeground() )
179 			aTextColor = GetControlForeground();
180 		SetTextColor( aTextColor );
181 	}
182 
183 	if ( bBackground )
184 	{
185 		if( IsControlBackground() )
186 			SetBackground( GetControlBackground() );
187 		else
188 			SetBackground( rStyleSettings.GetFaceColor() );
189 	}
190 }
191 // -----------------------------------------------------------------------
192 void OTableBorderWindow::DataChanged( const DataChangedEvent& rDCEvt )
193 {
194 	Window::DataChanged( rDCEvt );
195 
196 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
197 		 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
198 	{
199 		ImplInitSettings( sal_True, sal_True, sal_True );
200 		Invalidate();
201 	}
202 }
203 // -----------------------------------------------------------------------------
204 void OTableBorderWindow::GetFocus()
205 {
206 	Window::GetFocus();
207 
208 	// forward the focus to the current cell of the editor control
209 	if (m_pEditorCtrl)
210 		m_pEditorCtrl->GrabFocus();
211 }
212 
213 //==================================================================
214 // class OTableDesignView
215 //==================================================================
216 DBG_NAME(OTableDesignView);
217 //------------------------------------------------------------------------------
218 OTableDesignView::OTableDesignView( Window* pParent,
219 									const Reference< XMultiServiceFactory >& _rxOrb,
220 									OTableController& _rController
221 								   ) :
222 	ODataView( pParent, _rController,_rxOrb )
223 	,m_rController( _rController )
224 	,m_eChildFocus(NONE)
225 {
226 	DBG_CTOR(OTableDesignView,NULL);
227 
228 	try
229 	{
230 		m_aLocale = SvtSysLocale().GetLocaleData().getLocale();
231 	}
232 	catch(Exception&)
233 	{
234 	}
235 
236 	m_pWin = new OTableBorderWindow(this);
237 	m_pWin->Show();
238 }
239 
240 //------------------------------------------------------------------------------
241 OTableDesignView::~OTableDesignView()
242 {
243 	DBG_DTOR(OTableDesignView,NULL);
244 	m_pWin->Hide();
245 
246 	{
247 		::std::auto_ptr<Window> aTemp(m_pWin);
248 		m_pWin = NULL;
249 	}
250 }
251 
252 // -----------------------------------------------------------------------------
253 void OTableDesignView::initialize()
254 {
255 	GetEditorCtrl()->Init();
256 	GetDescWin()->Init();
257 	// first call after the editctrl has been set
258 
259 	GetEditorCtrl()->Show();
260 	GetDescWin()->Show();
261 
262 	GetEditorCtrl()->DisplayData(0);
263 }
264 //------------------------------------------------------------------------------
265 
266 //------------------------------------------------------------------------------
267 void OTableDesignView::resizeDocumentView(Rectangle& _rPlayground)
268 {
269 	m_pWin->SetPosSizePixel( _rPlayground.TopLeft(), _rPlayground.GetSize() );
270 
271 	// just for completeness: there is no space left, we occupied it all ...
272 	_rPlayground.SetPos( _rPlayground.BottomRight() );
273 	_rPlayground.SetSize( Size( 0, 0 ) );
274 }
275 
276 //------------------------------------------------------------------------------
277 IMPL_LINK( OTableDesignView, SwitchHdl, Accelerator*, /*pAcc*/ )
278 {
279 	if( getController().isReadOnly() )
280 		return 0;
281 
282 	if( GetDescWin()->HasChildPathFocus() )
283 	{
284 		GetDescWin()->LoseFocus();
285 		GetEditorCtrl()->GrabFocus();
286 	}
287 	else
288 	{
289 		 ::boost::shared_ptr<OTableRow>  pRow = (*GetEditorCtrl()->GetRowList())[GetEditorCtrl()->GetCurRow()];
290 		OFieldDescription* pFieldDescr = pRow ? pRow->GetActFieldDescr() : NULL;
291 		if ( pFieldDescr )
292 			GetDescWin()->GrabFocus();
293 		else
294 			GetEditorCtrl()->GrabFocus();
295 	}
296 
297 	return 0;
298 }
299 //------------------------------------------------------------------------------
300 long OTableDesignView::PreNotify( NotifyEvent& rNEvt )
301 {
302 	sal_Bool bHandled = sal_False;
303 	switch(rNEvt.GetType())
304 	{
305 		case EVENT_GETFOCUS:
306 			if( GetDescWin() && GetDescWin()->HasChildPathFocus() )
307 				m_eChildFocus = DESCRIPTION;
308 			else if ( GetEditorCtrl() && GetEditorCtrl()->HasChildPathFocus() )
309 				m_eChildFocus = EDITOR;
310 			else
311 				m_eChildFocus = NONE;
312 			break;
313 	}
314 
315 	return bHandled ? 1L : ODataView::PreNotify(rNEvt);
316 }
317 // -----------------------------------------------------------------------------
318 IClipboardTest* OTableDesignView::getActiveChild() const
319 {
320 	IClipboardTest* pTest = NULL;
321 	switch(m_eChildFocus)
322 	{
323 		case DESCRIPTION:
324 			pTest = GetDescWin();
325 			break;
326 		case EDITOR:
327 			pTest = GetEditorCtrl();
328 			break;
329         case NONE:
330             break;
331 	}
332 	return pTest;
333 }
334 // -----------------------------------------------------------------------------
335 sal_Bool OTableDesignView::isCopyAllowed()
336 {
337 	IClipboardTest* pTest = getActiveChild();
338 	return pTest && pTest->isCopyAllowed();
339 }
340 // -----------------------------------------------------------------------------
341 sal_Bool OTableDesignView::isCutAllowed()
342 {
343 	IClipboardTest* pTest = getActiveChild();
344 	return pTest && pTest->isCutAllowed();
345 }
346 // -----------------------------------------------------------------------------
347 sal_Bool OTableDesignView::isPasteAllowed()
348 {
349 	IClipboardTest* pTest = getActiveChild();
350 	return pTest && pTest->isPasteAllowed();
351 }
352 // -----------------------------------------------------------------------------
353 void OTableDesignView::copy()
354 {
355 	IClipboardTest* pTest = getActiveChild();
356 	if ( pTest )
357 		pTest->copy();
358 }
359 // -----------------------------------------------------------------------------
360 void OTableDesignView::cut()
361 {
362 	IClipboardTest* pTest = getActiveChild();
363 	if ( pTest )
364 		pTest->cut();
365 }
366 // -----------------------------------------------------------------------------
367 void OTableDesignView::paste()
368 {
369 	IClipboardTest* pTest = getActiveChild();
370 	if ( pTest )
371 		pTest->paste();
372 }
373 // -----------------------------------------------------------------------------
374 // set the view readonly or not
375 void OTableDesignView::setReadOnly(sal_Bool _bReadOnly)
376 {
377 	GetDescWin()->SetReadOnly(_bReadOnly);
378 	GetEditorCtrl()->SetReadOnly(_bReadOnly);
379 }
380 // -----------------------------------------------------------------------------
381 void OTableDesignView::reSync()
382 {
383 	GetEditorCtrl()->DeactivateCell();
384 	 ::boost::shared_ptr<OTableRow>  pRow = (*GetEditorCtrl()->GetRowList())[GetEditorCtrl()->GetCurRow()];
385 	OFieldDescription* pFieldDescr = pRow ? pRow->GetActFieldDescr() : NULL;
386 	if ( pFieldDescr )
387 		GetDescWin()->DisplayData(pFieldDescr);
388 }
389 // -----------------------------------------------------------------------------
390 void OTableDesignView::GetFocus()
391 {
392 	if ( GetEditorCtrl() )
393 		GetEditorCtrl()->GrabFocus();
394 }
395 // -----------------------------------------------------------------------------
396 
397