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