Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "scitems.hxx"
21 : #include <sfx2/viewfrm.hxx>
22 : #include <sfx2/app.hxx>
23 : #include <sfx2/request.hxx>
24 : #include <svl/aeitem.hxx>
25 : #include <basic/sbxcore.hxx>
26 : #include <svl/whiter.hxx>
27 : #include <svl/zforlist.hxx>
28 : #include <vcl/msgbox.hxx>
29 : #include <svl/stritem.hxx>
30 : #include <svl/visitem.hxx>
31 : #include <unotools/moduleoptions.hxx>
32 :
33 : #include <com/sun/star/frame/FrameSearchFlag.hpp>
34 : #include <com/sun/star/sdbc/XResultSet.hpp>
35 :
36 : #include "cellsh.hxx"
37 : #include "tabvwsh.hxx"
38 : #include "sc.hrc"
39 : #include "globstr.hrc"
40 : #include "global.hxx"
41 : #include "globalnames.hxx"
42 : #include "scmod.hxx"
43 : #include "docsh.hxx"
44 : #include "document.hxx"
45 : #include "uiitems.hxx"
46 : #include "dbfunc.hxx"
47 : #include "dbdocfun.hxx"
48 : #include "filtdlg.hxx"
49 : #include "dbnamdlg.hxx"
50 : #include "reffact.hxx"
51 : #include "validat.hxx"
52 : #include "scresid.hxx"
53 :
54 : #include "validate.hrc" // ScValidationDlg
55 : #include "scui_def.hxx"
56 : #include "scabstdlg.hxx"
57 : #include "impex.hxx"
58 : #include "asciiopt.hxx"
59 : #include "queryentry.hxx"
60 : #include "markdata.hxx"
61 :
62 : using namespace com::sun::star;
63 :
64 0 : static bool lcl_GetTextToColumnsRange( const ScViewData* pData, ScRange& rRange )
65 : {
66 : OSL_ENSURE( pData, "lcl_GetTextToColumnsRange: pData is null!" );
67 :
68 0 : bool bRet = false;
69 0 : const ScMarkData& rMark = pData->GetMarkData();
70 :
71 0 : if ( rMark.IsMarked() )
72 : {
73 0 : if ( !rMark.IsMultiMarked() )
74 : {
75 0 : rMark.GetMarkArea( rRange );
76 0 : if ( rRange.aStart.Col() == rRange.aEnd.Col() )
77 : {
78 0 : bRet = true;
79 : }
80 : }
81 : }
82 : else
83 : {
84 0 : const SCCOL nCol = pData->GetCurX();
85 0 : const SCROW nRow = pData->GetCurY();
86 0 : const SCTAB nTab = pData->GetTabNo();
87 0 : rRange = ScRange( nCol, nRow, nTab, nCol, nRow, nTab );
88 0 : bRet = true;
89 : }
90 :
91 0 : const ScDocument* pDoc = pData->GetDocument();
92 : OSL_ENSURE( pDoc, "lcl_GetTextToColumnsRange: pDoc is null!" );
93 :
94 0 : if ( bRet && pDoc->IsBlockEmpty( rRange.aStart.Tab(), rRange.aStart.Col(),
95 0 : rRange.aStart.Row(), rRange.aEnd.Col(),
96 0 : rRange.aEnd.Row() ) )
97 : {
98 0 : bRet = false;
99 : }
100 :
101 0 : return bRet;
102 : }
103 :
104 0 : static sal_Bool lcl_GetSortParam( const ScViewData* pData, ScSortParam& rSortParam )
105 : {
106 0 : ScTabViewShell* pTabViewShell = pData->GetViewShell();
107 0 : ScDBData* pDBData = pTabViewShell->GetDBData();
108 0 : ScDocument* pDoc = pData->GetDocument();
109 0 : SCTAB nTab = pData->GetTabNo();
110 0 : ScDirection eFillDir = DIR_TOP;
111 0 : sal_Bool bSort = sal_True;
112 0 : ScRange aExternalRange;
113 :
114 0 : if( rSortParam.nCol1 != rSortParam.nCol2 )
115 0 : eFillDir = DIR_LEFT;
116 0 : if( rSortParam.nRow1 != rSortParam.nRow2 )
117 0 : eFillDir = DIR_TOP;
118 :
119 0 : SCSIZE nCount = pDoc->GetEmptyLinesInBlock( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab, eFillDir );
120 :
121 0 : if( rSortParam.nRow2 == MAXROW )
122 0 : aExternalRange = ScRange( rSortParam.nCol1,sal::static_int_cast<SCROW>( nCount ), nTab );
123 : else
124 0 : aExternalRange = ScRange( pData->GetCurX(), pData->GetCurY(), nTab );
125 :
126 0 : SCROW nStartRow = aExternalRange.aStart.Row();
127 0 : SCCOL nStartCol = aExternalRange.aStart.Col();
128 0 : SCROW nEndRow = aExternalRange.aEnd.Row();
129 0 : SCCOL nEndCol = aExternalRange.aEnd.Col();
130 0 : pDoc->GetDataArea( aExternalRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow, false, false );
131 0 : aExternalRange.aStart.SetRow( nStartRow );
132 0 : aExternalRange.aStart.SetCol( nStartCol );
133 0 : aExternalRange.aEnd.SetRow( nEndRow );
134 0 : aExternalRange.aEnd.SetCol( nEndCol );
135 :
136 0 : if(( rSortParam.nCol1 == rSortParam.nCol2 && aExternalRange.aStart.Col() != aExternalRange.aEnd.Col() ) ||
137 0 : ( rSortParam.nRow1 == rSortParam.nRow2 && aExternalRange.aStart.Row() != aExternalRange.aEnd.Row() ) )
138 : {
139 0 : sal_uInt16 nFmt = SCA_VALID;
140 0 : String aExtendStr,aCurrentStr;
141 :
142 0 : pTabViewShell->AddHighlightRange( aExternalRange,Color( COL_LIGHTBLUE ) );
143 0 : ScRange rExtendRange( aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), nTab, aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row(), nTab );
144 0 : rExtendRange.Format( aExtendStr, nFmt, pDoc );
145 :
146 0 : ScRange rCurrentRange( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab );
147 0 : rCurrentRange.Format( aCurrentStr, nFmt, pDoc );
148 :
149 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
150 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
151 :
152 0 : AbstractScSortWarningDlg* pWarningDlg = pFact->CreateScSortWarningDlg( pTabViewShell->GetDialogParent(), aExtendStr, aCurrentStr );
153 : OSL_ENSURE(pWarningDlg, "Dialog create fail!");
154 0 : short bResult = pWarningDlg->Execute();
155 0 : if( bResult == BTN_EXTEND_RANGE || bResult == BTN_CURRENT_SELECTION )
156 : {
157 0 : if( bResult == BTN_EXTEND_RANGE )
158 : {
159 0 : pTabViewShell->MarkRange( aExternalRange, false );
160 0 : pDBData->SetArea( nTab, aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row() );
161 : }
162 : }
163 : else
164 : {
165 0 : bSort = false;
166 0 : pData->GetDocShell()->CancelAutoDBRange();
167 : }
168 :
169 0 : delete pWarningDlg;
170 0 : pTabViewShell->ClearHighlightRanges();
171 : }
172 0 : return bSort;
173 : }
174 :
175 : //after end execute from !IsModalInputMode, it is safer to delay deleting
176 : namespace
177 : {
178 0 : long DelayDeleteAbstractDialog( void *pAbstractDialog, void * /*pArg*/ )
179 : {
180 0 : delete reinterpret_cast<SfxAbstractTabDialog*>( pAbstractDialog );
181 0 : return 0;
182 : }
183 : }
184 :
185 0 : void ScCellShell::ExecuteDB( SfxRequest& rReq )
186 : {
187 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
188 0 : sal_uInt16 nSlotId = rReq.GetSlot();
189 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
190 0 : ScModule* pScMod = SC_MOD();
191 :
192 0 : pTabViewShell->HideListBox(); // Autofilter-DropDown-Listbox
193 :
194 0 : if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) )
195 : {
196 0 : pScMod->InputEnterHandler();
197 0 : pTabViewShell->UpdateInputHandler();
198 : }
199 :
200 0 : switch ( nSlotId )
201 : {
202 : case SID_VIEW_DATA_SOURCE_BROWSER:
203 : {
204 : // check if database beamer is open
205 :
206 0 : SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame();
207 0 : sal_Bool bWasOpen = false;
208 : {
209 0 : uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface();
210 0 : uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame(
211 : OUString("_beamer"),
212 0 : frame::FrameSearchFlag::CHILDREN);
213 0 : if ( xBeamerFrame.is() )
214 0 : bWasOpen = sal_True;
215 : }
216 :
217 0 : if ( bWasOpen )
218 : {
219 : // close database beamer: just forward to SfxViewFrame
220 :
221 0 : pViewFrame->ExecuteSlot( rReq );
222 : }
223 : else
224 : {
225 : // show database beamer: SfxViewFrame call must be synchronous
226 :
227 0 : pViewFrame->ExecuteSlot( rReq, (sal_Bool) false ); // sal_False = synchronous
228 :
229 : // select current database in database beamer
230 :
231 0 : ScImportParam aImportParam;
232 0 : ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); // don't create if none found
233 0 : if (pDBData)
234 0 : pDBData->GetImportParam( aImportParam );
235 :
236 0 : ScDBDocFunc::ShowInBeamer( aImportParam, pTabViewShell->GetViewFrame() );
237 : }
238 0 : rReq.Done(); // needed because it's a toggle slot
239 : }
240 0 : break;
241 :
242 : case SID_REIMPORT_DATA:
243 : {
244 0 : sal_Bool bOk = false;
245 0 : ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);
246 0 : if (pDBData)
247 : {
248 0 : ScImportParam aImportParam;
249 0 : pDBData->GetImportParam( aImportParam );
250 0 : if (aImportParam.bImport && !pDBData->HasImportSelection())
251 : {
252 0 : pTabViewShell->ImportData( aImportParam );
253 0 : pDBData->SetImportParam( aImportParam ); //! Undo ??
254 0 : bOk = sal_True;
255 0 : }
256 : }
257 :
258 0 : if (!bOk && ! rReq.IsAPI() )
259 0 : pTabViewShell->ErrorMessage(STR_REIMPORT_EMPTY);
260 :
261 0 : if( bOk )
262 0 : rReq.Done();
263 : }
264 0 : break;
265 :
266 : case SID_REFRESH_DBAREA:
267 : {
268 0 : ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);
269 0 : if (pDBData)
270 : {
271 : // repeat import like SID_REIMPORT_DATA
272 :
273 0 : sal_Bool bContinue = sal_True;
274 0 : ScImportParam aImportParam;
275 0 : pDBData->GetImportParam( aImportParam );
276 0 : if (aImportParam.bImport && !pDBData->HasImportSelection())
277 : {
278 0 : bContinue = pTabViewShell->ImportData( aImportParam );
279 0 : pDBData->SetImportParam( aImportParam ); //! Undo ??
280 :
281 : // mark (size may have been changed)
282 0 : ScRange aNewRange;
283 0 : pDBData->GetArea(aNewRange);
284 0 : pTabViewShell->MarkRange(aNewRange);
285 : }
286 :
287 0 : if ( bContinue ) // fail at import -> break
288 : {
289 : // internal operations, when any stored
290 :
291 0 : if ( pDBData->HasQueryParam() || pDBData->HasSortParam() ||
292 0 : pDBData->HasSubTotalParam() )
293 0 : pTabViewShell->RepeatDB();
294 :
295 : // pivot tables that have the range as data source
296 :
297 0 : ScRange aRange;
298 0 : pDBData->GetArea(aRange);
299 0 : GetViewData()->GetDocShell()->RefreshPivotTables(aRange);
300 0 : }
301 : }
302 0 : rReq.Done();
303 : }
304 0 : break;
305 :
306 : case SID_SBA_BRW_INSERT:
307 : {
308 : OSL_FAIL( "Deprecated Slot" );
309 : }
310 0 : break;
311 :
312 : case SID_DATA_FORM:
313 : {
314 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
315 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
316 :
317 : AbstractScDataFormDlg* pDlg = pFact->CreateScDataFormDlg(
318 0 : pTabViewShell->GetDialogParent(), pTabViewShell);
319 : OSL_ENSURE(pDlg, "Dialog create fail!");
320 :
321 0 : pDlg->Execute();
322 :
323 0 : rReq.Done();
324 : }
325 0 : break;
326 :
327 : case SID_SUBTOTALS:
328 0 : ExecuteSubtotals(rReq);
329 0 : break;
330 :
331 : case SID_SORT_DESCENDING:
332 : case SID_SORT_ASCENDING:
333 : {
334 : //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data
335 : //the patch comes from maoyg
336 0 : ScSortParam aSortParam;
337 0 : ScDBData* pDBData = pTabViewShell->GetDBData();
338 0 : ScViewData* pData = GetViewData();
339 :
340 0 : pDBData->GetSortParam( aSortParam );
341 :
342 0 : if( lcl_GetSortParam( pData, aSortParam ) )
343 : {
344 0 : SfxItemSet aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA );
345 0 : SCCOL nCol = GetViewData()->GetCurX();
346 0 : SCCOL nTab = GetViewData()->GetTabNo();
347 0 : ScDocument* pDoc = GetViewData()->GetDocument();
348 :
349 0 : pDBData->GetSortParam( aSortParam );
350 0 : sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, nTab );
351 :
352 0 : if( nCol < aSortParam.nCol1 )
353 0 : nCol = aSortParam.nCol1;
354 0 : else if( nCol > aSortParam.nCol2 )
355 0 : nCol = aSortParam.nCol2;
356 :
357 0 : aSortParam.bHasHeader = bHasHeader;
358 0 : aSortParam.bByRow = true;
359 0 : aSortParam.bCaseSens = false;
360 0 : aSortParam.bNaturalSort = false;
361 0 : aSortParam.bIncludePattern = true;
362 0 : aSortParam.bInplace = true;
363 0 : aSortParam.maKeyState[0].bDoSort = true;
364 0 : aSortParam.maKeyState[0].nField = nCol;
365 0 : aSortParam.maKeyState[0].bAscending = ( nSlotId == SID_SORT_ASCENDING );
366 :
367 0 : for ( sal_uInt16 i=1; i<aSortParam.GetSortKeyCount(); i++ )
368 0 : aSortParam.maKeyState[i].bDoSort = false;
369 :
370 0 : aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) );
371 :
372 0 : pTabViewShell->UISort( aSortParam ); // subtotal when needed new
373 :
374 0 : rReq.Done();
375 0 : }
376 : }
377 0 : break;
378 :
379 : case SID_SORT:
380 : {
381 0 : const SfxItemSet* pArgs = rReq.GetArgs();
382 :
383 : //#i60401 ux-ctest: Calc does not support all users' strategies regarding sorting data
384 : //the patch comes from maoyg
385 :
386 0 : if ( pArgs ) // Basic
387 : {
388 0 : ScSortParam aSortParam;
389 0 : ScDBData* pDBData = pTabViewShell->GetDBData();
390 0 : ScViewData* pData = GetViewData();
391 :
392 0 : pDBData->GetSortParam( aSortParam );
393 :
394 0 : if( lcl_GetSortParam( pData, aSortParam ) )
395 : {
396 0 : ScDocument* pDoc = GetViewData()->GetDocument();
397 :
398 0 : pDBData->GetSortParam( aSortParam );
399 0 : sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() );
400 0 : if( bHasHeader )
401 0 : aSortParam.bHasHeader = bHasHeader;
402 :
403 0 : aSortParam.bInplace = sal_True; // from Basic always
404 :
405 : const SfxPoolItem* pItem;
406 0 : if ( pArgs->GetItemState( SID_SORT_BYROW, sal_True, &pItem ) == SFX_ITEM_SET )
407 0 : aSortParam.bByRow = static_cast<const SfxBoolItem*>(pItem)->GetValue();
408 0 : if ( pArgs->GetItemState( SID_SORT_HASHEADER, sal_True, &pItem ) == SFX_ITEM_SET )
409 0 : aSortParam.bHasHeader = static_cast<const SfxBoolItem*>(pItem)->GetValue();
410 0 : if ( pArgs->GetItemState( SID_SORT_CASESENS, sal_True, &pItem ) == SFX_ITEM_SET )
411 0 : aSortParam.bCaseSens = static_cast<const SfxBoolItem*>(pItem)->GetValue();
412 0 : if ( pArgs->GetItemState( SID_SORT_NATURALSORT, true, &pItem ) == SFX_ITEM_SET )
413 0 : aSortParam.bNaturalSort = static_cast<const SfxBoolItem*>(pItem)->GetValue();
414 0 : if ( pArgs->GetItemState( SID_SORT_ATTRIBS, true, &pItem ) == SFX_ITEM_SET )
415 0 : aSortParam.bIncludePattern = static_cast<const SfxBoolItem*>(pItem)->GetValue();
416 0 : if ( pArgs->GetItemState( SID_SORT_USERDEF, sal_True, &pItem ) == SFX_ITEM_SET )
417 : {
418 0 : sal_uInt16 nUserIndex = static_cast<const SfxUInt16Item*>(pItem)->GetValue();
419 0 : aSortParam.bUserDef = ( nUserIndex != 0 );
420 0 : if ( nUserIndex )
421 0 : aSortParam.nUserIndex = nUserIndex - 1; // Basic: 1-based
422 : }
423 :
424 0 : SCCOLROW nField0 = 0;
425 0 : if ( pArgs->GetItemState( FN_PARAM_1, sal_True, &pItem ) == SFX_ITEM_SET )
426 0 : nField0 = static_cast<const SfxInt32Item*>(pItem)->GetValue();
427 0 : aSortParam.maKeyState[0].bDoSort = ( nField0 != 0 );
428 0 : aSortParam.maKeyState[0].nField = nField0 > 0 ? (nField0-1) : 0;
429 0 : if ( pArgs->GetItemState( FN_PARAM_2, sal_True, &pItem ) == SFX_ITEM_SET )
430 0 : aSortParam.maKeyState[0].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue();
431 0 : SCCOLROW nField1 = 0;
432 0 : if ( pArgs->GetItemState( FN_PARAM_3, sal_True, &pItem ) == SFX_ITEM_SET )
433 0 : nField1 = static_cast<const SfxInt32Item*>(pItem)->GetValue();
434 0 : aSortParam.maKeyState[1].bDoSort = ( nField1 != 0 );
435 0 : aSortParam.maKeyState[1].nField = nField1 > 0 ? (nField1-1) : 0;
436 0 : if ( pArgs->GetItemState( FN_PARAM_4, sal_True, &pItem ) == SFX_ITEM_SET )
437 0 : aSortParam.maKeyState[1].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue();
438 0 : SCCOLROW nField2 = 0;
439 0 : if ( pArgs->GetItemState( FN_PARAM_5, sal_True, &pItem ) == SFX_ITEM_SET )
440 0 : nField2 = static_cast<const SfxInt32Item*>(pItem)->GetValue();
441 0 : aSortParam.maKeyState[2].bDoSort = ( nField2 != 0 );
442 0 : aSortParam.maKeyState[2].nField = nField2 > 0 ? (nField2-1) : 0;
443 0 : if ( pArgs->GetItemState( FN_PARAM_6, sal_True, &pItem ) == SFX_ITEM_SET )
444 0 : aSortParam.maKeyState[2].bAscending = static_cast<const SfxBoolItem*>(pItem)->GetValue();
445 :
446 : // subtotal when needed new
447 0 : pTabViewShell->UISort( aSortParam );
448 0 : rReq.Done();
449 0 : }
450 : }
451 : else
452 : {
453 0 : ScSortParam aSortParam;
454 0 : ScDBData* pDBData = pTabViewShell->GetDBData();
455 0 : ScViewData* pData = GetViewData();
456 :
457 0 : pDBData->GetSortParam( aSortParam );
458 :
459 0 : if( lcl_GetSortParam( pData, aSortParam ) )
460 : {
461 0 : SfxAbstractTabDialog* pDlg = NULL;
462 0 : ScDocument* pDoc = GetViewData()->GetDocument();
463 0 : SfxItemSet aArgSet( GetPool(), SCITEM_SORTDATA, SCITEM_SORTDATA );
464 :
465 0 : pDBData->GetSortParam( aSortParam );
466 0 : sal_Bool bHasHeader = pDoc->HasColHeader( aSortParam.nCol1, aSortParam.nRow1, aSortParam.nCol2, aSortParam.nRow2, pData->GetTabNo() );
467 0 : if( bHasHeader )
468 0 : aSortParam.bHasHeader = bHasHeader;
469 :
470 0 : aArgSet.Put( ScSortItem( SCITEM_SORTDATA, GetViewData(), &aSortParam ) );
471 :
472 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
473 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
474 :
475 0 : pDlg = pFact->CreateScSortDlg( pTabViewShell->GetDialogParent(), &aArgSet, RID_SCDLG_SORT );
476 : OSL_ENSURE(pDlg, "Dialog create fail!");
477 0 : pDlg->SetCurPageId(1); // 1=sort field tab 2=sort options tab
478 :
479 0 : if ( pDlg->Execute() == RET_OK )
480 : {
481 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
482 : const ScSortParam& rOutParam = ((const ScSortItem&)
483 0 : pOutSet->Get( SCITEM_SORTDATA )).GetSortData();
484 :
485 : // subtotal when needed new
486 :
487 0 : pTabViewShell->UISort( rOutParam );
488 :
489 0 : if ( rOutParam.bInplace )
490 : {
491 : rReq.AppendItem( SfxBoolItem( SID_SORT_BYROW,
492 0 : rOutParam.bByRow ) );
493 : rReq.AppendItem( SfxBoolItem( SID_SORT_HASHEADER,
494 0 : rOutParam.bHasHeader ) );
495 : rReq.AppendItem( SfxBoolItem( SID_SORT_CASESENS,
496 0 : rOutParam.bCaseSens ) );
497 : rReq.AppendItem( SfxBoolItem( SID_SORT_NATURALSORT,
498 0 : rOutParam.bNaturalSort ) );
499 : rReq.AppendItem( SfxBoolItem( SID_SORT_ATTRIBS,
500 0 : rOutParam.bIncludePattern ) );
501 0 : sal_uInt16 nUser = rOutParam.bUserDef ? ( rOutParam.nUserIndex + 1 ) : 0;
502 0 : rReq.AppendItem( SfxUInt16Item( SID_SORT_USERDEF, nUser ) );
503 0 : if ( rOutParam.maKeyState[0].bDoSort )
504 : {
505 : rReq.AppendItem( SfxInt32Item( FN_PARAM_1,
506 0 : rOutParam.maKeyState[0].nField + 1 ) );
507 : rReq.AppendItem( SfxBoolItem( FN_PARAM_2,
508 0 : rOutParam.maKeyState[0].bAscending ) );
509 : }
510 0 : if ( rOutParam.maKeyState[1].bDoSort )
511 : {
512 : rReq.AppendItem( SfxInt32Item( FN_PARAM_3,
513 0 : rOutParam.maKeyState[1].nField + 1 ) );
514 : rReq.AppendItem( SfxBoolItem( FN_PARAM_4,
515 0 : rOutParam.maKeyState[1].bAscending ) );
516 : }
517 0 : if ( rOutParam.maKeyState[2].bDoSort )
518 : {
519 : rReq.AppendItem( SfxInt32Item( FN_PARAM_5,
520 0 : rOutParam.maKeyState[2].nField + 1 ) );
521 : rReq.AppendItem( SfxBoolItem( FN_PARAM_6,
522 0 : rOutParam.maKeyState[2].bAscending ) );
523 : }
524 : }
525 :
526 0 : rReq.Done();
527 : }
528 : else
529 0 : GetViewData()->GetDocShell()->CancelAutoDBRange();
530 :
531 0 : delete pDlg;
532 0 : }
533 : }
534 : }
535 0 : break;
536 :
537 : case SID_FILTER:
538 : {
539 0 : const SfxItemSet* pArgs = rReq.GetArgs();
540 0 : if ( pArgs )
541 : {
542 : OSL_FAIL("SID_FILTER with arguments?");
543 : pTabViewShell->Query( ((const ScQueryItem&)
544 0 : pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True );
545 0 : rReq.Done();
546 : }
547 : else
548 : {
549 0 : sal_uInt16 nId = ScFilterDlgWrapper::GetChildWindowId();
550 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
551 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
552 :
553 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
554 : }
555 : }
556 0 : break;
557 :
558 : case SID_SPECIAL_FILTER:
559 : {
560 0 : const SfxItemSet* pArgs = rReq.GetArgs();
561 0 : if ( pArgs )
562 : {
563 : OSL_FAIL("SID_SPECIAL_FILTER with arguments?");
564 : pTabViewShell->Query( ((const ScQueryItem&)
565 0 : pArgs->Get( SCITEM_QUERYDATA )).GetQueryData(), NULL, sal_True );
566 0 : rReq.Done();
567 : }
568 : else
569 : {
570 0 : sal_uInt16 nId = ScSpecialFilterDlgWrapper::GetChildWindowId();
571 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
572 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
573 :
574 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
575 : }
576 : }
577 0 : break;
578 :
579 : case FID_FILTER_OK:
580 : {
581 : const SfxPoolItem* pItem;
582 0 : if ( pReqArgs && SFX_ITEM_SET ==
583 0 : pReqArgs->GetItemState( SCITEM_QUERYDATA, sal_True, &pItem ) )
584 : {
585 0 : const ScQueryItem& rQueryItem = static_cast<const ScQueryItem&>(*pItem);
586 :
587 0 : SCTAB nCurTab = GetViewData()->GetTabNo();
588 0 : SCTAB nRefTab = GetViewData()->GetRefTabNo();
589 :
590 : // If RefInput switched to a different sheet from the data sheet,
591 : // switch back:
592 :
593 0 : if ( nCurTab != nRefTab )
594 : {
595 0 : pTabViewShell->SetTabNo( nRefTab );
596 0 : pTabViewShell->PaintExtras();
597 : }
598 :
599 0 : ScRange aAdvSource;
600 0 : if (rQueryItem.GetAdvancedQuerySource(aAdvSource))
601 0 : pTabViewShell->Query( rQueryItem.GetQueryData(), &aAdvSource, sal_True );
602 : else
603 0 : pTabViewShell->Query( rQueryItem.GetQueryData(), NULL, sal_True );
604 0 : rReq.Done( *pReqArgs );
605 : }
606 : }
607 0 : break;
608 :
609 : case SID_UNFILTER:
610 : {
611 0 : ScQueryParam aParam;
612 0 : ScDBData* pDBData = pTabViewShell->GetDBData();
613 :
614 0 : pDBData->GetQueryParam( aParam );
615 0 : SCSIZE nEC = aParam.GetEntryCount();
616 0 : for (SCSIZE i=0; i<nEC; i++)
617 0 : aParam.GetEntry(i).bDoQuery = false;
618 0 : aParam.bDuplicate = sal_True;
619 0 : pTabViewShell->Query( aParam, NULL, sal_True );
620 0 : rReq.Done();
621 : }
622 0 : break;
623 :
624 : case SID_AUTO_FILTER:
625 0 : pTabViewShell->ToggleAutoFilter();
626 0 : rReq.Done();
627 0 : break;
628 :
629 : case SID_AUTOFILTER_HIDE:
630 0 : pTabViewShell->HideAutoFilter();
631 0 : rReq.Done();
632 0 : break;
633 :
634 : case SID_PIVOT_TABLE:
635 : {
636 : const SfxPoolItem* pItem;
637 0 : if ( pReqArgs && SFX_ITEM_SET ==
638 0 : pReqArgs->GetItemState( SCITEM_PIVOTDATA, sal_True, &pItem ) )
639 : {
640 0 : SCTAB nCurTab = GetViewData()->GetTabNo();
641 0 : SCTAB nRefTab = GetViewData()->GetRefTabNo();
642 :
643 : // If RefInput switched to a different sheet from the data sheet,
644 : // switch back:
645 :
646 0 : if ( nCurTab != nRefTab )
647 : {
648 0 : pTabViewShell->SetTabNo( nRefTab );
649 0 : pTabViewShell->PaintExtras();
650 : }
651 :
652 0 : const ScDPObject* pDPObject = pTabViewShell->GetDialogDPObject();
653 0 : if ( pDPObject )
654 : {
655 0 : const ScPivotItem* pPItem = (const ScPivotItem*)pItem;
656 : bool bSuccess = pTabViewShell->MakePivotTable(
657 0 : pPItem->GetData(), pPItem->GetDestRange(), pPItem->IsNewSheet(), *pDPObject );
658 0 : SfxBoolItem aRet(0, bSuccess);
659 0 : rReq.SetReturnValue(aRet);
660 : }
661 0 : rReq.Done();
662 : }
663 : #ifndef DISABLE_SCRIPTING
664 0 : else if (rReq.IsAPI())
665 0 : SbxBase::SetError(SbxERR_BAD_PARAMETER);
666 : #endif
667 : }
668 0 : break;
669 :
670 : case SID_OPENDLG_PIVOTTABLE:
671 0 : ExecuteDataPilotDialog();
672 0 : break;
673 : case SID_DEFINE_DBNAME:
674 : {
675 :
676 0 : sal_uInt16 nId = ScDbNameDlgWrapper::GetChildWindowId();
677 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
678 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
679 :
680 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
681 :
682 : }
683 0 : break;
684 :
685 : case SID_SELECT_DB:
686 : {
687 0 : if ( pReqArgs )
688 : {
689 : const SfxStringItem* pItem =
690 0 : (const SfxStringItem*)&pReqArgs->Get( SID_SELECT_DB );
691 :
692 0 : if( pItem )
693 : {
694 0 : pTabViewShell->GotoDBArea( pItem->GetValue() );
695 0 : rReq.Done();
696 : }
697 : else
698 : {
699 : OSL_FAIL("NULL");
700 : }
701 : }
702 : else
703 : {
704 0 : ScDocument* pDoc = GetViewData()->GetDocument();
705 0 : ScDBCollection* pDBCol = pDoc->GetDBCollection();
706 :
707 0 : if ( pDBCol )
708 : {
709 0 : std::vector<String> aList;
710 0 : const ScDBCollection::NamedDBs& rDBs = pDBCol->getNamedDBs();
711 0 : ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(), itrEnd = rDBs.end();
712 0 : for (; itr != itrEnd; ++itr)
713 0 : aList.push_back(itr->GetName());
714 :
715 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
716 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
717 :
718 : AbstractScSelEntryDlg* pDlg = pFact->CreateScSelEntryDlg( pTabViewShell->GetDialogParent(),
719 0 : aList );
720 : OSL_ENSURE(pDlg, "Dialog create fail!");
721 0 : if ( pDlg->Execute() == RET_OK )
722 : {
723 0 : String aName = pDlg->GetSelectEntry();
724 0 : pTabViewShell->GotoDBArea( aName );
725 0 : rReq.AppendItem( SfxStringItem( SID_SELECT_DB, aName ) );
726 0 : rReq.Done();
727 : }
728 :
729 0 : delete pDlg;
730 : }
731 : }
732 : }
733 0 : break;
734 :
735 : case SID_MANAGE_XML_SOURCE:
736 0 : ExecuteXMLSourceDialog();
737 0 : break;
738 : case FID_VALIDATION:
739 : {
740 : const SfxPoolItem* pItem;
741 0 : const SfxItemSet* pArgs = rReq.GetArgs();
742 0 : if ( pArgs )
743 : {
744 : OSL_FAIL("later...");
745 : }
746 : else
747 : {
748 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
749 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
750 0 : ::GetTabPageRanges ScTPValidationValueGetRanges = pFact->GetTabPageRangesFunc(TP_VALIDATION_VALUES);
751 : OSL_ENSURE(ScTPValidationValueGetRanges, "TabPage create fail!");
752 0 : SfxItemSet aArgSet( GetPool(), (*ScTPValidationValueGetRanges)() );
753 0 : ScValidationMode eMode = SC_VALID_ANY;
754 0 : ScConditionMode eOper = SC_COND_EQUAL;
755 0 : String aExpr1, aExpr2;
756 0 : sal_Bool bBlank = sal_True;
757 0 : sal_Int16 nListType = ValidListType::UNSORTED;
758 0 : sal_Bool bShowHelp = false;
759 0 : String aHelpTitle, aHelpText;
760 0 : sal_Bool bShowError = false;
761 0 : ScValidErrorStyle eErrStyle = SC_VALERR_STOP;
762 0 : String aErrTitle, aErrText;
763 :
764 0 : ScDocument* pDoc = GetViewData()->GetDocument();
765 0 : SCCOL nCurX = GetViewData()->GetCurX();
766 0 : SCROW nCurY = GetViewData()->GetCurY();
767 0 : SCTAB nTab = GetViewData()->GetTabNo();
768 0 : ScAddress aCursorPos( nCurX, nCurY, nTab );
769 : sal_uLong nIndex = ((SfxUInt32Item*)pDoc->GetAttr(
770 0 : nCurX, nCurY, nTab, ATTR_VALIDDATA ))->GetValue();
771 0 : if ( nIndex )
772 : {
773 0 : const ScValidationData* pOldData = pDoc->GetValidationEntry( nIndex );
774 0 : if ( pOldData )
775 : {
776 0 : eMode = pOldData->GetDataMode();
777 0 : eOper = pOldData->GetOperation();
778 0 : sal_uLong nNumFmt = 0;
779 0 : if ( eMode == SC_VALID_DATE || eMode == SC_VALID_TIME )
780 : {
781 : short nType = ( eMode == SC_VALID_DATE ) ? NUMBERFORMAT_DATE
782 0 : : NUMBERFORMAT_TIME;
783 : nNumFmt = pDoc->GetFormatTable()->GetStandardFormat(
784 0 : nType, ScGlobal::eLnge );
785 : }
786 0 : aExpr1 = pOldData->GetExpression( aCursorPos, 0, nNumFmt );
787 0 : aExpr2 = pOldData->GetExpression( aCursorPos, 1, nNumFmt );
788 0 : bBlank = pOldData->IsIgnoreBlank();
789 0 : nListType = pOldData->GetListType();
790 :
791 0 : bShowHelp = pOldData->GetInput( aHelpTitle, aHelpText );
792 0 : bShowError = pOldData->GetErrMsg( aErrTitle, aErrText, eErrStyle );
793 :
794 0 : aArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<sal_uInt16>(eMode) ) );
795 0 : aArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<sal_uInt16>(eOper) ) );
796 0 : aArgSet.Put( SfxStringItem( FID_VALID_VALUE1, aExpr1 ) );
797 0 : aArgSet.Put( SfxStringItem( FID_VALID_VALUE2, aExpr2 ) );
798 0 : aArgSet.Put( SfxBoolItem( FID_VALID_BLANK, bBlank ) );
799 0 : aArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) );
800 0 : aArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, bShowHelp ) );
801 0 : aArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, aHelpTitle ) );
802 0 : aArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, aHelpText ) );
803 0 : aArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, bShowError ) );
804 0 : aArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, sal::static_int_cast<sal_uInt16>(eErrStyle) ) );
805 0 : aArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, aErrTitle ) );
806 0 : aArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, aErrText ) );
807 : }
808 : }
809 :
810 : // cell range picker
811 0 : SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION, pTabViewShell );
812 : OSL_ENSURE(pDlg, "Dialog create fail!");
813 :
814 0 : short nResult = pDlg->Execute();
815 : //When picking Cell Range, other Tab may be switched. Need restore the correct tab
816 0 : pTabViewShell->SetTabNo( nTab );
817 0 : if ( nResult == RET_OK )
818 : {
819 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
820 :
821 0 : if ( pOutSet->GetItemState( FID_VALID_MODE, sal_True, &pItem ) == SFX_ITEM_SET )
822 0 : eMode = (ScValidationMode) ((const SfxAllEnumItem*)pItem)->GetValue();
823 0 : if ( pOutSet->GetItemState( FID_VALID_CONDMODE, sal_True, &pItem ) == SFX_ITEM_SET )
824 0 : eOper = (ScConditionMode) ((const SfxAllEnumItem*)pItem)->GetValue();
825 0 : if ( pOutSet->GetItemState( FID_VALID_VALUE1, sal_True, &pItem ) == SFX_ITEM_SET )
826 : {
827 0 : String aTemp1 = ((const SfxStringItem*)pItem)->GetValue();
828 0 : if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME)
829 : {
830 0 : sal_uInt32 nNumIndex = 0;
831 : double nVal;
832 0 : if (pDoc->GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal))
833 0 : aExpr1 =String( ::rtl::math::doubleToUString( nVal,
834 : rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
835 0 : ScGlobal::pLocaleData->getNumDecimalSep()[0], sal_True));
836 : else
837 0 : aExpr1 = aTemp1;
838 : }
839 : else
840 0 : aExpr1 = aTemp1;
841 : }
842 0 : if ( pOutSet->GetItemState( FID_VALID_VALUE2, sal_True, &pItem ) == SFX_ITEM_SET )
843 : {
844 0 : String aTemp2 = ((const SfxStringItem*)pItem)->GetValue();
845 0 : if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME)
846 : {
847 0 : sal_uInt32 nNumIndex = 0;
848 : double nVal;
849 0 : if (pDoc->GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal))
850 0 : aExpr2 =String( ::rtl::math::doubleToUString( nVal,
851 : rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
852 0 : ScGlobal::pLocaleData->getNumDecimalSep()[0], sal_True));
853 : else
854 0 : aExpr2 = aTemp2;
855 : }
856 : else
857 0 : aExpr2 = aTemp2;
858 : }
859 :
860 0 : if ( pOutSet->GetItemState( FID_VALID_BLANK, sal_True, &pItem ) == SFX_ITEM_SET )
861 0 : bBlank = ((const SfxBoolItem*)pItem)->GetValue();
862 0 : if ( pOutSet->GetItemState( FID_VALID_LISTTYPE, sal_True, &pItem ) == SFX_ITEM_SET )
863 0 : nListType = ((const SfxInt16Item*)pItem)->GetValue();
864 :
865 0 : if ( pOutSet->GetItemState( FID_VALID_SHOWHELP, sal_True, &pItem ) == SFX_ITEM_SET )
866 0 : bShowHelp = ((const SfxBoolItem*)pItem)->GetValue();
867 0 : if ( pOutSet->GetItemState( FID_VALID_HELPTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
868 0 : aHelpTitle = ((const SfxStringItem*)pItem)->GetValue();
869 0 : if ( pOutSet->GetItemState( FID_VALID_HELPTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
870 0 : aHelpText = ((const SfxStringItem*)pItem)->GetValue();
871 :
872 0 : if ( pOutSet->GetItemState( FID_VALID_SHOWERR, sal_True, &pItem ) == SFX_ITEM_SET )
873 0 : bShowError = ((const SfxBoolItem*)pItem)->GetValue();
874 0 : if ( pOutSet->GetItemState( FID_VALID_ERRSTYLE, sal_True, &pItem ) == SFX_ITEM_SET )
875 0 : eErrStyle = (ScValidErrorStyle) ((const SfxAllEnumItem*)pItem)->GetValue();
876 0 : if ( pOutSet->GetItemState( FID_VALID_ERRTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
877 0 : aErrTitle = ((const SfxStringItem*)pItem)->GetValue();
878 0 : if ( pOutSet->GetItemState( FID_VALID_ERRTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
879 0 : aErrText = ((const SfxStringItem*)pItem)->GetValue();
880 :
881 0 : ScValidationData aData( eMode, eOper, aExpr1, aExpr2, pDoc, aCursorPos );
882 0 : aData.SetIgnoreBlank( bBlank );
883 0 : aData.SetListType( nListType );
884 :
885 0 : aData.SetInput(aHelpTitle, aHelpText); // sets bShowInput to TRUE
886 0 : if (!bShowHelp)
887 0 : aData.ResetInput(); // reset only bShowInput
888 :
889 0 : aData.SetError(aErrTitle, aErrText, eErrStyle); // sets bShowError to TRUE
890 0 : if (!bShowError)
891 0 : aData.ResetError(); // reset only bShowError
892 :
893 0 : pTabViewShell->SetValidation( aData );
894 0 : pTabViewShell->TestHintWindow();
895 0 : rReq.Done( *pOutSet );
896 : }
897 : //after end execute from !IsModalInputMode, it is safer to delay deleting
898 : //delete pDlg;
899 0 : Application::PostUserEvent( Link( pDlg, &DelayDeleteAbstractDialog ) );
900 : }
901 : }
902 0 : break;
903 :
904 : case SID_TEXT_TO_COLUMNS:
905 : {
906 0 : ScViewData* pData = GetViewData();
907 : OSL_ENSURE( pData, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pData is null!" );
908 0 : ScRange aRange;
909 :
910 0 : if ( lcl_GetTextToColumnsRange( pData, aRange ) )
911 : {
912 0 : ScDocument* pDoc = pData->GetDocument();
913 : OSL_ENSURE( pDoc, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDoc is null!" );
914 :
915 0 : ScImportExport aExport( pDoc, aRange );
916 0 : aExport.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::None, 0, false ) );
917 :
918 : // #i87703# text to columns fails with tab separator
919 0 : aExport.SetDelimiter( static_cast< sal_Unicode >( 0 ) );
920 :
921 0 : SvMemoryStream aStream;
922 0 : aStream.SetStreamCharSet( RTL_TEXTENCODING_UNICODE );
923 0 : ScImportExport::SetNoEndianSwap( aStream );
924 0 : aExport.ExportStream( aStream, String(), FORMAT_STRING );
925 :
926 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
927 : OSL_ENSURE( pFact, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pFact is null!" );
928 : AbstractScImportAsciiDlg *pDlg = pFact->CreateScImportAsciiDlg(
929 0 : NULL, String(), &aStream, SC_TEXTTOCOLUMNS);
930 : OSL_ENSURE( pDlg, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDlg is null!" );
931 :
932 0 : if ( pDlg->Execute() == RET_OK )
933 : {
934 0 : ScDocShell* pDocSh = pData->GetDocShell();
935 : OSL_ENSURE( pDocSh, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDocSh is null!" );
936 :
937 0 : String aUndo = ScGlobal::GetRscString( STR_UNDO_TEXTTOCOLUMNS );
938 0 : pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
939 :
940 0 : ScImportExport aImport( pDoc, aRange.aStart );
941 0 : ScAsciiOptions aOptions;
942 0 : pDlg->GetOptions( aOptions );
943 0 : pDlg->SaveParameters();
944 0 : aImport.SetExtOptions( aOptions );
945 0 : aImport.SetApi( false );
946 0 : aStream.Seek( 0 );
947 0 : aImport.ImportStream( aStream, String(), FORMAT_STRING );
948 :
949 0 : pDocSh->GetUndoManager()->LeaveListAction();
950 : }
951 0 : delete pDlg;
952 : }
953 : }
954 0 : break;
955 : }
956 0 : }
957 :
958 491 : void ScCellShell::GetDBState( SfxItemSet& rSet )
959 : {
960 491 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
961 491 : ScViewData* pData = GetViewData();
962 491 : ScDocShell* pDocSh = pData->GetDocShell();
963 491 : ScDocument* pDoc = pDocSh->GetDocument();
964 491 : SCCOL nPosX = pData->GetCurX();
965 491 : SCROW nPosY = pData->GetCurY();
966 491 : SCTAB nTab = pData->GetTabNo();
967 :
968 491 : sal_Bool bAutoFilter = false;
969 491 : sal_Bool bAutoFilterTested = false;
970 :
971 491 : SfxWhichIter aIter(rSet);
972 491 : sal_uInt16 nWhich = aIter.FirstWhich();
973 1555 : while (nWhich)
974 : {
975 573 : switch (nWhich)
976 : {
977 : case SID_REFRESH_DBAREA:
978 : {
979 : // imported data without selection
980 : // or filter,sort,subtotal (also without import)
981 0 : sal_Bool bOk = false;
982 0 : ScDBData* pDBData = pTabViewShell->GetDBData(false,SC_DB_OLD);
983 0 : if (pDBData && pDoc->GetChangeTrack() == NULL)
984 : {
985 0 : if ( pDBData->HasImportParam() )
986 0 : bOk = !pDBData->HasImportSelection();
987 : else
988 : {
989 0 : bOk = pDBData->HasQueryParam() ||
990 0 : pDBData->HasSortParam() ||
991 0 : pDBData->HasSubTotalParam();
992 : }
993 : }
994 0 : if (!bOk)
995 0 : rSet.DisableItem( nWhich );
996 : }
997 0 : break;
998 :
999 : case SID_FILTER:
1000 : case SID_SPECIAL_FILTER:
1001 : {
1002 0 : ScRange aDummy;
1003 0 : ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy);
1004 0 : if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
1005 : {
1006 0 : rSet.DisableItem( nWhich );
1007 : }
1008 : }
1009 0 : break;
1010 :
1011 :
1012 : //in case of Redlining and multiselection disable
1013 : case SID_SORT_ASCENDING:
1014 : case SID_SORT_DESCENDING:
1015 : case SCITEM_SORTDATA:
1016 : case SCITEM_SUBTDATA:
1017 : case SID_OPENDLG_PIVOTTABLE:
1018 : {
1019 : //! move ReadOnly check to idl flags
1020 :
1021 764 : if ( pDocSh->IsReadOnly() || pDoc->GetChangeTrack()!=NULL ||
1022 382 : GetViewData()->IsMultiMarked() )
1023 : {
1024 0 : rSet.DisableItem( nWhich );
1025 : }
1026 : }
1027 382 : break;
1028 :
1029 : case SID_REIMPORT_DATA:
1030 : {
1031 : // only imported data without selection
1032 0 : ScDBData* pDBData = pTabViewShell->GetDBData(false,SC_DB_OLD);
1033 0 : if (!pDBData || !pDBData->HasImportParam() || pDBData->HasImportSelection() ||
1034 0 : pDoc->GetChangeTrack()!=NULL)
1035 : {
1036 0 : rSet.DisableItem( nWhich );
1037 : }
1038 : }
1039 0 : break;
1040 :
1041 : case SID_VIEW_DATA_SOURCE_BROWSER:
1042 : {
1043 191 : if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE))
1044 0 : rSet.Put(SfxVisibilityItem(nWhich, false));
1045 : else
1046 : // get state (BoolItem) from SfxViewFrame
1047 191 : pTabViewShell->GetViewFrame()->GetSlotState( nWhich, NULL, &rSet );
1048 : }
1049 191 : break;
1050 : case SID_SBA_BRW_INSERT:
1051 : {
1052 : // SBA wants a sal_Bool-item, enabled
1053 :
1054 0 : sal_Bool bEnable = sal_True;
1055 0 : rSet.Put(SfxBoolItem(nWhich, bEnable));
1056 : }
1057 0 : break;
1058 :
1059 : case SID_AUTO_FILTER:
1060 : case SID_AUTOFILTER_HIDE:
1061 : {
1062 0 : if (!bAutoFilterTested)
1063 : {
1064 0 : bAutoFilter = pDoc->HasAutoFilter( nPosX, nPosY, nTab );
1065 0 : bAutoFilterTested = sal_True;
1066 : }
1067 0 : if ( nWhich == SID_AUTO_FILTER )
1068 : {
1069 0 : ScRange aDummy;
1070 0 : ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy);
1071 0 : if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
1072 : {
1073 0 : rSet.DisableItem( nWhich );
1074 : }
1075 0 : else if (pDoc->GetDPAtBlock(aDummy))
1076 : {
1077 0 : rSet.DisableItem( nWhich );
1078 : }
1079 : else
1080 0 : rSet.Put( SfxBoolItem( nWhich, bAutoFilter ) );
1081 : }
1082 : else
1083 0 : if (!bAutoFilter)
1084 0 : rSet.DisableItem( nWhich );
1085 : }
1086 0 : break;
1087 :
1088 : case SID_UNFILTER:
1089 : {
1090 : SCCOL nStartCol, nEndCol;
1091 : SCROW nStartRow, nEndRow;
1092 : SCTAB nStartTab, nEndTab;
1093 0 : sal_Bool bAnyQuery = false;
1094 :
1095 : sal_Bool bSelected = (GetViewData()->GetSimpleArea(
1096 0 : nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab )
1097 0 : == SC_MARK_SIMPLE);
1098 :
1099 0 : if ( bSelected )
1100 : {
1101 0 : if (nStartCol==nEndCol && nStartRow==nEndRow)
1102 0 : bSelected = false;
1103 : }
1104 : else
1105 : {
1106 0 : nStartCol = GetViewData()->GetCurX();
1107 0 : nStartRow = GetViewData()->GetCurY();
1108 0 : nStartTab = GetViewData()->GetTabNo();
1109 : }
1110 :
1111 : ScDBData* pDBData = bSelected
1112 0 : ? pDoc->GetDBAtArea( nStartTab, nStartCol, nStartRow, nEndCol, nEndRow )
1113 0 : : pDoc->GetDBAtCursor( nStartCol, nStartRow, nStartTab );
1114 :
1115 0 : if ( pDBData )
1116 : {
1117 0 : ScQueryParam aParam;
1118 0 : pDBData->GetQueryParam( aParam );
1119 0 : if ( aParam.GetEntry(0).bDoQuery )
1120 0 : bAnyQuery = sal_True;
1121 : }
1122 :
1123 0 : if ( !bAnyQuery )
1124 0 : rSet.DisableItem( nWhich );
1125 : }
1126 0 : break;
1127 :
1128 : case SID_DEFINE_DBNAME:
1129 : {
1130 0 : if ( pDocSh && pDocSh->IsDocShared() )
1131 : {
1132 0 : rSet.DisableItem( nWhich );
1133 : }
1134 : }
1135 0 : break;
1136 :
1137 : case SID_TEXT_TO_COLUMNS:
1138 : {
1139 0 : ScRange aRange;
1140 0 : if ( !lcl_GetTextToColumnsRange( pData, aRange ) )
1141 : {
1142 0 : rSet.DisableItem( nWhich );
1143 : }
1144 : }
1145 0 : break;
1146 : }
1147 573 : nWhich = aIter.NextWhich();
1148 491 : }
1149 584 : }
1150 :
1151 :
1152 :
1153 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|