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 <comphelper/processfactory.hxx>
22 : #include <tools/debug.hxx>
23 : #include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
24 : #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
25 : #include <com/sun/star/sdbcx/XAlterTable.hpp>
26 : #include <com/sun/star/sdbcx/XDrop.hpp>
27 : #include <com/sun/star/sdbcx/XAppend.hpp>
28 : #include <com/sun/star/beans/PropertyAttribute.hpp>
29 : #include <com/sun/star/util/XNumberFormatTypes.hpp>
30 : #include "dbu_tbl.hrc"
31 : #include "dbustrings.hrc"
32 : #include "browserids.hxx"
33 : #include "dbaccess_helpid.hrc"
34 : #include <comphelper/types.hxx>
35 : #include "FieldDescControl.hxx"
36 : #include "FieldDescriptions.hxx"
37 : #include <vcl/msgbox.hxx>
38 : #include "TableUndo.hxx"
39 : #include "TableController.hxx"
40 : #include <connectivity/dbtools.hxx>
41 : #include "SqlNameEdit.hxx"
42 : #include "TableRowExchange.hxx"
43 : #include <sot/storage.hxx>
44 : #include "UITools.hxx"
45 : #include "TableFieldControl.hxx"
46 : #include "dsntypes.hxx"
47 :
48 : #include "dbaccess_slotid.hrc"
49 :
50 : using namespace ::dbaui;
51 : using namespace ::comphelper;
52 : using namespace ::svt;
53 : using namespace ::com::sun::star::uno;
54 : using namespace ::com::sun::star::container;
55 : using namespace ::com::sun::star::io;
56 : using namespace ::com::sun::star::beans;
57 : using namespace ::com::sun::star::frame;
58 : using namespace ::com::sun::star::util;
59 : using namespace ::com::sun::star::lang;
60 : using namespace ::com::sun::star::sdbc;
61 : using namespace ::com::sun::star::sdbcx;
62 : using namespace ::com::sun::star::sdb;
63 :
64 : // TYPEINIT1(OTableEditorCtrl, DBView);
65 :
66 : #define HANDLE_ID 0
67 :
68 : // default field widths
69 : #define FIELDNAME_WIDTH 100
70 : #define FIELDTYPE_WIDTH 150
71 : #define FIELDDESCR_WIDTH 300
72 :
73 : // Maximum length in description field
74 : #define MAX_DESCR_LEN 256
75 :
76 0 : OTableEditorCtrl::ClipboardInvalidator::ClipboardInvalidator(sal_uLong nTimeout,OTableEditorCtrl* _pOwner)
77 0 : : m_pOwner(_pOwner)
78 : {
79 :
80 0 : m_aInvalidateTimer.SetTimeout(nTimeout);
81 0 : m_aInvalidateTimer.SetTimeoutHdl(LINK(this, OTableEditorCtrl::ClipboardInvalidator, OnInvalidate));
82 0 : m_aInvalidateTimer.Start();
83 0 : }
84 :
85 0 : OTableEditorCtrl::ClipboardInvalidator::~ClipboardInvalidator()
86 : {
87 0 : m_aInvalidateTimer.Stop();
88 :
89 0 : }
90 :
91 0 : IMPL_LINK_NOARG(OTableEditorCtrl::ClipboardInvalidator, OnInvalidate)
92 : {
93 0 : m_pOwner->GetView()->getController().InvalidateFeature(SID_CUT);
94 0 : m_pOwner->GetView()->getController().InvalidateFeature(SID_COPY);
95 0 : m_pOwner->GetView()->getController().InvalidateFeature(SID_PASTE);
96 0 : return 0L;
97 : }
98 :
99 0 : void OTableEditorCtrl::Init()
100 : {
101 0 : OTableRowView::Init();
102 :
103 : // Should it be opened ReadOnly?
104 0 : bool bRead(GetView()->getController().isReadOnly());
105 :
106 0 : SetReadOnly( bRead );
107 :
108 : // Insert the columns
109 0 : OUString aColumnName( ModuleRes(STR_TAB_FIELD_COLUMN_NAME) );
110 0 : InsertDataColumn( FIELD_NAME, aColumnName, FIELDNAME_WIDTH );
111 :
112 0 : aColumnName = ModuleRes(STR_TAB_FIELD_COLUMN_DATATYPE);
113 0 : InsertDataColumn( FIELD_TYPE, aColumnName, FIELDTYPE_WIDTH );
114 :
115 0 : ::dbaccess::ODsnTypeCollection aDsnTypes(GetView()->getController().getORB());
116 0 : bool bShowColumnDescription = aDsnTypes.supportsColumnDescription(::comphelper::getString(GetView()->getController().getDataSource()->getPropertyValue(PROPERTY_URL)));
117 0 : aColumnName = ModuleRes(STR_TAB_HELP_TEXT);
118 0 : InsertDataColumn( HELP_TEXT, aColumnName, bShowColumnDescription ? FIELDTYPE_WIDTH : FIELDDESCR_WIDTH );
119 :
120 0 : if ( bShowColumnDescription )
121 : {
122 0 : aColumnName = ModuleRes(STR_COLUMN_DESCRIPTION);
123 0 : InsertDataColumn( COLUMN_DESCRIPTION, aColumnName, FIELDTYPE_WIDTH );
124 : }
125 :
126 0 : InitCellController();
127 :
128 : // Insert the rows
129 0 : RowInserted(0, m_pRowList->size(), true);
130 0 : }
131 :
132 0 : void OTableEditorCtrl::UpdateAll()
133 : {
134 0 : RowRemoved(0, GetRowCount(), false);
135 0 : m_nDataPos = 0;
136 :
137 0 : InvalidateFeatures();
138 0 : Invalidate();
139 0 : }
140 :
141 0 : OTableEditorCtrl::OTableEditorCtrl(vcl::Window* pWindow)
142 : :OTableRowView(pWindow)
143 : ,pNameCell(NULL)
144 : ,pTypeCell(NULL)
145 : ,pHelpTextCell(NULL)
146 : ,pDescrCell(NULL)
147 : ,pDescrWin(NULL)
148 : ,nCutEvent(0)
149 : ,nPasteEvent(0)
150 : ,nDeleteEvent(0)
151 : ,nInsNewRowsEvent(0)
152 : ,nInvalidateTypeEvent(0)
153 : ,m_eChildFocus(NONE)
154 : ,nOldDataPos(-1)
155 : ,bSaveOnMove(true)
156 : ,bReadOnly(true)
157 0 : ,m_aInvalidate(500,this)
158 : {
159 :
160 0 : SetHelpId(HID_TABDESIGN_BACKGROUND);
161 0 : GetDataWindow().SetHelpId(HID_CTL_TABLEEDIT);
162 :
163 0 : m_pRowList = &GetView()->getController().getRows();
164 0 : m_nDataPos = 0;
165 0 : }
166 :
167 0 : SfxUndoManager& OTableEditorCtrl::GetUndoManager() const
168 : {
169 0 : return GetView()->getController().GetUndoManager();
170 : }
171 :
172 :
173 0 : void OTableEditorCtrl::SetReadOnly( bool bRead )
174 : {
175 : // nothing to do?
176 0 : if (bRead == IsReadOnly())
177 : // This check is important, as the underlying Def may be unnecessarily locked or unlocked
178 : // or worse, this action may not be reversed afterwards
179 0 : return;
180 :
181 0 : bReadOnly = bRead;
182 :
183 : // Disable active cells
184 0 : long nRow(GetCurRow());
185 0 : sal_uInt16 nCol(GetCurColumnId());
186 0 : DeactivateCell();
187 :
188 : // Select the correct Browsers cursor
189 : BrowserMode nMode(BROWSER_COLUMNSELECTION | BROWSER_MULTISELECTION | BROWSER_KEEPSELECTION |
190 0 : BROWSER_HLINESFULL | BROWSER_VLINESFULL|BROWSER_AUTOSIZE_LASTCOL);
191 0 : if( !bReadOnly )
192 0 : nMode |= BROWSER_HIDECURSOR;
193 0 : SetMode(nMode);
194 :
195 0 : if( !bReadOnly )
196 0 : ActivateCell( nRow, nCol );
197 : }
198 :
199 0 : void OTableEditorCtrl::InitCellController()
200 : {
201 : // Cell Field name
202 0 : sal_Int32 nMaxTextLen = EDIT_NOLIMIT;
203 0 : OUString sExtraNameChars;
204 0 : Reference<XConnection> xCon;
205 : try
206 : {
207 0 : xCon = GetView()->getController().getConnection();
208 0 : Reference< XDatabaseMetaData> xMetaData = xCon.is() ? xCon->getMetaData() : Reference< XDatabaseMetaData>();
209 :
210 0 : nMaxTextLen = xMetaData.is() ? xMetaData->getMaxColumnNameLength() : 0;
211 :
212 0 : if( nMaxTextLen == 0 )
213 0 : nMaxTextLen = EDIT_NOLIMIT;
214 0 : sExtraNameChars = xMetaData.is() ? xMetaData->getExtraNameCharacters() : OUString();
215 :
216 : }
217 0 : catch(SQLException&)
218 : {
219 : OSL_FAIL("getMaxColumnNameLength");
220 : }
221 :
222 0 : pNameCell = new OSQLNameEdit(&GetDataWindow(), WB_LEFT, sExtraNameChars);
223 0 : pNameCell->SetMaxTextLen( nMaxTextLen );
224 0 : pNameCell->setCheck( isSQL92CheckEnabled(xCon) );
225 :
226 : // Cell type
227 0 : pTypeCell = new ListBoxControl( &GetDataWindow() );
228 0 : pTypeCell->SetDropDownLineCount( 15 );
229 :
230 : // Cell description
231 0 : pDescrCell = new Edit( &GetDataWindow(), WB_LEFT );
232 0 : pDescrCell->SetMaxTextLen( MAX_DESCR_LEN );
233 :
234 0 : pHelpTextCell = new Edit( &GetDataWindow(), WB_LEFT );
235 0 : pHelpTextCell->SetMaxTextLen( MAX_DESCR_LEN );
236 :
237 0 : pNameCell->SetHelpId(HID_TABDESIGN_NAMECELL);
238 0 : pTypeCell->SetHelpId(HID_TABDESIGN_TYPECELL);
239 0 : pDescrCell->SetHelpId(HID_TABDESIGN_COMMENTCELL);
240 0 : pHelpTextCell->SetHelpId(HID_TABDESIGN_HELPTEXT);
241 :
242 0 : Size aHeight;
243 0 : const Control* pControls[] = { pTypeCell,pDescrCell,pNameCell,pHelpTextCell};
244 0 : for(sal_Size i= 0; i < sizeof(pControls) / sizeof(pControls[0]);++i)
245 : {
246 0 : const Size aTemp(pControls[i]->GetOptimalSize());
247 0 : if ( aTemp.Height() > aHeight.Height() )
248 0 : aHeight.Height() = aTemp.Height();
249 : }
250 0 : SetDataRowHeight(aHeight.Height());
251 :
252 0 : ClearModified();
253 0 : }
254 :
255 0 : void OTableEditorCtrl::ClearModified()
256 : {
257 0 : pNameCell->ClearModifyFlag();
258 0 : pDescrCell->ClearModifyFlag();
259 0 : pHelpTextCell->ClearModifyFlag();
260 0 : pTypeCell->SaveValue();
261 0 : }
262 :
263 0 : OTableEditorCtrl::~OTableEditorCtrl()
264 : {
265 : // Reset the Undo-Manager
266 0 : GetUndoManager().Clear();
267 :
268 : // Take possible Events from the queue
269 0 : if( nCutEvent )
270 0 : Application::RemoveUserEvent( nCutEvent );
271 0 : if( nPasteEvent )
272 0 : Application::RemoveUserEvent( nPasteEvent );
273 0 : if( nDeleteEvent )
274 0 : Application::RemoveUserEvent( nDeleteEvent );
275 0 : if( nInsNewRowsEvent )
276 0 : Application::RemoveUserEvent( nInsNewRowsEvent );
277 0 : if( nInvalidateTypeEvent )
278 0 : Application::RemoveUserEvent( nInvalidateTypeEvent );
279 :
280 : // Delete the control types
281 0 : delete pNameCell;
282 0 : delete pTypeCell;
283 0 : delete pDescrCell;
284 0 : delete pHelpTextCell;
285 0 : }
286 :
287 0 : bool OTableEditorCtrl::SetDataPtr( long nRow )
288 : {
289 0 : if(nRow == -1)
290 0 : return false;
291 :
292 : OSL_ENSURE(nRow < (long)m_pRowList->size(),"Row is greater than size!");
293 0 : if(nRow >= (long)m_pRowList->size())
294 0 : return false;
295 0 : pActRow = (*m_pRowList)[nRow];
296 0 : return pActRow != 0;
297 : }
298 :
299 0 : bool OTableEditorCtrl::SeekRow(long _nRow)
300 : {
301 : // Call the Base class to remember which row must be repainted
302 0 : EditBrowseBox::SeekRow(_nRow);
303 :
304 0 : m_nCurrentPos = _nRow;
305 0 : return SetDataPtr(_nRow);
306 : }
307 :
308 0 : void OTableEditorCtrl::PaintCell(OutputDevice& rDev, const Rectangle& rRect,
309 : sal_uInt16 nColumnId ) const
310 : {
311 0 : const OUString aText( GetCellText( m_nCurrentPos, nColumnId ));
312 :
313 0 : rDev.Push( PushFlags::CLIPREGION );
314 0 : rDev.SetClipRegion(vcl::Region(rRect));
315 0 : rDev.DrawText( rRect, aText, TEXT_DRAW_LEFT | TEXT_DRAW_VCENTER );
316 0 : rDev.Pop();
317 0 : }
318 :
319 0 : CellController* OTableEditorCtrl::GetController(long nRow, sal_uInt16 nColumnId)
320 : {
321 : // If EditorCtrl is ReadOnly, editing is forbidden
322 0 : Reference<XPropertySet> xTable = GetView()->getController().getTable();
323 0 : if (IsReadOnly() || ( xTable.is() &&
324 0 : xTable->getPropertySetInfo()->hasPropertyByName(PROPERTY_TYPE) &&
325 0 : ::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == "VIEW"))
326 0 : return NULL;
327 :
328 : // If the row is ReadOnly, editing is forbidden
329 0 : SetDataPtr( nRow );
330 0 : if( pActRow->IsReadOnly() )
331 0 : return NULL;
332 :
333 0 : OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
334 0 : switch (nColumnId)
335 : {
336 : case FIELD_NAME:
337 0 : return new EditCellController( pNameCell );
338 : case FIELD_TYPE:
339 0 : if (pActFieldDescr && !pActFieldDescr->GetName().isEmpty())
340 0 : return new ListBoxCellController( pTypeCell );
341 0 : else return NULL;
342 : case HELP_TEXT:
343 0 : if (pActFieldDescr && !pActFieldDescr->GetName().isEmpty())
344 0 : return new EditCellController( pHelpTextCell );
345 : else
346 0 : return NULL;
347 : case COLUMN_DESCRIPTION:
348 0 : if (pActFieldDescr && !pActFieldDescr->GetName().isEmpty())
349 0 : return new EditCellController( pDescrCell );
350 : else
351 0 : return NULL;
352 : default:
353 0 : return NULL;
354 0 : }
355 : }
356 :
357 0 : void OTableEditorCtrl::InitController(CellControllerRef&, long nRow, sal_uInt16 nColumnId)
358 : {
359 0 : SeekRow( nRow == -1 ? GetCurRow() : nRow);
360 0 : OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
361 0 : OUString aInitString;
362 :
363 0 : switch (nColumnId)
364 : {
365 : case FIELD_NAME:
366 0 : if( pActFieldDescr )
367 0 : aInitString = pActFieldDescr->GetName();
368 0 : pNameCell->SetText( aInitString );
369 0 : pNameCell->SaveValue();
370 0 : break;
371 : case FIELD_TYPE:
372 : {
373 0 : if ( pActFieldDescr && pActFieldDescr->getTypeInfo() )
374 0 : aInitString = pActFieldDescr->getTypeInfo()->aUIName;
375 :
376 : // Set the ComboBox contents
377 0 : pTypeCell->Clear();
378 0 : if( !pActFieldDescr )
379 0 : break;
380 :
381 0 : const OTypeInfoMap& rTypeInfo = GetView()->getController().getTypeInfo();
382 0 : OTypeInfoMap::const_iterator aIter = rTypeInfo.begin();
383 0 : OTypeInfoMap::const_iterator aEnd = rTypeInfo.end();
384 0 : for(;aIter != aEnd;++aIter)
385 0 : pTypeCell->InsertEntry( aIter->second->aUIName );
386 0 : pTypeCell->SelectEntry( aInitString );
387 : }
388 :
389 0 : break;
390 : case HELP_TEXT:
391 0 : if( pActFieldDescr )
392 0 : aInitString = pActFieldDescr->GetHelpText();
393 0 : pHelpTextCell->SetText( aInitString );
394 0 : pHelpTextCell->SaveValue();
395 0 : break;
396 : case COLUMN_DESCRIPTION:
397 0 : if( pActFieldDescr )
398 0 : aInitString = pActFieldDescr->GetDescription();
399 0 : pDescrCell->SetText( aInitString );
400 0 : pDescrCell->SaveValue();
401 0 : break;
402 :
403 0 : }
404 0 : }
405 :
406 0 : EditBrowseBox::RowStatus OTableEditorCtrl::GetRowStatus(long nRow) const
407 : {
408 0 : const_cast<OTableEditorCtrl*>(this)->SetDataPtr( nRow );
409 0 : if( !pActRow )
410 0 : return EditBrowseBox::CLEAN;
411 0 : if (nRow >= 0 && nRow == m_nDataPos)
412 : {
413 0 : if( pActRow->IsPrimaryKey() )
414 0 : return EditBrowseBox::CURRENT_PRIMARYKEY;
415 0 : return EditBrowseBox::CURRENT;
416 : }
417 : else
418 : {
419 0 : if( pActRow->IsPrimaryKey() )
420 0 : return EditBrowseBox::PRIMARYKEY;
421 0 : return EditBrowseBox::CLEAN;
422 : }
423 : }
424 :
425 0 : bool OTableEditorCtrl::SaveCurRow()
426 : {
427 0 : if (GetFieldDescr(GetCurRow()) == NULL)
428 : // there is no data in the current row
429 0 : return true;
430 0 : if (!SaveModified())
431 0 : return false;
432 :
433 0 : SetDataPtr(GetCurRow());
434 0 : pDescrWin->SaveData( pActRow->GetActFieldDescr() );
435 0 : return true;
436 : }
437 :
438 0 : void OTableEditorCtrl::DisplayData(long nRow, bool bGrabFocus)
439 : {
440 : // go to the correct cell
441 0 : SetDataPtr(nRow);
442 :
443 : // Disable Edit-Mode temporarily
444 0 : bool bWasEditing = IsEditing();
445 0 : if (bWasEditing)
446 0 : DeactivateCell();
447 :
448 0 : CellControllerRef aTemp;
449 0 : InitController(aTemp, nRow, FIELD_NAME);
450 0 : InitController(aTemp, nRow, FIELD_TYPE);
451 0 : InitController(aTemp, nRow, COLUMN_DESCRIPTION);
452 0 : InitController(aTemp, nRow, HELP_TEXT);
453 :
454 0 : GoToRow(nRow);
455 : // Update the Description-Window
456 0 : GetView()->GetDescWin()->DisplayData(GetFieldDescr(nRow));
457 : // redraw the row
458 0 : RowModified(nRow);
459 :
460 : // and re-enable edit mode
461 0 : if (bWasEditing || bGrabFocus)
462 0 : ActivateCell(nRow, GetCurColumnId(), bGrabFocus);
463 0 : }
464 :
465 0 : void OTableEditorCtrl::CursorMoved()
466 : {
467 : // New line?
468 0 : m_nDataPos = GetCurRow();
469 0 : if( m_nDataPos != nOldDataPos && m_nDataPos != -1)
470 : {
471 0 : CellControllerRef aTemp;
472 0 : InitController(aTemp,m_nDataPos,FIELD_NAME);
473 0 : InitController(aTemp,m_nDataPos,FIELD_TYPE);
474 0 : InitController(aTemp,m_nDataPos,COLUMN_DESCRIPTION);
475 0 : InitController(aTemp,m_nDataPos,HELP_TEXT);
476 : }
477 :
478 0 : OTableRowView::CursorMoved();
479 0 : }
480 :
481 0 : sal_Int32 OTableEditorCtrl::HasFieldName( const OUString& rFieldName )
482 : {
483 :
484 0 : Reference<XConnection> xCon = GetView()->getController().getConnection();
485 0 : Reference< XDatabaseMetaData> xMetaData = xCon.is() ? xCon->getMetaData() : Reference< XDatabaseMetaData>();
486 :
487 0 : ::comphelper::UStringMixEqual bCase(xMetaData.is() ? xMetaData->supportsMixedCaseQuotedIdentifiers() : sal_True);
488 :
489 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aIter = m_pRowList->begin();
490 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::iterator aEnd = m_pRowList->end();
491 : OFieldDescription* pFieldDescr;
492 0 : sal_Int32 nCount(0);
493 0 : for(;aIter != aEnd;++aIter)
494 : {
495 0 : pFieldDescr = (*aIter)->GetActFieldDescr();
496 0 : if( pFieldDescr && bCase(rFieldName,pFieldDescr->GetName()))
497 0 : nCount++;
498 : }
499 0 : return nCount;
500 : }
501 :
502 0 : bool OTableEditorCtrl::SaveData(long nRow, sal_uInt16 nColId)
503 : {
504 : // Store the cell content
505 0 : SetDataPtr( nRow == -1 ? GetCurRow() : nRow);
506 0 : OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
507 :
508 0 : switch( nColId)
509 : {
510 : // Store NameCell
511 : case FIELD_NAME:
512 : {
513 : // If there is no name, do nothing
514 0 : OUString aName(pNameCell->GetText());
515 :
516 0 : if( aName.isEmpty() )
517 : {
518 : // If FieldDescr exists, the field is deleted and the old content restored
519 0 : if (pActFieldDescr)
520 : {
521 0 : GetUndoManager().AddUndoAction(new OTableEditorTypeSelUndoAct(this, nRow, FIELD_TYPE, pActFieldDescr->getTypeInfo()));
522 0 : SwitchType(TOTypeInfoSP());
523 0 : pActFieldDescr = pActRow->GetActFieldDescr();
524 : }
525 : else
526 0 : return true;
527 : }
528 0 : if(pActFieldDescr)
529 0 : pActFieldDescr->SetName( aName );
530 0 : pNameCell->ClearModifyFlag();
531 :
532 0 : break;
533 : }
534 :
535 : // Store the field type
536 : case FIELD_TYPE:
537 0 : break;
538 :
539 : // Store DescrCell
540 : case HELP_TEXT:
541 : {
542 : // if the current field description is NULL, set Default
543 0 : if( !pActFieldDescr )
544 : {
545 0 : pHelpTextCell->SetText(OUString());
546 0 : pHelpTextCell->ClearModifyFlag();
547 : }
548 : else
549 0 : pActFieldDescr->SetHelpText( pHelpTextCell->GetText() );
550 0 : break;
551 : }
552 : case COLUMN_DESCRIPTION:
553 : {
554 : // Set the default if the field description is null
555 0 : if( !pActFieldDescr )
556 : {
557 0 : pDescrCell->SetText(OUString());
558 0 : pDescrCell->ClearModifyFlag();
559 : }
560 : else
561 0 : pActFieldDescr->SetDescription( pDescrCell->GetText() );
562 0 : break;
563 : }
564 : case FIELD_PROPERTY_DEFAULT:
565 : case FIELD_PROPERTY_REQUIRED:
566 : case FIELD_PROPERTY_TEXTLEN:
567 : case FIELD_PROPERTY_NUMTYPE:
568 : case FIELD_PROPERTY_AUTOINC:
569 : case FIELD_PROPERTY_LENGTH:
570 : case FIELD_PROPERTY_SCALE:
571 : case FIELD_PROPERTY_BOOL_DEFAULT:
572 0 : pDescrWin->SaveData(pActFieldDescr);
573 :
574 0 : if ( FIELD_PROPERTY_AUTOINC == nColId && pActFieldDescr->IsAutoIncrement() )
575 : {
576 0 : OTableController& rController = GetView()->getController();
577 0 : if ( rController.isAutoIncrementPrimaryKey() )
578 : {
579 0 : pActFieldDescr->SetPrimaryKey( true );
580 0 : InvalidateHandleColumn();
581 0 : Invalidate();
582 : }
583 : }
584 0 : break;
585 : }
586 0 : return true;
587 : }
588 :
589 0 : bool OTableEditorCtrl::SaveModified()
590 : {
591 0 : sal_uInt16 nColId = GetCurColumnId();
592 :
593 0 : switch( nColId )
594 : {
595 : // Fieled type
596 : case FIELD_TYPE:
597 : {
598 : // Reset the type
599 0 : resetType();
600 0 : } break;
601 : }
602 :
603 0 : return true;
604 : }
605 :
606 0 : bool OTableEditorCtrl::CursorMoving(long nNewRow, sal_uInt16 nNewCol)
607 : {
608 :
609 0 : if (!EditBrowseBox::CursorMoving(nNewRow, nNewCol))
610 0 : return false;
611 :
612 : // Called after SaveModified(), current row is still the old one
613 0 : m_nDataPos = nNewRow;
614 0 : nOldDataPos = GetCurRow();
615 :
616 : // Reset the markers
617 0 : InvalidateStatusCell( nOldDataPos );
618 0 : InvalidateStatusCell( m_nDataPos );
619 :
620 : // Store the data from the Property window
621 0 : if( SetDataPtr(nOldDataPos) && pDescrWin)
622 0 : pDescrWin->SaveData( pActRow->GetActFieldDescr() );
623 :
624 : // Show new data in the Property window
625 0 : if( SetDataPtr(m_nDataPos) && pDescrWin)
626 0 : pDescrWin->DisplayData( pActRow->GetActFieldDescr() );
627 :
628 0 : return true;
629 : }
630 :
631 0 : IMPL_LINK( OTableEditorCtrl, InvalidateFieldType, void*, /*EMPTYTAG*/ )
632 : {
633 0 : nInvalidateTypeEvent = 0;
634 0 : Invalidate( GetFieldRectPixel(nOldDataPos, FIELD_TYPE) );
635 :
636 0 : return 0;
637 : }
638 :
639 0 : void OTableEditorCtrl::CellModified( long nRow, sal_uInt16 nColId )
640 : {
641 :
642 : // If the description is null, use the default
643 0 : if(nRow == -1)
644 0 : nRow = GetCurRow();
645 0 : SetDataPtr( nRow );
646 0 : OFieldDescription* pActFieldDescr = pActRow->GetActFieldDescr();
647 :
648 0 : OUString sActionDescription;
649 0 : switch ( nColId )
650 : {
651 0 : case FIELD_NAME: sActionDescription = ModuleRes( STR_CHANGE_COLUMN_NAME ); break;
652 0 : case FIELD_TYPE: sActionDescription = ModuleRes( STR_CHANGE_COLUMN_TYPE ); break;
653 : case HELP_TEXT:
654 0 : case COLUMN_DESCRIPTION: sActionDescription = ModuleRes( STR_CHANGE_COLUMN_DESCRIPTION ); break;
655 0 : default: sActionDescription = ModuleRes( STR_CHANGE_COLUMN_ATTRIBUTE ); break;
656 : }
657 :
658 0 : GetUndoManager().EnterListAction( sActionDescription, OUString() );
659 0 : if (!pActFieldDescr)
660 : {
661 0 : const OTypeInfoMap& rTypeInfoMap = GetView()->getController().getTypeInfo();
662 0 : if ( !rTypeInfoMap.empty() )
663 : {
664 0 : OTypeInfoMap::const_iterator aTypeIter = rTypeInfoMap.find(DataType::VARCHAR);
665 0 : if ( aTypeIter == rTypeInfoMap.end() )
666 0 : aTypeIter = rTypeInfoMap.begin();
667 0 : pActRow->SetFieldType( aTypeIter->second );
668 : }
669 : else
670 0 : pActRow->SetFieldType( GetView()->getController().getTypeInfoFallBack() );
671 :
672 0 : nInvalidateTypeEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, InvalidateFieldType) );
673 0 : pActFieldDescr = pActRow->GetActFieldDescr();
674 0 : pDescrWin->DisplayData( pActFieldDescr );
675 0 : GetUndoManager().AddUndoAction( new OTableEditorTypeSelUndoAct(this, nRow, nColId+1, TOTypeInfoSP()) );
676 : }
677 :
678 0 : if( nColId != FIELD_TYPE )
679 0 : GetUndoManager().AddUndoAction( new OTableDesignCellUndoAct(this, nRow, nColId) );
680 : else
681 : {
682 0 : GetUndoManager().AddUndoAction(new OTableEditorTypeSelUndoAct(this, GetCurRow(), nColId, GetFieldDescr(GetCurRow())->getTypeInfo()));
683 0 : resetType();
684 : }
685 :
686 0 : SaveData(nRow,nColId);
687 : // SaveData could create a undo action as well
688 0 : GetUndoManager().LeaveListAction();
689 0 : RowModified(nRow);
690 0 : CellControllerRef xController(Controller());
691 0 : if(xController.Is())
692 0 : xController->SetModified();
693 :
694 : // Set the Modify flag
695 0 : GetView()->getController().setModified( sal_True );
696 0 : InvalidateFeatures();
697 0 : }
698 :
699 0 : void OTableEditorCtrl::resetType()
700 : {
701 0 : sal_Int32 nPos = pTypeCell->GetSelectEntryPos();
702 0 : if(nPos != LISTBOX_ENTRY_NOTFOUND)
703 0 : SwitchType( GetView()->getController().getTypeInfo(nPos) );
704 : else
705 0 : SwitchType(TOTypeInfoSP());
706 0 : }
707 :
708 0 : void OTableEditorCtrl::CellModified()
709 : {
710 0 : CellModified( GetCurRow(), GetCurColumnId() );
711 0 : }
712 :
713 0 : void OTableEditorCtrl::InvalidateFeatures()
714 : {
715 0 : GetView()->getController().InvalidateFeature(SID_UNDO);
716 0 : GetView()->getController().InvalidateFeature(SID_REDO);
717 0 : GetView()->getController().InvalidateFeature(SID_SAVEDOC);
718 0 : }
719 :
720 0 : void OTableEditorCtrl::Undo()
721 : {
722 :
723 0 : InvalidateFeatures();
724 0 : }
725 :
726 0 : void OTableEditorCtrl::Redo()
727 : {
728 0 : InvalidateFeatures();
729 0 : }
730 :
731 0 : void OTableEditorCtrl::CopyRows()
732 : {
733 : // set to the right row and save it
734 0 : if( SetDataPtr(m_nDataPos) )
735 0 : pDescrWin->SaveData( pActRow->GetActFieldDescr() );
736 :
737 : // Copy selected rows to the ClipboardList
738 0 : ::boost::shared_ptr<OTableRow> pClipboardRow;
739 0 : ::boost::shared_ptr<OTableRow> pRow;
740 0 : ::std::vector< ::boost::shared_ptr<OTableRow> > vClipboardList;
741 0 : vClipboardList.reserve(GetSelectRowCount());
742 :
743 0 : for( long nIndex=FirstSelectedRow(); nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()); nIndex=NextSelectedRow() )
744 : {
745 0 : pRow = (*m_pRowList)[nIndex];
746 : OSL_ENSURE(pRow,"OTableEditorCtrl::CopyRows: Row is NULL!");
747 0 : if ( pRow && pRow->GetActFieldDescr() )
748 : {
749 0 : pClipboardRow.reset(new OTableRow( *pRow ));
750 0 : vClipboardList.push_back( pClipboardRow);
751 : }
752 : }
753 0 : if(!vClipboardList.empty())
754 : {
755 0 : OTableRowExchange* pData = new OTableRowExchange(vClipboardList);
756 0 : Reference< ::com::sun::star::datatransfer::XTransferable> xRef = pData;
757 0 : pData->CopyToClipboard(GetParent());
758 0 : }
759 0 : }
760 :
761 0 : OUString OTableEditorCtrl::GenerateName( const OUString& rName )
762 : {
763 : // Create a base name for appending numbers to
764 0 : OUString aBaseName;
765 0 : Reference<XConnection> xCon = GetView()->getController().getConnection();
766 0 : Reference< XDatabaseMetaData> xMetaData = xCon.is() ? xCon->getMetaData() : Reference< XDatabaseMetaData>();
767 :
768 0 : sal_Int32 nMaxTextLen(xMetaData.is() ? xMetaData->getMaxColumnNameLength() : 0);
769 :
770 0 : if( (rName.getLength()+2) >nMaxTextLen )
771 0 : aBaseName = rName.copy( 0, nMaxTextLen-2 );
772 : else
773 0 : aBaseName = rName;
774 :
775 : // append a sequential number to the base name (up to 99)
776 0 : OUString aFieldName( rName);
777 0 : sal_Int32 i=1;
778 0 : while( HasFieldName(aFieldName) )
779 : {
780 0 : aFieldName = aBaseName + OUString::number(i);
781 0 : i++;
782 : }
783 :
784 0 : return aFieldName;
785 : }
786 :
787 0 : void OTableEditorCtrl::InsertRows( long nRow )
788 : {
789 :
790 0 : ::std::vector< ::boost::shared_ptr<OTableRow> > vInsertedUndoRedoRows; // need for undo/redo handling
791 : // get rows from clipboard
792 0 : TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
793 0 : if(aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_TABED))
794 : {
795 0 : SotStorageStreamRef aStreamRef;
796 0 : bool bOk = aTransferData.GetSotStorageStream(SOT_FORMATSTR_ID_SBA_TABED,aStreamRef);
797 0 : if (bOk && aStreamRef.Is())
798 : {
799 0 : aStreamRef->Seek(STREAM_SEEK_TO_BEGIN);
800 0 : aStreamRef->ResetError();
801 0 : long nInsertRow = nRow;
802 0 : OUString aFieldName;
803 0 : ::boost::shared_ptr<OTableRow> pRow;
804 0 : sal_Int32 nSize = 0;
805 0 : (*aStreamRef).ReadInt32( nSize );
806 0 : vInsertedUndoRedoRows.reserve(nSize);
807 0 : for(sal_Int32 i=0;i < nSize;++i)
808 : {
809 0 : pRow.reset(new OTableRow());
810 0 : ReadOTableRow( *aStreamRef, *pRow );
811 0 : pRow->SetReadOnly( false );
812 0 : sal_Int32 nType = pRow->GetActFieldDescr()->GetType();
813 0 : if ( pRow->GetActFieldDescr() )
814 0 : pRow->GetActFieldDescr()->SetType(GetView()->getController().getTypeInfoByType(nType));
815 : // Adjust the field names
816 0 : aFieldName = GenerateName( pRow->GetActFieldDescr()->GetName() );
817 0 : pRow->GetActFieldDescr()->SetName( aFieldName );
818 0 : pRow->SetPos(nInsertRow);
819 0 : m_pRowList->insert( m_pRowList->begin()+nInsertRow,pRow );
820 0 : vInsertedUndoRedoRows.push_back(::boost::shared_ptr<OTableRow>(new OTableRow(*pRow)));
821 0 : nInsertRow++;
822 0 : }
823 0 : }
824 : }
825 : // RowInserted calls CursorMoved.
826 : // The UI data should not be stored here.
827 0 : bSaveOnMove = false;
828 0 : RowInserted( nRow,vInsertedUndoRedoRows.size(), true );
829 0 : bSaveOnMove = true;
830 :
831 : // Create the Undo-Action
832 0 : GetUndoManager().AddUndoAction( new OTableEditorInsUndoAct(this, nRow,vInsertedUndoRedoRows) );
833 0 : GetView()->getController().setModified( sal_True );
834 0 : InvalidateFeatures();
835 0 : }
836 :
837 0 : void OTableEditorCtrl::DeleteRows()
838 : {
839 : OSL_ENSURE(GetView()->getController().isDropAllowed(),"Call of DeleteRows not valid here. Please check isDropAllowed!");
840 : // Create the Undo-Action
841 0 : GetUndoManager().AddUndoAction( new OTableEditorDelUndoAct(this) );
842 :
843 : // Delete all marked rows
844 0 : long nIndex = FirstSelectedRow();
845 0 : nOldDataPos = nIndex;
846 0 : bSaveOnMove = false;
847 :
848 0 : while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
849 : {
850 : // Remove rows
851 0 : m_pRowList->erase( m_pRowList->begin()+nIndex );
852 0 : RowRemoved( nIndex, 1, true );
853 :
854 : // Insert the empty row at the end
855 0 : m_pRowList->push_back( ::boost::shared_ptr<OTableRow>(new OTableRow()));
856 0 : RowInserted( GetRowCount()-1, 1, true );
857 :
858 0 : nIndex = FirstSelectedRow();
859 : }
860 :
861 0 : bSaveOnMove = true;
862 :
863 : // Force the current record to be displayed
864 0 : m_nDataPos = GetCurRow();
865 0 : InvalidateStatusCell( nOldDataPos );
866 0 : InvalidateStatusCell( m_nDataPos );
867 0 : SetDataPtr( m_nDataPos );
868 0 : ActivateCell();
869 0 : pDescrWin->DisplayData( pActRow->GetActFieldDescr() );
870 0 : GetView()->getController().setModified( sal_True );
871 0 : InvalidateFeatures();
872 0 : }
873 :
874 0 : void OTableEditorCtrl::InsertNewRows( long nRow )
875 : {
876 : OSL_ENSURE(GetView()->getController().isAddAllowed(),"Call of InsertNewRows not valid here. Please check isAppendAllowed!");
877 : // Create Undo-Action
878 0 : long nInsertRows = GetSelectRowCount();
879 0 : if( !nInsertRows )
880 0 : nInsertRows = 1;
881 0 : GetUndoManager().AddUndoAction( new OTableEditorInsNewUndoAct(this, nRow, nInsertRows) );
882 : // Insert the number of of selected rows
883 0 : for( long i=nRow; i<(nRow+nInsertRows); i++ )
884 0 : m_pRowList->insert( m_pRowList->begin()+i ,::boost::shared_ptr<OTableRow>(new OTableRow()));
885 0 : RowInserted( nRow, nInsertRows, true );
886 :
887 0 : GetView()->getController().setModified( sal_True );
888 0 : InvalidateFeatures();
889 0 : }
890 :
891 0 : OUString OTableEditorCtrl::GetControlText( long nRow, sal_uInt16 nColId )
892 : {
893 : // Read the Browser Controls
894 0 : if( nColId < FIELD_FIRST_VIRTUAL_COLUMN )
895 : {
896 0 : GoToRow( nRow );
897 0 : GoToColumnId( nColId );
898 0 : CellControllerRef xController = Controller();
899 0 : if(xController.Is())
900 0 : return xController->GetWindow().GetText();
901 : else
902 0 : return GetCellText(nRow,nColId);
903 : }
904 :
905 : // Read the Controls on the Tabpage
906 : else
907 0 : return pDescrWin->GetControlText( nColId );
908 : }
909 :
910 0 : void OTableEditorCtrl::SetControlText( long nRow, sal_uInt16 nColId, const OUString& rText )
911 : {
912 : // Set the Browser Controls
913 0 : if( nColId < FIELD_FIRST_VIRTUAL_COLUMN )
914 : {
915 0 : GoToRow( nRow );
916 0 : GoToColumnId( nColId );
917 0 : CellControllerRef xController = Controller();
918 0 : if(xController.Is())
919 0 : xController->GetWindow().SetText( rText );
920 : else
921 0 : RowModified(nRow,nColId);
922 : }
923 :
924 : // Set the Tabpage controls
925 : else
926 : {
927 0 : pDescrWin->SetControlText( nColId, rText );
928 : }
929 0 : }
930 :
931 0 : void OTableEditorCtrl::SetCellData( long nRow, sal_uInt16 nColId, const TOTypeInfoSP& _pTypeInfo )
932 : {
933 : // Relocate the current pointer
934 0 : if( nRow == -1 )
935 0 : nRow = GetCurRow();
936 0 : OFieldDescription* pFieldDescr = GetFieldDescr( nRow );
937 0 : if( !pFieldDescr && nColId != FIELD_TYPE)
938 0 : return;
939 :
940 : // Set individual fields
941 0 : switch( nColId )
942 : {
943 : case FIELD_TYPE:
944 0 : SwitchType( _pTypeInfo );
945 0 : break;
946 : default:
947 : OSL_FAIL("OTableEditorCtrl::SetCellData: invalid column!");
948 : }
949 0 : SetControlText(nRow,nColId,_pTypeInfo.get() ? _pTypeInfo->aUIName : OUString());
950 : }
951 :
952 0 : void OTableEditorCtrl::SetCellData( long nRow, sal_uInt16 nColId, const ::com::sun::star::uno::Any& _rNewData )
953 : {
954 : // Relocate the current pointer
955 0 : if( nRow == -1 )
956 0 : nRow = GetCurRow();
957 0 : OFieldDescription* pFieldDescr = GetFieldDescr( nRow );
958 0 : if( !pFieldDescr && nColId != FIELD_TYPE)
959 0 : return;
960 :
961 0 : OUString sValue;
962 : // Set indvidual fields
963 0 : switch( nColId )
964 : {
965 : case FIELD_NAME:
966 0 : sValue = ::comphelper::getString(_rNewData);
967 0 : pFieldDescr->SetName( sValue );
968 0 : break;
969 :
970 : case FIELD_TYPE:
971 : OSL_FAIL("OTableEditorCtrl::SetCellData: invalid column!");
972 0 : break;
973 :
974 : case COLUMN_DESCRIPTION:
975 0 : pFieldDescr->SetDescription( sValue = ::comphelper::getString(_rNewData) );
976 0 : break;
977 :
978 : case FIELD_PROPERTY_DEFAULT:
979 0 : pFieldDescr->SetControlDefault( _rNewData );
980 0 : sValue = GetView()->GetDescWin()->getGenPage()->getFieldControl()->getControlDefault(pFieldDescr);
981 0 : break;
982 :
983 : case FIELD_PROPERTY_REQUIRED:
984 : {
985 0 : sValue = ::comphelper::getString(_rNewData);
986 0 : pFieldDescr->SetIsNullable( sValue.toInt32() );
987 : }
988 0 : break;
989 :
990 : case FIELD_PROPERTY_TEXTLEN:
991 : case FIELD_PROPERTY_LENGTH:
992 : {
993 0 : sValue = ::comphelper::getString(_rNewData);
994 0 : pFieldDescr->SetPrecision( sValue.toInt32() );
995 : }
996 0 : break;
997 :
998 : case FIELD_PROPERTY_NUMTYPE:
999 : OSL_FAIL("OTableEditorCtrl::SetCellData: invalid column!");
1000 0 : break;
1001 :
1002 : case FIELD_PROPERTY_AUTOINC:
1003 : {
1004 0 : OUString strYes(ModuleRes(STR_VALUE_YES));
1005 0 : sValue = ::comphelper::getString(_rNewData);
1006 0 : pFieldDescr->SetAutoIncrement(sValue == strYes);
1007 : }
1008 0 : break;
1009 : case FIELD_PROPERTY_SCALE:
1010 : {
1011 0 : sValue = ::comphelper::getString(_rNewData);
1012 0 : pFieldDescr->SetScale(sValue.toInt32());
1013 : }
1014 0 : break;
1015 :
1016 : case FIELD_PROPERTY_BOOL_DEFAULT:
1017 0 : sValue = GetView()->GetDescWin()->BoolStringPersistent(::comphelper::getString(_rNewData));
1018 0 : pFieldDescr->SetControlDefault(makeAny(OUString(sValue)));
1019 0 : break;
1020 :
1021 : case FIELD_PROPERTY_FORMAT:
1022 : {
1023 0 : sValue = ::comphelper::getString(_rNewData);
1024 0 : pFieldDescr->SetFormatKey(sValue.toInt32());
1025 : }
1026 0 : break;
1027 : }
1028 :
1029 0 : SetControlText(nRow,nColId,sValue);
1030 : }
1031 :
1032 0 : Any OTableEditorCtrl::GetCellData( long nRow, sal_uInt16 nColId )
1033 : {
1034 0 : OFieldDescription* pFieldDescr = GetFieldDescr( nRow );
1035 0 : if( !pFieldDescr )
1036 0 : return Any();
1037 :
1038 : // Relocate the current pointer
1039 0 : if( nRow==-1 )
1040 0 : nRow = GetCurRow();
1041 0 : SetDataPtr( nRow );
1042 :
1043 0 : static const OUString strYes(ModuleRes(STR_VALUE_YES));
1044 0 : static const OUString strNo(ModuleRes(STR_VALUE_NO));
1045 0 : OUString sValue;
1046 : // Read out the fields
1047 0 : switch( nColId )
1048 : {
1049 : case FIELD_NAME:
1050 0 : sValue = pFieldDescr->GetName();
1051 0 : break;
1052 :
1053 : case FIELD_TYPE:
1054 0 : if ( pFieldDescr->getTypeInfo() )
1055 0 : sValue = pFieldDescr->getTypeInfo()->aUIName;
1056 0 : break;
1057 :
1058 : case COLUMN_DESCRIPTION:
1059 0 : sValue = pFieldDescr->GetDescription();
1060 0 : break;
1061 : case HELP_TEXT:
1062 0 : sValue = pFieldDescr->GetHelpText();
1063 0 : break;
1064 :
1065 : case FIELD_PROPERTY_DEFAULT:
1066 0 : return pFieldDescr->GetControlDefault();
1067 :
1068 : case FIELD_PROPERTY_REQUIRED:
1069 0 : sValue = pFieldDescr->GetIsNullable() == ColumnValue::NULLABLE ? strYes : strNo;
1070 0 : break;
1071 :
1072 : case FIELD_PROPERTY_TEXTLEN:
1073 : case FIELD_PROPERTY_LENGTH:
1074 0 : sValue = OUString::number(pFieldDescr->GetPrecision());
1075 0 : break;
1076 :
1077 : case FIELD_PROPERTY_NUMTYPE:
1078 : OSL_FAIL("OTableEditorCtrl::GetCellData: invalid column!");
1079 0 : break;
1080 :
1081 : case FIELD_PROPERTY_AUTOINC:
1082 0 : sValue = pFieldDescr->IsAutoIncrement() ? strYes : strNo;
1083 0 : break;
1084 :
1085 : case FIELD_PROPERTY_SCALE:
1086 0 : sValue = OUString::number(pFieldDescr->GetScale());
1087 0 : break;
1088 :
1089 : case FIELD_PROPERTY_BOOL_DEFAULT:
1090 0 : sValue = GetView()->GetDescWin()->BoolStringUI(::comphelper::getString(pFieldDescr->GetControlDefault()));
1091 0 : break;
1092 :
1093 : case FIELD_PROPERTY_FORMAT:
1094 0 : sValue = OUString::number(pFieldDescr->GetFormatKey());
1095 0 : break;
1096 : }
1097 :
1098 0 : return makeAny(sValue);
1099 : }
1100 :
1101 0 : OUString OTableEditorCtrl::GetCellText( long nRow, sal_uInt16 nColId ) const
1102 : {
1103 0 : OUString sCellText;
1104 0 : const_cast< OTableEditorCtrl* >( this )->GetCellData( nRow, nColId ) >>= sCellText;
1105 0 : return sCellText;
1106 : }
1107 :
1108 0 : sal_uInt32 OTableEditorCtrl::GetTotalCellWidth(long nRow, sal_uInt16 nColId)
1109 : {
1110 0 : return GetTextWidth(GetCellText(nRow, nColId)) + 2 * GetTextWidth(OUString('0'));
1111 : }
1112 :
1113 0 : OFieldDescription* OTableEditorCtrl::GetFieldDescr( long nRow )
1114 : {
1115 : std::vector< ::boost::shared_ptr<OTableRow> >::size_type nListCount(
1116 0 : m_pRowList->size());
1117 0 : if( (nRow<0) || (sal::static_int_cast< unsigned long >(nRow)>=nListCount) )
1118 : {
1119 : OSL_FAIL("(nRow<0) || (nRow>=nListCount)");
1120 0 : return NULL;
1121 : }
1122 0 : ::boost::shared_ptr<OTableRow> pRow = (*m_pRowList)[ nRow ];
1123 0 : if( !pRow )
1124 0 : return NULL;
1125 0 : return pRow->GetActFieldDescr();
1126 : }
1127 :
1128 0 : bool OTableEditorCtrl::IsCutAllowed( long nRow )
1129 : {
1130 0 : bool bIsCutAllowed = (GetView()->getController().isAddAllowed() && GetView()->getController().isDropAllowed()) ||
1131 0 : GetView()->getController().isAlterAllowed();
1132 :
1133 0 : if(bIsCutAllowed)
1134 : {
1135 0 : switch(m_eChildFocus)
1136 : {
1137 : case DESCRIPTION:
1138 0 : bIsCutAllowed = !pDescrCell->GetSelected().isEmpty();
1139 0 : break;
1140 : case HELPTEXT:
1141 0 : bIsCutAllowed = !pHelpTextCell->GetSelected().isEmpty();
1142 0 : break;
1143 : case NAME:
1144 0 : bIsCutAllowed = !pNameCell->GetSelected().isEmpty();
1145 0 : break;
1146 : case ROW:
1147 0 : bIsCutAllowed = IsCopyAllowed(nRow);
1148 0 : break;
1149 : default:
1150 0 : bIsCutAllowed = false;
1151 0 : break;
1152 : }
1153 : }
1154 :
1155 0 : return bIsCutAllowed;
1156 : }
1157 :
1158 0 : bool OTableEditorCtrl::IsCopyAllowed( long /*nRow*/ )
1159 : {
1160 0 : bool bIsCopyAllowed = false;
1161 0 : if(m_eChildFocus == DESCRIPTION )
1162 0 : bIsCopyAllowed = !pDescrCell->GetSelected().isEmpty();
1163 0 : else if(HELPTEXT == m_eChildFocus )
1164 0 : bIsCopyAllowed = !pHelpTextCell->GetSelected().isEmpty();
1165 0 : else if(m_eChildFocus == NAME)
1166 0 : bIsCopyAllowed = !pNameCell->GetSelected().isEmpty();
1167 0 : else if(m_eChildFocus == ROW)
1168 : {
1169 0 : Reference<XPropertySet> xTable = GetView()->getController().getTable();
1170 0 : if( !GetSelectRowCount() || (xTable.is() && ::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == "VIEW"))
1171 0 : return false;
1172 :
1173 : // If one of the selected rows is empty, Copy is not possible
1174 0 : ::boost::shared_ptr<OTableRow> pRow;
1175 0 : long nIndex = FirstSelectedRow();
1176 0 : while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1177 : {
1178 0 : pRow = (*m_pRowList)[nIndex];
1179 0 : if( !pRow->GetActFieldDescr() )
1180 0 : return false;
1181 :
1182 0 : nIndex = NextSelectedRow();
1183 : }
1184 :
1185 0 : bIsCopyAllowed = true;
1186 : }
1187 :
1188 0 : return bIsCopyAllowed;
1189 : }
1190 :
1191 0 : bool OTableEditorCtrl::IsPasteAllowed( long /*nRow*/ )
1192 : {
1193 0 : bool bAllowed = GetView()->getController().isAddAllowed();
1194 0 : if ( bAllowed )
1195 : {
1196 0 : TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
1197 0 : bool bRowFormat = aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_TABED);
1198 0 : if ( m_eChildFocus == ROW )
1199 0 : bAllowed = bRowFormat;
1200 : else
1201 0 : bAllowed = !bRowFormat && aTransferData.HasFormat(SOT_FORMAT_STRING);
1202 : }
1203 :
1204 0 : return bAllowed;
1205 : }
1206 :
1207 0 : void OTableEditorCtrl::cut()
1208 : {
1209 0 : if(m_eChildFocus == NAME)
1210 : {
1211 0 : if(GetView()->getController().isAlterAllowed())
1212 : {
1213 0 : SaveData(-1,FIELD_NAME);
1214 0 : pNameCell->Cut();
1215 0 : CellModified(-1,FIELD_NAME);
1216 : }
1217 : }
1218 0 : else if(m_eChildFocus == DESCRIPTION)
1219 : {
1220 0 : if(GetView()->getController().isAlterAllowed())
1221 : {
1222 0 : SaveData(-1,COLUMN_DESCRIPTION);
1223 0 : pDescrCell->Cut();
1224 0 : CellModified(-1,COLUMN_DESCRIPTION);
1225 : }
1226 : }
1227 0 : else if(HELPTEXT == m_eChildFocus )
1228 : {
1229 0 : if(GetView()->getController().isAlterAllowed())
1230 : {
1231 0 : SaveData(-1,HELP_TEXT);
1232 0 : pHelpTextCell->Cut();
1233 0 : CellModified(-1,HELP_TEXT);
1234 : }
1235 : }
1236 0 : else if(m_eChildFocus == ROW)
1237 : {
1238 0 : if (nCutEvent)
1239 0 : Application::RemoveUserEvent(nCutEvent);
1240 0 : nCutEvent = Application::PostUserEvent(LINK(this, OTableEditorCtrl, DelayedCut));
1241 : }
1242 0 : }
1243 :
1244 0 : void OTableEditorCtrl::copy()
1245 : {
1246 0 : if(GetSelectRowCount())
1247 0 : OTableRowView::copy();
1248 0 : else if(m_eChildFocus == NAME)
1249 0 : pNameCell->Copy();
1250 0 : else if(HELPTEXT == m_eChildFocus )
1251 0 : pHelpTextCell->Copy();
1252 0 : else if(m_eChildFocus == DESCRIPTION )
1253 0 : pDescrCell->Copy();
1254 0 : }
1255 :
1256 0 : void OTableEditorCtrl::paste()
1257 : {
1258 0 : TransferableDataHelper aTransferData(TransferableDataHelper::CreateFromSystemClipboard(GetParent()));
1259 0 : if(aTransferData.HasFormat(SOT_FORMATSTR_ID_SBA_TABED))
1260 : {
1261 0 : if( nPasteEvent )
1262 0 : Application::RemoveUserEvent( nPasteEvent );
1263 0 : nPasteEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, DelayedPaste) );
1264 : }
1265 0 : else if(m_eChildFocus == NAME)
1266 : {
1267 0 : if(GetView()->getController().isAlterAllowed())
1268 : {
1269 0 : pNameCell->Paste();
1270 0 : CellModified();
1271 : }
1272 : }
1273 0 : else if(HELPTEXT == m_eChildFocus )
1274 : {
1275 0 : if(GetView()->getController().isAlterAllowed())
1276 : {
1277 0 : pHelpTextCell->Paste();
1278 0 : CellModified();
1279 : }
1280 : }
1281 0 : else if(m_eChildFocus == DESCRIPTION)
1282 : {
1283 0 : if(GetView()->getController().isAlterAllowed())
1284 : {
1285 0 : pDescrCell->Paste();
1286 0 : CellModified();
1287 : }
1288 0 : }
1289 0 : }
1290 :
1291 0 : bool OTableEditorCtrl::IsDeleteAllowed( long /*nRow*/ )
1292 : {
1293 :
1294 0 : return GetSelectRowCount() != 0 && GetView()->getController().isDropAllowed();
1295 : }
1296 :
1297 0 : bool OTableEditorCtrl::IsInsertNewAllowed( long nRow )
1298 : {
1299 :
1300 0 : bool bInsertNewAllowed = GetView()->getController().isAddAllowed();
1301 : // If fields can be added, Paste in the new fields
1302 0 : if (bInsertNewAllowed && !GetView()->getController().isDropAllowed())
1303 : {
1304 0 : SetDataPtr(nRow);
1305 0 : if( GetActRow()->IsReadOnly() )
1306 0 : return false;
1307 : }
1308 :
1309 0 : return bInsertNewAllowed;
1310 : }
1311 :
1312 0 : bool OTableEditorCtrl::IsPrimaryKeyAllowed( long /*nRow*/ )
1313 : {
1314 0 : if( !GetSelectRowCount() )
1315 0 : return false;
1316 :
1317 0 : OTableController& rController = GetView()->getController();
1318 0 : if ( !rController.getSdbMetaData().supportsPrimaryKeys() )
1319 0 : return false;
1320 :
1321 0 : Reference<XPropertySet> xTable = rController.getTable();
1322 : // Key must not be changed
1323 : // This applies only if the table is not new and not a ::com::sun::star::sdbcx::View. Otherwise no DROP is executed
1324 :
1325 0 : if(xTable.is() && ::comphelper::getString(xTable->getPropertyValue(PROPERTY_TYPE)) == "VIEW")
1326 0 : return false;
1327 : // If there is an empty field, no primary key
1328 : // The entry is only permitted if
1329 : // - there are no empty entries in the selection
1330 : // - No Memo or Image entries
1331 : // - DROP is not permitted (see above) and the column is not Required (not null flag is not set).
1332 0 : long nIndex = FirstSelectedRow();
1333 0 : ::boost::shared_ptr<OTableRow> pRow;
1334 0 : while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1335 : {
1336 0 : pRow = (*m_pRowList)[nIndex];
1337 0 : OFieldDescription* pFieldDescr = pRow->GetActFieldDescr();
1338 0 : if(!pFieldDescr)
1339 0 : return false;
1340 : else
1341 : {
1342 : // Memo and Image fields cannot be primary keys
1343 : // or if the column cannot be dropped and the Required flag is not set
1344 : // or if a ::com::sun::star::sdbcx::View is available and the Required flag is not set
1345 0 : TOTypeInfoSP pTypeInfo = pFieldDescr->getTypeInfo();
1346 0 : if( pTypeInfo->nSearchType == ColumnSearch::NONE
1347 0 : || (pFieldDescr->IsNullable() && pRow->IsReadOnly())
1348 : )
1349 0 : return false;
1350 : }
1351 :
1352 0 : nIndex = NextSelectedRow();
1353 : }
1354 :
1355 0 : return true;
1356 : }
1357 :
1358 0 : void OTableEditorCtrl::Command(const CommandEvent& rEvt)
1359 : {
1360 0 : switch (rEvt.GetCommand())
1361 : {
1362 : case COMMAND_CONTEXTMENU:
1363 : {
1364 0 : Point aMenuPos( rEvt.GetMousePosPixel() );
1365 0 : if (!rEvt.IsMouseEvent())
1366 : {
1367 0 : if ( 1 == GetSelectColumnCount() )
1368 : {
1369 : sal_uInt16 nSelId = GetColumnId(
1370 : sal::static_int_cast< sal_uInt16 >(
1371 0 : FirstSelectedColumn() ) );
1372 0 : ::Rectangle aColRect( GetFieldRectPixel( 0, nSelId, false ) );
1373 :
1374 0 : aMenuPos = aColRect.TopCenter();
1375 : }
1376 0 : else if ( GetSelectRowCount() > 0 )
1377 : {
1378 0 : ::Rectangle aColRect( GetFieldRectPixel( FirstSelectedRow(), HANDLE_ID, true ) );
1379 :
1380 0 : aMenuPos = aColRect.TopCenter();
1381 : }
1382 : else
1383 : {
1384 0 : OTableRowView::Command(rEvt);
1385 0 : return;
1386 : }
1387 : }
1388 :
1389 : // Show the Context menu
1390 0 : if( !IsReadOnly() )
1391 : {
1392 0 : sal_uInt16 nColId = GetColumnAtXPosPixel(aMenuPos.X());
1393 0 : long nRow = GetRowAtYPosPixel(aMenuPos.Y());
1394 :
1395 0 : if ( HANDLE_ID != nColId )
1396 : {
1397 0 : if ( nRow < 0 && nColId != BROWSER_INVALIDID )
1398 : { // hit the header
1399 0 : if ( 3 != nColId )
1400 : { // 3 would mean the last column, and this last column is auto-sized
1401 0 : if ( !IsColumnSelected( nColId ) )
1402 0 : SelectColumnId( nColId );
1403 :
1404 0 : PopupMenu aContextMenu( ModuleRes( RID_QUERYCOLPOPUPMENU ) );
1405 0 : aContextMenu.EnableItem( SID_DELETE, false );
1406 0 : aContextMenu.RemoveDisabledEntries(true, true);
1407 0 : switch ( aContextMenu.Execute( this, aMenuPos ) )
1408 : {
1409 : case ID_BROWSER_COLWIDTH:
1410 0 : adjustBrowseBoxColumnWidth( this, nColId );
1411 0 : break;
1412 0 : }
1413 : }
1414 : }
1415 : }
1416 : else
1417 : {
1418 0 : PopupMenu aContextMenu(ModuleRes(RID_TABLEDESIGNROWPOPUPMENU));
1419 :
1420 0 : aContextMenu.EnableItem( SID_CUT, IsCutAllowed(nRow) );
1421 0 : aContextMenu.EnableItem( SID_COPY, IsCopyAllowed(nRow) );
1422 0 : aContextMenu.EnableItem( SID_PASTE, IsPasteAllowed(nRow) );
1423 0 : aContextMenu.EnableItem( SID_DELETE, IsDeleteAllowed(nRow) );
1424 0 : aContextMenu.EnableItem( SID_TABLEDESIGN_TABED_PRIMARYKEY, IsPrimaryKeyAllowed(nRow) );
1425 0 : aContextMenu.EnableItem( SID_TABLEDESIGN_INSERTROWS, IsInsertNewAllowed(nRow) );
1426 0 : aContextMenu.CheckItem( SID_TABLEDESIGN_TABED_PRIMARYKEY, IsRowSelected(GetCurRow()) && IsPrimaryKey() );
1427 :
1428 : // remove all the disable entries
1429 0 : aContextMenu.RemoveDisabledEntries(true, true);
1430 :
1431 0 : if( SetDataPtr(m_nDataPos) )
1432 0 : pDescrWin->SaveData( pActRow->GetActFieldDescr() );
1433 :
1434 : // All actions which change the number of rows must be run asynchronously
1435 : // otherwise there may be problems between the Context menu and the Browser
1436 0 : m_nDataPos = GetCurRow();
1437 0 : switch (aContextMenu.Execute(this, aMenuPos))
1438 : {
1439 : case SID_CUT:
1440 0 : cut();
1441 0 : break;
1442 : case SID_COPY:
1443 0 : copy();
1444 0 : break;
1445 : case SID_PASTE:
1446 0 : paste();
1447 0 : break;
1448 : case SID_DELETE:
1449 0 : if( nDeleteEvent )
1450 0 : Application::RemoveUserEvent( nDeleteEvent );
1451 0 : nDeleteEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, DelayedDelete) );
1452 0 : break;
1453 : case SID_TABLEDESIGN_INSERTROWS:
1454 0 : if( nInsNewRowsEvent )
1455 0 : Application::RemoveUserEvent( nInsNewRowsEvent );
1456 0 : nInsNewRowsEvent = Application::PostUserEvent( LINK(this, OTableEditorCtrl, DelayedInsNewRows) );
1457 0 : break;
1458 : case SID_TABLEDESIGN_TABED_PRIMARYKEY:
1459 0 : SetPrimaryKey( !IsPrimaryKey() );
1460 0 : break;
1461 : default:
1462 0 : break;
1463 0 : }
1464 : }
1465 : }
1466 : }
1467 0 : break;
1468 : default:
1469 0 : OTableRowView::Command(rEvt);
1470 : }
1471 :
1472 : }
1473 :
1474 0 : IMPL_LINK( OTableEditorCtrl, DelayedCut, void*, /*EMPTYTAG*/ )
1475 : {
1476 0 : nCutEvent = 0;
1477 0 : OTableRowView::cut();
1478 0 : return 0;
1479 : }
1480 :
1481 0 : IMPL_LINK( OTableEditorCtrl, DelayedPaste, void*, /*EMPTYTAG*/ )
1482 : {
1483 0 : nPasteEvent = 0;
1484 :
1485 0 : sal_Int32 nPastePosition = GetView()->getController().getFirstEmptyRowPosition();
1486 0 : if ( !GetView()->getController().getTable().is() )
1487 0 : nPastePosition = GetSelectRowCount() ? FirstSelectedRow() : GetCurRow();
1488 :
1489 0 : if (!IsInsertNewAllowed(nPastePosition))
1490 : { // Insertion is not allowed, only appending, so test if there are full cells after the PastePosition
1491 :
1492 : sal_Int32 nFreeFromPos; // from here on there are only empty rows
1493 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::reverse_iterator aIter = m_pRowList->rbegin();
1494 0 : for(nFreeFromPos = m_pRowList->size();
1495 0 : aIter != m_pRowList->rend() && (!(*aIter) || !(*aIter)->GetActFieldDescr() || (*aIter)->GetActFieldDescr()->GetName().isEmpty());
1496 : --nFreeFromPos, ++aIter)
1497 : ;
1498 0 : if (nPastePosition < nFreeFromPos) // if at least one PastePosition is full, go right to the end
1499 0 : nPastePosition = nFreeFromPos;
1500 : }
1501 :
1502 0 : OTableRowView::Paste( nPastePosition );
1503 0 : SetNoSelection();
1504 0 : GoToRow( nPastePosition );
1505 :
1506 0 : return 0;
1507 : }
1508 :
1509 0 : IMPL_LINK( OTableEditorCtrl, DelayedDelete, void*, /*EMPTYTAG*/ )
1510 : {
1511 0 : nDeleteEvent = 0;
1512 0 : DeleteRows();
1513 0 : return 0;
1514 : }
1515 :
1516 0 : IMPL_LINK( OTableEditorCtrl, DelayedInsNewRows, void*, /*EMPTYTAG*/ )
1517 : {
1518 0 : nInsNewRowsEvent = 0;
1519 0 : sal_Int32 nPastePosition = GetView()->getController().getFirstEmptyRowPosition();
1520 0 : if ( !GetView()->getController().getTable().is() )
1521 0 : nPastePosition = GetSelectRowCount() ? FirstSelectedRow() : m_nDataPos;
1522 :
1523 0 : InsertNewRows( nPastePosition );
1524 0 : SetNoSelection();
1525 0 : GoToRow( nPastePosition );
1526 :
1527 0 : return 0;
1528 : }
1529 :
1530 0 : void OTableEditorCtrl::AdjustFieldDescription(OFieldDescription* _pFieldDesc,
1531 : MultiSelection& _rMultiSel,
1532 : sal_Int32 _nPos,
1533 : bool _bSet,
1534 : bool _bPrimaryKey)
1535 : {
1536 0 : _pFieldDesc->SetPrimaryKey( _bPrimaryKey );
1537 0 : if(!_bSet && _pFieldDesc->getTypeInfo()->bNullable)
1538 : {
1539 0 : _pFieldDesc->SetIsNullable(ColumnValue::NO_NULLS);
1540 0 : _pFieldDesc->SetControlDefault(Any());
1541 : }
1542 0 : if ( _pFieldDesc->IsAutoIncrement() && !_bPrimaryKey )
1543 : {
1544 0 : OTableController& rController = GetView()->getController();
1545 0 : if ( rController.isAutoIncrementPrimaryKey() )
1546 : {
1547 0 : _pFieldDesc->SetAutoIncrement(false);
1548 : }
1549 : }
1550 : // update field description
1551 0 : pDescrWin->DisplayData(_pFieldDesc);
1552 :
1553 0 : _rMultiSel.Insert( _nPos );
1554 0 : _rMultiSel.Select( _nPos );
1555 0 : }
1556 :
1557 0 : void OTableEditorCtrl::SetPrimaryKey( bool bSet )
1558 : {
1559 : // Delete any existing Primary Keys
1560 0 : MultiSelection aDeletedPrimKeys;
1561 0 : aDeletedPrimKeys.SetTotalRange( Range(0,GetRowCount()) );
1562 :
1563 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_pRowList->begin();
1564 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aEnd = m_pRowList->end();
1565 0 : for(sal_Int32 nRow = 0;aIter != aEnd;++aIter,++nRow)
1566 : {
1567 0 : OFieldDescription* pFieldDescr = (*aIter)->GetActFieldDescr();
1568 0 : if( pFieldDescr && (*aIter)->IsPrimaryKey() && (!bSet || !IsRowSelected(nRow)) )
1569 : {
1570 0 : AdjustFieldDescription(pFieldDescr,aDeletedPrimKeys,nRow,bSet,false);
1571 : }
1572 : }
1573 :
1574 : // Set the primary keys of the marked rows
1575 0 : MultiSelection aInsertedPrimKeys;
1576 0 : aInsertedPrimKeys.SetTotalRange( Range(0,GetRowCount()) );
1577 0 : if( bSet )
1578 : {
1579 0 : long nIndex = FirstSelectedRow();
1580 0 : while( nIndex >= 0 && nIndex < static_cast<long>(m_pRowList->size()) )
1581 : {
1582 : // Set the key
1583 0 : ::boost::shared_ptr<OTableRow> pRow = (*m_pRowList)[nIndex];
1584 0 : OFieldDescription* pFieldDescr = pRow->GetActFieldDescr();
1585 0 : if(pFieldDescr)
1586 0 : AdjustFieldDescription(pFieldDescr,aInsertedPrimKeys,nIndex,false,true);
1587 :
1588 0 : nIndex = NextSelectedRow();
1589 0 : }
1590 : }
1591 :
1592 0 : GetUndoManager().AddUndoAction( new OPrimKeyUndoAct(this, aDeletedPrimKeys, aInsertedPrimKeys) );
1593 :
1594 : // Invalidate the handle-columns
1595 0 : InvalidateHandleColumn();
1596 :
1597 : // Set the TableDocSh's ModifyFlag
1598 0 : GetView()->getController().setModified( sal_True );
1599 0 : InvalidateFeatures();
1600 0 : }
1601 :
1602 0 : bool OTableEditorCtrl::IsPrimaryKey()
1603 : {
1604 : // Are all marked fields part of the Primary Key ?
1605 0 : long nPrimaryKeys = 0;
1606 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aIter = m_pRowList->begin();
1607 0 : ::std::vector< ::boost::shared_ptr<OTableRow> >::const_iterator aEnd = m_pRowList->end();
1608 0 : for(sal_Int32 nRow=0;aIter != aEnd;++aIter,++nRow)
1609 : {
1610 0 : if( IsRowSelected(nRow) && !(*aIter)->IsPrimaryKey() )
1611 0 : return false;
1612 0 : if( (*aIter)->IsPrimaryKey() )
1613 0 : ++nPrimaryKeys;
1614 : }
1615 :
1616 : // Are there any unselected fields that are part of the Key ?
1617 0 : return GetSelectRowCount() == nPrimaryKeys;
1618 : }
1619 :
1620 0 : void OTableEditorCtrl::SwitchType( const TOTypeInfoSP& _pType )
1621 : {
1622 : // if there is no assigned field name
1623 0 : long nRow(GetCurRow());
1624 0 : OFieldDescription* pActFieldDescr = GetFieldDescr( nRow );
1625 0 : if( pActFieldDescr )
1626 : // Store the old description
1627 0 : pDescrWin->SaveData( pActFieldDescr );
1628 :
1629 0 : if ( nRow < 0 || nRow > static_cast<long>(m_pRowList->size()) )
1630 0 : return;
1631 : // Show the new description
1632 0 : ::boost::shared_ptr<OTableRow> pRow = (*m_pRowList)[nRow];
1633 0 : pRow->SetFieldType( _pType, true );
1634 0 : if ( _pType.get() )
1635 : {
1636 0 : const sal_Int32 nCurrentlySelected = pTypeCell->GetSelectEntryPos();
1637 :
1638 0 : if ( ( LISTBOX_ENTRY_NOTFOUND == nCurrentlySelected )
1639 0 : || ( GetView()->getController().getTypeInfo( nCurrentlySelected ) != _pType )
1640 : )
1641 : {
1642 0 : sal_Int32 nEntryPos = 0;
1643 0 : const OTypeInfoMap& rTypeInfo = GetView()->getController().getTypeInfo();
1644 0 : OTypeInfoMap::const_iterator aIter = rTypeInfo.begin();
1645 0 : OTypeInfoMap::const_iterator aEnd = rTypeInfo.end();
1646 0 : for(;aIter != aEnd;++aIter,++nEntryPos)
1647 : {
1648 0 : if(aIter->second == _pType)
1649 0 : break;
1650 : }
1651 0 : if (nEntryPos < pTypeCell->GetEntryCount())
1652 0 : pTypeCell->SelectEntryPos( nEntryPos );
1653 : }
1654 : }
1655 :
1656 0 : pActFieldDescr = pRow->GetActFieldDescr();
1657 0 : if (pActFieldDescr != NULL && !pActFieldDescr->GetFormatKey())
1658 : {
1659 : sal_Int32 nFormatKey = ::dbtools::getDefaultNumberFormat( pActFieldDescr->GetType(),
1660 : pActFieldDescr->GetScale(),
1661 0 : pActFieldDescr->IsCurrency(),
1662 0 : Reference< XNumberFormatTypes>(GetView()->getController().getNumberFormatter()->getNumberFormatsSupplier()->getNumberFormats(),UNO_QUERY),
1663 0 : GetView()->getLocale());
1664 :
1665 0 : pActFieldDescr->SetFormatKey(nFormatKey);
1666 : }
1667 :
1668 0 : pDescrWin->DisplayData( pActFieldDescr );
1669 : }
1670 :
1671 0 : OTableDesignView* OTableEditorCtrl::GetView() const
1672 : {
1673 0 : return static_cast<OTableDesignView*>(GetParent()->GetParent());
1674 : }
1675 :
1676 0 : void OTableEditorCtrl::DeactivateCell(bool bUpdate)
1677 : {
1678 0 : OTableRowView::DeactivateCell(bUpdate);
1679 : // now we have to deactivate the field description
1680 0 : long nRow(GetCurRow());
1681 0 : if (pDescrWin)
1682 0 : pDescrWin->SetReadOnly(bReadOnly || !SetDataPtr(nRow) || GetActRow()->IsReadOnly());
1683 0 : }
1684 :
1685 0 : bool OTableEditorCtrl::PreNotify( NotifyEvent& rNEvt )
1686 : {
1687 0 : if (rNEvt.GetType() == EVENT_GETFOCUS)
1688 : {
1689 0 : if( pHelpTextCell && pHelpTextCell->HasChildPathFocus() )
1690 0 : m_eChildFocus = HELPTEXT;
1691 0 : else if( pDescrCell && pDescrCell->HasChildPathFocus() )
1692 0 : m_eChildFocus = DESCRIPTION;
1693 0 : else if(pNameCell && pNameCell->HasChildPathFocus() )
1694 0 : m_eChildFocus = NAME;
1695 : else
1696 0 : m_eChildFocus = ROW;
1697 : }
1698 :
1699 0 : return OTableRowView::PreNotify(rNEvt);
1700 72 : }
1701 :
1702 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|