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