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