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