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 "pvlaydlg.hxx"
52 : #include "validat.hxx"
53 : #include "scresid.hxx"
54 :
55 : #include "validate.hrc" // ScValidationDlg
56 : #include "scui_def.hxx"
57 : #include "scabstdlg.hxx"
58 : #include "impex.hxx"
59 : #include "asciiopt.hxx"
60 : #include "queryentry.hxx"
61 : #include "markdata.hxx"
62 :
63 : using namespace com::sun::star;
64 :
65 0 : static bool lcl_GetTextToColumnsRange( const ScViewData* pData, ScRange& rRange )
66 : {
67 : OSL_ENSURE( pData, "lcl_GetTextToColumnsRange: pData is null!" );
68 :
69 0 : bool bRet = false;
70 0 : const ScMarkData& rMark = pData->GetMarkData();
71 :
72 0 : if ( rMark.IsMarked() )
73 : {
74 0 : if ( !rMark.IsMultiMarked() )
75 : {
76 0 : rMark.GetMarkArea( rRange );
77 0 : if ( rRange.aStart.Col() == rRange.aEnd.Col() )
78 : {
79 0 : bRet = true;
80 : }
81 : }
82 : }
83 : else
84 : {
85 0 : const SCCOL nCol = pData->GetCurX();
86 0 : const SCROW nRow = pData->GetCurY();
87 0 : const SCTAB nTab = pData->GetTabNo();
88 0 : rRange = ScRange( nCol, nRow, nTab, nCol, nRow, nTab );
89 0 : bRet = true;
90 : }
91 :
92 0 : const ScDocument* pDoc = pData->GetDocument();
93 : OSL_ENSURE( pDoc, "lcl_GetTextToColumnsRange: pDoc is null!" );
94 :
95 0 : if ( bRet && pDoc->IsBlockEmpty( rRange.aStart.Tab(), rRange.aStart.Col(),
96 0 : rRange.aStart.Row(), rRange.aEnd.Col(),
97 0 : rRange.aEnd.Row() ) )
98 : {
99 0 : bRet = false;
100 : }
101 :
102 0 : return bRet;
103 : }
104 :
105 0 : static sal_Bool lcl_GetSortParam( const ScViewData* pData, ScSortParam& rSortParam )
106 : {
107 0 : ScTabViewShell* pTabViewShell = pData->GetViewShell();
108 0 : ScDBData* pDBData = pTabViewShell->GetDBData();
109 0 : ScDocument* pDoc = pData->GetDocument();
110 0 : SCTAB nTab = pData->GetTabNo();
111 0 : ScDirection eFillDir = DIR_TOP;
112 0 : sal_Bool bSort = sal_True;
113 0 : ScRange aExternalRange;
114 :
115 0 : if( rSortParam.nCol1 != rSortParam.nCol2 )
116 0 : eFillDir = DIR_LEFT;
117 0 : if( rSortParam.nRow1 != rSortParam.nRow2 )
118 0 : eFillDir = DIR_TOP;
119 :
120 0 : SCSIZE nCount = pDoc->GetEmptyLinesInBlock( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab, eFillDir );
121 :
122 0 : if( rSortParam.nRow2 == MAXROW )
123 0 : aExternalRange = ScRange( rSortParam.nCol1,sal::static_int_cast<SCROW>( nCount ), nTab );
124 : else
125 0 : aExternalRange = ScRange( pData->GetCurX(), pData->GetCurY(), nTab );
126 :
127 0 : SCROW nStartRow = aExternalRange.aStart.Row();
128 0 : SCCOL nStartCol = aExternalRange.aStart.Col();
129 0 : SCROW nEndRow = aExternalRange.aEnd.Row();
130 0 : SCCOL nEndCol = aExternalRange.aEnd.Col();
131 0 : pDoc->GetDataArea( aExternalRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow, false, false );
132 0 : aExternalRange.aStart.SetRow( nStartRow );
133 0 : aExternalRange.aStart.SetCol( nStartCol );
134 0 : aExternalRange.aEnd.SetRow( nEndRow );
135 0 : aExternalRange.aEnd.SetCol( nEndCol );
136 :
137 0 : if(( rSortParam.nCol1 == rSortParam.nCol2 && aExternalRange.aStart.Col() != aExternalRange.aEnd.Col() ) ||
138 0 : ( rSortParam.nRow1 == rSortParam.nRow2 && aExternalRange.aStart.Row() != aExternalRange.aEnd.Row() ) )
139 : {
140 0 : sal_uInt16 nFmt = SCA_VALID;
141 0 : String aExtendStr,aCurrentStr;
142 :
143 0 : pTabViewShell->AddHighlightRange( aExternalRange,Color( COL_LIGHTBLUE ) );
144 0 : ScRange rExtendRange( aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), nTab, aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row(), nTab );
145 0 : rExtendRange.Format( aExtendStr, nFmt, pDoc );
146 :
147 0 : ScRange rCurrentRange( rSortParam.nCol1, rSortParam.nRow1, nTab, rSortParam.nCol2, rSortParam.nRow2, nTab );
148 0 : rCurrentRange.Format( aCurrentStr, nFmt, pDoc );
149 :
150 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
151 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
152 :
153 0 : VclAbstractDialog* pWarningDlg = pFact->CreateScSortWarningDlg( pTabViewShell->GetDialogParent(),aExtendStr,aCurrentStr,RID_SCDLG_SORT_WARNING );
154 : OSL_ENSURE(pWarningDlg, "Dialog create fail!");
155 0 : short bResult = pWarningDlg->Execute();
156 0 : if( bResult == BTN_EXTEND_RANGE || bResult == BTN_CURRENT_SELECTION )
157 : {
158 0 : if( bResult == BTN_EXTEND_RANGE )
159 : {
160 0 : pTabViewShell->MarkRange( aExternalRange, false );
161 0 : pDBData->SetArea( nTab, aExternalRange.aStart.Col(), aExternalRange.aStart.Row(), aExternalRange.aEnd.Col(), aExternalRange.aEnd.Row() );
162 : }
163 : }
164 : else
165 : {
166 0 : bSort = false;
167 0 : pData->GetDocShell()->CancelAutoDBRange();
168 : }
169 :
170 0 : delete pWarningDlg;
171 0 : pTabViewShell->ClearHighlightRanges();
172 : }
173 0 : return bSort;
174 : }
175 :
176 : //after end execute from !IsModalInputMode, it is safer to delay deleting
177 : namespace
178 : {
179 0 : long DelayDeleteAbstractDialog( void *pAbstractDialog, void * /*pArg*/ )
180 : {
181 0 : delete reinterpret_cast<VclAbstractDialog*>( pAbstractDialog );
182 0 : return 0;
183 : }
184 : }
185 :
186 0 : void ScCellShell::ExecuteDB( SfxRequest& rReq )
187 : {
188 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
189 0 : sal_uInt16 nSlotId = rReq.GetSlot();
190 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
191 0 : ScModule* pScMod = SC_MOD();
192 :
193 0 : pTabViewShell->HideListBox(); // Autofilter-DropDown-Listbox
194 :
195 0 : if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) )
196 : {
197 0 : pScMod->InputEnterHandler();
198 0 : pTabViewShell->UpdateInputHandler();
199 : }
200 :
201 0 : switch ( nSlotId )
202 : {
203 : case SID_VIEW_DATA_SOURCE_BROWSER:
204 : {
205 : // check if database beamer is open
206 :
207 0 : SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame();
208 0 : sal_Bool bWasOpen = false;
209 : {
210 0 : uno::Reference<frame::XFrame> xFrame = pViewFrame->GetFrame().GetFrameInterface();
211 0 : uno::Reference<frame::XFrame> xBeamerFrame = xFrame->findFrame(
212 : rtl::OUString("_beamer"),
213 0 : frame::FrameSearchFlag::CHILDREN);
214 0 : if ( xBeamerFrame.is() )
215 0 : bWasOpen = sal_True;
216 : }
217 :
218 0 : if ( bWasOpen )
219 : {
220 : // close database beamer: just forward to SfxViewFrame
221 :
222 0 : pViewFrame->ExecuteSlot( rReq );
223 : }
224 : else
225 : {
226 : // show database beamer: SfxViewFrame call must be synchronous
227 :
228 0 : pViewFrame->ExecuteSlot( rReq, (sal_Bool) false ); // sal_False = synchronous
229 :
230 : // select current database in database beamer
231 :
232 0 : ScImportParam aImportParam;
233 0 : ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD); // don't create if none found
234 0 : if (pDBData)
235 0 : pDBData->GetImportParam( aImportParam );
236 :
237 0 : ScDBDocFunc::ShowInBeamer( aImportParam, pTabViewShell->GetViewFrame() );
238 : }
239 0 : rReq.Done(); // needed because it's a toggle slot
240 : }
241 0 : break;
242 :
243 : case SID_REIMPORT_DATA:
244 : {
245 0 : sal_Bool bOk = false;
246 0 : ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);
247 0 : if (pDBData)
248 : {
249 0 : ScImportParam aImportParam;
250 0 : pDBData->GetImportParam( aImportParam );
251 0 : if (aImportParam.bImport && !pDBData->HasImportSelection())
252 : {
253 0 : pTabViewShell->ImportData( aImportParam );
254 0 : pDBData->SetImportParam( aImportParam ); //! Undo ??
255 0 : bOk = sal_True;
256 0 : }
257 : }
258 :
259 0 : if (!bOk && ! rReq.IsAPI() )
260 0 : pTabViewShell->ErrorMessage(STR_REIMPORT_EMPTY);
261 :
262 0 : if( bOk )
263 0 : rReq.Done();
264 : }
265 0 : break;
266 :
267 : case SID_REFRESH_DBAREA:
268 : {
269 0 : ScDBData* pDBData = pTabViewShell->GetDBData(sal_True,SC_DB_OLD);
270 0 : if (pDBData)
271 : {
272 : // repeat import like SID_REIMPORT_DATA
273 :
274 0 : sal_Bool bContinue = sal_True;
275 0 : ScImportParam aImportParam;
276 0 : pDBData->GetImportParam( aImportParam );
277 0 : if (aImportParam.bImport && !pDBData->HasImportSelection())
278 : {
279 0 : bContinue = pTabViewShell->ImportData( aImportParam );
280 0 : pDBData->SetImportParam( aImportParam ); //! Undo ??
281 :
282 : // mark (size may have been changed)
283 0 : ScRange aNewRange;
284 0 : pDBData->GetArea(aNewRange);
285 0 : pTabViewShell->MarkRange(aNewRange);
286 : }
287 :
288 0 : if ( bContinue ) // fail at import -> break
289 : {
290 : // internal operations, when any stored
291 :
292 0 : if ( pDBData->HasQueryParam() || pDBData->HasSortParam() ||
293 0 : pDBData->HasSubTotalParam() )
294 0 : pTabViewShell->RepeatDB();
295 :
296 : // pivot tables that have the range as data source
297 :
298 0 : ScRange aRange;
299 0 : pDBData->GetArea(aRange);
300 0 : GetViewData()->GetDocShell()->RefreshPivotTables(aRange);
301 0 : }
302 : }
303 0 : rReq.Done();
304 : }
305 0 : break;
306 :
307 : case SID_SBA_BRW_INSERT:
308 : {
309 : OSL_FAIL( "Deprecated Slot" );
310 : }
311 0 : break;
312 :
313 : case SID_DATA_FORM:
314 : {
315 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
316 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
317 :
318 0 : AbstractScDataFormDlg* pDlg = pFact->CreateScDataFormDlg( pTabViewShell->GetDialogParent(),RID_SCDLG_DATAFORM, 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 : RID_SCDLG_SELECTDB,
720 : String(ScResId(SCSTR_SELECTDB)),
721 : String(ScResId(SCSTR_AREAS)),
722 : aList,
723 0 : RID_SCDLG_SELECTDB);
724 : OSL_ENSURE(pDlg, "Dialog create fail!");
725 0 : if ( pDlg->Execute() == RET_OK )
726 : {
727 0 : String aName = pDlg->GetSelectEntry();
728 0 : pTabViewShell->GotoDBArea( aName );
729 0 : rReq.AppendItem( SfxStringItem( SID_SELECT_DB, aName ) );
730 0 : rReq.Done();
731 : }
732 :
733 0 : delete pDlg;
734 : }
735 : }
736 : }
737 0 : break;
738 :
739 : case SID_MANAGE_XML_SOURCE:
740 0 : ExecuteXMLSourceDialog();
741 0 : break;
742 : case FID_VALIDATION:
743 : {
744 : const SfxPoolItem* pItem;
745 0 : const SfxItemSet* pArgs = rReq.GetArgs();
746 0 : if ( pArgs )
747 : {
748 : OSL_FAIL("later...");
749 : }
750 : else
751 : {
752 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
753 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
754 0 : ::GetTabPageRanges ScTPValidationValueGetRanges = pFact->GetTabPageRangesFunc(TP_VALIDATION_VALUES);
755 : OSL_ENSURE(ScTPValidationValueGetRanges, "TabPage create fail!");
756 0 : SfxItemSet aArgSet( GetPool(), (*ScTPValidationValueGetRanges)() );
757 0 : ScValidationMode eMode = SC_VALID_ANY;
758 0 : ScConditionMode eOper = SC_COND_EQUAL;
759 0 : String aExpr1, aExpr2;
760 0 : sal_Bool bBlank = sal_True;
761 0 : sal_Int16 nListType = ValidListType::UNSORTED;
762 0 : sal_Bool bShowHelp = false;
763 0 : String aHelpTitle, aHelpText;
764 0 : sal_Bool bShowError = false;
765 0 : ScValidErrorStyle eErrStyle = SC_VALERR_STOP;
766 0 : String aErrTitle, aErrText;
767 :
768 0 : ScDocument* pDoc = GetViewData()->GetDocument();
769 0 : SCCOL nCurX = GetViewData()->GetCurX();
770 0 : SCROW nCurY = GetViewData()->GetCurY();
771 0 : SCTAB nTab = GetViewData()->GetTabNo();
772 0 : ScAddress aCursorPos( nCurX, nCurY, nTab );
773 : sal_uLong nIndex = ((SfxUInt32Item*)pDoc->GetAttr(
774 0 : nCurX, nCurY, nTab, ATTR_VALIDDATA ))->GetValue();
775 0 : if ( nIndex )
776 : {
777 0 : const ScValidationData* pOldData = pDoc->GetValidationEntry( nIndex );
778 0 : if ( pOldData )
779 : {
780 0 : eMode = pOldData->GetDataMode();
781 0 : eOper = pOldData->GetOperation();
782 0 : sal_uLong nNumFmt = 0;
783 0 : if ( eMode == SC_VALID_DATE || eMode == SC_VALID_TIME )
784 : {
785 : short nType = ( eMode == SC_VALID_DATE ) ? NUMBERFORMAT_DATE
786 0 : : NUMBERFORMAT_TIME;
787 : nNumFmt = pDoc->GetFormatTable()->GetStandardFormat(
788 0 : nType, ScGlobal::eLnge );
789 : }
790 0 : aExpr1 = pOldData->GetExpression( aCursorPos, 0, nNumFmt );
791 0 : aExpr2 = pOldData->GetExpression( aCursorPos, 1, nNumFmt );
792 0 : bBlank = pOldData->IsIgnoreBlank();
793 0 : nListType = pOldData->GetListType();
794 :
795 0 : bShowHelp = pOldData->GetInput( aHelpTitle, aHelpText );
796 0 : bShowError = pOldData->GetErrMsg( aErrTitle, aErrText, eErrStyle );
797 :
798 0 : aArgSet.Put( SfxAllEnumItem( FID_VALID_MODE, sal::static_int_cast<sal_uInt16>(eMode) ) );
799 0 : aArgSet.Put( SfxAllEnumItem( FID_VALID_CONDMODE, sal::static_int_cast<sal_uInt16>(eOper) ) );
800 0 : aArgSet.Put( SfxStringItem( FID_VALID_VALUE1, aExpr1 ) );
801 0 : aArgSet.Put( SfxStringItem( FID_VALID_VALUE2, aExpr2 ) );
802 0 : aArgSet.Put( SfxBoolItem( FID_VALID_BLANK, bBlank ) );
803 0 : aArgSet.Put( SfxInt16Item( FID_VALID_LISTTYPE, nListType ) );
804 0 : aArgSet.Put( SfxBoolItem( FID_VALID_SHOWHELP, bShowHelp ) );
805 0 : aArgSet.Put( SfxStringItem( FID_VALID_HELPTITLE, aHelpTitle ) );
806 0 : aArgSet.Put( SfxStringItem( FID_VALID_HELPTEXT, aHelpText ) );
807 0 : aArgSet.Put( SfxBoolItem( FID_VALID_SHOWERR, bShowError ) );
808 0 : aArgSet.Put( SfxAllEnumItem( FID_VALID_ERRSTYLE, sal::static_int_cast<sal_uInt16>(eErrStyle) ) );
809 0 : aArgSet.Put( SfxStringItem( FID_VALID_ERRTITLE, aErrTitle ) );
810 0 : aArgSet.Put( SfxStringItem( FID_VALID_ERRTEXT, aErrText ) );
811 : }
812 : }
813 :
814 : // cell range picker
815 0 : SfxAbstractTabDialog* pDlg = pFact->CreateScValidationDlg( NULL, &aArgSet, TAB_DLG_VALIDATION, pTabViewShell );
816 : OSL_ENSURE(pDlg, "Dialog create fail!");
817 :
818 0 : short nResult = pDlg->Execute();
819 : //When picking Cell Range, other Tab may be switched. Need restore the correct tab
820 0 : pTabViewShell->SetTabNo( nTab );
821 0 : if ( nResult == RET_OK )
822 : {
823 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
824 :
825 0 : if ( pOutSet->GetItemState( FID_VALID_MODE, sal_True, &pItem ) == SFX_ITEM_SET )
826 0 : eMode = (ScValidationMode) ((const SfxAllEnumItem*)pItem)->GetValue();
827 0 : if ( pOutSet->GetItemState( FID_VALID_CONDMODE, sal_True, &pItem ) == SFX_ITEM_SET )
828 0 : eOper = (ScConditionMode) ((const SfxAllEnumItem*)pItem)->GetValue();
829 0 : if ( pOutSet->GetItemState( FID_VALID_VALUE1, sal_True, &pItem ) == SFX_ITEM_SET )
830 : {
831 0 : String aTemp1 = ((const SfxStringItem*)pItem)->GetValue();
832 0 : if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME)
833 : {
834 0 : sal_uInt32 nNumIndex = 0;
835 : double nVal;
836 0 : if (pDoc->GetFormatTable()->IsNumberFormat(aTemp1, nNumIndex, nVal))
837 : aExpr1 =String( ::rtl::math::doubleToUString( nVal,
838 : rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
839 0 : ScGlobal::pLocaleData->getNumDecimalSep()[0], sal_True));
840 : else
841 0 : aExpr1 = aTemp1;
842 : }
843 : else
844 0 : aExpr1 = aTemp1;
845 : }
846 0 : if ( pOutSet->GetItemState( FID_VALID_VALUE2, sal_True, &pItem ) == SFX_ITEM_SET )
847 : {
848 0 : String aTemp2 = ((const SfxStringItem*)pItem)->GetValue();
849 0 : if (eMode == SC_VALID_DATE || eMode == SC_VALID_TIME)
850 : {
851 0 : sal_uInt32 nNumIndex = 0;
852 : double nVal;
853 0 : if (pDoc->GetFormatTable()->IsNumberFormat(aTemp2, nNumIndex, nVal))
854 : aExpr2 =String( ::rtl::math::doubleToUString( nVal,
855 : rtl_math_StringFormat_Automatic, rtl_math_DecimalPlaces_Max,
856 0 : ScGlobal::pLocaleData->getNumDecimalSep()[0], sal_True));
857 : else
858 0 : aExpr2 = aTemp2;
859 : }
860 : else
861 0 : aExpr2 = aTemp2;
862 : }
863 :
864 0 : if ( pOutSet->GetItemState( FID_VALID_BLANK, sal_True, &pItem ) == SFX_ITEM_SET )
865 0 : bBlank = ((const SfxBoolItem*)pItem)->GetValue();
866 0 : if ( pOutSet->GetItemState( FID_VALID_LISTTYPE, sal_True, &pItem ) == SFX_ITEM_SET )
867 0 : nListType = ((const SfxInt16Item*)pItem)->GetValue();
868 :
869 0 : if ( pOutSet->GetItemState( FID_VALID_SHOWHELP, sal_True, &pItem ) == SFX_ITEM_SET )
870 0 : bShowHelp = ((const SfxBoolItem*)pItem)->GetValue();
871 0 : if ( pOutSet->GetItemState( FID_VALID_HELPTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
872 0 : aHelpTitle = ((const SfxStringItem*)pItem)->GetValue();
873 0 : if ( pOutSet->GetItemState( FID_VALID_HELPTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
874 0 : aHelpText = ((const SfxStringItem*)pItem)->GetValue();
875 :
876 0 : if ( pOutSet->GetItemState( FID_VALID_SHOWERR, sal_True, &pItem ) == SFX_ITEM_SET )
877 0 : bShowError = ((const SfxBoolItem*)pItem)->GetValue();
878 0 : if ( pOutSet->GetItemState( FID_VALID_ERRSTYLE, sal_True, &pItem ) == SFX_ITEM_SET )
879 0 : eErrStyle = (ScValidErrorStyle) ((const SfxAllEnumItem*)pItem)->GetValue();
880 0 : if ( pOutSet->GetItemState( FID_VALID_ERRTITLE, sal_True, &pItem ) == SFX_ITEM_SET )
881 0 : aErrTitle = ((const SfxStringItem*)pItem)->GetValue();
882 0 : if ( pOutSet->GetItemState( FID_VALID_ERRTEXT, sal_True, &pItem ) == SFX_ITEM_SET )
883 0 : aErrText = ((const SfxStringItem*)pItem)->GetValue();
884 :
885 0 : ScValidationData aData( eMode, eOper, aExpr1, aExpr2, pDoc, aCursorPos );
886 0 : aData.SetIgnoreBlank( bBlank );
887 0 : aData.SetListType( nListType );
888 :
889 0 : aData.SetInput(aHelpTitle, aHelpText); // sets bShowInput to TRUE
890 0 : if (!bShowHelp)
891 0 : aData.ResetInput(); // reset only bShowInput
892 :
893 0 : aData.SetError(aErrTitle, aErrText, eErrStyle); // sets bShowError to TRUE
894 0 : if (!bShowError)
895 0 : aData.ResetError(); // reset only bShowError
896 :
897 0 : pTabViewShell->SetValidation( aData );
898 0 : pTabViewShell->TestHintWindow();
899 0 : rReq.Done( *pOutSet );
900 : }
901 : //after end execute from !IsModalInputMode, it is safer to delay deleting
902 : //delete pDlg;
903 0 : Application::PostUserEvent( Link( pDlg, &DelayDeleteAbstractDialog ) );
904 : }
905 : }
906 0 : break;
907 :
908 : case SID_TEXT_TO_COLUMNS:
909 : {
910 0 : ScViewData* pData = GetViewData();
911 : OSL_ENSURE( pData, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pData is null!" );
912 0 : ScRange aRange;
913 :
914 0 : if ( lcl_GetTextToColumnsRange( pData, aRange ) )
915 : {
916 0 : ScDocument* pDoc = pData->GetDocument();
917 : OSL_ENSURE( pDoc, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDoc is null!" );
918 :
919 0 : ScImportExport aExport( pDoc, aRange );
920 0 : aExport.SetExportTextOptions( ScExportTextOptions( ScExportTextOptions::None, 0, false ) );
921 :
922 : // #i87703# text to columns fails with tab separator
923 0 : aExport.SetDelimiter( static_cast< sal_Unicode >( 0 ) );
924 :
925 0 : SvMemoryStream aStream;
926 0 : aStream.SetStreamCharSet( RTL_TEXTENCODING_UNICODE );
927 0 : ScImportExport::SetNoEndianSwap( aStream );
928 0 : aExport.ExportStream( aStream, String(), FORMAT_STRING );
929 :
930 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
931 : OSL_ENSURE( pFact, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pFact is null!" );
932 : AbstractScImportAsciiDlg *pDlg = pFact->CreateScImportAsciiDlg(
933 0 : NULL, String(), &aStream, RID_SCDLG_ASCII,SC_TEXTTOCOLUMNS);
934 : OSL_ENSURE( pDlg, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDlg is null!" );
935 :
936 0 : if ( pDlg->Execute() == RET_OK )
937 : {
938 0 : ScDocShell* pDocSh = pData->GetDocShell();
939 : OSL_ENSURE( pDocSh, "ScCellShell::ExecuteDB: SID_TEXT_TO_COLUMNS - pDocSh is null!" );
940 :
941 0 : String aUndo = ScGlobal::GetRscString( STR_UNDO_TEXTTOCOLUMNS );
942 0 : pDocSh->GetUndoManager()->EnterListAction( aUndo, aUndo );
943 :
944 0 : ScImportExport aImport( pDoc, aRange.aStart );
945 0 : ScAsciiOptions aOptions;
946 0 : pDlg->GetOptions( aOptions );
947 0 : pDlg->SaveParameters();
948 0 : aImport.SetExtOptions( aOptions );
949 0 : aImport.SetApi( false );
950 0 : aStream.Seek( 0 );
951 0 : aImport.ImportStream( aStream, String(), FORMAT_STRING );
952 :
953 0 : pDocSh->GetUndoManager()->LeaveListAction();
954 : }
955 0 : delete pDlg;
956 : }
957 : }
958 0 : break;
959 : }
960 0 : }
961 :
962 0 : void ScCellShell::GetDBState( SfxItemSet& rSet )
963 : {
964 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
965 0 : ScViewData* pData = GetViewData();
966 0 : ScDocShell* pDocSh = pData->GetDocShell();
967 0 : ScDocument* pDoc = pDocSh->GetDocument();
968 0 : SCCOL nPosX = pData->GetCurX();
969 0 : SCROW nPosY = pData->GetCurY();
970 0 : SCTAB nTab = pData->GetTabNo();
971 :
972 0 : sal_Bool bAutoFilter = false;
973 0 : sal_Bool bAutoFilterTested = false;
974 :
975 0 : SfxWhichIter aIter(rSet);
976 0 : sal_uInt16 nWhich = aIter.FirstWhich();
977 0 : while (nWhich)
978 : {
979 0 : switch (nWhich)
980 : {
981 : case SID_REFRESH_DBAREA:
982 : {
983 : // imported data without selection
984 : // or filter,sort,subtotal (also without import)
985 0 : sal_Bool bOk = false;
986 0 : ScDBData* pDBData = pTabViewShell->GetDBData(false,SC_DB_OLD);
987 0 : if (pDBData && pDoc->GetChangeTrack() == NULL)
988 : {
989 0 : if ( pDBData->HasImportParam() )
990 0 : bOk = !pDBData->HasImportSelection();
991 : else
992 : {
993 0 : bOk = pDBData->HasQueryParam() ||
994 0 : pDBData->HasSortParam() ||
995 0 : pDBData->HasSubTotalParam();
996 : }
997 : }
998 0 : if (!bOk)
999 0 : rSet.DisableItem( nWhich );
1000 : }
1001 0 : break;
1002 :
1003 : case SID_FILTER:
1004 : case SID_SPECIAL_FILTER:
1005 : {
1006 0 : ScRange aDummy;
1007 0 : ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy);
1008 0 : if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
1009 : {
1010 0 : rSet.DisableItem( nWhich );
1011 : }
1012 : }
1013 0 : break;
1014 :
1015 :
1016 : //in case of Redlining and multiselection disable
1017 : case SID_SORT_ASCENDING:
1018 : case SID_SORT_DESCENDING:
1019 : case SCITEM_SORTDATA:
1020 : case SCITEM_SUBTDATA:
1021 : case SID_OPENDLG_PIVOTTABLE:
1022 : {
1023 : //! move ReadOnly check to idl flags
1024 :
1025 0 : if ( pDocSh->IsReadOnly() || pDoc->GetChangeTrack()!=NULL ||
1026 0 : GetViewData()->IsMultiMarked() )
1027 : {
1028 0 : rSet.DisableItem( nWhich );
1029 : }
1030 : }
1031 0 : break;
1032 :
1033 : case SID_REIMPORT_DATA:
1034 : {
1035 : // only imported data without selection
1036 0 : ScDBData* pDBData = pTabViewShell->GetDBData(false,SC_DB_OLD);
1037 0 : if (!pDBData || !pDBData->HasImportParam() || pDBData->HasImportSelection() ||
1038 0 : pDoc->GetChangeTrack()!=NULL)
1039 : {
1040 0 : rSet.DisableItem( nWhich );
1041 : }
1042 : }
1043 0 : break;
1044 :
1045 : case SID_VIEW_DATA_SOURCE_BROWSER:
1046 : {
1047 0 : if (!SvtModuleOptions().IsModuleInstalled(SvtModuleOptions::E_SDATABASE))
1048 0 : rSet.Put(SfxVisibilityItem(nWhich, false));
1049 : else
1050 : // get state (BoolItem) from SfxViewFrame
1051 0 : pTabViewShell->GetViewFrame()->GetSlotState( nWhich, NULL, &rSet );
1052 : }
1053 0 : break;
1054 : case SID_SBA_BRW_INSERT:
1055 : {
1056 : // SBA wants a sal_Bool-item, enabled
1057 :
1058 0 : sal_Bool bEnable = sal_True;
1059 0 : rSet.Put(SfxBoolItem(nWhich, bEnable));
1060 : }
1061 0 : break;
1062 :
1063 : case SID_AUTO_FILTER:
1064 : case SID_AUTOFILTER_HIDE:
1065 : {
1066 0 : if (!bAutoFilterTested)
1067 : {
1068 0 : bAutoFilter = pDoc->HasAutoFilter( nPosX, nPosY, nTab );
1069 0 : bAutoFilterTested = sal_True;
1070 : }
1071 0 : if ( nWhich == SID_AUTO_FILTER )
1072 : {
1073 0 : ScRange aDummy;
1074 0 : ScMarkType eMarkType = GetViewData()->GetSimpleArea( aDummy);
1075 0 : if (eMarkType != SC_MARK_SIMPLE && eMarkType != SC_MARK_SIMPLE_FILTERED)
1076 : {
1077 0 : rSet.DisableItem( nWhich );
1078 : }
1079 0 : else if (pDoc->GetDPAtBlock(aDummy))
1080 : {
1081 0 : rSet.DisableItem( nWhich );
1082 : }
1083 : else
1084 0 : rSet.Put( SfxBoolItem( nWhich, bAutoFilter ) );
1085 : }
1086 : else
1087 0 : if (!bAutoFilter)
1088 0 : rSet.DisableItem( nWhich );
1089 : }
1090 0 : break;
1091 :
1092 : case SID_UNFILTER:
1093 : {
1094 : SCCOL nStartCol, nEndCol;
1095 : SCROW nStartRow, nEndRow;
1096 : SCTAB nStartTab, nEndTab;
1097 0 : sal_Bool bAnyQuery = false;
1098 :
1099 : sal_Bool bSelected = (GetViewData()->GetSimpleArea(
1100 0 : nStartCol, nStartRow, nStartTab, nEndCol, nEndRow, nEndTab )
1101 0 : == SC_MARK_SIMPLE);
1102 :
1103 0 : if ( bSelected )
1104 : {
1105 0 : if (nStartCol==nEndCol && nStartRow==nEndRow)
1106 0 : bSelected = false;
1107 : }
1108 : else
1109 : {
1110 0 : nStartCol = GetViewData()->GetCurX();
1111 0 : nStartRow = GetViewData()->GetCurY();
1112 0 : nStartTab = GetViewData()->GetTabNo();
1113 : }
1114 :
1115 : ScDBData* pDBData = bSelected
1116 0 : ? pDoc->GetDBAtArea( nStartTab, nStartCol, nStartRow, nEndCol, nEndRow )
1117 0 : : pDoc->GetDBAtCursor( nStartCol, nStartRow, nStartTab );
1118 :
1119 0 : if ( pDBData )
1120 : {
1121 0 : ScQueryParam aParam;
1122 0 : pDBData->GetQueryParam( aParam );
1123 0 : if ( aParam.GetEntry(0).bDoQuery )
1124 0 : bAnyQuery = sal_True;
1125 : }
1126 :
1127 0 : if ( !bAnyQuery )
1128 0 : rSet.DisableItem( nWhich );
1129 : }
1130 0 : break;
1131 :
1132 : case SID_DEFINE_DBNAME:
1133 : {
1134 0 : if ( pDocSh && pDocSh->IsDocShared() )
1135 : {
1136 0 : rSet.DisableItem( nWhich );
1137 : }
1138 : }
1139 0 : break;
1140 :
1141 : case SID_TEXT_TO_COLUMNS:
1142 : {
1143 0 : ScRange aRange;
1144 0 : if ( !lcl_GetTextToColumnsRange( pData, aRange ) )
1145 : {
1146 0 : rSet.DisableItem( nWhich );
1147 : }
1148 : }
1149 0 : break;
1150 : }
1151 0 : nWhich = aIter.NextWhich();
1152 0 : }
1153 15 : }
1154 :
1155 :
1156 :
1157 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|