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