1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_dbaccess.hxx"
26*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEEDITORCONTROL_HXX
27*b1cdbd2cSJim Jagielski #include "TEditControl.hxx"
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski #ifndef _TOOLS_DEBUG_HXX
30*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
31*b1cdbd2cSJim Jagielski #endif
32*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
33*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
36*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
37*b1cdbd2cSJim Jagielski #endif
38*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XALTERTABLE_HPP_
39*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XAlterTable.hpp>
40*b1cdbd2cSJim Jagielski #endif
41*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XDROP_HPP_
42*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XDrop.hpp>
43*b1cdbd2cSJim Jagielski #endif
44*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_SDBCX_XAPPEND_HPP_
45*b1cdbd2cSJim Jagielski #include <com/sun/star/sdbcx/XAppend.hpp>
46*b1cdbd2cSJim Jagielski #endif
47*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_BEANS_PROPERTYATTRIBUTE_HPP_
48*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/PropertyAttribute.hpp>
49*b1cdbd2cSJim Jagielski #endif
50*b1cdbd2cSJim Jagielski #ifndef _COM_SUN_STAR_UTIL_XNUMBERFORMATTYPES_HPP_
51*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XNumberFormatTypes.hpp>
52*b1cdbd2cSJim Jagielski #endif
53*b1cdbd2cSJim Jagielski #ifndef _DBU_TBL_HRC_
54*b1cdbd2cSJim Jagielski #include "dbu_tbl.hrc"
55*b1cdbd2cSJim Jagielski #endif
56*b1cdbd2cSJim Jagielski #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
57*b1cdbd2cSJim Jagielski #include "dbustrings.hrc"
58*b1cdbd2cSJim Jagielski #endif
59*b1cdbd2cSJim Jagielski #ifndef DBACCESS_UI_BROWSER_ID_HXX
60*b1cdbd2cSJim Jagielski #include "browserids.hxx"
61*b1cdbd2cSJim Jagielski #endif
62*b1cdbd2cSJim Jagielski #ifndef _DBA_DBACCESS_HELPID_HRC_
63*b1cdbd2cSJim Jagielski #include "dbaccess_helpid.hrc"
64*b1cdbd2cSJim Jagielski #endif
65*b1cdbd2cSJim Jagielski #ifndef _COMPHELPER_TYPES_HXX_
66*b1cdbd2cSJim Jagielski #include <comphelper/types.hxx>
67*b1cdbd2cSJim Jagielski #endif
68*b1cdbd2cSJim Jagielski #ifndef DBAUI_FIELDDESCRIPTIONCONTROL_HXX
69*b1cdbd2cSJim Jagielski #include "FieldDescControl.hxx"
70*b1cdbd2cSJim Jagielski #endif
71*b1cdbd2cSJim Jagielski #ifndef DBAUI_FIELDDESCRIPTIONS_HXX
72*b1cdbd2cSJim Jagielski #include "FieldDescriptions.hxx"
73*b1cdbd2cSJim Jagielski #endif
74*b1cdbd2cSJim Jagielski #ifndef _SV_MSGBOX_HXX
75*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
76*b1cdbd2cSJim Jagielski #endif
77*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEUNDO_HXX
78*b1cdbd2cSJim Jagielski #include "TableUndo.hxx"
79*b1cdbd2cSJim Jagielski #endif
80*b1cdbd2cSJim Jagielski #ifndef DBUI_TABLECONTROLLER_HXX
81*b1cdbd2cSJim Jagielski #include "TableController.hxx"
82*b1cdbd2cSJim Jagielski #endif
83*b1cdbd2cSJim Jagielski #ifndef _CONNECTIVITY_DBTOOLS_HXX_
84*b1cdbd2cSJim Jagielski #include <connectivity/dbtools.hxx>
85*b1cdbd2cSJim Jagielski #endif
86*b1cdbd2cSJim Jagielski #ifndef DBAUI_SQLNAMEEDIT_HXX
87*b1cdbd2cSJim Jagielski #include "SqlNameEdit.hxx"
88*b1cdbd2cSJim Jagielski #endif
89*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEROW_EXCHANGE_HXX
90*b1cdbd2cSJim Jagielski #include "TableRowExchange.hxx"
91*b1cdbd2cSJim Jagielski #endif
92*b1cdbd2cSJim Jagielski #ifndef _SOT_STORAGE_HXX
93*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
94*b1cdbd2cSJim Jagielski #endif
95*b1cdbd2cSJim Jagielski #ifndef DBAUI_TOOLS_HXX
96*b1cdbd2cSJim Jagielski #include "UITools.hxx"
97*b1cdbd2cSJim Jagielski #endif
98*b1cdbd2cSJim Jagielski #ifndef DBAUI_FIELDDESCRIPTIONCONTROL_HXX
99*b1cdbd2cSJim Jagielski #include "FieldDescControl.hxx"
100*b1cdbd2cSJim Jagielski #endif
101*b1cdbd2cSJim Jagielski #ifndef DBAUI_TABLEFIELDCONTROL_HXX
102*b1cdbd2cSJim Jagielski #include "TableFieldControl.hxx"
103*b1cdbd2cSJim Jagielski #endif
104*b1cdbd2cSJim Jagielski #include "dsntypes.hxx"
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski #include "dbaccess_slotid.hrc"
107*b1cdbd2cSJim Jagielski 
108*b1cdbd2cSJim Jagielski using namespace ::dbaui;
109*b1cdbd2cSJim Jagielski using namespace ::comphelper;
110*b1cdbd2cSJim Jagielski using namespace ::svt;
111*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
112*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
113*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::io;
114*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::beans;
115*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::frame;
116*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::util;
117*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::lang;
118*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbc;
119*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdbcx;
120*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::sdb;
121*b1cdbd2cSJim Jagielski 
122*b1cdbd2cSJim Jagielski namespace dbaui
123*b1cdbd2cSJim Jagielski {
124*b1cdbd2cSJim Jagielski 	extern String GetTypeString( sal_uInt16 nType );
125*b1cdbd2cSJim Jagielski }
126*b1cdbd2cSJim Jagielski //==============================================================================
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski //	TYPEINIT1(OTableEditorCtrl, DBView);
129*b1cdbd2cSJim Jagielski DBG_NAME(OTableEditorCtrl)
130*b1cdbd2cSJim Jagielski 
131*b1cdbd2cSJim Jagielski //==============================================================================
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski #define HANDLE_ID		0
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski // default Spaltenbreiten
136*b1cdbd2cSJim Jagielski #define FIELDNAME_WIDTH		100
137*b1cdbd2cSJim Jagielski #define FIELDTYPE_WIDTH		150
138*b1cdbd2cSJim Jagielski #define FIELDDESCR_WIDTH	300
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski // Maximale Eingabelaenge im Beschreibungsfeld
141*b1cdbd2cSJim Jagielski #define MAX_DESCR_LEN		256
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski #define CONTROL_SPACING_X	18	// 6
145*b1cdbd2cSJim Jagielski #define	CONTROL_SPACING_Y	5
146*b1cdbd2cSJim Jagielski #define CONTROL_HEIGHT		20
147*b1cdbd2cSJim Jagielski #define CONTROL_WIDTH_1		140	// 100
148*b1cdbd2cSJim Jagielski #define CONTROL_WIDTH_2		100 // 60
149*b1cdbd2cSJim Jagielski #define CONTROL_WIDTH_3		250
150*b1cdbd2cSJim Jagielski #define CONTROL_WIDTH_4		(CONTROL_WIDTH_3 - CONTROL_HEIGHT - 5)
151*b1cdbd2cSJim Jagielski 
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski //==================================================================
DBG_NAME(ClipboardInvalidator)154*b1cdbd2cSJim Jagielski DBG_NAME(ClipboardInvalidator)
155*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
156*b1cdbd2cSJim Jagielski OTableEditorCtrl::ClipboardInvalidator::ClipboardInvalidator(sal_uLong nTimeout,OTableEditorCtrl* _pOwner)
157*b1cdbd2cSJim Jagielski : m_pOwner(_pOwner)
158*b1cdbd2cSJim Jagielski {
159*b1cdbd2cSJim Jagielski     DBG_CTOR(ClipboardInvalidator,NULL);
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	m_aInvalidateTimer.SetTimeout(nTimeout);
162*b1cdbd2cSJim Jagielski 	m_aInvalidateTimer.SetTimeoutHdl(LINK(this, OTableEditorCtrl::ClipboardInvalidator, OnInvalidate));
163*b1cdbd2cSJim Jagielski 	m_aInvalidateTimer.Start();
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
166*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
~ClipboardInvalidator()167*b1cdbd2cSJim Jagielski OTableEditorCtrl::ClipboardInvalidator::~ClipboardInvalidator()
168*b1cdbd2cSJim Jagielski {
169*b1cdbd2cSJim Jagielski 	m_aInvalidateTimer.Stop();
170*b1cdbd2cSJim Jagielski 
171*b1cdbd2cSJim Jagielski     DBG_DTOR(ClipboardInvalidator,NULL);
172*b1cdbd2cSJim Jagielski }
173*b1cdbd2cSJim Jagielski 
174*b1cdbd2cSJim Jagielski //------------------------------------------------------------------
IMPL_LINK(OTableEditorCtrl::ClipboardInvalidator,OnInvalidate,void *,EMPTYARG)175*b1cdbd2cSJim Jagielski IMPL_LINK(OTableEditorCtrl::ClipboardInvalidator, OnInvalidate, void*, EMPTYARG)
176*b1cdbd2cSJim Jagielski {
177*b1cdbd2cSJim Jagielski 	m_pOwner->GetView()->getController().InvalidateFeature(SID_CUT);
178*b1cdbd2cSJim Jagielski 	m_pOwner->GetView()->getController().InvalidateFeature(SID_COPY);
179*b1cdbd2cSJim Jagielski 	m_pOwner->GetView()->getController().InvalidateFeature(SID_PASTE);
180*b1cdbd2cSJim Jagielski 	return 0L;
181*b1cdbd2cSJim Jagielski }
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski //==================================================================
Init()184*b1cdbd2cSJim Jagielski void OTableEditorCtrl::Init()
185*b1cdbd2cSJim Jagielski {
186*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
187*b1cdbd2cSJim Jagielski 	OTableRowView::Init();
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
190*b1cdbd2cSJim Jagielski 	// Soll der Entwurf ReadOnly geoeffnet werden ?
191*b1cdbd2cSJim Jagielski 	sal_Bool bRead(GetView()->getController().isReadOnly());
192*b1cdbd2cSJim Jagielski 
193*b1cdbd2cSJim Jagielski 	SetReadOnly( bRead );
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
196*b1cdbd2cSJim Jagielski 	// Spalten einfuegen
197*b1cdbd2cSJim Jagielski 	String aColumnName( ModuleRes(STR_TAB_FIELD_COLUMN_NAME) );
198*b1cdbd2cSJim Jagielski 	InsertDataColumn( FIELD_NAME, aColumnName, FIELDNAME_WIDTH );
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 	aColumnName = String( ModuleRes(STR_TAB_FIELD_COLUMN_DATATYPE) );
201*b1cdbd2cSJim Jagielski 	InsertDataColumn( FIELD_TYPE, aColumnName, FIELDTYPE_WIDTH );
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski     ::dbaccess::ODsnTypeCollection aDsnTypes(GetView()->getController().getORB());
204*b1cdbd2cSJim Jagielski     sal_Bool bShowColumnDescription = aDsnTypes.supportsColumnDescription(::comphelper::getString(GetView()->getController().getDataSource()->getPropertyValue(PROPERTY_URL)));
205*b1cdbd2cSJim Jagielski 	aColumnName = String( ModuleRes(STR_TAB_HELP_TEXT) );
206*b1cdbd2cSJim Jagielski     InsertDataColumn( HELP_TEXT, aColumnName, bShowColumnDescription ? FIELDTYPE_WIDTH : FIELDDESCR_WIDTH );
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski     if ( bShowColumnDescription )
209*b1cdbd2cSJim Jagielski     {
210*b1cdbd2cSJim Jagielski         aColumnName = String( ModuleRes(STR_COLUMN_DESCRIPTION) );
211*b1cdbd2cSJim Jagielski 	    InsertDataColumn( COLUMN_DESCRIPTION, aColumnName, FIELDTYPE_WIDTH );
212*b1cdbd2cSJim Jagielski     }
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	InitCellController();
215*b1cdbd2cSJim Jagielski 
216*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
217*b1cdbd2cSJim Jagielski 	// Zeilen einfuegen
218*b1cdbd2cSJim Jagielski 	RowInserted(0, m_pRowList->size(), sal_True);
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski 
221*b1cdbd2cSJim Jagielski //==================================================================
UpdateAll()222*b1cdbd2cSJim Jagielski void OTableEditorCtrl::UpdateAll()
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
225*b1cdbd2cSJim Jagielski 	RowRemoved(0, GetRowCount(), sal_False);
226*b1cdbd2cSJim Jagielski 	m_nDataPos = 0;
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
229*b1cdbd2cSJim Jagielski 	Invalidate();
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski //==================================================================
OTableEditorCtrl(Window * pWindow)232*b1cdbd2cSJim Jagielski OTableEditorCtrl::OTableEditorCtrl(Window* pWindow)
233*b1cdbd2cSJim Jagielski     :OTableRowView(pWindow)
234*b1cdbd2cSJim Jagielski     ,pNameCell(NULL)
235*b1cdbd2cSJim Jagielski     ,pTypeCell(NULL)
236*b1cdbd2cSJim Jagielski     ,pHelpTextCell(NULL)
237*b1cdbd2cSJim Jagielski     ,pDescrCell(NULL)
238*b1cdbd2cSJim Jagielski     ,pDescrWin(NULL)
239*b1cdbd2cSJim Jagielski     ,nIndexEvent(0)
240*b1cdbd2cSJim Jagielski     ,nCutEvent(0)
241*b1cdbd2cSJim Jagielski     ,nPasteEvent(0)
242*b1cdbd2cSJim Jagielski     ,nDeleteEvent(0)
243*b1cdbd2cSJim Jagielski     ,nInsNewRowsEvent(0)
244*b1cdbd2cSJim Jagielski     ,nInvalidateTypeEvent(0)
245*b1cdbd2cSJim Jagielski     ,nEntryNotFoundEvent(0)
246*b1cdbd2cSJim Jagielski     ,m_eChildFocus(NONE)
247*b1cdbd2cSJim Jagielski     ,nOldDataPos(-1)
248*b1cdbd2cSJim Jagielski     ,bSaveOnMove(sal_True)
249*b1cdbd2cSJim Jagielski     ,bReadOnly(sal_True)
250*b1cdbd2cSJim Jagielski     ,m_aInvalidate(500,this)
251*b1cdbd2cSJim Jagielski {
252*b1cdbd2cSJim Jagielski 	DBG_CTOR(OTableEditorCtrl,NULL);
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski 	SetHelpId(HID_TABDESIGN_BACKGROUND);
255*b1cdbd2cSJim Jagielski 	GetDataWindow().SetHelpId(HID_CTL_TABLEEDIT);
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 	m_pRowList = GetView()->getController().getRows();
258*b1cdbd2cSJim Jagielski 	m_nDataPos = 0;
259*b1cdbd2cSJim Jagielski }
260*b1cdbd2cSJim Jagielski 
261*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetUndoManager() const262*b1cdbd2cSJim Jagielski SfxUndoManager& OTableEditorCtrl::GetUndoManager() const
263*b1cdbd2cSJim Jagielski {
264*b1cdbd2cSJim Jagielski 	return GetView()->getController().GetUndoManager();
265*b1cdbd2cSJim Jagielski }
266*b1cdbd2cSJim Jagielski 
267*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsReadOnly()268*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsReadOnly()
269*b1cdbd2cSJim Jagielski {
270*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
271*b1cdbd2cSJim Jagielski 	return bReadOnly;
272*b1cdbd2cSJim Jagielski }
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetReadOnly(sal_Bool bRead)275*b1cdbd2cSJim Jagielski void OTableEditorCtrl::SetReadOnly( sal_Bool bRead )
276*b1cdbd2cSJim Jagielski {
277*b1cdbd2cSJim Jagielski 	// nix zu tun ?
278*b1cdbd2cSJim Jagielski 	if (bRead == IsReadOnly())
279*b1cdbd2cSJim Jagielski 		// diese Abfrage ist wichtig, da die zugrundeliegende Def sonst im folgenden gelockt oder ge-unlocked wird, obwohl es
280*b1cdbd2cSJim Jagielski 		// nicht notwendig waere (und was schlimmer ist, das wuerde dann auch nicht wieder rueckgaengig gemacht)
281*b1cdbd2cSJim Jagielski 		return;
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
284*b1cdbd2cSJim Jagielski 	bReadOnly = bRead;
285*b1cdbd2cSJim Jagielski 
286*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
287*b1cdbd2cSJim Jagielski 	// Aktive Zelle disablen
288*b1cdbd2cSJim Jagielski 	long nRow(GetCurRow());
289*b1cdbd2cSJim Jagielski 	sal_uInt16 nCol(GetCurColumnId());
290*b1cdbd2cSJim Jagielski 	DeactivateCell();
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
293*b1cdbd2cSJim Jagielski 	// ::com::sun::star::beans::Property Controls disablen
294*b1cdbd2cSJim Jagielski //	if (pDescrWin)
295*b1cdbd2cSJim Jagielski //		pDescrWin->SetReadOnly(bReadOnly || !SetDataPtr(nRow) || GetActRow()->IsReadOnly());
296*b1cdbd2cSJim Jagielski 
297*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
298*b1cdbd2cSJim Jagielski 	// Cursor des Browsers anpassen
299*b1cdbd2cSJim Jagielski 	BrowserMode nMode(BROWSER_COLUMNSELECTION | BROWSER_MULTISELECTION | BROWSER_KEEPSELECTION |
300*b1cdbd2cSJim Jagielski 					  BROWSER_HLINESFULL	  | BROWSER_VLINESFULL|BROWSER_AUTOSIZE_LASTCOL);
301*b1cdbd2cSJim Jagielski 	if( !bReadOnly )
302*b1cdbd2cSJim Jagielski 		nMode |= BROWSER_HIDECURSOR;
303*b1cdbd2cSJim Jagielski 	SetMode(nMode);
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 	if( !bReadOnly )
306*b1cdbd2cSJim Jagielski 		ActivateCell( nRow, nCol );
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
309*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
InitCellController()310*b1cdbd2cSJim Jagielski void OTableEditorCtrl::InitCellController()
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
313*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
314*b1cdbd2cSJim Jagielski 	// Zelle Feldname
315*b1cdbd2cSJim Jagielski 	xub_StrLen nMaxTextLen = EDIT_NOLIMIT;
316*b1cdbd2cSJim Jagielski 	::rtl::OUString sExtraNameChars;
317*b1cdbd2cSJim Jagielski 	Reference<XConnection> xCon;
318*b1cdbd2cSJim Jagielski 	try
319*b1cdbd2cSJim Jagielski 	{
320*b1cdbd2cSJim Jagielski 		xCon = GetView()->getController().getConnection();
321*b1cdbd2cSJim Jagielski 		Reference< XDatabaseMetaData> xMetaData = xCon.is() ? xCon->getMetaData() : Reference< XDatabaseMetaData>();
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 		nMaxTextLen = ((xub_StrLen)xMetaData.is() ? static_cast<xub_StrLen>(xMetaData->getMaxColumnNameLength()) : 0);
324*b1cdbd2cSJim Jagielski 
325*b1cdbd2cSJim Jagielski 		if( nMaxTextLen == 0 )
326*b1cdbd2cSJim Jagielski 			nMaxTextLen = EDIT_NOLIMIT;
327*b1cdbd2cSJim Jagielski 		sExtraNameChars = xMetaData.is() ? xMetaData->getExtraNameCharacters() : ::rtl::OUString();
328*b1cdbd2cSJim Jagielski 
329*b1cdbd2cSJim Jagielski 	}
330*b1cdbd2cSJim Jagielski 	catch(SQLException&)
331*b1cdbd2cSJim Jagielski 	{
332*b1cdbd2cSJim Jagielski 		OSL_ASSERT(!"getMaxColumnNameLength");
333*b1cdbd2cSJim Jagielski 	}
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski 	pNameCell = new OSQLNameEdit( &GetDataWindow(), sExtraNameChars,WB_LEFT );
336*b1cdbd2cSJim Jagielski 	pNameCell->SetMaxTextLen( nMaxTextLen );
337*b1cdbd2cSJim Jagielski 	pNameCell->setCheck( isSQL92CheckEnabled(xCon) );
338*b1cdbd2cSJim Jagielski 
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
341*b1cdbd2cSJim Jagielski 	// Zelle Typ
342*b1cdbd2cSJim Jagielski 	pTypeCell = new ListBoxControl( &GetDataWindow() );
343*b1cdbd2cSJim Jagielski     pTypeCell->SetDropDownLineCount( 15 );
344*b1cdbd2cSJim Jagielski 
345*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
346*b1cdbd2cSJim Jagielski 	// Zelle Beschreibung
347*b1cdbd2cSJim Jagielski 	pDescrCell = new Edit( &GetDataWindow(), WB_LEFT );
348*b1cdbd2cSJim Jagielski 	pDescrCell->SetMaxTextLen( MAX_DESCR_LEN );
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski     pHelpTextCell = new Edit( &GetDataWindow(), WB_LEFT );
351*b1cdbd2cSJim Jagielski 	pHelpTextCell->SetMaxTextLen( MAX_DESCR_LEN );
352*b1cdbd2cSJim Jagielski 
353*b1cdbd2cSJim Jagielski 	pNameCell->SetHelpId(HID_TABDESIGN_NAMECELL);
354*b1cdbd2cSJim Jagielski 	pTypeCell->SetHelpId(HID_TABDESIGN_TYPECELL);
355*b1cdbd2cSJim Jagielski 	pDescrCell->SetHelpId(HID_TABDESIGN_COMMENTCELL);
356*b1cdbd2cSJim Jagielski     pHelpTextCell->SetHelpId(HID_TABDESIGN_HELPTEXT);
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski     Size aHeight;
359*b1cdbd2cSJim Jagielski     const Control* pControls[] = { pTypeCell,pDescrCell,pNameCell,pHelpTextCell};
360*b1cdbd2cSJim Jagielski     for(sal_Size i= 0; i < sizeof(pControls)/sizeof(pControls[0]);++i)
361*b1cdbd2cSJim Jagielski     {
362*b1cdbd2cSJim Jagielski         const Size aTemp( pControls[i]->GetOptimalSize(WINDOWSIZE_PREFERRED) );
363*b1cdbd2cSJim Jagielski         if ( aTemp.Height() > aHeight.Height() )
364*b1cdbd2cSJim Jagielski             aHeight.Height() = aTemp.Height();
365*b1cdbd2cSJim Jagielski     } // for(int i= 0; i < sizeof(pControls)/sizeof(pControls[0]);++i
366*b1cdbd2cSJim Jagielski     SetDataRowHeight(aHeight.Height());
367*b1cdbd2cSJim Jagielski 
368*b1cdbd2cSJim Jagielski 	ClearModified();
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
ClearModified()372*b1cdbd2cSJim Jagielski void OTableEditorCtrl::ClearModified()
373*b1cdbd2cSJim Jagielski {
374*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
375*b1cdbd2cSJim Jagielski 	pNameCell->ClearModifyFlag();
376*b1cdbd2cSJim Jagielski 	pDescrCell->ClearModifyFlag();
377*b1cdbd2cSJim Jagielski     pHelpTextCell->ClearModifyFlag();
378*b1cdbd2cSJim Jagielski 	pTypeCell->SaveValue();
379*b1cdbd2cSJim Jagielski }
380*b1cdbd2cSJim Jagielski 
381*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
~OTableEditorCtrl()382*b1cdbd2cSJim Jagielski OTableEditorCtrl::~OTableEditorCtrl()
383*b1cdbd2cSJim Jagielski {
384*b1cdbd2cSJim Jagielski 	DBG_DTOR(OTableEditorCtrl,NULL);
385*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
386*b1cdbd2cSJim Jagielski 	// Undo-Manager zuruecksetzen
387*b1cdbd2cSJim Jagielski 	GetUndoManager().Clear();
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
390*b1cdbd2cSJim Jagielski 	// Moegliche Events aus Queue entfernen
391*b1cdbd2cSJim Jagielski 	if( nCutEvent )
392*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nCutEvent );
393*b1cdbd2cSJim Jagielski 	if( nPasteEvent )
394*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nPasteEvent );
395*b1cdbd2cSJim Jagielski 	if( nDeleteEvent )
396*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nDeleteEvent );
397*b1cdbd2cSJim Jagielski 	if( nInsNewRowsEvent )
398*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nInsNewRowsEvent );
399*b1cdbd2cSJim Jagielski 	if( nInvalidateTypeEvent )
400*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nInvalidateTypeEvent );
401*b1cdbd2cSJim Jagielski 	if( nEntryNotFoundEvent )
402*b1cdbd2cSJim Jagielski 		Application::RemoveUserEvent( nEntryNotFoundEvent );
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
405*b1cdbd2cSJim Jagielski 	// Controltypen zerstoeren
406*b1cdbd2cSJim Jagielski 	delete pNameCell;
407*b1cdbd2cSJim Jagielski 	delete pTypeCell;
408*b1cdbd2cSJim Jagielski 	delete pDescrCell;
409*b1cdbd2cSJim Jagielski     delete pHelpTextCell;
410*b1cdbd2cSJim Jagielski }
411*b1cdbd2cSJim Jagielski 
412*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetDataPtr(long nRow)413*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::SetDataPtr( long nRow )
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
416*b1cdbd2cSJim Jagielski 	if(nRow == -1)
417*b1cdbd2cSJim Jagielski 		return sal_False;
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 	OSL_ENSURE((xub_StrLen)nRow < m_pRowList->size(),"Row is greater than size!");
420*b1cdbd2cSJim Jagielski 	if(nRow >= (long)m_pRowList->size())
421*b1cdbd2cSJim Jagielski 		return sal_False;
422*b1cdbd2cSJim Jagielski 	pActRow = (*m_pRowList)[nRow];
423*b1cdbd2cSJim Jagielski 	return bool(pActRow);
424*b1cdbd2cSJim Jagielski }
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SeekRow(long _nRow)427*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::SeekRow(long _nRow)
428*b1cdbd2cSJim Jagielski {
429*b1cdbd2cSJim Jagielski 	// die Basisklasse braucht den Aufruf, da sie sich dort merkt, welche Zeile gepainted wird
430*b1cdbd2cSJim Jagielski 	EditBrowseBox::SeekRow(_nRow);
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
433*b1cdbd2cSJim Jagielski 	m_nCurrentPos = _nRow;
434*b1cdbd2cSJim Jagielski 	return SetDataPtr(_nRow);
435*b1cdbd2cSJim Jagielski }
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
PaintCell(OutputDevice & rDev,const Rectangle & rRect,sal_uInt16 nColumnId) const438*b1cdbd2cSJim Jagielski void OTableEditorCtrl::PaintCell(OutputDevice& rDev, const Rectangle& rRect,
439*b1cdbd2cSJim Jagielski 								   sal_uInt16 nColumnId ) const
440*b1cdbd2cSJim Jagielski {
441*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
442*b1cdbd2cSJim Jagielski 	const String aText( GetCellText( m_nCurrentPos, nColumnId ));
443*b1cdbd2cSJim Jagielski 	const Point aPos(rRect.TopLeft());
444*b1cdbd2cSJim Jagielski 	const Size TxtSize(GetDataWindow().GetTextWidth(aText), GetDataWindow().GetTextHeight());
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski     rDev.Push( PUSH_CLIPREGION );
447*b1cdbd2cSJim Jagielski 	rDev.SetClipRegion( rRect );
448*b1cdbd2cSJim Jagielski 	rDev.DrawText( rRect, aText, TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER );
449*b1cdbd2cSJim Jagielski 	rDev.Pop();
450*b1cdbd2cSJim Jagielski }
451*b1cdbd2cSJim Jagielski 
452*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetController(long nRow,sal_uInt16 nColumnId)453*b1cdbd2cSJim Jagielski CellController* OTableEditorCtrl::GetController(long nRow, sal_uInt16 nColumnId)
454*b1cdbd2cSJim Jagielski {
455*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
456*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
457*b1cdbd2cSJim Jagielski 	// Wenn EditorCtrl ReadOnly ist, darf nicht editiert werden
458*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xTable = GetView()->getController().getTable();
459*b1cdbd2cSJim Jagielski 	if (IsReadOnly() || (	xTable.is() &&
460*b1cdbd2cSJim Jagielski 							xTable->getPropertySetInfo()->hasPropertyByName(PROPERTY_TYPE) &&
461*b1cdbd2cSJim Jagielski 							::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == ::rtl::OUString::createFromAscii("VIEW")))
462*b1cdbd2cSJim Jagielski 		return NULL;
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
465*b1cdbd2cSJim Jagielski 	// Wenn Zeile ReadOnly ist, darf sie nicht editiert werden
466*b1cdbd2cSJim Jagielski 	SetDataPtr( nRow );
467*b1cdbd2cSJim Jagielski 	if( pActRow->IsReadOnly() )
468*b1cdbd2cSJim Jagielski 		return NULL;
469*b1cdbd2cSJim Jagielski 
470*b1cdbd2cSJim Jagielski 	OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
471*b1cdbd2cSJim Jagielski 	switch (nColumnId)
472*b1cdbd2cSJim Jagielski 	{
473*b1cdbd2cSJim Jagielski 		case FIELD_NAME:
474*b1cdbd2cSJim Jagielski 			return new EditCellController( pNameCell );
475*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
476*b1cdbd2cSJim Jagielski 			if (pActFieldDescr && (pActFieldDescr->GetName().getLength() != 0))
477*b1cdbd2cSJim Jagielski 				return new ListBoxCellController( pTypeCell );
478*b1cdbd2cSJim Jagielski 			else return NULL;
479*b1cdbd2cSJim Jagielski         case HELP_TEXT:
480*b1cdbd2cSJim Jagielski             if (pActFieldDescr && (pActFieldDescr->GetName().getLength() != 0))
481*b1cdbd2cSJim Jagielski 				return new EditCellController( pHelpTextCell );
482*b1cdbd2cSJim Jagielski 			else
483*b1cdbd2cSJim Jagielski                 return NULL;
484*b1cdbd2cSJim Jagielski 		case COLUMN_DESCRIPTION:
485*b1cdbd2cSJim Jagielski 			if (pActFieldDescr && (pActFieldDescr->GetName().getLength() != 0))
486*b1cdbd2cSJim Jagielski 				return new EditCellController( pDescrCell );
487*b1cdbd2cSJim Jagielski 			else
488*b1cdbd2cSJim Jagielski                 return NULL;
489*b1cdbd2cSJim Jagielski 		default:
490*b1cdbd2cSJim Jagielski 			return NULL;
491*b1cdbd2cSJim Jagielski 	}
492*b1cdbd2cSJim Jagielski }
493*b1cdbd2cSJim Jagielski 
494*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
InitController(CellControllerRef &,long nRow,sal_uInt16 nColumnId)495*b1cdbd2cSJim Jagielski void OTableEditorCtrl::InitController(CellControllerRef&, long nRow, sal_uInt16 nColumnId)
496*b1cdbd2cSJim Jagielski {
497*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
498*b1cdbd2cSJim Jagielski 	SeekRow( nRow == -1 ? GetCurRow() : nRow);
499*b1cdbd2cSJim Jagielski 	OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
500*b1cdbd2cSJim Jagielski 	String aInitString;
501*b1cdbd2cSJim Jagielski 
502*b1cdbd2cSJim Jagielski 	switch (nColumnId)
503*b1cdbd2cSJim Jagielski 	{
504*b1cdbd2cSJim Jagielski 		case FIELD_NAME:
505*b1cdbd2cSJim Jagielski 			if( pActFieldDescr )
506*b1cdbd2cSJim Jagielski 				aInitString = pActFieldDescr->GetName();
507*b1cdbd2cSJim Jagielski 			pNameCell->SetText( aInitString );
508*b1cdbd2cSJim Jagielski 			pNameCell->SaveValue();
509*b1cdbd2cSJim Jagielski 			break;
510*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
511*b1cdbd2cSJim Jagielski 			{
512*b1cdbd2cSJim Jagielski 				if ( pActFieldDescr && pActFieldDescr->getTypeInfo() )
513*b1cdbd2cSJim Jagielski 					aInitString = pActFieldDescr->getTypeInfo()->aUIName;
514*b1cdbd2cSJim Jagielski 
515*b1cdbd2cSJim Jagielski 				//////////////////////////////////////////////////////////////
516*b1cdbd2cSJim Jagielski 				// Anpassen des ComboBoxInhalts
517*b1cdbd2cSJim Jagielski 				pTypeCell->Clear();
518*b1cdbd2cSJim Jagielski 				if( !pActFieldDescr )
519*b1cdbd2cSJim Jagielski 					break;
520*b1cdbd2cSJim Jagielski 
521*b1cdbd2cSJim Jagielski 				const OTypeInfoMap* pTypeInfo = GetView()->getController().getTypeInfo();
522*b1cdbd2cSJim Jagielski 				OTypeInfoMap::const_iterator aIter = pTypeInfo->begin();
523*b1cdbd2cSJim Jagielski                 OTypeInfoMap::const_iterator aEnd = pTypeInfo->end();
524*b1cdbd2cSJim Jagielski 				for(;aIter != aEnd;++aIter)
525*b1cdbd2cSJim Jagielski 					pTypeCell->InsertEntry( aIter->second->aUIName );
526*b1cdbd2cSJim Jagielski 				pTypeCell->SelectEntry( aInitString );
527*b1cdbd2cSJim Jagielski 			}
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski 			break;
530*b1cdbd2cSJim Jagielski         case HELP_TEXT:
531*b1cdbd2cSJim Jagielski             if( pActFieldDescr )
532*b1cdbd2cSJim Jagielski                 aInitString = pActFieldDescr->GetHelpText();
533*b1cdbd2cSJim Jagielski 			pHelpTextCell->SetText( aInitString );
534*b1cdbd2cSJim Jagielski             pHelpTextCell->SaveValue();
535*b1cdbd2cSJim Jagielski 			break;
536*b1cdbd2cSJim Jagielski 		case COLUMN_DESCRIPTION:
537*b1cdbd2cSJim Jagielski 			if( pActFieldDescr )
538*b1cdbd2cSJim Jagielski                 aInitString = pActFieldDescr->GetDescription();
539*b1cdbd2cSJim Jagielski 			pDescrCell->SetText( aInitString );
540*b1cdbd2cSJim Jagielski             pDescrCell->SaveValue();
541*b1cdbd2cSJim Jagielski 			break;
542*b1cdbd2cSJim Jagielski 
543*b1cdbd2cSJim Jagielski 	}
544*b1cdbd2cSJim Jagielski }
545*b1cdbd2cSJim Jagielski 
546*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetRowStatus(long nRow) const547*b1cdbd2cSJim Jagielski EditBrowseBox::RowStatus OTableEditorCtrl::GetRowStatus(long nRow) const
548*b1cdbd2cSJim Jagielski {
549*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
550*b1cdbd2cSJim Jagielski 	( (OTableEditorCtrl*)this )->SetDataPtr( nRow );
551*b1cdbd2cSJim Jagielski 	if( !pActRow )
552*b1cdbd2cSJim Jagielski 		return EditBrowseBox::CLEAN;
553*b1cdbd2cSJim Jagielski 	if (nRow >= 0 && nRow == m_nDataPos)
554*b1cdbd2cSJim Jagielski 	{
555*b1cdbd2cSJim Jagielski 		if( pActRow->IsPrimaryKey() )
556*b1cdbd2cSJim Jagielski 			return EditBrowseBox::CURRENT_PRIMARYKEY;
557*b1cdbd2cSJim Jagielski 		return EditBrowseBox::CURRENT;
558*b1cdbd2cSJim Jagielski 	}
559*b1cdbd2cSJim Jagielski 	else
560*b1cdbd2cSJim Jagielski 	{
561*b1cdbd2cSJim Jagielski 		if( pActRow->IsPrimaryKey() )
562*b1cdbd2cSJim Jagielski 			return EditBrowseBox::PRIMARYKEY;
563*b1cdbd2cSJim Jagielski 		return EditBrowseBox::CLEAN;
564*b1cdbd2cSJim Jagielski 	}
565*b1cdbd2cSJim Jagielski }
566*b1cdbd2cSJim Jagielski 
567*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SaveCurRow()568*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::SaveCurRow()
569*b1cdbd2cSJim Jagielski {
570*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
571*b1cdbd2cSJim Jagielski 	if (GetFieldDescr(GetCurRow()) == NULL)
572*b1cdbd2cSJim Jagielski 		// in der Zeile, in der ich mich i.A. befinde, stehen keine Daten
573*b1cdbd2cSJim Jagielski 		return sal_True;
574*b1cdbd2cSJim Jagielski 	if (!SaveModified())
575*b1cdbd2cSJim Jagielski 		return sal_False;
576*b1cdbd2cSJim Jagielski 
577*b1cdbd2cSJim Jagielski 	SetDataPtr(GetCurRow());
578*b1cdbd2cSJim Jagielski 	pDescrWin->SaveData( pActRow->GetActFieldDescr() );
579*b1cdbd2cSJim Jagielski 	return sal_True;
580*b1cdbd2cSJim Jagielski }
581*b1cdbd2cSJim Jagielski 
582*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
DisplayData(long nRow,sal_Bool bGrabFocus)583*b1cdbd2cSJim Jagielski void OTableEditorCtrl::DisplayData(long nRow, sal_Bool bGrabFocus)
584*b1cdbd2cSJim Jagielski {
585*b1cdbd2cSJim Jagielski 	// zur richtigen Zelle fahren
586*b1cdbd2cSJim Jagielski 	SetDataPtr(nRow);
587*b1cdbd2cSJim Jagielski 
588*b1cdbd2cSJim Jagielski 	// Editier-Modus temporaer aus
589*b1cdbd2cSJim Jagielski 	sal_Bool bWasEditing = IsEditing();
590*b1cdbd2cSJim Jagielski 	if (bWasEditing)
591*b1cdbd2cSJim Jagielski 		DeactivateCell();
592*b1cdbd2cSJim Jagielski 
593*b1cdbd2cSJim Jagielski 	CellControllerRef aTemp;
594*b1cdbd2cSJim Jagielski 	InitController(aTemp, nRow, FIELD_NAME);
595*b1cdbd2cSJim Jagielski 	InitController(aTemp, nRow, FIELD_TYPE);
596*b1cdbd2cSJim Jagielski 	InitController(aTemp, nRow, COLUMN_DESCRIPTION);
597*b1cdbd2cSJim Jagielski     InitController(aTemp, nRow, HELP_TEXT);
598*b1cdbd2cSJim Jagielski 
599*b1cdbd2cSJim Jagielski 	GoToRow(nRow);
600*b1cdbd2cSJim Jagielski 	// das Description-Window aktualisieren
601*b1cdbd2cSJim Jagielski 	GetView()->GetDescWin()->DisplayData(GetFieldDescr(nRow));
602*b1cdbd2cSJim Jagielski 	// neu zeichnen
603*b1cdbd2cSJim Jagielski 	RowModified(nRow);
604*b1cdbd2cSJim Jagielski 
605*b1cdbd2cSJim Jagielski 	// wieder an
606*b1cdbd2cSJim Jagielski 	if (bWasEditing || bGrabFocus)
607*b1cdbd2cSJim Jagielski 		ActivateCell(nRow, GetCurColumnId(), bGrabFocus);
608*b1cdbd2cSJim Jagielski }
609*b1cdbd2cSJim Jagielski 
610*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
CursorMoved()611*b1cdbd2cSJim Jagielski void OTableEditorCtrl::CursorMoved()
612*b1cdbd2cSJim Jagielski {
613*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
614*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
615*b1cdbd2cSJim Jagielski 	// Zeilenwechsel ?
616*b1cdbd2cSJim Jagielski 	m_nDataPos = GetCurRow();
617*b1cdbd2cSJim Jagielski 	if( m_nDataPos != nOldDataPos && m_nDataPos != -1)
618*b1cdbd2cSJim Jagielski 	{
619*b1cdbd2cSJim Jagielski 		CellControllerRef aTemp;
620*b1cdbd2cSJim Jagielski 		InitController(aTemp,m_nDataPos,FIELD_NAME);
621*b1cdbd2cSJim Jagielski 		InitController(aTemp,m_nDataPos,FIELD_TYPE);
622*b1cdbd2cSJim Jagielski 		InitController(aTemp,m_nDataPos,COLUMN_DESCRIPTION);
623*b1cdbd2cSJim Jagielski         InitController(aTemp,m_nDataPos,HELP_TEXT);
624*b1cdbd2cSJim Jagielski 	}
625*b1cdbd2cSJim Jagielski 
626*b1cdbd2cSJim Jagielski 	OTableRowView::CursorMoved();
627*b1cdbd2cSJim Jagielski }
628*b1cdbd2cSJim Jagielski 
629*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
HasFieldName(const String & rFieldName)630*b1cdbd2cSJim Jagielski sal_Int32 OTableEditorCtrl::HasFieldName( const String& rFieldName )
631*b1cdbd2cSJim Jagielski {
632*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
633*b1cdbd2cSJim Jagielski 
634*b1cdbd2cSJim Jagielski 	Reference<XConnection> xCon = GetView()->getController().getConnection();
635*b1cdbd2cSJim Jagielski 	Reference< XDatabaseMetaData> xMetaData = xCon.is() ? xCon->getMetaData() : Reference< XDatabaseMetaData>();
636*b1cdbd2cSJim Jagielski 
637*b1cdbd2cSJim Jagielski 	::comphelper::UStringMixEqual bCase(xMetaData.is() ? xMetaData->supportsMixedCaseQuotedIdentifiers() : sal_True);
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski 	::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_pRowList->begin();
640*b1cdbd2cSJim Jagielski     ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_pRowList->end();
641*b1cdbd2cSJim Jagielski 	OFieldDescription* pFieldDescr;
642*b1cdbd2cSJim Jagielski 	sal_Int32 nCount(0);
643*b1cdbd2cSJim Jagielski 	for(;aIter != aEnd;++aIter)
644*b1cdbd2cSJim Jagielski 	{
645*b1cdbd2cSJim Jagielski 		pFieldDescr = (*aIter)->GetActFieldDescr();
646*b1cdbd2cSJim Jagielski 		if( pFieldDescr && bCase(rFieldName,pFieldDescr->GetName()))
647*b1cdbd2cSJim Jagielski 			nCount++;
648*b1cdbd2cSJim Jagielski 	}
649*b1cdbd2cSJim Jagielski 	return nCount;
650*b1cdbd2cSJim Jagielski }
651*b1cdbd2cSJim Jagielski // --------------------------------------------------------------------------------------
SaveData(long nRow,sal_uInt16 nColId)652*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::SaveData(long nRow, sal_uInt16 nColId)
653*b1cdbd2cSJim Jagielski {
654*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
655*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////
656*b1cdbd2cSJim Jagielski 	// Zellinhalte in Datenstruktur speichern
657*b1cdbd2cSJim Jagielski 	SetDataPtr( nRow == -1 ? GetCurRow() : nRow);
658*b1cdbd2cSJim Jagielski 	OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
659*b1cdbd2cSJim Jagielski 
660*b1cdbd2cSJim Jagielski 	switch( nColId)
661*b1cdbd2cSJim Jagielski 	{
662*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////
663*b1cdbd2cSJim Jagielski 		// Speichern Inhalt NameCell
664*b1cdbd2cSJim Jagielski 		case FIELD_NAME:
665*b1cdbd2cSJim Jagielski 		{
666*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////
667*b1cdbd2cSJim Jagielski 			// Wenn kein Name, nichts machen
668*b1cdbd2cSJim Jagielski 			String aName(pNameCell->GetText());
669*b1cdbd2cSJim Jagielski 
670*b1cdbd2cSJim Jagielski 			if( !aName.Len() )
671*b1cdbd2cSJim Jagielski 			{
672*b1cdbd2cSJim Jagielski 				//////////////////////////////////////////////////////////////
673*b1cdbd2cSJim Jagielski 				// Wenn FieldDescr existiert, wurde Feld geloescht und alter Inhalt wird wiederhergestellt
674*b1cdbd2cSJim Jagielski 				if (pActFieldDescr)
675*b1cdbd2cSJim Jagielski 				{
676*b1cdbd2cSJim Jagielski 					GetUndoManager().AddUndoAction(new OTableEditorTypeSelUndoAct(this, nRow, FIELD_TYPE, pActFieldDescr->getTypeInfo()));
677*b1cdbd2cSJim Jagielski 					SwitchType(TOTypeInfoSP());
678*b1cdbd2cSJim Jagielski 					pActFieldDescr = pActRow->GetActFieldDescr();
679*b1cdbd2cSJim Jagielski 				}
680*b1cdbd2cSJim Jagielski 				else
681*b1cdbd2cSJim Jagielski 					return sal_True;
682*b1cdbd2cSJim Jagielski 			}
683*b1cdbd2cSJim Jagielski 			if(pActFieldDescr)
684*b1cdbd2cSJim Jagielski 				pActFieldDescr->SetName( aName );
685*b1cdbd2cSJim Jagielski 			pNameCell->ClearModifyFlag();
686*b1cdbd2cSJim Jagielski 
687*b1cdbd2cSJim Jagielski 			break;
688*b1cdbd2cSJim Jagielski 		}
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////
691*b1cdbd2cSJim Jagielski 		// Speichern Inhalt TypeCell
692*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
693*b1cdbd2cSJim Jagielski 			break;
694*b1cdbd2cSJim Jagielski 
695*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////
696*b1cdbd2cSJim Jagielski 		// Speichern Inhalt DescrCell
697*b1cdbd2cSJim Jagielski         case HELP_TEXT:
698*b1cdbd2cSJim Jagielski         {
699*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////
700*b1cdbd2cSJim Jagielski 			// Wenn aktuelle Feldbeschreibung NULL, Default setzen
701*b1cdbd2cSJim Jagielski 			if( !pActFieldDescr )
702*b1cdbd2cSJim Jagielski             {
703*b1cdbd2cSJim Jagielski 				pHelpTextCell->SetText(String());
704*b1cdbd2cSJim Jagielski                 pHelpTextCell->ClearModifyFlag();
705*b1cdbd2cSJim Jagielski             }
706*b1cdbd2cSJim Jagielski 			else
707*b1cdbd2cSJim Jagielski                 pActFieldDescr->SetHelpText( pHelpTextCell->GetText() );
708*b1cdbd2cSJim Jagielski 			break;
709*b1cdbd2cSJim Jagielski 		}
710*b1cdbd2cSJim Jagielski 		case COLUMN_DESCRIPTION:
711*b1cdbd2cSJim Jagielski 		{
712*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////
713*b1cdbd2cSJim Jagielski 			// Wenn aktuelle Feldbeschreibung NULL, Default setzen
714*b1cdbd2cSJim Jagielski 			if( !pActFieldDescr )
715*b1cdbd2cSJim Jagielski             {
716*b1cdbd2cSJim Jagielski 				pDescrCell->SetText(String());
717*b1cdbd2cSJim Jagielski                 pDescrCell->ClearModifyFlag();
718*b1cdbd2cSJim Jagielski             }
719*b1cdbd2cSJim Jagielski             else
720*b1cdbd2cSJim Jagielski 				pActFieldDescr->SetDescription( pDescrCell->GetText() );
721*b1cdbd2cSJim Jagielski 			break;
722*b1cdbd2cSJim Jagielski 		}
723*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_DEFAULT:
724*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_REQUIRED:
725*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_TEXTLEN:
726*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_NUMTYPE:
727*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_AUTOINC:
728*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_LENGTH:
729*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_SCALE:
730*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_BOOL_DEFAULT:
731*b1cdbd2cSJim Jagielski 			pDescrWin->SaveData(pActFieldDescr);
732*b1cdbd2cSJim Jagielski 
733*b1cdbd2cSJim Jagielski             if ( FIELD_PROPERTY_AUTOINC == nColId && pActFieldDescr->IsAutoIncrement() )
734*b1cdbd2cSJim Jagielski             {
735*b1cdbd2cSJim Jagielski                 OTableController& rController = GetView()->getController();
736*b1cdbd2cSJim Jagielski                 if ( rController.isAutoIncrementPrimaryKey() )
737*b1cdbd2cSJim Jagielski                 {
738*b1cdbd2cSJim Jagielski                     pActFieldDescr->SetPrimaryKey( true );
739*b1cdbd2cSJim Jagielski                     InvalidateHandleColumn();
740*b1cdbd2cSJim Jagielski                     Invalidate();
741*b1cdbd2cSJim Jagielski                 }
742*b1cdbd2cSJim Jagielski             }
743*b1cdbd2cSJim Jagielski 			break;
744*b1cdbd2cSJim Jagielski 	}
745*b1cdbd2cSJim Jagielski 	return sal_True;
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SaveModified()749*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::SaveModified()
750*b1cdbd2cSJim Jagielski {
751*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
752*b1cdbd2cSJim Jagielski 	sal_uInt16 nColId = GetCurColumnId();
753*b1cdbd2cSJim Jagielski 
754*b1cdbd2cSJim Jagielski 	switch( nColId )
755*b1cdbd2cSJim Jagielski 	{
756*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////
757*b1cdbd2cSJim Jagielski 		// NameCell
758*b1cdbd2cSJim Jagielski 		case FIELD_NAME:
759*b1cdbd2cSJim Jagielski 		{
760*b1cdbd2cSJim Jagielski 			// removed the former duplicate-check. this is done in OTableDocShell::CheckDefConsistency now.
761*b1cdbd2cSJim Jagielski 			// FS - 07.12.99 - 69575
762*b1cdbd2cSJim Jagielski 
763*b1cdbd2cSJim Jagielski 		} break;
764*b1cdbd2cSJim Jagielski 
765*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////
766*b1cdbd2cSJim Jagielski 		// TypeCell
767*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
768*b1cdbd2cSJim Jagielski 		{
769*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
770*b1cdbd2cSJim Jagielski 			// Type umstellen
771*b1cdbd2cSJim Jagielski             resetType();
772*b1cdbd2cSJim Jagielski 		} break;
773*b1cdbd2cSJim Jagielski 	}
774*b1cdbd2cSJim Jagielski 
775*b1cdbd2cSJim Jagielski 	return sal_True;
776*b1cdbd2cSJim Jagielski }
777*b1cdbd2cSJim Jagielski 
778*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
CursorMoving(long nNewRow,sal_uInt16 nNewCol)779*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::CursorMoving(long nNewRow, sal_uInt16 nNewCol)
780*b1cdbd2cSJim Jagielski {
781*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
782*b1cdbd2cSJim Jagielski 
783*b1cdbd2cSJim Jagielski 	if (!EditBrowseBox::CursorMoving(nNewRow, nNewCol))
784*b1cdbd2cSJim Jagielski 		return sal_False;
785*b1cdbd2cSJim Jagielski 
786*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
787*b1cdbd2cSJim Jagielski 	// Wird nach SaveModified() gerufen, aktuelle Zeile ist noch die alte
788*b1cdbd2cSJim Jagielski 	m_nDataPos = nNewRow;
789*b1cdbd2cSJim Jagielski 	nOldDataPos = GetCurRow();
790*b1cdbd2cSJim Jagielski 
791*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
792*b1cdbd2cSJim Jagielski 	// Marker umsetzen
793*b1cdbd2cSJim Jagielski 	InvalidateStatusCell( nOldDataPos );
794*b1cdbd2cSJim Jagielski 	InvalidateStatusCell( m_nDataPos );
795*b1cdbd2cSJim Jagielski 
796*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
797*b1cdbd2cSJim Jagielski 	// Daten des Propertyfensters speichern
798*b1cdbd2cSJim Jagielski 	if( SetDataPtr(nOldDataPos) && pDescrWin)
799*b1cdbd2cSJim Jagielski 		pDescrWin->SaveData( pActRow->GetActFieldDescr() );
800*b1cdbd2cSJim Jagielski 
801*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
802*b1cdbd2cSJim Jagielski 	// Neue Daten im Propertyfenster anzeigen
803*b1cdbd2cSJim Jagielski 	if( SetDataPtr(m_nDataPos) && pDescrWin)
804*b1cdbd2cSJim Jagielski 		pDescrWin->DisplayData( pActRow->GetActFieldDescr() );
805*b1cdbd2cSJim Jagielski 
806*b1cdbd2cSJim Jagielski 	return sal_True;
807*b1cdbd2cSJim Jagielski }
808*b1cdbd2cSJim Jagielski 
809*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
810*b1cdbd2cSJim Jagielski IMPL_LINK( OTableEditorCtrl, InvalidateFieldType, void*, /*EMPTYTAG*/ )
811*b1cdbd2cSJim Jagielski {
812*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
813*b1cdbd2cSJim Jagielski 	nInvalidateTypeEvent = 0;
814*b1cdbd2cSJim Jagielski 	Invalidate( GetFieldRectPixel(nOldDataPos, FIELD_TYPE) );
815*b1cdbd2cSJim Jagielski 
816*b1cdbd2cSJim Jagielski 	return 0;
817*b1cdbd2cSJim Jagielski }
818*b1cdbd2cSJim Jagielski 
819*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
820*b1cdbd2cSJim Jagielski IMPL_LINK( OTableEditorCtrl, EntryNotFound, void*, /*EMPTYTAG*/ )
821*b1cdbd2cSJim Jagielski {
822*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
823*b1cdbd2cSJim Jagielski 	nEntryNotFoundEvent = 0;
824*b1cdbd2cSJim Jagielski 	ErrorBox( this, ModuleRes(ERR_INVALID_LISTBOX_ENTRY) ).Execute();
825*b1cdbd2cSJim Jagielski 
826*b1cdbd2cSJim Jagielski 	return 0;
827*b1cdbd2cSJim Jagielski }
828*b1cdbd2cSJim Jagielski 
829*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
CellModified(long nRow,sal_uInt16 nColId)830*b1cdbd2cSJim Jagielski void OTableEditorCtrl::CellModified( long nRow, sal_uInt16 nColId )
831*b1cdbd2cSJim Jagielski {
832*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
833*b1cdbd2cSJim Jagielski 
834*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////
835*b1cdbd2cSJim Jagielski 	// Wenn aktuelle Feldbeschreibung NULL, Default setzen
836*b1cdbd2cSJim Jagielski 	if(nRow == -1)
837*b1cdbd2cSJim Jagielski 		nRow = GetCurRow();
838*b1cdbd2cSJim Jagielski 	SetDataPtr( nRow );
839*b1cdbd2cSJim Jagielski 	OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
840*b1cdbd2cSJim Jagielski 
841*b1cdbd2cSJim Jagielski     String sActionDescription;
842*b1cdbd2cSJim Jagielski     switch ( nColId )
843*b1cdbd2cSJim Jagielski     {
844*b1cdbd2cSJim Jagielski     case FIELD_NAME:    sActionDescription = String( ModuleRes( STR_CHANGE_COLUMN_NAME ) ); break;
845*b1cdbd2cSJim Jagielski     case FIELD_TYPE:    sActionDescription = String( ModuleRes( STR_CHANGE_COLUMN_TYPE ) ); break;
846*b1cdbd2cSJim Jagielski     case HELP_TEXT:
847*b1cdbd2cSJim Jagielski     case COLUMN_DESCRIPTION:   sActionDescription = String( ModuleRes( STR_CHANGE_COLUMN_DESCRIPTION ) ); break;
848*b1cdbd2cSJim Jagielski     default:            sActionDescription = String( ModuleRes( STR_CHANGE_COLUMN_ATTRIBUTE ) ); break;
849*b1cdbd2cSJim Jagielski     }
850*b1cdbd2cSJim Jagielski 
851*b1cdbd2cSJim Jagielski 	GetUndoManager().EnterListAction( sActionDescription, String() );
852*b1cdbd2cSJim Jagielski 	if (!pActFieldDescr)
853*b1cdbd2cSJim Jagielski 	{
854*b1cdbd2cSJim Jagielski 		const OTypeInfoMap* pTypeInfoMap = GetView()->getController().getTypeInfo();
855*b1cdbd2cSJim Jagielski 		if ( !pTypeInfoMap->empty() )
856*b1cdbd2cSJim Jagielski 		{
857*b1cdbd2cSJim Jagielski 			OTypeInfoMap::const_iterator aTypeIter = pTypeInfoMap->find(DataType::VARCHAR);
858*b1cdbd2cSJim Jagielski 			if ( aTypeIter == pTypeInfoMap->end() )
859*b1cdbd2cSJim Jagielski 				aTypeIter = pTypeInfoMap->begin();
860*b1cdbd2cSJim Jagielski 			pActRow->SetFieldType( aTypeIter->second );
861*b1cdbd2cSJim Jagielski 		}
862*b1cdbd2cSJim Jagielski 		else
863*b1cdbd2cSJim Jagielski 			pActRow->SetFieldType( GetView()->getController().getTypeInfoFallBack() );
864*b1cdbd2cSJim Jagielski 
865*b1cdbd2cSJim Jagielski 		nInvalidateTypeEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, InvalidateFieldType) );
866*b1cdbd2cSJim Jagielski 		pActFieldDescr = pActRow->GetActFieldDescr();
867*b1cdbd2cSJim Jagielski 		pDescrWin->DisplayData( pActFieldDescr );
868*b1cdbd2cSJim Jagielski 		GetUndoManager().AddUndoAction( new OTableEditorTypeSelUndoAct(this, nRow, nColId+1, TOTypeInfoSP()) );
869*b1cdbd2cSJim Jagielski 	}
870*b1cdbd2cSJim Jagielski 
871*b1cdbd2cSJim Jagielski 	if( nColId != FIELD_TYPE )
872*b1cdbd2cSJim Jagielski 		GetUndoManager().AddUndoAction( new OTableDesignCellUndoAct(this, nRow, nColId) );
873*b1cdbd2cSJim Jagielski 	else
874*b1cdbd2cSJim Jagielski 	{
875*b1cdbd2cSJim Jagielski 		GetUndoManager().AddUndoAction(new OTableEditorTypeSelUndoAct(this, GetCurRow(), nColId, GetFieldDescr(GetCurRow())->getTypeInfo()));
876*b1cdbd2cSJim Jagielski         resetType();
877*b1cdbd2cSJim Jagielski 	}
878*b1cdbd2cSJim Jagielski 
879*b1cdbd2cSJim Jagielski 	SaveData(nRow,nColId);
880*b1cdbd2cSJim Jagielski 	// SaveData could create a undo action as well
881*b1cdbd2cSJim Jagielski 	GetUndoManager().LeaveListAction();
882*b1cdbd2cSJim Jagielski 	RowModified(nRow);
883*b1cdbd2cSJim Jagielski 	CellControllerRef xController(Controller());
884*b1cdbd2cSJim Jagielski 	if(xController.Is())
885*b1cdbd2cSJim Jagielski 		xController->SetModified();
886*b1cdbd2cSJim Jagielski 
887*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
888*b1cdbd2cSJim Jagielski 	// Das ModifyFlag setzen
889*b1cdbd2cSJim Jagielski 	GetView()->getController().setModified( sal_True );
890*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
891*b1cdbd2cSJim Jagielski }
892*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
resetType()893*b1cdbd2cSJim Jagielski void OTableEditorCtrl::resetType()
894*b1cdbd2cSJim Jagielski {
895*b1cdbd2cSJim Jagielski     sal_uInt16 nPos = pTypeCell->GetSelectEntryPos();
896*b1cdbd2cSJim Jagielski 	if(nPos != LISTBOX_ENTRY_NOTFOUND)
897*b1cdbd2cSJim Jagielski 		SwitchType( GetView()->getController().getTypeInfo(nPos) );
898*b1cdbd2cSJim Jagielski 	else
899*b1cdbd2cSJim Jagielski 		SwitchType(TOTypeInfoSP());
900*b1cdbd2cSJim Jagielski }
901*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
CellModified()902*b1cdbd2cSJim Jagielski void OTableEditorCtrl::CellModified()
903*b1cdbd2cSJim Jagielski {
904*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
905*b1cdbd2cSJim Jagielski 	CellModified( GetCurRow(), GetCurColumnId() );
906*b1cdbd2cSJim Jagielski }
907*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
InvalidateFeatures()908*b1cdbd2cSJim Jagielski void OTableEditorCtrl::InvalidateFeatures()
909*b1cdbd2cSJim Jagielski {
910*b1cdbd2cSJim Jagielski 	GetView()->getController().InvalidateFeature(SID_UNDO);
911*b1cdbd2cSJim Jagielski 	GetView()->getController().InvalidateFeature(SID_REDO);
912*b1cdbd2cSJim Jagielski 	GetView()->getController().InvalidateFeature(SID_SAVEDOC);
913*b1cdbd2cSJim Jagielski }
914*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Undo()915*b1cdbd2cSJim Jagielski void OTableEditorCtrl::Undo()
916*b1cdbd2cSJim Jagielski {
917*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
918*b1cdbd2cSJim Jagielski 
919*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
920*b1cdbd2cSJim Jagielski }
921*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Redo()922*b1cdbd2cSJim Jagielski void OTableEditorCtrl::Redo()
923*b1cdbd2cSJim Jagielski {
924*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
925*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski 
928*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
CopyRows()929*b1cdbd2cSJim Jagielski void OTableEditorCtrl::CopyRows()
930*b1cdbd2cSJim Jagielski {
931*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
932*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
933*b1cdbd2cSJim Jagielski 	// set to the right row and save it
934*b1cdbd2cSJim Jagielski 	if( SetDataPtr(m_nDataPos) )
935*b1cdbd2cSJim Jagielski 		pDescrWin->SaveData( pActRow->GetActFieldDescr() );
936*b1cdbd2cSJim Jagielski 
937*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
938*b1cdbd2cSJim Jagielski 	// Selektierte Zeilen in die ClipboardListe kopieren
939*b1cdbd2cSJim Jagielski 	 ::boost::shared_ptr<OTableRow>  pClipboardRow;
940*b1cdbd2cSJim Jagielski 	 ::boost::shared_ptr<OTableRow>  pRow;
941*b1cdbd2cSJim Jagielski 	::std::vector< ::boost::shared_ptr<OTableRow> > vClipboardList;
942*b1cdbd2cSJim Jagielski 	vClipboardList.reserve(GetSelectRowCount());
943*b1cdbd2cSJim Jagielski 
944*b1cdbd2cSJim Jagielski 	for( long nIndex=FirstSelectedRow(); nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()); nIndex=NextSelectedRow() )
945*b1cdbd2cSJim Jagielski 	{
946*b1cdbd2cSJim Jagielski 		pRow = (*m_pRowList)[nIndex];
947*b1cdbd2cSJim Jagielski         OSL_ENSURE(pRow,"OTableEditorCtrl::CopyRows: Row is NULL!");
948*b1cdbd2cSJim Jagielski         if ( pRow && pRow->GetActFieldDescr() )
949*b1cdbd2cSJim Jagielski         {
950*b1cdbd2cSJim Jagielski 		    pClipboardRow.reset(new OTableRow( *pRow ));
951*b1cdbd2cSJim Jagielski 		    vClipboardList.push_back( pClipboardRow);
952*b1cdbd2cSJim Jagielski         }
953*b1cdbd2cSJim Jagielski 	}
954*b1cdbd2cSJim Jagielski 	if(!vClipboardList.empty())
955*b1cdbd2cSJim Jagielski 	{
956*b1cdbd2cSJim Jagielski 		OTableRowExchange* pData = new OTableRowExchange(vClipboardList);
957*b1cdbd2cSJim Jagielski 		Reference< ::com::sun::star::datatransfer::XTransferable> xRef = pData;
958*b1cdbd2cSJim Jagielski 		pData->CopyToClipboard(GetParent());
959*b1cdbd2cSJim Jagielski 	}
960*b1cdbd2cSJim Jagielski }
961*b1cdbd2cSJim Jagielski 
962*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GenerateName(const String & rName)963*b1cdbd2cSJim Jagielski String OTableEditorCtrl::GenerateName( const String& rName )
964*b1cdbd2cSJim Jagielski {
965*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
966*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
967*b1cdbd2cSJim Jagielski 	// Basisnamen zum Anhaengen einer Numerierung erstellen
968*b1cdbd2cSJim Jagielski 	String aBaseName;
969*b1cdbd2cSJim Jagielski 	Reference<XConnection> xCon = GetView()->getController().getConnection();
970*b1cdbd2cSJim Jagielski 	Reference< XDatabaseMetaData> xMetaData = xCon.is() ? xCon->getMetaData() : Reference< XDatabaseMetaData>();
971*b1cdbd2cSJim Jagielski 
972*b1cdbd2cSJim Jagielski 	xub_StrLen nMaxTextLen((xub_StrLen)( xMetaData.is() ? xMetaData->getMaxColumnNameLength() : 0));
973*b1cdbd2cSJim Jagielski 
974*b1cdbd2cSJim Jagielski 	if( (rName.Len()+2) >nMaxTextLen )
975*b1cdbd2cSJim Jagielski 		aBaseName = rName.Copy( 0, nMaxTextLen-2 );
976*b1cdbd2cSJim Jagielski 	else
977*b1cdbd2cSJim Jagielski 		aBaseName = rName;
978*b1cdbd2cSJim Jagielski 
979*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
980*b1cdbd2cSJim Jagielski 	// Namen durchnumerieren (bis 99)
981*b1cdbd2cSJim Jagielski 	String aFieldName( rName);
982*b1cdbd2cSJim Jagielski 	sal_Int32 i=1;
983*b1cdbd2cSJim Jagielski 	while( HasFieldName(aFieldName) )
984*b1cdbd2cSJim Jagielski 	{
985*b1cdbd2cSJim Jagielski 		aFieldName = aBaseName;
986*b1cdbd2cSJim Jagielski 		aFieldName += String::CreateFromInt32(i);
987*b1cdbd2cSJim Jagielski 		i++;
988*b1cdbd2cSJim Jagielski 	}
989*b1cdbd2cSJim Jagielski 
990*b1cdbd2cSJim Jagielski 	return aFieldName;
991*b1cdbd2cSJim Jagielski }
992*b1cdbd2cSJim Jagielski 
993*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
InsertRows(long nRow)994*b1cdbd2cSJim Jagielski void OTableEditorCtrl::InsertRows( long nRow )
995*b1cdbd2cSJim Jagielski {
996*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
997*b1cdbd2cSJim Jagielski 
998*b1cdbd2cSJim Jagielski 	::std::vector<  ::boost::shared_ptr<OTableRow> > vInsertedUndoRedoRows; // need for undo/redo handling
999*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1000*b1cdbd2cSJim Jagielski 	// get rows from clipboard
1001*b1cdbd2cSJim Jagielski 	TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
1002*b1cdbd2cSJim Jagielski 	if(aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_TABED))
1003*b1cdbd2cSJim Jagielski 	{
1004*b1cdbd2cSJim Jagielski 		SotStorageStreamRef aStreamRef;
1005*b1cdbd2cSJim Jagielski 		aTransferData.GetSotStorageStream(SOT_FORMATSTR_ID_SBA_TABED,aStreamRef);
1006*b1cdbd2cSJim Jagielski 		if(aStreamRef.Is())
1007*b1cdbd2cSJim Jagielski 		{
1008*b1cdbd2cSJim Jagielski 			aStreamRef->Seek(STREAM_SEEK_TO_BEGIN);
1009*b1cdbd2cSJim Jagielski 			aStreamRef->ResetError();
1010*b1cdbd2cSJim Jagielski 			long nInsertRow = nRow;
1011*b1cdbd2cSJim Jagielski 			String aFieldName;
1012*b1cdbd2cSJim Jagielski 			 ::boost::shared_ptr<OTableRow>  pRow;
1013*b1cdbd2cSJim Jagielski 			sal_Int32 nSize = 0;
1014*b1cdbd2cSJim Jagielski 			(*aStreamRef) >> nSize;
1015*b1cdbd2cSJim Jagielski 			vInsertedUndoRedoRows.reserve(nSize);
1016*b1cdbd2cSJim Jagielski 			for(sal_Int32 i=0;i < nSize;++i)
1017*b1cdbd2cSJim Jagielski 			{
1018*b1cdbd2cSJim Jagielski 				pRow.reset(new OTableRow());
1019*b1cdbd2cSJim Jagielski 				(*aStreamRef) >> *pRow;
1020*b1cdbd2cSJim Jagielski 				pRow->SetReadOnly( sal_False );
1021*b1cdbd2cSJim Jagielski 				sal_Int32 nType = pRow->GetActFieldDescr()->GetType();
1022*b1cdbd2cSJim Jagielski 				if ( pRow->GetActFieldDescr() )
1023*b1cdbd2cSJim Jagielski 					pRow->GetActFieldDescr()->SetType(GetView()->getController().getTypeInfoByType(nType));
1024*b1cdbd2cSJim Jagielski 				//////////////////////////////////////////////////////////////////////
1025*b1cdbd2cSJim Jagielski 				// Anpassen des Feldnamens
1026*b1cdbd2cSJim Jagielski 				aFieldName = GenerateName( pRow->GetActFieldDescr()->GetName() );
1027*b1cdbd2cSJim Jagielski 				pRow->GetActFieldDescr()->SetName( aFieldName );
1028*b1cdbd2cSJim Jagielski 				pRow->SetPos(nInsertRow);
1029*b1cdbd2cSJim Jagielski 				m_pRowList->insert( m_pRowList->begin()+nInsertRow,pRow );
1030*b1cdbd2cSJim Jagielski 				vInsertedUndoRedoRows.push_back(::boost::shared_ptr<OTableRow>(new OTableRow(*pRow)));
1031*b1cdbd2cSJim Jagielski 				nInsertRow++;
1032*b1cdbd2cSJim Jagielski 			}
1033*b1cdbd2cSJim Jagielski 		}
1034*b1cdbd2cSJim Jagielski 	}
1035*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1036*b1cdbd2cSJim Jagielski 	// Beim RowInserted wird CursorMoved gerufen.
1037*b1cdbd2cSJim Jagielski 	// Die UI-Daten duerfen hier beim CursorMoved nicht gespeichert werden.
1038*b1cdbd2cSJim Jagielski 	bSaveOnMove = sal_False;
1039*b1cdbd2cSJim Jagielski 	RowInserted( nRow,vInsertedUndoRedoRows.size(),sal_True );
1040*b1cdbd2cSJim Jagielski 	bSaveOnMove = sal_True;
1041*b1cdbd2cSJim Jagielski 
1042*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1043*b1cdbd2cSJim Jagielski 	// Undo-Action erzeugen
1044*b1cdbd2cSJim Jagielski 	GetUndoManager().AddUndoAction( new OTableEditorInsUndoAct(this, nRow,vInsertedUndoRedoRows) );
1045*b1cdbd2cSJim Jagielski 	GetView()->getController().setModified( sal_True );
1046*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
1047*b1cdbd2cSJim Jagielski }
1048*b1cdbd2cSJim Jagielski 
1049*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
DeleteRows()1050*b1cdbd2cSJim Jagielski void OTableEditorCtrl::DeleteRows()
1051*b1cdbd2cSJim Jagielski {
1052*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1053*b1cdbd2cSJim Jagielski 	OSL_ENSURE(GetView()->getController().isDropAllowed(),"Call of DeleteRows not valid here. Please check isDropAllowed!");
1054*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1055*b1cdbd2cSJim Jagielski 	// Undo-Action erzeugen
1056*b1cdbd2cSJim Jagielski 	GetUndoManager().AddUndoAction( new OTableEditorDelUndoAct(this) );
1057*b1cdbd2cSJim Jagielski 
1058*b1cdbd2cSJim Jagielski 
1059*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1060*b1cdbd2cSJim Jagielski 	// Alle markierten Zeilen loeschen
1061*b1cdbd2cSJim Jagielski 	long nIndex = FirstSelectedRow();
1062*b1cdbd2cSJim Jagielski 	nOldDataPos = nIndex;
1063*b1cdbd2cSJim Jagielski 	bSaveOnMove = sal_False;
1064*b1cdbd2cSJim Jagielski 
1065*b1cdbd2cSJim Jagielski 	while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1066*b1cdbd2cSJim Jagielski 	{
1067*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1068*b1cdbd2cSJim Jagielski 		// Zeile entfernen
1069*b1cdbd2cSJim Jagielski 		m_pRowList->erase( m_pRowList->begin()+nIndex );
1070*b1cdbd2cSJim Jagielski 		RowRemoved( nIndex, 1, sal_True );
1071*b1cdbd2cSJim Jagielski 
1072*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1073*b1cdbd2cSJim Jagielski 		// Leerzeile am Ende wieder einfuegen
1074*b1cdbd2cSJim Jagielski 		m_pRowList->push_back( ::boost::shared_ptr<OTableRow>(new OTableRow()));
1075*b1cdbd2cSJim Jagielski 		RowInserted( GetRowCount()-1, 1, sal_True );
1076*b1cdbd2cSJim Jagielski 
1077*b1cdbd2cSJim Jagielski 		nIndex = FirstSelectedRow();
1078*b1cdbd2cSJim Jagielski 	}
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski 	bSaveOnMove = sal_True;
1081*b1cdbd2cSJim Jagielski 
1082*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1083*b1cdbd2cSJim Jagielski 	// Erzwingen, dass der aktuelle Datensatz angezeigt wird
1084*b1cdbd2cSJim Jagielski 	m_nDataPos = GetCurRow();
1085*b1cdbd2cSJim Jagielski 	InvalidateStatusCell( nOldDataPos );
1086*b1cdbd2cSJim Jagielski 	InvalidateStatusCell( m_nDataPos );
1087*b1cdbd2cSJim Jagielski 	SetDataPtr( m_nDataPos );
1088*b1cdbd2cSJim Jagielski 	ActivateCell();
1089*b1cdbd2cSJim Jagielski 	pDescrWin->DisplayData( pActRow->GetActFieldDescr() );
1090*b1cdbd2cSJim Jagielski 	GetView()->getController().setModified( sal_True );
1091*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
1092*b1cdbd2cSJim Jagielski }
1093*b1cdbd2cSJim Jagielski 
1094*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
InsertNewRows(long nRow)1095*b1cdbd2cSJim Jagielski void OTableEditorCtrl::InsertNewRows( long nRow )
1096*b1cdbd2cSJim Jagielski {
1097*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1098*b1cdbd2cSJim Jagielski 	OSL_ENSURE(GetView()->getController().isAddAllowed(),"Call of InsertNewRows not valid here. Please check isAppendAllowed!");
1099*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1100*b1cdbd2cSJim Jagielski 	// Undo-Action erzeugen
1101*b1cdbd2cSJim Jagielski 	long nInsertRows = GetSelectRowCount();
1102*b1cdbd2cSJim Jagielski 	if( !nInsertRows )
1103*b1cdbd2cSJim Jagielski 		nInsertRows = 1;
1104*b1cdbd2cSJim Jagielski 	GetUndoManager().AddUndoAction( new OTableEditorInsNewUndoAct(this, nRow, nInsertRows) );
1105*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1106*b1cdbd2cSJim Jagielski 	// Zahl der selektierten Zeilen werden neu eingefuegt
1107*b1cdbd2cSJim Jagielski 	for( long i=nRow; i<(nRow+nInsertRows); i++ )
1108*b1cdbd2cSJim Jagielski 		m_pRowList->insert( m_pRowList->begin()+i ,::boost::shared_ptr<OTableRow>(new OTableRow()));
1109*b1cdbd2cSJim Jagielski 	RowInserted( nRow, nInsertRows, sal_True );
1110*b1cdbd2cSJim Jagielski 
1111*b1cdbd2cSJim Jagielski 	GetView()->getController().setModified( sal_True );
1112*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
1113*b1cdbd2cSJim Jagielski }
1114*b1cdbd2cSJim Jagielski 
1115*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetControlText(long nRow,sal_uInt16 nColId)1116*b1cdbd2cSJim Jagielski String OTableEditorCtrl::GetControlText( long nRow, sal_uInt16 nColId )
1117*b1cdbd2cSJim Jagielski {
1118*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1119*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1120*b1cdbd2cSJim Jagielski 	// Controls des Browsers auslesen
1121*b1cdbd2cSJim Jagielski 	if( nColId < FIELD_FIRST_VIRTUAL_COLUMN )
1122*b1cdbd2cSJim Jagielski 	{
1123*b1cdbd2cSJim Jagielski 		GoToRow( nRow );
1124*b1cdbd2cSJim Jagielski 		GoToColumnId( nColId );
1125*b1cdbd2cSJim Jagielski 		CellControllerRef xController = Controller();
1126*b1cdbd2cSJim Jagielski 		if(xController.Is())
1127*b1cdbd2cSJim Jagielski 			return xController->GetWindow().GetText();
1128*b1cdbd2cSJim Jagielski 		else
1129*b1cdbd2cSJim Jagielski 			return GetCellText(nRow,nColId);
1130*b1cdbd2cSJim Jagielski 	}
1131*b1cdbd2cSJim Jagielski 
1132*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1133*b1cdbd2cSJim Jagielski 	// Controls der Tabpage Auslesen
1134*b1cdbd2cSJim Jagielski 	else
1135*b1cdbd2cSJim Jagielski 		return pDescrWin->GetControlText( nColId );
1136*b1cdbd2cSJim Jagielski }
1137*b1cdbd2cSJim Jagielski 
1138*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetControlText(long nRow,sal_uInt16 nColId,const String & rText)1139*b1cdbd2cSJim Jagielski void OTableEditorCtrl::SetControlText( long nRow, sal_uInt16 nColId, const String& rText )
1140*b1cdbd2cSJim Jagielski {
1141*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1142*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1143*b1cdbd2cSJim Jagielski 	// Controls des Browsers setzen
1144*b1cdbd2cSJim Jagielski 	if( nColId < FIELD_FIRST_VIRTUAL_COLUMN )
1145*b1cdbd2cSJim Jagielski 	{
1146*b1cdbd2cSJim Jagielski 		GoToRow( nRow );
1147*b1cdbd2cSJim Jagielski 		GoToColumnId( nColId );
1148*b1cdbd2cSJim Jagielski 		CellControllerRef xController = Controller();
1149*b1cdbd2cSJim Jagielski 		if(xController.Is())
1150*b1cdbd2cSJim Jagielski 			xController->GetWindow().SetText( rText );
1151*b1cdbd2cSJim Jagielski 		else
1152*b1cdbd2cSJim Jagielski 			RowModified(nRow,nColId);
1153*b1cdbd2cSJim Jagielski 	}
1154*b1cdbd2cSJim Jagielski 
1155*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1156*b1cdbd2cSJim Jagielski 	// Controls der Tabpage setzen
1157*b1cdbd2cSJim Jagielski 	else
1158*b1cdbd2cSJim Jagielski 	{
1159*b1cdbd2cSJim Jagielski 		pDescrWin->SetControlText( nColId, rText );
1160*b1cdbd2cSJim Jagielski 	}
1161*b1cdbd2cSJim Jagielski }
1162*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetCellData(long nRow,sal_uInt16 nColId,const TOTypeInfoSP & _pTypeInfo)1163*b1cdbd2cSJim Jagielski void OTableEditorCtrl::SetCellData( long nRow, sal_uInt16 nColId, const TOTypeInfoSP& _pTypeInfo )
1164*b1cdbd2cSJim Jagielski {
1165*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1166*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1167*b1cdbd2cSJim Jagielski 	// Aktuellen Datenzeiger umsetzen
1168*b1cdbd2cSJim Jagielski 	if( nRow == -1 )
1169*b1cdbd2cSJim Jagielski 		nRow = GetCurRow();
1170*b1cdbd2cSJim Jagielski 	OFieldDescription* pFieldDescr = GetFieldDescr( nRow );
1171*b1cdbd2cSJim Jagielski 	if( !pFieldDescr && nColId != FIELD_TYPE)
1172*b1cdbd2cSJim Jagielski 		return;
1173*b1cdbd2cSJim Jagielski 
1174*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1175*b1cdbd2cSJim Jagielski 	// Einzelne Felder setzen
1176*b1cdbd2cSJim Jagielski 	switch( nColId )
1177*b1cdbd2cSJim Jagielski 	{
1178*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
1179*b1cdbd2cSJim Jagielski 			SwitchType( _pTypeInfo );
1180*b1cdbd2cSJim Jagielski 			break;
1181*b1cdbd2cSJim Jagielski 		default:
1182*b1cdbd2cSJim Jagielski 			OSL_ENSURE(sal_False, "OTableEditorCtrl::SetCellData: invalid column!");
1183*b1cdbd2cSJim Jagielski 	}
1184*b1cdbd2cSJim Jagielski 	SetControlText(nRow,nColId,_pTypeInfo.get() ? _pTypeInfo->aUIName : ::rtl::OUString());
1185*b1cdbd2cSJim Jagielski }
1186*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetCellData(long nRow,sal_uInt16 nColId,const::com::sun::star::uno::Any & _rNewData)1187*b1cdbd2cSJim Jagielski void OTableEditorCtrl::SetCellData( long nRow, sal_uInt16 nColId, const ::com::sun::star::uno::Any& _rNewData )
1188*b1cdbd2cSJim Jagielski {
1189*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1190*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1191*b1cdbd2cSJim Jagielski 	// Aktuellen Datenzeiger umsetzen
1192*b1cdbd2cSJim Jagielski 	if( nRow == -1 )
1193*b1cdbd2cSJim Jagielski 		nRow = GetCurRow();
1194*b1cdbd2cSJim Jagielski 	OFieldDescription* pFieldDescr = GetFieldDescr( nRow );
1195*b1cdbd2cSJim Jagielski 	if( !pFieldDescr && nColId != FIELD_TYPE)
1196*b1cdbd2cSJim Jagielski 		return;
1197*b1cdbd2cSJim Jagielski 
1198*b1cdbd2cSJim Jagielski 	String sValue;
1199*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1200*b1cdbd2cSJim Jagielski 	// Einzelne Felder setzen
1201*b1cdbd2cSJim Jagielski 	switch( nColId )
1202*b1cdbd2cSJim Jagielski 	{
1203*b1cdbd2cSJim Jagielski 		case FIELD_NAME:
1204*b1cdbd2cSJim Jagielski 			sValue = ::comphelper::getString(_rNewData);
1205*b1cdbd2cSJim Jagielski 			pFieldDescr->SetName( sValue );
1206*b1cdbd2cSJim Jagielski 			break;
1207*b1cdbd2cSJim Jagielski 
1208*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
1209*b1cdbd2cSJim Jagielski 			OSL_ENSURE(sal_False, "OTableEditorCtrl::SetCellData: invalid column!");
1210*b1cdbd2cSJim Jagielski 			break;
1211*b1cdbd2cSJim Jagielski 
1212*b1cdbd2cSJim Jagielski 		case COLUMN_DESCRIPTION:
1213*b1cdbd2cSJim Jagielski 			pFieldDescr->SetDescription( sValue = ::comphelper::getString(_rNewData) );
1214*b1cdbd2cSJim Jagielski 			break;
1215*b1cdbd2cSJim Jagielski 
1216*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_DEFAULT:
1217*b1cdbd2cSJim Jagielski 			pFieldDescr->SetControlDefault( _rNewData );
1218*b1cdbd2cSJim Jagielski 			sValue = GetView()->GetDescWin()->getGenPage()->getFieldControl()->getControlDefault(pFieldDescr);
1219*b1cdbd2cSJim Jagielski 			break;
1220*b1cdbd2cSJim Jagielski 
1221*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_REQUIRED:
1222*b1cdbd2cSJim Jagielski 			{
1223*b1cdbd2cSJim Jagielski 				sValue = ::comphelper::getString(_rNewData);
1224*b1cdbd2cSJim Jagielski 				pFieldDescr->SetIsNullable( sValue.ToInt32() );
1225*b1cdbd2cSJim Jagielski 			}
1226*b1cdbd2cSJim Jagielski 			break;
1227*b1cdbd2cSJim Jagielski 
1228*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_TEXTLEN:
1229*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_LENGTH:
1230*b1cdbd2cSJim Jagielski 			{
1231*b1cdbd2cSJim Jagielski 				sValue = ::comphelper::getString(_rNewData);
1232*b1cdbd2cSJim Jagielski 				pFieldDescr->SetPrecision( sValue.ToInt32() );
1233*b1cdbd2cSJim Jagielski 			}
1234*b1cdbd2cSJim Jagielski 			break;
1235*b1cdbd2cSJim Jagielski 
1236*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_NUMTYPE:
1237*b1cdbd2cSJim Jagielski 			//	pFieldDescr->SetNumType( _rNewData );
1238*b1cdbd2cSJim Jagielski 			OSL_ENSURE(sal_False, "OTableEditorCtrl::SetCellData: invalid column!");
1239*b1cdbd2cSJim Jagielski 			break;
1240*b1cdbd2cSJim Jagielski 
1241*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_AUTOINC:
1242*b1cdbd2cSJim Jagielski 			{
1243*b1cdbd2cSJim Jagielski 				String strYes(ModuleRes(STR_VALUE_YES));
1244*b1cdbd2cSJim Jagielski 				sValue = ::comphelper::getString(_rNewData);
1245*b1cdbd2cSJim Jagielski 				pFieldDescr->SetAutoIncrement(sValue.Equals(strYes));
1246*b1cdbd2cSJim Jagielski 			}
1247*b1cdbd2cSJim Jagielski 			break;
1248*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_SCALE:
1249*b1cdbd2cSJim Jagielski 			{
1250*b1cdbd2cSJim Jagielski 				sValue = ::comphelper::getString(_rNewData);
1251*b1cdbd2cSJim Jagielski 				pFieldDescr->SetScale(sValue.ToInt32());
1252*b1cdbd2cSJim Jagielski 			}
1253*b1cdbd2cSJim Jagielski 			break;
1254*b1cdbd2cSJim Jagielski 
1255*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_BOOL_DEFAULT:
1256*b1cdbd2cSJim Jagielski 			sValue = GetView()->GetDescWin()->BoolStringPersistent(::comphelper::getString(_rNewData));
1257*b1cdbd2cSJim Jagielski 			pFieldDescr->SetControlDefault(makeAny(::rtl::OUString(sValue)));
1258*b1cdbd2cSJim Jagielski 			break;
1259*b1cdbd2cSJim Jagielski 
1260*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_FORMAT:
1261*b1cdbd2cSJim Jagielski 			{
1262*b1cdbd2cSJim Jagielski 				sValue = ::comphelper::getString(_rNewData);
1263*b1cdbd2cSJim Jagielski 				pFieldDescr->SetFormatKey(sValue.ToInt32());
1264*b1cdbd2cSJim Jagielski 			}
1265*b1cdbd2cSJim Jagielski 			break;
1266*b1cdbd2cSJim Jagielski 	}
1267*b1cdbd2cSJim Jagielski 
1268*b1cdbd2cSJim Jagielski 	SetControlText(nRow,nColId,sValue);
1269*b1cdbd2cSJim Jagielski }
1270*b1cdbd2cSJim Jagielski 
1271*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetCellData(long nRow,sal_uInt16 nColId)1272*b1cdbd2cSJim Jagielski Any OTableEditorCtrl::GetCellData( long nRow, sal_uInt16 nColId )
1273*b1cdbd2cSJim Jagielski {
1274*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1275*b1cdbd2cSJim Jagielski 	OFieldDescription* pFieldDescr = GetFieldDescr( nRow );
1276*b1cdbd2cSJim Jagielski 	if( !pFieldDescr )
1277*b1cdbd2cSJim Jagielski 		return Any();
1278*b1cdbd2cSJim Jagielski 
1279*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1280*b1cdbd2cSJim Jagielski 	// Aktuellen Datenzeiger umsetzen
1281*b1cdbd2cSJim Jagielski 	if( nRow==-1 )
1282*b1cdbd2cSJim Jagielski 		nRow = GetCurRow();
1283*b1cdbd2cSJim Jagielski 	SetDataPtr( nRow );
1284*b1cdbd2cSJim Jagielski 
1285*b1cdbd2cSJim Jagielski 	static const String strYes(ModuleRes(STR_VALUE_YES));
1286*b1cdbd2cSJim Jagielski 	static const String strNo(ModuleRes(STR_VALUE_NO));
1287*b1cdbd2cSJim Jagielski 	::rtl::OUString sValue;
1288*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1289*b1cdbd2cSJim Jagielski 	// Einzelne Felder auslesen
1290*b1cdbd2cSJim Jagielski 	switch( nColId )
1291*b1cdbd2cSJim Jagielski 	{
1292*b1cdbd2cSJim Jagielski 		case FIELD_NAME:
1293*b1cdbd2cSJim Jagielski 			sValue = pFieldDescr->GetName();
1294*b1cdbd2cSJim Jagielski 			break;
1295*b1cdbd2cSJim Jagielski 
1296*b1cdbd2cSJim Jagielski 		case FIELD_TYPE:
1297*b1cdbd2cSJim Jagielski 			if ( pFieldDescr->getTypeInfo() )
1298*b1cdbd2cSJim Jagielski 				sValue = pFieldDescr->getTypeInfo()->aUIName;
1299*b1cdbd2cSJim Jagielski 			break;
1300*b1cdbd2cSJim Jagielski 
1301*b1cdbd2cSJim Jagielski 		case COLUMN_DESCRIPTION:
1302*b1cdbd2cSJim Jagielski 			sValue = pFieldDescr->GetDescription();
1303*b1cdbd2cSJim Jagielski 			break;
1304*b1cdbd2cSJim Jagielski         case HELP_TEXT:
1305*b1cdbd2cSJim Jagielski 			sValue = pFieldDescr->GetHelpText();
1306*b1cdbd2cSJim Jagielski 			break;
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_DEFAULT:
1309*b1cdbd2cSJim Jagielski 			return pFieldDescr->GetControlDefault();
1310*b1cdbd2cSJim Jagielski 
1311*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_REQUIRED:
1312*b1cdbd2cSJim Jagielski 			sValue = pFieldDescr->GetIsNullable() == ColumnValue::NULLABLE ? strYes : strNo;
1313*b1cdbd2cSJim Jagielski 			break;
1314*b1cdbd2cSJim Jagielski 
1315*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_TEXTLEN:
1316*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_LENGTH:
1317*b1cdbd2cSJim Jagielski 			sValue = String::CreateFromInt32(pFieldDescr->GetPrecision());
1318*b1cdbd2cSJim Jagielski 			break;
1319*b1cdbd2cSJim Jagielski 
1320*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_NUMTYPE:
1321*b1cdbd2cSJim Jagielski 			OSL_ENSURE(sal_False, "OTableEditorCtrl::GetCellData: invalid column!");
1322*b1cdbd2cSJim Jagielski 			//	return pFieldDescr->GetNumType();
1323*b1cdbd2cSJim Jagielski 
1324*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_AUTOINC:
1325*b1cdbd2cSJim Jagielski 			sValue = pFieldDescr->IsAutoIncrement() ? strYes : strNo;
1326*b1cdbd2cSJim Jagielski 			break;
1327*b1cdbd2cSJim Jagielski 
1328*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_SCALE:
1329*b1cdbd2cSJim Jagielski 			sValue = String::CreateFromInt32(pFieldDescr->GetScale());
1330*b1cdbd2cSJim Jagielski 			break;
1331*b1cdbd2cSJim Jagielski 
1332*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_BOOL_DEFAULT:
1333*b1cdbd2cSJim Jagielski 			sValue = GetView()->GetDescWin()->BoolStringUI(::comphelper::getString(pFieldDescr->GetControlDefault()));
1334*b1cdbd2cSJim Jagielski 			break;
1335*b1cdbd2cSJim Jagielski 
1336*b1cdbd2cSJim Jagielski 		case FIELD_PROPERTY_FORMAT:
1337*b1cdbd2cSJim Jagielski 			sValue = String::CreateFromInt32(pFieldDescr->GetFormatKey());
1338*b1cdbd2cSJim Jagielski 			break;
1339*b1cdbd2cSJim Jagielski 	}
1340*b1cdbd2cSJim Jagielski 
1341*b1cdbd2cSJim Jagielski 	return makeAny(sValue);
1342*b1cdbd2cSJim Jagielski }
1343*b1cdbd2cSJim Jagielski 
1344*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetCellText(long nRow,sal_uInt16 nColId) const1345*b1cdbd2cSJim Jagielski String OTableEditorCtrl::GetCellText( long nRow, sal_uInt16 nColId ) const
1346*b1cdbd2cSJim Jagielski {
1347*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1348*b1cdbd2cSJim Jagielski     ::rtl::OUString sCellText;
1349*b1cdbd2cSJim Jagielski     const_cast< OTableEditorCtrl* >( this )->GetCellData( nRow, nColId ) >>= sCellText;
1350*b1cdbd2cSJim Jagielski 	return sCellText;
1351*b1cdbd2cSJim Jagielski }
1352*b1cdbd2cSJim Jagielski 
1353*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetTotalCellWidth(long nRow,sal_uInt16 nColId)1354*b1cdbd2cSJim Jagielski sal_uInt32 OTableEditorCtrl::GetTotalCellWidth(long nRow, sal_uInt16 nColId)
1355*b1cdbd2cSJim Jagielski {
1356*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1357*b1cdbd2cSJim Jagielski 	return GetTextWidth(GetCellText(nRow, nColId)) + 2 * GetTextWidth('0');
1358*b1cdbd2cSJim Jagielski }
1359*b1cdbd2cSJim Jagielski 
1360*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
GetFieldDescr(long nRow)1361*b1cdbd2cSJim Jagielski OFieldDescription* OTableEditorCtrl::GetFieldDescr( long nRow )
1362*b1cdbd2cSJim Jagielski {
1363*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1364*b1cdbd2cSJim Jagielski 	std::vector< ::boost::shared_ptr<OTableRow> >::size_type nListCount(
1365*b1cdbd2cSJim Jagielski         m_pRowList->size());
1366*b1cdbd2cSJim Jagielski 	if( (nRow<0) || (sal::static_int_cast< unsigned long >(nRow)>=nListCount) )
1367*b1cdbd2cSJim Jagielski 	{
1368*b1cdbd2cSJim Jagielski 		OSL_ENSURE(0,"(nRow<0) || (nRow>=nListCount)");
1369*b1cdbd2cSJim Jagielski 		return NULL;
1370*b1cdbd2cSJim Jagielski 	}
1371*b1cdbd2cSJim Jagielski 	 ::boost::shared_ptr<OTableRow>  pRow = (*m_pRowList)[ nRow ];
1372*b1cdbd2cSJim Jagielski 	if( !pRow )
1373*b1cdbd2cSJim Jagielski 		return NULL;
1374*b1cdbd2cSJim Jagielski 	return pRow->GetActFieldDescr();
1375*b1cdbd2cSJim Jagielski }
1376*b1cdbd2cSJim Jagielski 
1377*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsCutAllowed(long nRow)1378*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsCutAllowed( long nRow )
1379*b1cdbd2cSJim Jagielski {
1380*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1381*b1cdbd2cSJim Jagielski 	sal_Bool bIsCutAllowed = (GetView()->getController().isAddAllowed() && GetView()->getController().isDropAllowed()) ||
1382*b1cdbd2cSJim Jagielski 							GetView()->getController().isAlterAllowed();
1383*b1cdbd2cSJim Jagielski 
1384*b1cdbd2cSJim Jagielski 	if(bIsCutAllowed)
1385*b1cdbd2cSJim Jagielski 	{
1386*b1cdbd2cSJim Jagielski         switch(m_eChildFocus)
1387*b1cdbd2cSJim Jagielski         {
1388*b1cdbd2cSJim Jagielski             case DESCRIPTION:
1389*b1cdbd2cSJim Jagielski                 bIsCutAllowed = pDescrCell->GetSelected().Len() != 0;
1390*b1cdbd2cSJim Jagielski                 break;
1391*b1cdbd2cSJim Jagielski             case HELPTEXT:
1392*b1cdbd2cSJim Jagielski                 bIsCutAllowed = pHelpTextCell->GetSelected().Len() != 0;
1393*b1cdbd2cSJim Jagielski                 break;
1394*b1cdbd2cSJim Jagielski             case NAME:
1395*b1cdbd2cSJim Jagielski                 bIsCutAllowed = pNameCell->GetSelected().Len() != 0;
1396*b1cdbd2cSJim Jagielski                 break;
1397*b1cdbd2cSJim Jagielski             case ROW:
1398*b1cdbd2cSJim Jagielski                 bIsCutAllowed = IsCopyAllowed(nRow);
1399*b1cdbd2cSJim Jagielski                 break;
1400*b1cdbd2cSJim Jagielski             default:
1401*b1cdbd2cSJim Jagielski                 bIsCutAllowed = sal_False;
1402*b1cdbd2cSJim Jagielski                 break;
1403*b1cdbd2cSJim Jagielski         }
1404*b1cdbd2cSJim Jagielski 	}
1405*b1cdbd2cSJim Jagielski 
1406*b1cdbd2cSJim Jagielski //	Reference<XPropertySet> xTable = GetView()->getController().getTable();
1407*b1cdbd2cSJim Jagielski //	if( !IsCopyAllowed(nRow) || (xTable.is() && ::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == ::rtl::OUString::createFromAscii("VIEW")))
1408*b1cdbd2cSJim Jagielski //		return sal_False;
1409*b1cdbd2cSJim Jagielski 
1410*b1cdbd2cSJim Jagielski 	//	return bCutAllowed && IsDeleteAllowed( nRow );
1411*b1cdbd2cSJim Jagielski 	return bIsCutAllowed;
1412*b1cdbd2cSJim Jagielski }
1413*b1cdbd2cSJim Jagielski 
1414*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsCopyAllowed(long)1415*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsCopyAllowed( long /*nRow*/ )
1416*b1cdbd2cSJim Jagielski {
1417*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1418*b1cdbd2cSJim Jagielski 	sal_Bool bIsCopyAllowed = sal_False;
1419*b1cdbd2cSJim Jagielski 	if(m_eChildFocus == DESCRIPTION )
1420*b1cdbd2cSJim Jagielski 		bIsCopyAllowed = pDescrCell->GetSelected().Len() != 0;
1421*b1cdbd2cSJim Jagielski     else if(HELPTEXT == m_eChildFocus )
1422*b1cdbd2cSJim Jagielski 		bIsCopyAllowed = pHelpTextCell->GetSelected().Len() != 0;
1423*b1cdbd2cSJim Jagielski 	else if(m_eChildFocus == NAME)
1424*b1cdbd2cSJim Jagielski 		bIsCopyAllowed = pNameCell->GetSelected().Len() != 0;
1425*b1cdbd2cSJim Jagielski 	else if(m_eChildFocus == ROW)
1426*b1cdbd2cSJim Jagielski 	{
1427*b1cdbd2cSJim Jagielski 		Reference<XPropertySet> xTable = GetView()->getController().getTable();
1428*b1cdbd2cSJim Jagielski 		if( !GetSelectRowCount() || (xTable.is() && ::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == ::rtl::OUString::createFromAscii("VIEW")))
1429*b1cdbd2cSJim Jagielski 			return sal_False;
1430*b1cdbd2cSJim Jagielski 
1431*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1432*b1cdbd2cSJim Jagielski 		// Wenn eine der markierten Zeilen leer ist, kein Copy moeglich
1433*b1cdbd2cSJim Jagielski 		 ::boost::shared_ptr<OTableRow>  pRow;
1434*b1cdbd2cSJim Jagielski 		long nIndex = FirstSelectedRow();
1435*b1cdbd2cSJim Jagielski         while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1436*b1cdbd2cSJim Jagielski 		{
1437*b1cdbd2cSJim Jagielski 			pRow = (*m_pRowList)[nIndex];
1438*b1cdbd2cSJim Jagielski 			if( !pRow->GetActFieldDescr() )
1439*b1cdbd2cSJim Jagielski 				return sal_False;
1440*b1cdbd2cSJim Jagielski 
1441*b1cdbd2cSJim Jagielski 			nIndex = NextSelectedRow();
1442*b1cdbd2cSJim Jagielski 		}
1443*b1cdbd2cSJim Jagielski 
1444*b1cdbd2cSJim Jagielski 		bIsCopyAllowed = sal_True;
1445*b1cdbd2cSJim Jagielski 	}
1446*b1cdbd2cSJim Jagielski 
1447*b1cdbd2cSJim Jagielski 	return bIsCopyAllowed;
1448*b1cdbd2cSJim Jagielski }
1449*b1cdbd2cSJim Jagielski 
1450*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsPasteAllowed(long)1451*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsPasteAllowed( long /*nRow*/ )
1452*b1cdbd2cSJim Jagielski {
1453*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1454*b1cdbd2cSJim Jagielski 	sal_Bool bAllowed = GetView()->getController().isAddAllowed();
1455*b1cdbd2cSJim Jagielski 	if ( bAllowed )
1456*b1cdbd2cSJim Jagielski 	{
1457*b1cdbd2cSJim Jagielski 		TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
1458*b1cdbd2cSJim Jagielski 		sal_Bool bRowFormat = aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_TABED);
1459*b1cdbd2cSJim Jagielski 		if ( m_eChildFocus == ROW )
1460*b1cdbd2cSJim Jagielski 			bAllowed = bRowFormat;
1461*b1cdbd2cSJim Jagielski 		else
1462*b1cdbd2cSJim Jagielski 			bAllowed = !bRowFormat && aTransferData.HasFormat(SOT_FORMAT_STRING);
1463*b1cdbd2cSJim Jagielski 	}
1464*b1cdbd2cSJim Jagielski 
1465*b1cdbd2cSJim Jagielski 	return bAllowed;
1466*b1cdbd2cSJim Jagielski }
1467*b1cdbd2cSJim Jagielski 
1468*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
cut()1469*b1cdbd2cSJim Jagielski void OTableEditorCtrl::cut()
1470*b1cdbd2cSJim Jagielski {
1471*b1cdbd2cSJim Jagielski 	if(m_eChildFocus == NAME)
1472*b1cdbd2cSJim Jagielski 	{
1473*b1cdbd2cSJim Jagielski 		if(GetView()->getController().isAlterAllowed())
1474*b1cdbd2cSJim Jagielski 		{
1475*b1cdbd2cSJim Jagielski 			SaveData(-1,FIELD_NAME);
1476*b1cdbd2cSJim Jagielski 			pNameCell->Cut();
1477*b1cdbd2cSJim Jagielski 			CellModified(-1,FIELD_NAME);
1478*b1cdbd2cSJim Jagielski 		}
1479*b1cdbd2cSJim Jagielski 	}
1480*b1cdbd2cSJim Jagielski 	else if(m_eChildFocus == DESCRIPTION)
1481*b1cdbd2cSJim Jagielski 	{
1482*b1cdbd2cSJim Jagielski 		if(GetView()->getController().isAlterAllowed())
1483*b1cdbd2cSJim Jagielski 		{
1484*b1cdbd2cSJim Jagielski 			SaveData(-1,COLUMN_DESCRIPTION);
1485*b1cdbd2cSJim Jagielski 			pDescrCell->Cut();
1486*b1cdbd2cSJim Jagielski 			CellModified(-1,COLUMN_DESCRIPTION);
1487*b1cdbd2cSJim Jagielski 		}
1488*b1cdbd2cSJim Jagielski 	}
1489*b1cdbd2cSJim Jagielski     else if(HELPTEXT == m_eChildFocus )
1490*b1cdbd2cSJim Jagielski 	{
1491*b1cdbd2cSJim Jagielski 		if(GetView()->getController().isAlterAllowed())
1492*b1cdbd2cSJim Jagielski 		{
1493*b1cdbd2cSJim Jagielski 			SaveData(-1,HELP_TEXT);
1494*b1cdbd2cSJim Jagielski 			pHelpTextCell->Cut();
1495*b1cdbd2cSJim Jagielski 			CellModified(-1,HELP_TEXT);
1496*b1cdbd2cSJim Jagielski 		}
1497*b1cdbd2cSJim Jagielski 	}
1498*b1cdbd2cSJim Jagielski 	else if(m_eChildFocus == ROW)
1499*b1cdbd2cSJim Jagielski 	{
1500*b1cdbd2cSJim Jagielski 		if (nCutEvent)
1501*b1cdbd2cSJim Jagielski 			Application::RemoveUserEvent(nCutEvent);
1502*b1cdbd2cSJim Jagielski 		nCutEvent = Application::PostUserEvent(LINK(this, OTableEditorCtrl, DelayedCut));
1503*b1cdbd2cSJim Jagielski 	}
1504*b1cdbd2cSJim Jagielski }
1505*b1cdbd2cSJim Jagielski 
1506*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
copy()1507*b1cdbd2cSJim Jagielski void OTableEditorCtrl::copy()
1508*b1cdbd2cSJim Jagielski {
1509*b1cdbd2cSJim Jagielski 	if(GetSelectRowCount())
1510*b1cdbd2cSJim Jagielski 		OTableRowView::copy();
1511*b1cdbd2cSJim Jagielski 	else if(m_eChildFocus == NAME)
1512*b1cdbd2cSJim Jagielski 		pNameCell->Copy();
1513*b1cdbd2cSJim Jagielski 	else if(HELPTEXT == m_eChildFocus )
1514*b1cdbd2cSJim Jagielski 		pHelpTextCell->Copy();
1515*b1cdbd2cSJim Jagielski     else if(m_eChildFocus == DESCRIPTION )
1516*b1cdbd2cSJim Jagielski 		pDescrCell->Copy();
1517*b1cdbd2cSJim Jagielski }
1518*b1cdbd2cSJim Jagielski 
1519*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
paste()1520*b1cdbd2cSJim Jagielski void OTableEditorCtrl::paste()
1521*b1cdbd2cSJim Jagielski {
1522*b1cdbd2cSJim Jagielski 	TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
1523*b1cdbd2cSJim Jagielski 	if(aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_TABED))
1524*b1cdbd2cSJim Jagielski 	{
1525*b1cdbd2cSJim Jagielski 		if( nPasteEvent )
1526*b1cdbd2cSJim Jagielski 			Application::RemoveUserEvent( nPasteEvent );
1527*b1cdbd2cSJim Jagielski 		nPasteEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, DelayedPaste) );
1528*b1cdbd2cSJim Jagielski 	}
1529*b1cdbd2cSJim Jagielski 	else if(m_eChildFocus == NAME)
1530*b1cdbd2cSJim Jagielski 	{
1531*b1cdbd2cSJim Jagielski 		if(GetView()->getController().isAlterAllowed())
1532*b1cdbd2cSJim Jagielski 		{
1533*b1cdbd2cSJim Jagielski 			pNameCell->Paste();
1534*b1cdbd2cSJim Jagielski 			CellModified();
1535*b1cdbd2cSJim Jagielski 		}
1536*b1cdbd2cSJim Jagielski 	}
1537*b1cdbd2cSJim Jagielski 	else if(HELPTEXT == m_eChildFocus )
1538*b1cdbd2cSJim Jagielski 	{
1539*b1cdbd2cSJim Jagielski 		if(GetView()->getController().isAlterAllowed())
1540*b1cdbd2cSJim Jagielski 		{
1541*b1cdbd2cSJim Jagielski 			pHelpTextCell->Paste();
1542*b1cdbd2cSJim Jagielski 			CellModified();
1543*b1cdbd2cSJim Jagielski 		}
1544*b1cdbd2cSJim Jagielski 	}
1545*b1cdbd2cSJim Jagielski     else if(m_eChildFocus == DESCRIPTION)
1546*b1cdbd2cSJim Jagielski 	{
1547*b1cdbd2cSJim Jagielski 		if(GetView()->getController().isAlterAllowed())
1548*b1cdbd2cSJim Jagielski 		{
1549*b1cdbd2cSJim Jagielski 			pDescrCell->Paste();
1550*b1cdbd2cSJim Jagielski 			CellModified();
1551*b1cdbd2cSJim Jagielski 		}
1552*b1cdbd2cSJim Jagielski 	}
1553*b1cdbd2cSJim Jagielski }
1554*b1cdbd2cSJim Jagielski 
1555*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsDeleteAllowed(long)1556*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsDeleteAllowed( long /*nRow*/ )
1557*b1cdbd2cSJim Jagielski {
1558*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1559*b1cdbd2cSJim Jagielski 
1560*b1cdbd2cSJim Jagielski 	return GetSelectRowCount() != 0 && GetView()->getController().isDropAllowed();
1561*b1cdbd2cSJim Jagielski }
1562*b1cdbd2cSJim Jagielski 
1563*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsInsertNewAllowed(long nRow)1564*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsInsertNewAllowed( long nRow )
1565*b1cdbd2cSJim Jagielski {
1566*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1567*b1cdbd2cSJim Jagielski 
1568*b1cdbd2cSJim Jagielski 	sal_Bool bInsertNewAllowed = GetView()->getController().isAddAllowed();
1569*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////
1570*b1cdbd2cSJim Jagielski 	// Wenn nur Felder hinzugefuegt werden duerfen, Paste nur in neue Felder
1571*b1cdbd2cSJim Jagielski 	if (bInsertNewAllowed && !GetView()->getController().isDropAllowed())
1572*b1cdbd2cSJim Jagielski 	{
1573*b1cdbd2cSJim Jagielski 		SetDataPtr(nRow);
1574*b1cdbd2cSJim Jagielski 		if( GetActRow()->IsReadOnly() )
1575*b1cdbd2cSJim Jagielski 			return sal_False;
1576*b1cdbd2cSJim Jagielski 	}
1577*b1cdbd2cSJim Jagielski 
1578*b1cdbd2cSJim Jagielski 	return bInsertNewAllowed;
1579*b1cdbd2cSJim Jagielski }
1580*b1cdbd2cSJim Jagielski 
1581*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsPrimaryKeyAllowed(long)1582*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsPrimaryKeyAllowed( long /*nRow*/ )
1583*b1cdbd2cSJim Jagielski {
1584*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1585*b1cdbd2cSJim Jagielski 	if( !GetSelectRowCount() )
1586*b1cdbd2cSJim Jagielski 		return sal_False;
1587*b1cdbd2cSJim Jagielski 
1588*b1cdbd2cSJim Jagielski 	OTableController& rController = GetView()->getController();
1589*b1cdbd2cSJim Jagielski     if ( !rController.getSdbMetaData().supportsPrimaryKeys() )
1590*b1cdbd2cSJim Jagielski         return sal_False;
1591*b1cdbd2cSJim Jagielski 
1592*b1cdbd2cSJim Jagielski 	Reference<XPropertySet> xTable = rController.getTable();
1593*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////
1594*b1cdbd2cSJim Jagielski 	// Key darf nicht veraendert werden
1595*b1cdbd2cSJim Jagielski 	// Dies gilt jedoch nur, wenn die Tabelle nicht neu ist und keine ::com::sun::star::sdbcx::View. Ansonsten wird kein DROP ausgef�hrt
1596*b1cdbd2cSJim Jagielski 
1597*b1cdbd2cSJim Jagielski 	if(xTable.is() && ::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == ::rtl::OUString::createFromAscii("VIEW"))
1598*b1cdbd2cSJim Jagielski 		return sal_False;
1599*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////
1600*b1cdbd2cSJim Jagielski 	// Wenn leeres Feld, kein PrimKey
1601*b1cdbd2cSJim Jagielski 	// Eintrag wird nur erlaubt, wenn
1602*b1cdbd2cSJim Jagielski 	// - kein leerer Eintrag in der Selection ist
1603*b1cdbd2cSJim Jagielski 	// - kein Eintrag vom Typ Memo oder Image ist
1604*b1cdbd2cSJim Jagielski 	// - kein DROP erlaubt ist (s.o.) und die Spalte noch kein Required (not null) gesetzt hatte.
1605*b1cdbd2cSJim Jagielski 	long nIndex = FirstSelectedRow();
1606*b1cdbd2cSJim Jagielski 	 ::boost::shared_ptr<OTableRow>  pRow;
1607*b1cdbd2cSJim Jagielski 	while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1608*b1cdbd2cSJim Jagielski 	{
1609*b1cdbd2cSJim Jagielski 		pRow = (*m_pRowList)[nIndex];
1610*b1cdbd2cSJim Jagielski 		OFieldDescription* pFieldDescr = pRow->GetActFieldDescr();
1611*b1cdbd2cSJim Jagielski 		if(!pFieldDescr)
1612*b1cdbd2cSJim Jagielski 			return sal_False;
1613*b1cdbd2cSJim Jagielski 		else
1614*b1cdbd2cSJim Jagielski 		{
1615*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////
1616*b1cdbd2cSJim Jagielski 			// Wenn Feldtyp Memo oder Image, kein PrimKey
1617*b1cdbd2cSJim Jagielski 			// oder wenn Spalten nicht gedroped werden k�nnen und das Required Flag ist nicht gesetzt
1618*b1cdbd2cSJim Jagielski 			// oder wenn eine ::com::sun::star::sdbcx::View vorhanden ist und das Required Flag nicht gesetzt ist
1619*b1cdbd2cSJim Jagielski 			TOTypeInfoSP pTypeInfo = pFieldDescr->getTypeInfo();
1620*b1cdbd2cSJim Jagielski 			if(     pTypeInfo->nSearchType == ColumnSearch::NONE
1621*b1cdbd2cSJim Jagielski                 || (pFieldDescr->IsNullable() && pRow->IsReadOnly())
1622*b1cdbd2cSJim Jagielski 			  )
1623*b1cdbd2cSJim Jagielski 				return sal_False;
1624*b1cdbd2cSJim Jagielski 		}
1625*b1cdbd2cSJim Jagielski 
1626*b1cdbd2cSJim Jagielski 		nIndex = NextSelectedRow();
1627*b1cdbd2cSJim Jagielski 	}
1628*b1cdbd2cSJim Jagielski 
1629*b1cdbd2cSJim Jagielski 	return sal_True;
1630*b1cdbd2cSJim Jagielski }
1631*b1cdbd2cSJim Jagielski 
1632*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
Command(const CommandEvent & rEvt)1633*b1cdbd2cSJim Jagielski void OTableEditorCtrl::Command(const CommandEvent& rEvt)
1634*b1cdbd2cSJim Jagielski {
1635*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1636*b1cdbd2cSJim Jagielski 	switch (rEvt.GetCommand())
1637*b1cdbd2cSJim Jagielski 	{
1638*b1cdbd2cSJim Jagielski 		case COMMAND_CONTEXTMENU:
1639*b1cdbd2cSJim Jagielski 		{
1640*b1cdbd2cSJim Jagielski 			Point aMenuPos( rEvt.GetMousePosPixel() );
1641*b1cdbd2cSJim Jagielski 			if (!rEvt.IsMouseEvent())
1642*b1cdbd2cSJim Jagielski 			{
1643*b1cdbd2cSJim Jagielski 				if	( 1 == GetSelectColumnCount() )
1644*b1cdbd2cSJim Jagielski 				{
1645*b1cdbd2cSJim Jagielski 					sal_uInt16 nSelId = GetColumnId(
1646*b1cdbd2cSJim Jagielski                         sal::static_int_cast< sal_uInt16 >(
1647*b1cdbd2cSJim Jagielski                             FirstSelectedColumn() ) );
1648*b1cdbd2cSJim Jagielski 					::Rectangle aColRect( GetFieldRectPixel( 0, nSelId, sal_False ) );
1649*b1cdbd2cSJim Jagielski 
1650*b1cdbd2cSJim Jagielski 					aMenuPos = aColRect.TopCenter();
1651*b1cdbd2cSJim Jagielski 				}
1652*b1cdbd2cSJim Jagielski 				else if	( GetSelectRowCount() > 0 )
1653*b1cdbd2cSJim Jagielski 				{
1654*b1cdbd2cSJim Jagielski 					::Rectangle aColRect( GetFieldRectPixel( FirstSelectedRow(), HANDLE_ID, sal_True ) );
1655*b1cdbd2cSJim Jagielski 
1656*b1cdbd2cSJim Jagielski 					aMenuPos = aColRect.TopCenter();
1657*b1cdbd2cSJim Jagielski 				}
1658*b1cdbd2cSJim Jagielski 				else
1659*b1cdbd2cSJim Jagielski 				{
1660*b1cdbd2cSJim Jagielski 					OTableRowView::Command(rEvt);
1661*b1cdbd2cSJim Jagielski 					return;
1662*b1cdbd2cSJim Jagielski 				}
1663*b1cdbd2cSJim Jagielski 			}
1664*b1cdbd2cSJim Jagielski 
1665*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////
1666*b1cdbd2cSJim Jagielski 			// Kontextmenu einblenden
1667*b1cdbd2cSJim Jagielski 			if( !IsReadOnly() )
1668*b1cdbd2cSJim Jagielski 			{
1669*b1cdbd2cSJim Jagielski 				sal_uInt16 nColId = GetColumnAtXPosPixel(aMenuPos.X());
1670*b1cdbd2cSJim Jagielski 				long   nRow = GetRowAtYPosPixel(aMenuPos.Y());
1671*b1cdbd2cSJim Jagielski 
1672*b1cdbd2cSJim Jagielski 				if ( HANDLE_ID != nColId )
1673*b1cdbd2cSJim Jagielski 				{
1674*b1cdbd2cSJim Jagielski 					if ( nRow < 0 && nColId != BROWSER_INVALIDID )
1675*b1cdbd2cSJim Jagielski 					{	// hit the header
1676*b1cdbd2cSJim Jagielski 						if ( 3 != nColId )
1677*b1cdbd2cSJim Jagielski 						{	// 3 would mean the last column, and this last column is auto-sized
1678*b1cdbd2cSJim Jagielski 							if ( !IsColumnSelected( nColId ) )
1679*b1cdbd2cSJim Jagielski 								SelectColumnId( nColId );
1680*b1cdbd2cSJim Jagielski 
1681*b1cdbd2cSJim Jagielski 							PopupMenu aContextMenu( ModuleRes( RID_QUERYCOLPOPUPMENU ) );
1682*b1cdbd2cSJim Jagielski 							aContextMenu.EnableItem( SID_DELETE, sal_False );
1683*b1cdbd2cSJim Jagielski 							aContextMenu.RemoveDisabledEntries(sal_True, sal_True);
1684*b1cdbd2cSJim Jagielski 							switch ( aContextMenu.Execute( this, aMenuPos ) )
1685*b1cdbd2cSJim Jagielski 							{
1686*b1cdbd2cSJim Jagielski 								case ID_BROWSER_COLWIDTH:
1687*b1cdbd2cSJim Jagielski 									adjustBrowseBoxColumnWidth( this, nColId );
1688*b1cdbd2cSJim Jagielski 									break;
1689*b1cdbd2cSJim Jagielski 							}
1690*b1cdbd2cSJim Jagielski 						}
1691*b1cdbd2cSJim Jagielski 					}
1692*b1cdbd2cSJim Jagielski 				}
1693*b1cdbd2cSJim Jagielski 				else
1694*b1cdbd2cSJim Jagielski 				{
1695*b1cdbd2cSJim Jagielski 					PopupMenu aContextMenu(ModuleRes(RID_TABLEDESIGNROWPOPUPMENU));
1696*b1cdbd2cSJim Jagielski 
1697*b1cdbd2cSJim Jagielski 					aContextMenu.EnableItem( SID_CUT, IsCutAllowed(nRow) );
1698*b1cdbd2cSJim Jagielski 					aContextMenu.EnableItem( SID_COPY, IsCopyAllowed(nRow) );
1699*b1cdbd2cSJim Jagielski 					aContextMenu.EnableItem( SID_PASTE, IsPasteAllowed(nRow) );
1700*b1cdbd2cSJim Jagielski 					aContextMenu.EnableItem( SID_DELETE, IsDeleteAllowed(nRow) );
1701*b1cdbd2cSJim Jagielski 					aContextMenu.EnableItem( SID_TABLEDESIGN_TABED_PRIMARYKEY, IsPrimaryKeyAllowed(nRow) );
1702*b1cdbd2cSJim Jagielski 					aContextMenu.EnableItem( SID_TABLEDESIGN_INSERTROWS, IsInsertNewAllowed(nRow) );
1703*b1cdbd2cSJim Jagielski 					aContextMenu.CheckItem( SID_TABLEDESIGN_TABED_PRIMARYKEY, IsRowSelected(GetCurRow()) && IsPrimaryKey() );
1704*b1cdbd2cSJim Jagielski 
1705*b1cdbd2cSJim Jagielski 					// jetzt alles, was disabled wurde, wech
1706*b1cdbd2cSJim Jagielski 					aContextMenu.RemoveDisabledEntries(sal_True, sal_True);
1707*b1cdbd2cSJim Jagielski 
1708*b1cdbd2cSJim Jagielski 					if( SetDataPtr(m_nDataPos) )
1709*b1cdbd2cSJim Jagielski 						pDescrWin->SaveData( pActRow->GetActFieldDescr() );
1710*b1cdbd2cSJim Jagielski 
1711*b1cdbd2cSJim Jagielski 					//////////////////////////////////////////////////////////////
1712*b1cdbd2cSJim Jagielski 					// Alle Aktionen, die die Zeilenzahl veraendern, muessen asynchron
1713*b1cdbd2cSJim Jagielski 					// ausgefuehrt werden->sonst Probleme zwischen Kontextmenu u. Browser
1714*b1cdbd2cSJim Jagielski 					m_nDataPos = GetCurRow();
1715*b1cdbd2cSJim Jagielski 					switch (aContextMenu.Execute(this, aMenuPos))
1716*b1cdbd2cSJim Jagielski 					{
1717*b1cdbd2cSJim Jagielski 						case SID_CUT:
1718*b1cdbd2cSJim Jagielski 							cut();
1719*b1cdbd2cSJim Jagielski 							break;
1720*b1cdbd2cSJim Jagielski 						case SID_COPY:
1721*b1cdbd2cSJim Jagielski 							copy();
1722*b1cdbd2cSJim Jagielski 							break;
1723*b1cdbd2cSJim Jagielski 						case SID_PASTE:
1724*b1cdbd2cSJim Jagielski 							paste();
1725*b1cdbd2cSJim Jagielski 							break;
1726*b1cdbd2cSJim Jagielski 						case SID_DELETE:
1727*b1cdbd2cSJim Jagielski 							if( nDeleteEvent )
1728*b1cdbd2cSJim Jagielski 								Application::RemoveUserEvent( nDeleteEvent );
1729*b1cdbd2cSJim Jagielski 							nDeleteEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, DelayedDelete) );
1730*b1cdbd2cSJim Jagielski 							break;
1731*b1cdbd2cSJim Jagielski 						case SID_TABLEDESIGN_INSERTROWS:
1732*b1cdbd2cSJim Jagielski 							if( nInsNewRowsEvent )
1733*b1cdbd2cSJim Jagielski 								Application::RemoveUserEvent( nInsNewRowsEvent );
1734*b1cdbd2cSJim Jagielski 							nInsNewRowsEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, DelayedInsNewRows) );
1735*b1cdbd2cSJim Jagielski 							break;
1736*b1cdbd2cSJim Jagielski 						case SID_TABLEDESIGN_TABED_PRIMARYKEY:
1737*b1cdbd2cSJim Jagielski 							SetPrimaryKey( !IsPrimaryKey() );
1738*b1cdbd2cSJim Jagielski 							break;
1739*b1cdbd2cSJim Jagielski 						default:
1740*b1cdbd2cSJim Jagielski 							break;
1741*b1cdbd2cSJim Jagielski 					}
1742*b1cdbd2cSJim Jagielski 				}
1743*b1cdbd2cSJim Jagielski 			}
1744*b1cdbd2cSJim Jagielski 		}
1745*b1cdbd2cSJim Jagielski 		break;
1746*b1cdbd2cSJim Jagielski 		default:
1747*b1cdbd2cSJim Jagielski 			OTableRowView::Command(rEvt);
1748*b1cdbd2cSJim Jagielski 	}
1749*b1cdbd2cSJim Jagielski 
1750*b1cdbd2cSJim Jagielski }
1751*b1cdbd2cSJim Jagielski 
1752*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
1753*b1cdbd2cSJim Jagielski IMPL_LINK( OTableEditorCtrl, DelayedCut, void*, /*EMPTYTAG*/ )
1754*b1cdbd2cSJim Jagielski {
1755*b1cdbd2cSJim Jagielski 	nCutEvent = 0;
1756*b1cdbd2cSJim Jagielski 	OTableRowView::cut();
1757*b1cdbd2cSJim Jagielski 	return 0;
1758*b1cdbd2cSJim Jagielski }
1759*b1cdbd2cSJim Jagielski 
1760*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
1761*b1cdbd2cSJim Jagielski IMPL_LINK( OTableEditorCtrl, DelayedPaste, void*, /*EMPTYTAG*/ )
1762*b1cdbd2cSJim Jagielski {
1763*b1cdbd2cSJim Jagielski 	nPasteEvent = 0;
1764*b1cdbd2cSJim Jagielski 
1765*b1cdbd2cSJim Jagielski 	sal_Int32 nPastePosition = GetView()->getController().getFirstEmptyRowPosition();
1766*b1cdbd2cSJim Jagielski 	if ( !GetView()->getController().getTable().is() )
1767*b1cdbd2cSJim Jagielski 		nPastePosition = GetSelectRowCount() ? FirstSelectedRow() : GetCurRow();
1768*b1cdbd2cSJim Jagielski 
1769*b1cdbd2cSJim Jagielski 	if (!IsInsertNewAllowed(nPastePosition))
1770*b1cdbd2cSJim Jagielski 	{	// kein Einfuegen erlaubt, sondern nur anhaengen, also testen, ob hinter der PastePosition noch
1771*b1cdbd2cSJim Jagielski 		// belegte Zeilen erscheinen
1772*b1cdbd2cSJim Jagielski 
1773*b1cdbd2cSJim Jagielski 		sal_Int32 nFreeFromPos;	// ab da nur freie Zeilen
1774*b1cdbd2cSJim Jagielski 		::std::vector< ::boost::shared_ptr<OTableRow> >::reverse_iterator aIter = m_pRowList->rbegin();
1775*b1cdbd2cSJim Jagielski 		for(nFreeFromPos = m_pRowList->size();
1776*b1cdbd2cSJim Jagielski 			aIter != m_pRowList->rend() && (!(*aIter) || !(*aIter)->GetActFieldDescr() || !(*aIter)->GetActFieldDescr()->GetName().getLength());
1777*b1cdbd2cSJim Jagielski 			--nFreeFromPos, ++aIter)
1778*b1cdbd2cSJim Jagielski 			;
1779*b1cdbd2cSJim Jagielski 		if (nPastePosition < nFreeFromPos)	// es gibt mindestens eine belegte hinter PastePosition -> ganz nach hinten
1780*b1cdbd2cSJim Jagielski 			nPastePosition = nFreeFromPos;
1781*b1cdbd2cSJim Jagielski 	}
1782*b1cdbd2cSJim Jagielski 
1783*b1cdbd2cSJim Jagielski 	OTableRowView::Paste( nPastePosition );
1784*b1cdbd2cSJim Jagielski 	SetNoSelection();
1785*b1cdbd2cSJim Jagielski 	GoToRow( nPastePosition );
1786*b1cdbd2cSJim Jagielski 
1787*b1cdbd2cSJim Jagielski 	return 0;
1788*b1cdbd2cSJim Jagielski }
1789*b1cdbd2cSJim Jagielski 
1790*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
1791*b1cdbd2cSJim Jagielski IMPL_LINK( OTableEditorCtrl, DelayedDelete, void*, /*EMPTYTAG*/ )
1792*b1cdbd2cSJim Jagielski {
1793*b1cdbd2cSJim Jagielski 	nDeleteEvent = 0;
1794*b1cdbd2cSJim Jagielski 	DeleteRows();
1795*b1cdbd2cSJim Jagielski 	return 0;
1796*b1cdbd2cSJim Jagielski }
1797*b1cdbd2cSJim Jagielski 
1798*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
1799*b1cdbd2cSJim Jagielski IMPL_LINK( OTableEditorCtrl, DelayedInsNewRows, void*, /*EMPTYTAG*/ )
1800*b1cdbd2cSJim Jagielski {
1801*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1802*b1cdbd2cSJim Jagielski 	nInsNewRowsEvent = 0;
1803*b1cdbd2cSJim Jagielski 	sal_Int32 nPastePosition = GetView()->getController().getFirstEmptyRowPosition();
1804*b1cdbd2cSJim Jagielski 	if ( !GetView()->getController().getTable().is() )
1805*b1cdbd2cSJim Jagielski 		nPastePosition = GetSelectRowCount() ? FirstSelectedRow() : m_nDataPos;
1806*b1cdbd2cSJim Jagielski 
1807*b1cdbd2cSJim Jagielski 	InsertNewRows( nPastePosition );
1808*b1cdbd2cSJim Jagielski 	SetNoSelection();
1809*b1cdbd2cSJim Jagielski 	GoToRow( nPastePosition );
1810*b1cdbd2cSJim Jagielski 
1811*b1cdbd2cSJim Jagielski 	return 0;
1812*b1cdbd2cSJim Jagielski }
1813*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
AdjustFieldDescription(OFieldDescription * _pFieldDesc,MultiSelection & _rMultiSel,sal_Int32 _nPos,sal_Bool _bSet,sal_Bool _bPrimaryKey)1814*b1cdbd2cSJim Jagielski void OTableEditorCtrl::AdjustFieldDescription(OFieldDescription* _pFieldDesc,
1815*b1cdbd2cSJim Jagielski 										 MultiSelection& _rMultiSel,
1816*b1cdbd2cSJim Jagielski 										 sal_Int32 _nPos,
1817*b1cdbd2cSJim Jagielski 										 sal_Bool _bSet,
1818*b1cdbd2cSJim Jagielski 										 sal_Bool _bPrimaryKey)
1819*b1cdbd2cSJim Jagielski {
1820*b1cdbd2cSJim Jagielski 	_pFieldDesc->SetPrimaryKey( _bPrimaryKey );
1821*b1cdbd2cSJim Jagielski 	if(!_bSet && _pFieldDesc->getTypeInfo()->bNullable)
1822*b1cdbd2cSJim Jagielski 	{
1823*b1cdbd2cSJim Jagielski 		_pFieldDesc->SetIsNullable(ColumnValue::NO_NULLS);
1824*b1cdbd2cSJim Jagielski 		_pFieldDesc->SetControlDefault(Any());
1825*b1cdbd2cSJim Jagielski 	} // if(!_bSet && _pFieldDesc->getTypeInfo()->bNullable)
1826*b1cdbd2cSJim Jagielski     if ( _pFieldDesc->IsAutoIncrement() && !_bPrimaryKey )
1827*b1cdbd2cSJim Jagielski     {
1828*b1cdbd2cSJim Jagielski         OTableController& rController = GetView()->getController();
1829*b1cdbd2cSJim Jagielski         if ( rController.isAutoIncrementPrimaryKey() )
1830*b1cdbd2cSJim Jagielski         {
1831*b1cdbd2cSJim Jagielski             _pFieldDesc->SetAutoIncrement(false);
1832*b1cdbd2cSJim Jagielski         }
1833*b1cdbd2cSJim Jagielski     }
1834*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1835*b1cdbd2cSJim Jagielski 	// update field description
1836*b1cdbd2cSJim Jagielski 	pDescrWin->DisplayData(_pFieldDesc);
1837*b1cdbd2cSJim Jagielski 
1838*b1cdbd2cSJim Jagielski 	_rMultiSel.Insert( _nPos );
1839*b1cdbd2cSJim Jagielski 	_rMultiSel.Select( _nPos );
1840*b1cdbd2cSJim Jagielski }
1841*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SetPrimaryKey(sal_Bool bSet)1842*b1cdbd2cSJim Jagielski void OTableEditorCtrl::SetPrimaryKey( sal_Bool bSet )
1843*b1cdbd2cSJim Jagielski {
1844*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1845*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1846*b1cdbd2cSJim Jagielski 	// Evtl. vorhandene Primary Keys loeschen
1847*b1cdbd2cSJim Jagielski 	MultiSelection aDeletedPrimKeys;
1848*b1cdbd2cSJim Jagielski 	aDeletedPrimKeys.SetTotalRange( Range(0,GetRowCount()) );
1849*b1cdbd2cSJim Jagielski 	long nIndex = 0;
1850*b1cdbd2cSJim Jagielski 
1851*b1cdbd2cSJim Jagielski 	::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_pRowList->begin();
1852*b1cdbd2cSJim Jagielski     ::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aEnd = m_pRowList->end();
1853*b1cdbd2cSJim Jagielski 	for(sal_Int32 nRow = 0;aIter != aEnd;++aIter,++nRow)
1854*b1cdbd2cSJim Jagielski 	{
1855*b1cdbd2cSJim Jagielski 		OFieldDescription* pFieldDescr = (*aIter)->GetActFieldDescr();
1856*b1cdbd2cSJim Jagielski 		if( pFieldDescr && (*aIter)->IsPrimaryKey() && (!bSet || !IsRowSelected(nRow)) )
1857*b1cdbd2cSJim Jagielski 		{
1858*b1cdbd2cSJim Jagielski 			AdjustFieldDescription(pFieldDescr,aDeletedPrimKeys,nRow,bSet,sal_False);
1859*b1cdbd2cSJim Jagielski 		}
1860*b1cdbd2cSJim Jagielski 	}
1861*b1cdbd2cSJim Jagielski 
1862*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1863*b1cdbd2cSJim Jagielski 	// Die Primary Keys der markierten Zeilen setzen
1864*b1cdbd2cSJim Jagielski 	MultiSelection aInsertedPrimKeys;
1865*b1cdbd2cSJim Jagielski 	aInsertedPrimKeys.SetTotalRange( Range(0,GetRowCount()) );
1866*b1cdbd2cSJim Jagielski 	if( bSet )
1867*b1cdbd2cSJim Jagielski 	{
1868*b1cdbd2cSJim Jagielski 		nIndex = FirstSelectedRow();
1869*b1cdbd2cSJim Jagielski 		while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1870*b1cdbd2cSJim Jagielski 		{
1871*b1cdbd2cSJim Jagielski 			//////////////////////////////////////////////////////////////////////
1872*b1cdbd2cSJim Jagielski 			// Key setzen
1873*b1cdbd2cSJim Jagielski 			 ::boost::shared_ptr<OTableRow>  pRow = (*m_pRowList)[nIndex];
1874*b1cdbd2cSJim Jagielski 			OFieldDescription* pFieldDescr = pRow->GetActFieldDescr();
1875*b1cdbd2cSJim Jagielski 			if(pFieldDescr)
1876*b1cdbd2cSJim Jagielski 				AdjustFieldDescription(pFieldDescr,aInsertedPrimKeys,nIndex,sal_False,sal_True);
1877*b1cdbd2cSJim Jagielski 
1878*b1cdbd2cSJim Jagielski 			nIndex = NextSelectedRow();
1879*b1cdbd2cSJim Jagielski 		}
1880*b1cdbd2cSJim Jagielski 	}
1881*b1cdbd2cSJim Jagielski 
1882*b1cdbd2cSJim Jagielski 	GetUndoManager().AddUndoAction( new OPrimKeyUndoAct(this, aDeletedPrimKeys, aInsertedPrimKeys) );
1883*b1cdbd2cSJim Jagielski 
1884*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1885*b1cdbd2cSJim Jagielski 	// Handle-Spalte invalidieren
1886*b1cdbd2cSJim Jagielski 	InvalidateHandleColumn();
1887*b1cdbd2cSJim Jagielski 
1888*b1cdbd2cSJim Jagielski 
1889*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1890*b1cdbd2cSJim Jagielski 	// Das ModifyFlag der TableDocSh setzen
1891*b1cdbd2cSJim Jagielski 	GetView()->getController().setModified( sal_True );
1892*b1cdbd2cSJim Jagielski 	InvalidateFeatures();
1893*b1cdbd2cSJim Jagielski }
1894*b1cdbd2cSJim Jagielski 
1895*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
IsPrimaryKey()1896*b1cdbd2cSJim Jagielski sal_Bool OTableEditorCtrl::IsPrimaryKey()
1897*b1cdbd2cSJim Jagielski {
1898*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1899*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1900*b1cdbd2cSJim Jagielski 	// Gehoeren alle markierten Felder zu einem Primary Key ?
1901*b1cdbd2cSJim Jagielski 	long nPrimaryKeys = 0;
1902*b1cdbd2cSJim Jagielski 	::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_pRowList->begin();
1903*b1cdbd2cSJim Jagielski     ::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aEnd = m_pRowList->end();
1904*b1cdbd2cSJim Jagielski 	for(sal_Int32 nRow=0;aIter != aEnd;++aIter,++nRow)
1905*b1cdbd2cSJim Jagielski 	{
1906*b1cdbd2cSJim Jagielski 		if( IsRowSelected(nRow) && !(*aIter)->IsPrimaryKey() )
1907*b1cdbd2cSJim Jagielski 			return sal_False;
1908*b1cdbd2cSJim Jagielski 		if( (*aIter)->IsPrimaryKey() )
1909*b1cdbd2cSJim Jagielski 			++nPrimaryKeys;
1910*b1cdbd2cSJim Jagielski 	}
1911*b1cdbd2cSJim Jagielski 
1912*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1913*b1cdbd2cSJim Jagielski 	// Gibt es unselektierte Felder, die noch zu dem Key gehoeren ?
1914*b1cdbd2cSJim Jagielski 	return GetSelectRowCount() == nPrimaryKeys;
1915*b1cdbd2cSJim Jagielski }
1916*b1cdbd2cSJim Jagielski 
1917*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
SwitchType(const TOTypeInfoSP & _pType)1918*b1cdbd2cSJim Jagielski void OTableEditorCtrl::SwitchType( const TOTypeInfoSP& _pType )
1919*b1cdbd2cSJim Jagielski {
1920*b1cdbd2cSJim Jagielski 	DBG_CHKTHIS(OTableEditorCtrl,NULL);
1921*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1922*b1cdbd2cSJim Jagielski 	// Wenn noch kein Feldname vergeben wurde
1923*b1cdbd2cSJim Jagielski 	long nRow(GetCurRow());
1924*b1cdbd2cSJim Jagielski 	OFieldDescription* pActFieldDescr = GetFieldDescr( nRow );
1925*b1cdbd2cSJim Jagielski 	if( pActFieldDescr )
1926*b1cdbd2cSJim Jagielski 		//////////////////////////////////////////////////////////////////////
1927*b1cdbd2cSJim Jagielski 		// Alte Beschreibung speichern
1928*b1cdbd2cSJim Jagielski 		pDescrWin->SaveData( pActFieldDescr );
1929*b1cdbd2cSJim Jagielski 
1930*b1cdbd2cSJim Jagielski     if ( nRow < 0 || nRow > static_cast<long>(m_pRowList->size()) )
1931*b1cdbd2cSJim Jagielski         return;
1932*b1cdbd2cSJim Jagielski 	//////////////////////////////////////////////////////////////////////
1933*b1cdbd2cSJim Jagielski 	// Neue Beschreibung darstellen
1934*b1cdbd2cSJim Jagielski 	 ::boost::shared_ptr<OTableRow>  pRow = (*m_pRowList)[nRow];
1935*b1cdbd2cSJim Jagielski 	pRow->SetFieldType( _pType, sal_True );
1936*b1cdbd2cSJim Jagielski 	if ( _pType.get() )
1937*b1cdbd2cSJim Jagielski 	{
1938*b1cdbd2cSJim Jagielski 		const sal_uInt16 nCurrentlySelected = pTypeCell->GetSelectEntryPos();
1939*b1cdbd2cSJim Jagielski 
1940*b1cdbd2cSJim Jagielski 		if  (   ( LISTBOX_ENTRY_NOTFOUND == nCurrentlySelected )
1941*b1cdbd2cSJim Jagielski             ||  ( GetView()->getController().getTypeInfo( nCurrentlySelected ) != _pType )
1942*b1cdbd2cSJim Jagielski             )
1943*b1cdbd2cSJim Jagielski 		{
1944*b1cdbd2cSJim Jagielski 			sal_uInt16 nEntryPos = 0;
1945*b1cdbd2cSJim Jagielski 			const OTypeInfoMap* pTypeInfo = GetView()->getController().getTypeInfo();
1946*b1cdbd2cSJim Jagielski 			OTypeInfoMap::const_iterator aIter = pTypeInfo->begin();
1947*b1cdbd2cSJim Jagielski             OTypeInfoMap::const_iterator aEnd = pTypeInfo->end();
1948*b1cdbd2cSJim Jagielski 			for(;aIter != aEnd;++aIter,++nEntryPos)
1949*b1cdbd2cSJim Jagielski 			{
1950*b1cdbd2cSJim Jagielski 				if(aIter->second == _pType)
1951*b1cdbd2cSJim Jagielski 					break;
1952*b1cdbd2cSJim Jagielski 			}
1953*b1cdbd2cSJim Jagielski 			if (nEntryPos < pTypeCell->GetEntryCount())
1954*b1cdbd2cSJim Jagielski 				pTypeCell->SelectEntryPos( nEntryPos );
1955*b1cdbd2cSJim Jagielski 		}
1956*b1cdbd2cSJim Jagielski 	}
1957*b1cdbd2cSJim Jagielski 
1958*b1cdbd2cSJim Jagielski 	pActFieldDescr = pRow->GetActFieldDescr();
1959*b1cdbd2cSJim Jagielski 	if (pActFieldDescr != NULL && !pActFieldDescr->GetFormatKey())
1960*b1cdbd2cSJim Jagielski 	{
1961*b1cdbd2cSJim Jagielski 		sal_Int32 nFormatKey = ::dbtools::getDefaultNumberFormat( pActFieldDescr->GetType(),
1962*b1cdbd2cSJim Jagielski 			pActFieldDescr->GetScale(),
1963*b1cdbd2cSJim Jagielski 			pActFieldDescr->IsCurrency(),
1964*b1cdbd2cSJim Jagielski 			Reference< XNumberFormatTypes>(GetView()->getController().getNumberFormatter()->getNumberFormatsSupplier()->getNumberFormats(),UNO_QUERY),
1965*b1cdbd2cSJim Jagielski 			GetView()->getLocale());
1966*b1cdbd2cSJim Jagielski 
1967*b1cdbd2cSJim Jagielski 		pActFieldDescr->SetFormatKey(nFormatKey);
1968*b1cdbd2cSJim Jagielski 	}
1969*b1cdbd2cSJim Jagielski 
1970*b1cdbd2cSJim Jagielski 	pDescrWin->DisplayData( pActFieldDescr );
1971*b1cdbd2cSJim Jagielski }
1972*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
GetView() const1973*b1cdbd2cSJim Jagielski OTableDesignView* OTableEditorCtrl::GetView() const
1974*b1cdbd2cSJim Jagielski {
1975*b1cdbd2cSJim Jagielski 	return static_cast<OTableDesignView*>(GetParent()->GetParent());
1976*b1cdbd2cSJim Jagielski }
1977*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
DeactivateCell(sal_Bool bUpdate)1978*b1cdbd2cSJim Jagielski void OTableEditorCtrl::DeactivateCell(sal_Bool bUpdate)
1979*b1cdbd2cSJim Jagielski {
1980*b1cdbd2cSJim Jagielski 	OTableRowView::DeactivateCell(bUpdate);
1981*b1cdbd2cSJim Jagielski 	// now we have to deactivate the field description
1982*b1cdbd2cSJim Jagielski 	long nRow(GetCurRow());
1983*b1cdbd2cSJim Jagielski 	if (pDescrWin)
1984*b1cdbd2cSJim Jagielski 		pDescrWin->SetReadOnly(bReadOnly || !SetDataPtr(nRow) || GetActRow()->IsReadOnly());
1985*b1cdbd2cSJim Jagielski }
1986*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------------
PreNotify(NotifyEvent & rNEvt)1987*b1cdbd2cSJim Jagielski long OTableEditorCtrl::PreNotify( NotifyEvent& rNEvt )
1988*b1cdbd2cSJim Jagielski {
1989*b1cdbd2cSJim Jagielski 	if (rNEvt.GetType() == EVENT_GETFOCUS)
1990*b1cdbd2cSJim Jagielski 	{
1991*b1cdbd2cSJim Jagielski 		if( pHelpTextCell && pHelpTextCell->HasChildPathFocus() )
1992*b1cdbd2cSJim Jagielski 			m_eChildFocus = HELPTEXT;
1993*b1cdbd2cSJim Jagielski         else if( pDescrCell && pDescrCell->HasChildPathFocus() )
1994*b1cdbd2cSJim Jagielski 			m_eChildFocus = DESCRIPTION;
1995*b1cdbd2cSJim Jagielski 		else if(pNameCell && pNameCell->HasChildPathFocus() )
1996*b1cdbd2cSJim Jagielski 			m_eChildFocus = NAME;
1997*b1cdbd2cSJim Jagielski 		else
1998*b1cdbd2cSJim Jagielski 			m_eChildFocus = ROW;
1999*b1cdbd2cSJim Jagielski 	}
2000*b1cdbd2cSJim Jagielski 
2001*b1cdbd2cSJim Jagielski 	return OTableRowView::PreNotify(rNEvt);
2002*b1cdbd2cSJim Jagielski }
2003*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------------
2004*b1cdbd2cSJim Jagielski 
2005*b1cdbd2cSJim Jagielski 
2006*b1cdbd2cSJim Jagielski 
2007*b1cdbd2cSJim Jagielski 
2008