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 <com/sun/star/i18n/TextConversionOption.hpp>
23 : #include <com/sun/star/sheet/DataPilotFieldFilter.hpp>
24 :
25 : #include "scitems.hxx"
26 : #include <sfx2/viewfrm.hxx>
27 :
28 : #include <svl/stritem.hxx>
29 : #include <svl/whiter.hxx>
30 : #include <svl/zforlist.hxx>
31 : #include <svl/zformat.hxx>
32 : #include <sfx2/dispatch.hxx>
33 : #include <sfx2/request.hxx>
34 : #include <vcl/msgbox.hxx>
35 : #include <svx/svxdlg.hxx>
36 : #include <sot/formats.hxx>
37 : #include <svx/postattr.hxx>
38 : #include <editeng/fontitem.hxx>
39 : #include <svx/clipfmtitem.hxx>
40 : #include <sfx2/passwd.hxx>
41 : #include <svx/hlnkitem.hxx>
42 : #include <basic/sbxcore.hxx>
43 : #include <unotools/useroptions.hxx>
44 : #include <vcl/waitobj.hxx>
45 : #include <unotools/localedatawrapper.hxx>
46 :
47 : #include "cellsh.hxx"
48 : #include "sc.hrc"
49 : #include "document.hxx"
50 : #include "patattr.hxx"
51 : #include "scmod.hxx"
52 : #include "scresid.hxx"
53 : #include "tabvwsh.hxx"
54 : #include "impex.hxx"
55 : #include "reffind.hxx"
56 : #include "uiitems.hxx"
57 : #include "reffact.hxx"
58 : #include "inputhdl.hxx"
59 : #include "transobj.hxx"
60 : #include "drwtrans.hxx"
61 : #include "docfunc.hxx"
62 : #include "editable.hxx"
63 : #include "dpobject.hxx"
64 : #include "dpsave.hxx"
65 : #include "dpgroup.hxx"
66 : #include "spellparam.hxx"
67 : #include "postit.hxx"
68 : #include "clipparam.hxx"
69 : #include "pivot.hxx"
70 : #include "dpsdbtab.hxx"
71 : #include "dpshttab.hxx"
72 : #include "dbdata.hxx"
73 : #include "docsh.hxx"
74 : #include "cliputil.hxx"
75 : #include "markdata.hxx"
76 : #include "docpool.hxx"
77 : #include "condformatdlg.hxx"
78 : #include "attrib.hxx"
79 :
80 : #include "globstr.hrc"
81 : #include "scui_def.hxx"
82 : #include <svx/dialogs.hrc>
83 : #include "scabstdlg.hxx"
84 : #include <tokenstringcontext.hxx>
85 : #include <cellvalue.hxx>
86 : #include <tokenarray.hxx>
87 : #include <formulacell.hxx>
88 : #include <gridwin.hxx>
89 : #include <searchresults.hxx>
90 :
91 : #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
92 : #include <com/sun/star/lang/XInitialization.hpp>
93 : #include <com/sun/star/beans/PropertyValue.hpp>
94 : #include <com/sun/star/beans/XPropertySet.hpp>
95 : #include <cppuhelper/bootstrap.hxx>
96 : #include <com/sun/star/i18n/TransliterationModules.hpp>
97 : #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
98 :
99 : #include <boost/scoped_ptr.hpp>
100 :
101 : using namespace ::com::sun::star;
102 : using namespace ::com::sun::star::beans;
103 : using namespace ::com::sun::star::uno;
104 :
105 0 : void ScCellShell::ExecuteEdit( SfxRequest& rReq )
106 : {
107 0 : ScModule* pScMod = SC_MOD();
108 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
109 0 : SfxBindings& rBindings = pTabViewShell->GetViewFrame()->GetBindings();
110 0 : const SfxItemSet* pReqArgs = rReq.GetArgs();
111 0 : sal_uInt16 nSlot = rReq.GetSlot();
112 :
113 0 : pTabViewShell->HideListBox(); // Autofilter-DropDown-Listbox
114 :
115 : // finish input
116 0 : if ( GetViewData()->HasEditView( GetViewData()->GetActivePart() ) )
117 : {
118 0 : switch ( nSlot )
119 : {
120 : case FID_DEFINE_NAME:
121 : case FID_ADD_NAME:
122 : case FID_USE_NAME:
123 : case FID_INSERT_NAME:
124 : case SID_SPELL_DIALOG:
125 : case SID_HANGUL_HANJA_CONVERSION:
126 : case SID_OPENDLG_CONDFRMT:
127 : case SID_OPENDLG_COLORSCALE:
128 : case SID_OPENDLG_DATABAR:
129 :
130 0 : pScMod->InputEnterHandler();
131 0 : pTabViewShell->UpdateInputHandler();
132 0 : break;
133 :
134 : default:
135 0 : break;
136 : }
137 : }
138 :
139 0 : switch ( nSlot )
140 : {
141 :
142 : // insert / delete cells / rows / columns
143 :
144 : case FID_INS_ROW:
145 0 : pTabViewShell->InsertCells(INS_INSROWS);
146 0 : rReq.Done();
147 0 : break;
148 :
149 : case FID_INS_COLUMN:
150 0 : pTabViewShell->InsertCells(INS_INSCOLS);
151 0 : rReq.Done();
152 0 : break;
153 :
154 : case FID_INS_CELLSDOWN:
155 0 : pTabViewShell->InsertCells(INS_CELLSDOWN);
156 0 : rReq.Done();
157 0 : break;
158 :
159 : case FID_INS_CELLSRIGHT:
160 0 : pTabViewShell->InsertCells(INS_CELLSRIGHT);
161 0 : rReq.Done();
162 0 : break;
163 :
164 : case SID_DEL_ROWS:
165 0 : pTabViewShell->DeleteCells( DEL_DELROWS );
166 0 : rReq.Done();
167 0 : break;
168 :
169 : case SID_DEL_COLS:
170 0 : pTabViewShell->DeleteCells( DEL_DELCOLS );
171 0 : rReq.Done();
172 0 : break;
173 :
174 : case FID_INS_CELL:
175 : {
176 0 : InsCellCmd eCmd=INS_NONE;
177 :
178 0 : if ( pReqArgs )
179 : {
180 : const SfxPoolItem* pItem;
181 0 : OUString aFlags;
182 :
183 0 : if( pReqArgs->HasItem( FID_INS_CELL, &pItem ) )
184 0 : aFlags = static_cast<const SfxStringItem*>(pItem)->GetValue();
185 0 : if( !aFlags.isEmpty() )
186 : {
187 0 : switch( aFlags[0] )
188 : {
189 0 : case 'V': eCmd = INS_CELLSDOWN ;break;
190 0 : case '>': eCmd = INS_CELLSRIGHT ;break;
191 0 : case 'R': eCmd = INS_INSROWS ;break;
192 0 : case 'C': eCmd = INS_INSCOLS ;break;
193 : }
194 0 : }
195 : }
196 : else
197 : {
198 0 : if ( GetViewData()->SimpleColMarked() )
199 0 : eCmd = INS_INSCOLS;
200 0 : else if ( GetViewData()->SimpleRowMarked() )
201 0 : eCmd = INS_INSROWS;
202 : else
203 : {
204 0 : ScDocument* pDoc = GetViewData()->GetDocument();
205 0 : bool bTheFlag=(pDoc->GetChangeTrack()!=NULL);
206 :
207 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
208 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
209 :
210 0 : boost::scoped_ptr<AbstractScInsertCellDlg> pDlg(pFact->CreateScInsertCellDlg( pTabViewShell->GetDialogParent(), RID_SCDLG_INSCELL, bTheFlag));
211 : OSL_ENSURE(pDlg, "Dialog create fail!");
212 0 : if (pDlg->Execute() == RET_OK)
213 0 : eCmd = pDlg->GetInsCellCmd();
214 : }
215 : }
216 :
217 0 : if (eCmd!=INS_NONE)
218 : {
219 0 : pTabViewShell->InsertCells( eCmd );
220 :
221 0 : if( ! rReq.IsAPI() )
222 : {
223 0 : OUString aParam;
224 :
225 0 : switch( eCmd )
226 : {
227 0 : case INS_CELLSDOWN: aParam = "V"; break;
228 0 : case INS_CELLSRIGHT: aParam = ">"; break;
229 0 : case INS_INSROWS: aParam = "R"; break;
230 0 : case INS_INSCOLS: aParam = "C"; break;
231 : default:
232 : {
233 : // added to avoid warnings
234 : }
235 : }
236 0 : rReq.AppendItem( SfxStringItem( FID_INS_CELL, aParam ) );
237 0 : rReq.Done();
238 : }
239 : }
240 : }
241 0 : break;
242 :
243 : case FID_DELETE_CELL:
244 : {
245 0 : DelCellCmd eCmd = DEL_NONE;
246 :
247 0 : if ( pReqArgs )
248 : {
249 : const SfxPoolItem* pItem;
250 0 : OUString aFlags;
251 :
252 0 : if( pReqArgs->HasItem( FID_DELETE_CELL, &pItem ) )
253 0 : aFlags = static_cast<const SfxStringItem*>(pItem)->GetValue();
254 0 : if( !aFlags.isEmpty() )
255 : {
256 0 : switch( aFlags[0] )
257 : {
258 0 : case 'U': eCmd = DEL_CELLSUP ;break;
259 0 : case 'L': eCmd = DEL_CELLSLEFT ;break;
260 0 : case 'R': eCmd = DEL_DELROWS ;break;
261 0 : case 'C': eCmd = DEL_DELCOLS ;break;
262 : }
263 0 : }
264 : }
265 : else
266 : {
267 0 : if ( GetViewData()->SimpleColMarked() )
268 0 : eCmd = DEL_DELCOLS;
269 0 : else if ( GetViewData()->SimpleRowMarked() )
270 0 : eCmd = DEL_DELROWS;
271 : else
272 : {
273 0 : ScRange aRange;
274 0 : ScDocument* pDoc = GetViewData()->GetDocument();
275 0 : bool bTheFlag=GetViewData()->IsMultiMarked() ||
276 0 : (GetViewData()->GetSimpleArea(aRange) == SC_MARK_SIMPLE_FILTERED) ||
277 0 : (pDoc->GetChangeTrack() != NULL);
278 :
279 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
280 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
281 :
282 0 : boost::scoped_ptr<AbstractScDeleteCellDlg> pDlg(pFact->CreateScDeleteCellDlg( pTabViewShell->GetDialogParent(), bTheFlag ));
283 : OSL_ENSURE(pDlg, "Dialog create fail!");
284 :
285 0 : if (pDlg->Execute() == RET_OK)
286 0 : eCmd = pDlg->GetDelCellCmd();
287 : }
288 : }
289 :
290 0 : if (eCmd != DEL_NONE )
291 : {
292 0 : pTabViewShell->DeleteCells( eCmd );
293 :
294 0 : if( ! rReq.IsAPI() )
295 : {
296 0 : OUString aParam;
297 :
298 0 : switch( eCmd )
299 : {
300 0 : case DEL_CELLSUP: aParam = "U"; break;
301 0 : case DEL_CELLSLEFT: aParam = "L"; break;
302 0 : case DEL_DELROWS: aParam = "R"; break;
303 0 : case DEL_DELCOLS: aParam = "C"; break;
304 : default:
305 : {
306 : // added to avoid warnings
307 : }
308 : }
309 0 : rReq.AppendItem( SfxStringItem( FID_DELETE_CELL, aParam ) );
310 0 : rReq.Done();
311 : }
312 : }
313 : }
314 0 : break;
315 :
316 : // delete contents from cells
317 :
318 : case SID_DELETE_CONTENTS:
319 0 : pTabViewShell->DeleteContents( IDF_CONTENTS );
320 0 : rReq.Done();
321 0 : break;
322 :
323 : case SID_DELETE:
324 : {
325 0 : InsertDeleteFlags nFlags = IDF_NONE;
326 :
327 0 : if ( pReqArgs!=NULL && pTabViewShell->SelectionEditable() )
328 : {
329 : const SfxPoolItem* pItem;
330 0 : OUString aFlags('A');
331 :
332 0 : if( pReqArgs->HasItem( SID_DELETE, &pItem ) )
333 0 : aFlags = static_cast<const SfxStringItem*>(pItem)->GetValue();
334 :
335 0 : aFlags = aFlags.toAsciiUpperCase();
336 0 : bool bCont = true;
337 :
338 0 : for (sal_Int32 i=0 ; bCont && i<aFlags.getLength(); ++i)
339 : {
340 0 : switch (aFlags[i])
341 : {
342 : case 'A': // all
343 0 : nFlags |= IDF_ALL;
344 0 : bCont = false; // don't continue!
345 0 : break;
346 0 : case 'S': nFlags |= IDF_STRING; break;
347 0 : case 'V': nFlags |= IDF_VALUE; break;
348 0 : case 'D': nFlags |= IDF_DATETIME; break;
349 0 : case 'F': nFlags |= IDF_FORMULA; break;
350 0 : case 'N': nFlags |= IDF_NOTE; break;
351 0 : case 'T': nFlags |= IDF_ATTRIB; break;
352 0 : case 'O': nFlags |= IDF_OBJECTS; break;
353 : }
354 0 : }
355 : }
356 : else
357 : {
358 0 : ScEditableTester aTester( pTabViewShell );
359 0 : if (aTester.IsEditable())
360 : {
361 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
362 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
363 :
364 0 : boost::scoped_ptr<AbstractScDeleteContentsDlg> pDlg(pFact->CreateScDeleteContentsDlg(pTabViewShell->GetDialogParent()));
365 : OSL_ENSURE(pDlg, "Dialog create fail!");
366 0 : ScDocument* pDoc = GetViewData()->GetDocument();
367 0 : SCTAB nTab = GetViewData()->GetTabNo();
368 0 : if ( pDoc->IsTabProtected(nTab) )
369 0 : pDlg->DisableObjects();
370 0 : if (pDlg->Execute() == RET_OK)
371 : {
372 0 : nFlags = pDlg->GetDelContentsCmdBits();
373 0 : }
374 : }
375 : else
376 0 : pTabViewShell->ErrorMessage(aTester.GetMessageId());
377 : }
378 :
379 0 : if( nFlags != IDF_NONE )
380 : {
381 0 : pTabViewShell->DeleteContents( nFlags );
382 :
383 0 : if( ! rReq.IsAPI() )
384 : {
385 0 : OUString aFlags;
386 :
387 0 : if( nFlags == IDF_ALL )
388 : {
389 0 : aFlags += "A";
390 : }
391 : else
392 : {
393 0 : if( nFlags & IDF_STRING ) aFlags += "S";
394 0 : if( nFlags & IDF_VALUE ) aFlags += "V";
395 0 : if( nFlags & IDF_DATETIME ) aFlags += "D";
396 0 : if( nFlags & IDF_FORMULA ) aFlags += "F";
397 0 : if( nFlags & IDF_NOTE ) aFlags += "N";
398 0 : if( nFlags & IDF_ATTRIB ) aFlags += "T";
399 0 : if( nFlags & IDF_OBJECTS ) aFlags += "O";
400 : }
401 :
402 0 : rReq.AppendItem( SfxStringItem( SID_DELETE, aFlags ) );
403 0 : rReq.Done();
404 : }
405 : }
406 : }
407 0 : break;
408 :
409 : // fill...
410 :
411 : case FID_FILL_TO_BOTTOM:
412 0 : pTabViewShell->FillSimple( FILL_TO_BOTTOM );
413 0 : rReq.Done();
414 0 : break;
415 :
416 : case FID_FILL_TO_RIGHT:
417 0 : pTabViewShell->FillSimple( FILL_TO_RIGHT );
418 0 : rReq.Done();
419 0 : break;
420 :
421 : case FID_FILL_TO_TOP:
422 0 : pTabViewShell->FillSimple( FILL_TO_TOP );
423 0 : rReq.Done();
424 0 : break;
425 :
426 : case FID_FILL_TO_LEFT:
427 0 : pTabViewShell->FillSimple( FILL_TO_LEFT );
428 0 : rReq.Done();
429 0 : break;
430 :
431 : case FID_FILL_TAB:
432 : {
433 0 : InsertDeleteFlags nFlags = IDF_NONE;
434 0 : sal_uInt16 nFunction = PASTE_NOFUNC;
435 0 : bool bSkipEmpty = false;
436 0 : bool bAsLink = false;
437 :
438 0 : if ( pReqArgs!=NULL && pTabViewShell->SelectionEditable() )
439 : {
440 : const SfxPoolItem* pItem;
441 0 : OUString aFlags('A');
442 :
443 0 : if( pReqArgs->HasItem( FID_FILL_TAB, &pItem ) )
444 0 : aFlags = static_cast<const SfxStringItem*>(pItem)->GetValue();
445 :
446 0 : aFlags = aFlags.toAsciiUpperCase();
447 0 : bool bCont = true;
448 :
449 0 : for (sal_Int32 i=0; bCont && i < aFlags.getLength(); ++i)
450 : {
451 0 : switch (aFlags[i])
452 : {
453 : case 'A': // all
454 0 : nFlags |= IDF_ALL;
455 0 : bCont = false; // don't continue!
456 0 : break;
457 0 : case 'S': nFlags |= IDF_STRING; break;
458 0 : case 'V': nFlags |= IDF_VALUE; break;
459 0 : case 'D': nFlags |= IDF_DATETIME; break;
460 0 : case 'F': nFlags |= IDF_FORMULA; break;
461 0 : case 'N': nFlags |= IDF_NOTE; break;
462 0 : case 'T': nFlags |= IDF_ATTRIB; break;
463 : }
464 0 : }
465 : }
466 : else
467 : {
468 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
469 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
470 :
471 : boost::scoped_ptr<AbstractScInsertContentsDlg> pDlg(pFact->CreateScInsertContentsDlg( pTabViewShell->GetDialogParent(),
472 : IDF_NONE, /* nCheckDefaults */
473 0 : &ScGlobal::GetRscString(STR_FILL_TAB)));
474 : OSL_ENSURE(pDlg, "Dialog create fail!");
475 0 : pDlg->SetFillMode(true);
476 :
477 0 : if (pDlg->Execute() == RET_OK)
478 : {
479 0 : nFlags = pDlg->GetInsContentsCmdBits();
480 0 : nFunction = pDlg->GetFormulaCmdBits();
481 0 : bSkipEmpty = pDlg->IsSkipEmptyCells();
482 0 : bAsLink = pDlg->IsLink();
483 : // there is no MoveMode with fill tabs
484 0 : }
485 : }
486 :
487 0 : if( nFlags != IDF_NONE )
488 : {
489 0 : pTabViewShell->FillTab( nFlags, nFunction, bSkipEmpty, bAsLink );
490 :
491 0 : if( ! rReq.IsAPI() )
492 : {
493 0 : OUString aFlags;
494 :
495 0 : if( nFlags == IDF_ALL )
496 : {
497 0 : aFlags += "A";
498 : }
499 : else
500 : {
501 0 : if( nFlags & IDF_STRING ) aFlags += "S";
502 0 : if( nFlags & IDF_VALUE ) aFlags += "V";
503 0 : if( nFlags & IDF_DATETIME ) aFlags += "D";
504 0 : if( nFlags & IDF_FORMULA ) aFlags += "F";
505 0 : if( nFlags & IDF_NOTE ) aFlags += "N";
506 0 : if( nFlags & IDF_ATTRIB ) aFlags += "T";
507 : }
508 :
509 0 : rReq.AppendItem( SfxStringItem( FID_FILL_TAB, aFlags ) );
510 0 : rReq.Done();
511 : }
512 : }
513 : }
514 0 : break;
515 :
516 : case FID_FILL_SERIES:
517 : {
518 : SCCOL nStartCol;
519 : SCROW nStartRow;
520 : SCTAB nStartTab;
521 : SCCOL nEndCol;
522 : SCROW nEndRow;
523 : SCTAB nEndTab;
524 0 : sal_uInt16 nPossDir = FDS_OPT_NONE;
525 0 : FillDir eFillDir = FILL_TO_BOTTOM;
526 0 : FillCmd eFillCmd = FILL_LINEAR;
527 0 : FillDateCmd eFillDateCmd = FILL_DAY;
528 0 : double fStartVal = MAXDOUBLE;
529 0 : double fIncVal = 1;
530 0 : double fMaxVal = MAXDOUBLE;
531 0 : bool bDoIt = false;
532 :
533 : GetViewData()->GetSimpleArea( nStartCol, nStartRow, nStartTab,
534 0 : nEndCol, nEndRow, nEndTab );
535 :
536 0 : if( nStartCol!=nEndCol )
537 : {
538 0 : nPossDir |= FDS_OPT_HORZ;
539 0 : eFillDir=FILL_TO_RIGHT;
540 : }
541 :
542 0 : if( nStartRow!=nEndRow )
543 : {
544 0 : nPossDir |= FDS_OPT_VERT;
545 0 : eFillDir=FILL_TO_BOTTOM;
546 : }
547 :
548 0 : ScDocument* pDoc = GetViewData()->GetDocument();
549 0 : SvNumberFormatter* pFormatter = pDoc->GetFormatTable();
550 :
551 0 : if( pReqArgs )
552 : {
553 : const SfxPoolItem* pItem;
554 0 : OUString aFillDir, aFillCmd, aFillDateCmd;
555 0 : OUString aFillStep, aFillStart, aFillMax;
556 : sal_uInt32 nKey;
557 : double fTmpVal;
558 :
559 0 : bDoIt=false;
560 :
561 0 : if( pReqArgs->HasItem( FID_FILL_SERIES, &pItem ) )
562 0 : aFillDir = static_cast<const SfxStringItem*>(pItem)->GetValue();
563 0 : if( pReqArgs->HasItem( FN_PARAM_1, &pItem ) )
564 0 : aFillCmd = static_cast<const SfxStringItem*>(pItem)->GetValue();
565 0 : if( pReqArgs->HasItem( FN_PARAM_2, &pItem ) )
566 0 : aFillDateCmd = static_cast<const SfxStringItem*>(pItem)->GetValue();
567 0 : if( pReqArgs->HasItem( FN_PARAM_3, &pItem ) )
568 0 : aFillStep = static_cast<const SfxStringItem*>(pItem)->GetValue();
569 0 : if( pReqArgs->HasItem( FN_PARAM_4, &pItem ) )
570 0 : aFillStart = static_cast<const SfxStringItem*>(pItem)->GetValue();
571 0 : if( pReqArgs->HasItem( FN_PARAM_5, &pItem ) )
572 0 : aFillMax = static_cast<const SfxStringItem*>(pItem)->GetValue();
573 :
574 0 : if( !aFillDir.isEmpty() )
575 0 : switch( aFillDir[0] )
576 : {
577 0 : case 'B': case 'b': eFillDir=FILL_TO_BOTTOM; break;
578 0 : case 'R': case 'r': eFillDir=FILL_TO_RIGHT; break;
579 0 : case 'T': case 't': eFillDir=FILL_TO_TOP; break;
580 0 : case 'L': case 'l': eFillDir=FILL_TO_LEFT; break;
581 : }
582 :
583 0 : if( !aFillCmd.isEmpty() )
584 0 : switch( aFillCmd[0] )
585 : {
586 0 : case 'S': case 's': eFillCmd=FILL_SIMPLE; break;
587 0 : case 'L': case 'l': eFillCmd=FILL_LINEAR; break;
588 0 : case 'G': case 'g': eFillCmd=FILL_GROWTH; break;
589 0 : case 'D': case 'd': eFillCmd=FILL_DATE; break;
590 0 : case 'A': case 'a': eFillCmd=FILL_AUTO; break;
591 : }
592 :
593 0 : if( !aFillDateCmd.isEmpty() )
594 0 : switch( aFillDateCmd[0] )
595 : {
596 0 : case 'D': case 'd': eFillDateCmd=FILL_DAY; break;
597 0 : case 'W': case 'w': eFillDateCmd=FILL_WEEKDAY; break;
598 0 : case 'M': case 'm': eFillDateCmd=FILL_MONTH; break;
599 0 : case 'Y': case 'y': eFillDateCmd=FILL_YEAR; break;
600 : }
601 :
602 0 : nKey = 0;
603 0 : if( pFormatter->IsNumberFormat( aFillStart, nKey, fTmpVal ))
604 0 : fStartVal = fTmpVal;
605 :
606 0 : nKey = 0;
607 0 : if( pFormatter->IsNumberFormat( aFillStep, nKey, fTmpVal ))
608 0 : fIncVal = fTmpVal;
609 :
610 0 : nKey = 0;
611 0 : if( pFormatter->IsNumberFormat( aFillMax, nKey, fTmpVal ))
612 0 : fMaxVal = fTmpVal;
613 :
614 0 : bDoIt = true;
615 :
616 : }
617 : else // (pReqArgs == NULL) => raise Dialog
618 : {
619 : sal_uInt32 nPrivFormat;
620 : CellType eCellType;
621 0 : pDoc->GetNumberFormat( nStartCol, nStartRow, nStartTab, nPrivFormat );
622 0 : pDoc->GetCellType( nStartCol, nStartRow, nStartTab,eCellType );
623 0 : const SvNumberformat* pPrivEntry = pFormatter->GetEntry( nPrivFormat );
624 0 : if (!pPrivEntry)
625 : {
626 : OSL_FAIL("Numberformat not found !!!");
627 : }
628 : else
629 : {
630 0 : short nPrivType = pPrivEntry->GetType();
631 0 : if ( ( nPrivType & NUMBERFORMAT_DATE)>0)
632 : {
633 0 : eFillCmd=FILL_DATE;
634 : }
635 0 : else if(eCellType==CELLTYPE_STRING)
636 : {
637 0 : eFillCmd=FILL_AUTO;
638 : }
639 : }
640 :
641 0 : OUString aStartStr;
642 :
643 : // suggest default Startvalue only, when just 1 row or column
644 0 : if ( nStartCol == nEndCol || nStartRow == nEndRow )
645 : {
646 0 : double fInputEndVal = 0.0;
647 0 : OUString aEndStr;
648 :
649 0 : pDoc->GetInputString( nStartCol, nStartRow, nStartTab, aStartStr);
650 0 : pDoc->GetValue( nStartCol, nStartRow, nStartTab, fStartVal );
651 :
652 0 : if(eFillDir==FILL_TO_BOTTOM && nStartRow < nEndRow )
653 : {
654 0 : pDoc->GetInputString( nStartCol, nStartRow+1, nStartTab, aEndStr);
655 0 : if(!aEndStr.isEmpty())
656 : {
657 0 : pDoc->GetValue( nStartCol, nStartRow+1, nStartTab, fInputEndVal);
658 0 : fIncVal=fInputEndVal-fStartVal;
659 : }
660 : }
661 : else
662 : {
663 0 : if(nStartCol < nEndCol)
664 : {
665 0 : pDoc->GetInputString( nStartCol+1, nStartRow, nStartTab, aEndStr);
666 0 : if(!aEndStr.isEmpty())
667 : {
668 0 : pDoc->GetValue( nStartCol+1, nStartRow, nStartTab, fInputEndVal);
669 0 : fIncVal=fInputEndVal-fStartVal;
670 : }
671 : }
672 : }
673 0 : if(eFillCmd==FILL_DATE)
674 : {
675 0 : Date aNullDate = *pDoc->GetFormatTable()->GetNullDate();
676 0 : Date aStartDate = aNullDate;
677 0 : aStartDate+= (long)fStartVal;
678 0 : Date aEndDate = aNullDate;
679 0 : aEndDate+= (long)fInputEndVal;
680 0 : double fTempDate=0;
681 :
682 0 : if(aStartDate.GetYear()!=aEndDate.GetYear())
683 : {
684 0 : eFillDateCmd = FILL_YEAR;
685 0 : fTempDate=aEndDate.GetYear()-aStartDate.GetYear();
686 : }
687 0 : if(aStartDate.GetMonth()!=aEndDate.GetMonth())
688 : {
689 0 : eFillDateCmd = FILL_MONTH;
690 0 : fTempDate=fTempDate*12+aEndDate.GetMonth()-aStartDate.GetMonth();
691 : }
692 0 : if(aStartDate.GetDay()==aEndDate.GetDay())
693 : {
694 0 : fIncVal=fTempDate;
695 : }
696 0 : }
697 : }
698 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
699 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
700 :
701 : boost::scoped_ptr<AbstractScFillSeriesDlg> pDlg(pFact->CreateScFillSeriesDlg( pTabViewShell->GetDialogParent(),
702 : *pDoc,
703 : eFillDir, eFillCmd, eFillDateCmd,
704 : aStartStr, fIncVal, fMaxVal,
705 0 : nPossDir));
706 : OSL_ENSURE(pDlg, "Dialog create fail!");
707 :
708 0 : if ( nStartCol != nEndCol && nStartRow != nEndRow )
709 : {
710 0 : pDlg->SetEdStartValEnabled(false);
711 : }
712 :
713 0 : if ( pDlg->Execute() == RET_OK )
714 : {
715 0 : eFillDir = pDlg->GetFillDir();
716 0 : eFillCmd = pDlg->GetFillCmd();
717 0 : eFillDateCmd = pDlg->GetFillDateCmd();
718 :
719 0 : if(eFillCmd==FILL_AUTO)
720 : {
721 0 : OUString aStr = pDlg->GetStartStr();
722 0 : if(!aStr.isEmpty())
723 0 : pTabViewShell->EnterData( nStartCol, nStartRow, nStartTab, aStr );
724 : }
725 0 : fStartVal = pDlg->GetStart();
726 0 : fIncVal = pDlg->GetStep();
727 0 : fMaxVal = pDlg->GetMax();
728 0 : bDoIt = true;
729 0 : }
730 : }
731 :
732 0 : if( bDoIt )
733 : {
734 : //nScFillModeMouseModifier = 0; // no Ctrl/Copy
735 0 : pTabViewShell->FillSeries( eFillDir, eFillCmd, eFillDateCmd, fStartVal, fIncVal, fMaxVal );
736 :
737 0 : if( ! rReq.IsAPI() )
738 : {
739 0 : OUString aPara;
740 0 : Color* pColor=0;
741 :
742 0 : switch( eFillDir )
743 : {
744 0 : case FILL_TO_BOTTOM: aPara = "B"; break;
745 0 : case FILL_TO_RIGHT: aPara = "R"; break;
746 0 : case FILL_TO_TOP: aPara = "T"; break;
747 0 : case FILL_TO_LEFT: aPara = "L"; break;
748 0 : default: break;
749 : }
750 0 : rReq.AppendItem( SfxStringItem( FID_FILL_SERIES, aPara ) );
751 :
752 0 : switch( eFillCmd )
753 : {
754 0 : case FILL_SIMPLE: aPara = "S"; break;
755 0 : case FILL_LINEAR: aPara = "L"; break;
756 0 : case FILL_GROWTH: aPara = "G"; break;
757 0 : case FILL_DATE: aPara = "D"; break;
758 0 : case FILL_AUTO: aPara = "A"; break;
759 0 : default: break;
760 : }
761 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_1, aPara ) );
762 :
763 0 : switch( eFillDateCmd )
764 : {
765 0 : case FILL_DAY: aPara = "D"; break;
766 0 : case FILL_WEEKDAY: aPara = "W"; break;
767 0 : case FILL_MONTH: aPara = "M"; break;
768 0 : case FILL_YEAR: aPara = "Y"; break;
769 0 : default: break;
770 : }
771 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_2, aPara ) );
772 :
773 : sal_uLong nFormatKey = pFormatter->GetStandardFormat(NUMBERFORMAT_NUMBER,
774 0 : ScGlobal::eLnge );
775 :
776 0 : pFormatter->GetOutputString( fIncVal, nFormatKey, aPara, &pColor );
777 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_3, aPara ) );
778 :
779 0 : pFormatter->GetOutputString( fStartVal, nFormatKey, aPara, &pColor );
780 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_4, aPara ) );
781 :
782 0 : pFormatter->GetOutputString( fMaxVal, nFormatKey, aPara, &pColor );
783 0 : rReq.AppendItem( SfxStringItem( FN_PARAM_5, aPara ) );
784 :
785 0 : rReq.Done();
786 : }
787 : }
788 : }
789 0 : break;
790 :
791 : case FID_FILL_AUTO:
792 : {
793 : SCCOL nStartCol;
794 : SCROW nStartRow;
795 : SCCOL nEndCol;
796 : SCROW nEndRow;
797 : SCTAB nStartTab, nEndTab;
798 :
799 0 : GetViewData()->GetFillData( nStartCol, nStartRow, nEndCol, nEndRow );
800 0 : SCCOL nFillCol = GetViewData()->GetRefEndX();
801 0 : SCROW nFillRow = GetViewData()->GetRefEndY();
802 0 : ScDocument* pDoc = GetViewData()->GetDocument();
803 :
804 0 : if( pReqArgs != NULL )
805 : {
806 : const SfxPoolItem* pItem;
807 :
808 0 : if( pReqArgs->HasItem( FID_FILL_AUTO, &pItem ) )
809 : {
810 0 : ScAddress aScAddress;
811 0 : OUString aArg = static_cast<const SfxStringItem*>(pItem)->GetValue();
812 :
813 0 : if( aScAddress.Parse( aArg, pDoc, pDoc->GetAddressConvention() ) & SCA_VALID )
814 : {
815 0 : nFillRow = aScAddress.Row();
816 0 : nFillCol = aScAddress.Col();
817 0 : }
818 : }
819 :
820 : GetViewData()->GetSimpleArea( nStartCol,nStartRow,nStartTab,
821 0 : nEndCol,nEndRow,nEndTab );
822 : }
823 : else // call via mouse
824 : {
825 : // not in a merged cell
826 :
827 0 : if ( nStartCol == nEndCol && nStartRow == nEndRow )
828 : {
829 0 : SCCOL nMergeCol = nStartCol;
830 0 : SCROW nMergeRow = nStartRow;
831 0 : if ( GetViewData()->GetDocument()->ExtendMerge(
832 : nStartCol, nStartRow, nMergeCol, nMergeRow,
833 0 : GetViewData()->GetTabNo() ) )
834 : {
835 0 : if ( nFillCol >= nStartCol && nFillCol <= nMergeCol && nFillRow == nStartRow )
836 0 : nFillCol = nStartCol;
837 0 : if ( nFillRow >= nStartRow && nFillRow <= nMergeRow && nFillCol == nStartCol )
838 0 : nFillRow = nStartRow;
839 : }
840 : }
841 : }
842 :
843 0 : if ( nFillCol != nEndCol || nFillRow != nEndRow )
844 : {
845 0 : if ( nFillCol==nEndCol || nFillRow==nEndRow )
846 : {
847 0 : FillDir eDir = FILL_TO_BOTTOM;
848 0 : SCCOLROW nCount = 0;
849 :
850 0 : if ( nFillCol==nEndCol )
851 : {
852 0 : if ( nFillRow > nEndRow )
853 : {
854 0 : eDir = FILL_TO_BOTTOM;
855 0 : nCount = nFillRow - nEndRow;
856 : }
857 0 : else if ( nFillRow < nStartRow )
858 : {
859 0 : eDir = FILL_TO_TOP;
860 0 : nCount = nStartRow - nFillRow;
861 : }
862 : }
863 : else
864 : {
865 0 : if ( nFillCol > nEndCol )
866 : {
867 0 : eDir = FILL_TO_RIGHT;
868 0 : nCount = nFillCol - nEndCol;
869 : }
870 0 : else if ( nFillCol < nStartCol )
871 : {
872 0 : eDir = FILL_TO_LEFT;
873 0 : nCount = nStartCol - nFillCol;
874 : }
875 : }
876 :
877 0 : if ( nCount != 0)
878 : {
879 0 : pTabViewShell->FillAuto( eDir, nStartCol, nStartRow, nEndCol, nEndRow, nCount );
880 :
881 0 : if( ! rReq.IsAPI() )
882 : {
883 0 : ScAddress aAdr( nFillCol, nFillRow, 0 );
884 0 : OUString aAdrStr(aAdr.Format(SCR_ABS, pDoc, pDoc->GetAddressConvention()));
885 :
886 0 : rReq.AppendItem( SfxStringItem( FID_FILL_AUTO, aAdrStr ) );
887 0 : rReq.Done();
888 : }
889 : }
890 :
891 : }
892 : else
893 : {
894 : OSL_FAIL( "Direction not unique for autofill" );
895 : }
896 : }
897 : }
898 0 : break;
899 : case FID_FILL_SINGLE_EDIT:
900 0 : ExecuteFillSingleEdit();
901 0 : break;
902 : case SID_RANDOM_NUMBER_GENERATOR_DIALOG:
903 : {
904 0 : sal_uInt16 nId = ScRandomNumberGeneratorDialogWrapper::GetChildWindowId();
905 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
906 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
907 :
908 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
909 :
910 : }
911 0 : break;
912 : case SID_SAMPLING_DIALOG:
913 : {
914 0 : sal_uInt16 nId = ScSamplingDialogWrapper::GetChildWindowId();
915 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
916 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
917 :
918 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
919 : }
920 0 : break;
921 : case SID_DESCRIPTIVE_STATISTICS_DIALOG:
922 : {
923 0 : sal_uInt16 nId = ScDescriptiveStatisticsDialogWrapper::GetChildWindowId();
924 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
925 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
926 :
927 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
928 : }
929 0 : break;
930 : case SID_ANALYSIS_OF_VARIANCE_DIALOG:
931 : {
932 0 : sal_uInt16 nId = ScAnalysisOfVarianceDialogWrapper::GetChildWindowId();
933 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
934 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
935 :
936 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
937 : }
938 0 : break;
939 : case SID_CORRELATION_DIALOG:
940 : {
941 0 : sal_uInt16 nId = ScCorrelationDialogWrapper::GetChildWindowId();
942 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
943 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
944 :
945 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
946 : }
947 0 : break;
948 : case SID_COVARIANCE_DIALOG:
949 : {
950 0 : sal_uInt16 nId = ScCovarianceDialogWrapper::GetChildWindowId();
951 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
952 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
953 :
954 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
955 : }
956 0 : break;
957 : case SID_EXPONENTIAL_SMOOTHING_DIALOG:
958 : {
959 0 : sal_uInt16 nId = ScExponentialSmoothingDialogWrapper::GetChildWindowId();
960 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
961 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
962 :
963 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
964 : }
965 0 : break;
966 : case SID_MOVING_AVERAGE_DIALOG:
967 : {
968 0 : sal_uInt16 nId = ScMovingAverageDialogWrapper::GetChildWindowId();
969 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
970 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
971 :
972 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
973 : }
974 0 : break;
975 : case SID_TTEST_DIALOG:
976 : {
977 0 : sal_uInt16 nId = ScTTestDialogWrapper::GetChildWindowId();
978 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
979 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
980 :
981 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
982 :
983 : }
984 0 : break;
985 : case SID_FTEST_DIALOG:
986 : {
987 0 : sal_uInt16 nId = ScFTestDialogWrapper::GetChildWindowId();
988 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
989 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
990 :
991 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
992 :
993 : }
994 0 : break;
995 :
996 : case SID_SEARCH_RESULTS_DIALOG:
997 : {
998 0 : const SfxPoolItem* pItem = NULL;
999 0 : if (pReqArgs->HasItem(SID_SEARCH_RESULTS_DIALOG, &pItem))
1000 : {
1001 0 : bool bVisible = static_cast<const SfxBoolItem*>(pItem)->GetValue();
1002 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
1003 : // The window ID should equal the slot ID, but not a biggie if it wasn't.
1004 0 : sal_uInt16 nId = sc::SearchResultsDlgWrapper::GetChildWindowId();
1005 0 : pViewFrm->SetChildWindow(nId, bVisible, false);
1006 : }
1007 0 : rReq.Done();
1008 : }
1009 0 : break;
1010 :
1011 : // disposal (Outlines)
1012 : // SID_AUTO_OUTLINE, SID_OUTLINE_DELETEALL in Execute (in docsh.idl)
1013 :
1014 : case SID_OUTLINE_HIDE:
1015 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
1016 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
1017 0 : pTabViewShell->SetDataPilotDetails( false );
1018 : else
1019 0 : pTabViewShell->HideMarkedOutlines();
1020 0 : rReq.Done();
1021 0 : break;
1022 :
1023 : case SID_OUTLINE_SHOW:
1024 : {
1025 0 : ScDPObject* pDPObj = GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
1026 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
1027 0 : if ( pDPObj )
1028 : {
1029 0 : Sequence<sheet::DataPilotFieldFilter> aFilters;
1030 : sal_uInt16 nOrientation;
1031 0 : if ( pTabViewShell->HasSelectionForDrillDown( nOrientation ) )
1032 : {
1033 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1034 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1035 :
1036 : AbstractScDPShowDetailDlg* pDlg = pFact->CreateScDPShowDetailDlg(
1037 0 : pTabViewShell->GetDialogParent(), RID_SCDLG_DPSHOWDETAIL, *pDPObj, nOrientation );
1038 : OSL_ENSURE(pDlg, "Dialog create fail!");
1039 0 : if ( pDlg->Execute() == RET_OK )
1040 : {
1041 0 : OUString aNewDimName( pDlg->GetDimensionName() );
1042 0 : pTabViewShell->SetDataPilotDetails( true, &aNewDimName );
1043 : }
1044 : }
1045 0 : else if ( !pDPObj->IsServiceData() &&
1046 : pDPObj->GetDataFieldPositionData(
1047 0 : ScAddress( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() ),
1048 0 : aFilters ) )
1049 0 : pTabViewShell->ShowDataPilotSourceData( *pDPObj, aFilters );
1050 : else
1051 0 : pTabViewShell->SetDataPilotDetails(true);
1052 : }
1053 : else
1054 0 : pTabViewShell->ShowMarkedOutlines();
1055 0 : rReq.Done();
1056 : }
1057 0 : break;
1058 :
1059 : case SID_OUTLINE_MAKE:
1060 : {
1061 0 : bool bColumns = false;
1062 0 : bool bOk = true;
1063 :
1064 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
1065 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
1066 : {
1067 0 : ScDPNumGroupInfo aNumInfo;
1068 0 : aNumInfo.mbEnable = true;
1069 0 : aNumInfo.mbAutoStart = true;
1070 0 : aNumInfo.mbAutoEnd = true;
1071 0 : sal_Int32 nParts = 0;
1072 0 : if ( pTabViewShell->HasSelectionForDateGroup( aNumInfo, nParts ) )
1073 : {
1074 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1075 : OSL_ENSURE( pFact, "ScAbstractFactory create fail!" );
1076 0 : Date aNullDate( *GetViewData()->GetDocument()->GetFormatTable()->GetNullDate() );
1077 : AbstractScDPDateGroupDlg* pDlg = pFact->CreateScDPDateGroupDlg(
1078 : pTabViewShell->GetDialogParent(), RID_SCDLG_DPDATEGROUP,
1079 0 : aNumInfo, nParts, aNullDate );
1080 : OSL_ENSURE( pDlg, "Dialog create fail!" );
1081 0 : if( pDlg->Execute() == RET_OK )
1082 : {
1083 0 : aNumInfo = pDlg->GetGroupInfo();
1084 0 : pTabViewShell->DateGroupDataPilot( aNumInfo, pDlg->GetDatePart() );
1085 : }
1086 : }
1087 0 : else if ( pTabViewShell->HasSelectionForNumGroup( aNumInfo ) )
1088 : {
1089 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1090 : OSL_ENSURE( pFact, "ScAbstractFactory create fail!" );
1091 : AbstractScDPNumGroupDlg* pDlg = pFact->CreateScDPNumGroupDlg(
1092 0 : pTabViewShell->GetDialogParent(), RID_SCDLG_DPNUMGROUP, aNumInfo );
1093 : OSL_ENSURE( pDlg, "Dialog create fail!" );
1094 0 : if( pDlg->Execute() == RET_OK )
1095 0 : pTabViewShell->NumGroupDataPilot( pDlg->GetGroupInfo() );
1096 : }
1097 : else
1098 0 : pTabViewShell->GroupDataPilot();
1099 :
1100 0 : bOk = false;
1101 : }
1102 0 : else if( pReqArgs != NULL )
1103 : {
1104 : const SfxPoolItem* pItem;
1105 0 : bOk = false;
1106 :
1107 0 : if( pReqArgs->HasItem( SID_OUTLINE_MAKE, &pItem ) )
1108 : {
1109 0 : OUString aCol = static_cast<const SfxStringItem*>(pItem)->GetValue();
1110 0 : aCol = aCol.toAsciiUpperCase();
1111 :
1112 0 : switch( aCol[0] )
1113 : {
1114 0 : case 'R': bColumns=false; bOk = true;break;
1115 0 : case 'C': bColumns=true; bOk = true;break;
1116 0 : }
1117 : }
1118 : }
1119 : else // Dialog, when not whole rows/columns are marked
1120 : {
1121 0 : if ( GetViewData()->SimpleColMarked() && !GetViewData()->SimpleRowMarked() )
1122 0 : bColumns = true;
1123 0 : else if ( !GetViewData()->SimpleColMarked() && GetViewData()->SimpleRowMarked() )
1124 0 : bColumns = false;
1125 : else
1126 : {
1127 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1128 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1129 :
1130 0 : boost::scoped_ptr<AbstractScGroupDlg> pDlg(pFact->CreateAbstractScGroupDlg(pTabViewShell->GetDialogParent(), false));
1131 : OSL_ENSURE(pDlg, "Dialog create fail!");
1132 0 : if ( pDlg->Execute() == RET_OK )
1133 0 : bColumns = pDlg->GetColsChecked();
1134 : else
1135 0 : bOk = false;
1136 : }
1137 : }
1138 0 : if (bOk)
1139 : {
1140 0 : pTabViewShell->MakeOutline( bColumns );
1141 :
1142 0 : if( ! rReq.IsAPI() )
1143 : {
1144 0 : OUString aCol = bColumns ? OUString('C') : OUString('R');
1145 0 : rReq.AppendItem( SfxStringItem( SID_OUTLINE_MAKE, aCol ) );
1146 0 : rReq.Done();
1147 : }
1148 : }
1149 : }
1150 0 : break;
1151 :
1152 : case SID_OUTLINE_REMOVE:
1153 : {
1154 0 : bool bColumns = false;
1155 0 : bool bOk = true;
1156 :
1157 0 : if ( GetViewData()->GetDocument()->GetDPAtCursor( GetViewData()->GetCurX(),
1158 0 : GetViewData()->GetCurY(), GetViewData()->GetTabNo() ) )
1159 : {
1160 0 : pTabViewShell->UngroupDataPilot();
1161 0 : bOk = false;
1162 : }
1163 0 : else if( pReqArgs != NULL )
1164 : {
1165 : const SfxPoolItem* pItem;
1166 0 : bOk = false;
1167 :
1168 0 : if( pReqArgs->HasItem( SID_OUTLINE_REMOVE, &pItem ) )
1169 : {
1170 0 : OUString aCol = static_cast<const SfxStringItem*>(pItem)->GetValue();
1171 0 : aCol = aCol.toAsciiUpperCase();
1172 :
1173 0 : switch (aCol[0])
1174 : {
1175 0 : case 'R': bColumns=false; bOk = true;break;
1176 0 : case 'C': bColumns=true; bOk = true;break;
1177 0 : }
1178 : }
1179 : }
1180 : else // Dialog only when removal for rows and columns is possible
1181 : {
1182 : bool bColPoss, bRowPoss;
1183 0 : pTabViewShell->TestRemoveOutline( bColPoss, bRowPoss );
1184 0 : if ( bColPoss && bRowPoss )
1185 : {
1186 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1187 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1188 :
1189 0 : boost::scoped_ptr<AbstractScGroupDlg> pDlg(pFact->CreateAbstractScGroupDlg(pTabViewShell->GetDialogParent(), true));
1190 : OSL_ENSURE(pDlg, "Dialog create fail!");
1191 0 : if ( pDlg->Execute() == RET_OK )
1192 0 : bColumns = pDlg->GetColsChecked();
1193 : else
1194 0 : bOk = false;
1195 : }
1196 0 : else if ( bColPoss )
1197 0 : bColumns = true;
1198 0 : else if ( bRowPoss )
1199 0 : bColumns = false;
1200 : else
1201 0 : bOk = false;
1202 : }
1203 0 : if (bOk)
1204 : {
1205 0 : pTabViewShell->RemoveOutline( bColumns );
1206 :
1207 0 : if( ! rReq.IsAPI() )
1208 : {
1209 0 : OUString aCol = bColumns ? OUString('C') : OUString('R');
1210 0 : rReq.AppendItem( SfxStringItem( SID_OUTLINE_REMOVE, aCol ) );
1211 0 : rReq.Done();
1212 : }
1213 : }
1214 : }
1215 0 : break;
1216 :
1217 : // Clipboard
1218 :
1219 : case SID_COPY: // for graphs in DrawShell
1220 : {
1221 0 : WaitObject aWait( GetViewData()->GetDialogParent() );
1222 0 : pTabViewShell->CopyToClip( NULL, false, false, true );
1223 0 : rReq.Done();
1224 0 : GetViewData()->SetPasteMode( (ScPasteFlags) (SC_PASTE_MODE | SC_PASTE_BORDER) );
1225 0 : pTabViewShell->ShowCursor();
1226 0 : pTabViewShell->UpdateCopySourceOverlay();
1227 : }
1228 0 : break;
1229 :
1230 : case SID_CUT: // for graphs in DrawShell
1231 : {
1232 0 : WaitObject aWait( GetViewData()->GetDialogParent() );
1233 0 : pTabViewShell->CutToClip( NULL, true );
1234 0 : rReq.Done();
1235 0 : GetViewData()->SetPasteMode( (ScPasteFlags)(SC_PASTE_MODE | SC_PASTE_BORDER));
1236 0 : pTabViewShell->ShowCursor();
1237 0 : pTabViewShell->UpdateCopySourceOverlay();
1238 : }
1239 0 : break;
1240 :
1241 : case SID_PASTE:
1242 : {
1243 0 : ScClipUtil::PasteFromClipboard ( GetViewData(), pTabViewShell, true );
1244 0 : rReq.Done();
1245 : }
1246 0 : break;
1247 :
1248 : case SID_CLIPBOARD_FORMAT_ITEMS:
1249 : {
1250 0 : WaitObject aWait( GetViewData()->GetDialogParent() );
1251 :
1252 0 : sal_uLong nFormat = 0;
1253 : const SfxPoolItem* pItem;
1254 0 : if ( pReqArgs &&
1255 0 : pReqArgs->GetItemState(nSlot, true, &pItem) == SfxItemState::SET &&
1256 0 : pItem->ISA(SfxUInt32Item) )
1257 : {
1258 0 : nFormat = static_cast<const SfxUInt32Item*>(pItem)->GetValue();
1259 : }
1260 :
1261 0 : if ( nFormat )
1262 : {
1263 0 : vcl::Window* pWin = GetViewData()->GetActiveWin();
1264 0 : bool bCells = ( ScTransferObj::GetOwnClipboard( pWin ) != NULL );
1265 0 : bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL );
1266 0 : bool bOle = ( nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE );
1267 :
1268 0 : if ( bCells && bOle )
1269 0 : pTabViewShell->PasteFromSystem();
1270 0 : else if ( bDraw && bOle )
1271 0 : pTabViewShell->PasteDraw();
1272 : else
1273 0 : pTabViewShell->PasteFromSystem(nFormat);
1274 : }
1275 : //?else
1276 : //? pTabViewShell->PasteFromSystem();
1277 :
1278 0 : rReq.Done();
1279 : }
1280 0 : pTabViewShell->CellContentChanged();
1281 0 : break;
1282 :
1283 : case FID_INS_CELL_CONTENTS:
1284 : {
1285 0 : InsertDeleteFlags nFlags = IDF_NONE;
1286 0 : sal_uInt16 nFunction = PASTE_NOFUNC;
1287 0 : bool bSkipEmpty = false;
1288 0 : bool bTranspose = false;
1289 0 : bool bAsLink = false;
1290 0 : InsCellCmd eMoveMode = INS_NONE;
1291 :
1292 0 : vcl::Window* pWin = GetViewData()->GetActiveWin();
1293 0 : ScDocument* pDoc = GetViewData()->GetDocument();
1294 0 : bool bOtherDoc = !pDoc->IsClipboardSource();
1295 0 : ScTransferObj* pOwnClip = ScTransferObj::GetOwnClipboard( pWin );
1296 0 : if ( pOwnClip )
1297 : {
1298 : // keep a reference in case the clipboard is changed during dialog or PasteFromClip
1299 0 : uno::Reference<datatransfer::XTransferable> aOwnClipRef( pOwnClip );
1300 0 : if ( pReqArgs!=NULL && pTabViewShell->SelectionEditable() )
1301 : {
1302 : const SfxPoolItem* pItem;
1303 0 : OUString aFlags('A');
1304 :
1305 0 : if( pReqArgs->HasItem( FID_INS_CELL_CONTENTS, &pItem ) )
1306 0 : aFlags = static_cast<const SfxStringItem*>(pItem)->GetValue();
1307 :
1308 0 : aFlags = aFlags.toAsciiUpperCase();
1309 0 : bool bCont = true;
1310 :
1311 0 : for (sal_Int32 i=0 ; bCont && i<aFlags.getLength(); ++i)
1312 : {
1313 0 : switch (aFlags[i])
1314 : {
1315 : case 'A': // all
1316 0 : nFlags |= IDF_ALL;
1317 0 : bCont = false; // don't continue!
1318 0 : break;
1319 0 : case 'S': nFlags |= IDF_STRING; break;
1320 0 : case 'V': nFlags |= IDF_VALUE; break;
1321 0 : case 'D': nFlags |= IDF_DATETIME; break;
1322 0 : case 'F': nFlags |= IDF_FORMULA; break;
1323 0 : case 'N': nFlags |= IDF_NOTE; break;
1324 0 : case 'T': nFlags |= IDF_ATTRIB; break;
1325 : }
1326 : }
1327 :
1328 0 : SFX_REQUEST_ARG( rReq, pFuncItem, SfxUInt16Item, FN_PARAM_1, false );
1329 0 : SFX_REQUEST_ARG( rReq, pSkipItem, SfxBoolItem, FN_PARAM_2, false );
1330 0 : SFX_REQUEST_ARG( rReq, pTransposeItem, SfxBoolItem, FN_PARAM_3, false );
1331 0 : SFX_REQUEST_ARG( rReq, pLinkItem, SfxBoolItem, FN_PARAM_4, false );
1332 0 : SFX_REQUEST_ARG( rReq, pMoveItem, SfxInt16Item, FN_PARAM_5, false );
1333 0 : if ( pFuncItem )
1334 0 : nFunction = pFuncItem->GetValue();
1335 0 : if ( pSkipItem )
1336 0 : bSkipEmpty = pSkipItem->GetValue();
1337 0 : if ( pTransposeItem )
1338 0 : bTranspose = pTransposeItem->GetValue();
1339 0 : if ( pLinkItem )
1340 0 : bAsLink = pLinkItem->GetValue();
1341 0 : if ( pMoveItem )
1342 0 : eMoveMode = (InsCellCmd) pMoveItem->GetValue();
1343 : }
1344 : else
1345 : {
1346 0 : ScEditableTester aTester( pTabViewShell );
1347 0 : if (aTester.IsEditable())
1348 : {
1349 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1350 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1351 :
1352 0 : boost::scoped_ptr<AbstractScInsertContentsDlg> pDlg(pFact->CreateScInsertContentsDlg(pTabViewShell->GetDialogParent()));
1353 : OSL_ENSURE(pDlg, "Dialog create fail!");
1354 0 : pDlg->SetOtherDoc( bOtherDoc );
1355 : // if ChangeTrack MoveMode disable
1356 0 : pDlg->SetChangeTrack( pDoc->GetChangeTrack() != NULL );
1357 : // fdo#56098 disable shift if necessary
1358 0 : if ( !bOtherDoc && pOwnClip )
1359 : {
1360 0 : ScViewData* pData = GetViewData();
1361 0 : if ( pData->GetMarkData().GetTableSelect( pData->GetTabNo() ) )
1362 : {
1363 : SCCOL nStartX, nEndX, nClipStartX, nClipSizeX, nRangeSizeX;
1364 : SCROW nStartY, nEndY, nClipStartY, nClipSizeY, nRangeSizeY;
1365 : SCTAB nStartTab, nEndTab;
1366 0 : pOwnClip->GetDocument()->GetClipStart( nClipStartX, nClipStartY );
1367 0 : pOwnClip->GetDocument()->GetClipArea( nClipSizeX, nClipSizeY, true );
1368 :
1369 0 : if ( !( pData->GetSimpleArea( nStartX, nStartY, nStartTab,
1370 0 : nEndX, nEndY, nEndTab ) == SC_MARK_SIMPLE &&
1371 0 : nStartTab == nEndTab ) )
1372 : {
1373 : // the destination is not a simple range,
1374 : // assume the destination as the current cell
1375 0 : nStartX = nEndX = pData->GetCurX();
1376 0 : nStartY = nEndY = pData->GetCurY();
1377 0 : nStartTab = pData->GetTabNo();
1378 : }
1379 : // we now have clip- and range dimensions
1380 : // the size of the destination area is the larger of the two
1381 0 : nRangeSizeX = nClipSizeX >= nEndX - nStartX ? nClipSizeX : nEndX - nStartX;
1382 0 : nRangeSizeY = nClipSizeY >= nEndY - nStartY ? nClipSizeY : nEndY - nStartY;
1383 : // When the source and destination areas intersect things may go wrong,
1384 : // especially if the area contains references. This may produce data loss
1385 : // (e.g. formulas that get wrong references), this scenario _must_ be avoided.
1386 : ScRange aSource( nClipStartX, nClipStartY, nStartTab,
1387 0 : nClipStartX + nClipSizeX, nClipStartY + nClipSizeY, nStartTab );
1388 : ScRange aDest( nStartX, nStartY, nStartTab,
1389 0 : nStartX + nRangeSizeX, nStartY + nRangeSizeY, nStartTab );
1390 0 : if ( pOwnClip->GetDocument()->IsCutMode() && aSource.Intersects( aDest ) )
1391 0 : pDlg->SetCellShiftDisabled( SC_CELL_SHIFT_DISABLE_DOWN | SC_CELL_SHIFT_DISABLE_RIGHT );
1392 : else
1393 : {
1394 : //no conflict with intersecting ranges,
1395 : //check if paste plus shift will fit on sheet
1396 : //and disable shift-option if no fit
1397 0 : int nDisableShiftX = 0;
1398 0 : int nDisableShiftY = 0;
1399 :
1400 : //check if horizontal shift will fit
1401 0 : if ( !pData->GetDocument()->IsBlockEmpty( nStartTab,
1402 : MAXCOL - nRangeSizeX, nStartY,
1403 0 : MAXCOL, nStartY + nRangeSizeY, false ) )
1404 0 : nDisableShiftX = SC_CELL_SHIFT_DISABLE_RIGHT;
1405 :
1406 : //check if vertical shift will fit
1407 0 : if ( !pData->GetDocument()->IsBlockEmpty( nStartTab,
1408 : nStartX, MAXROW - nRangeSizeY,
1409 0 : nStartX + nRangeSizeX, MAXROW, false ) )
1410 0 : nDisableShiftY = SC_CELL_SHIFT_DISABLE_DOWN;
1411 :
1412 0 : if ( nDisableShiftX || nDisableShiftY )
1413 0 : pDlg->SetCellShiftDisabled( nDisableShiftX | nDisableShiftY );
1414 : }
1415 : }
1416 : }
1417 0 : if (pDlg->Execute() == RET_OK)
1418 : {
1419 0 : nFlags = pDlg->GetInsContentsCmdBits();
1420 0 : nFunction = pDlg->GetFormulaCmdBits();
1421 0 : bSkipEmpty = pDlg->IsSkipEmptyCells();
1422 0 : bTranspose = pDlg->IsTranspose();
1423 0 : bAsLink = pDlg->IsLink();
1424 0 : eMoveMode = pDlg->GetMoveMode();
1425 0 : }
1426 : }
1427 : else
1428 0 : pTabViewShell->ErrorMessage(aTester.GetMessageId());
1429 : }
1430 :
1431 0 : if( nFlags != IDF_NONE )
1432 : {
1433 : {
1434 0 : WaitObject aWait( GetViewData()->GetDialogParent() );
1435 0 : if ( bAsLink && bOtherDoc )
1436 0 : pTabViewShell->PasteFromSystem(SOT_FORMATSTR_ID_LINK); // DDE insert
1437 : else
1438 : {
1439 : pTabViewShell->PasteFromClip( nFlags, pOwnClip->GetDocument(),
1440 : nFunction, bSkipEmpty, bTranspose, bAsLink,
1441 0 : eMoveMode, IDF_NONE, true ); // allow warning dialog
1442 0 : }
1443 : }
1444 :
1445 0 : if( !pReqArgs )
1446 : {
1447 0 : OUString aFlags;
1448 :
1449 0 : if( nFlags == IDF_ALL )
1450 : {
1451 0 : aFlags += "A";
1452 : }
1453 : else
1454 : {
1455 0 : if( nFlags & IDF_STRING ) aFlags += "S";
1456 0 : if( nFlags & IDF_VALUE ) aFlags += "V";
1457 0 : if( nFlags & IDF_DATETIME ) aFlags += "D";
1458 0 : if( nFlags & IDF_FORMULA ) aFlags += "F";
1459 0 : if( nFlags & IDF_NOTE ) aFlags += "N";
1460 0 : if( nFlags & IDF_ATTRIB ) aFlags += "T";
1461 : }
1462 :
1463 0 : rReq.AppendItem( SfxStringItem( FID_INS_CELL_CONTENTS, aFlags ) );
1464 0 : rReq.AppendItem( SfxBoolItem( FN_PARAM_2, bSkipEmpty ) );
1465 0 : rReq.AppendItem( SfxBoolItem( FN_PARAM_3, bTranspose ) );
1466 0 : rReq.AppendItem( SfxBoolItem( FN_PARAM_4, bAsLink ) );
1467 0 : rReq.AppendItem( SfxUInt16Item( FN_PARAM_1, nFunction ) );
1468 0 : rReq.AppendItem( SfxInt16Item( FN_PARAM_5, (sal_Int16) eMoveMode ) );
1469 0 : rReq.Done();
1470 : }
1471 0 : }
1472 : }
1473 : }
1474 0 : pTabViewShell->CellContentChanged(); // => PasteFromXXX ???
1475 0 : break;
1476 : case SID_PASTE_ONLY_VALUE:
1477 : case SID_PASTE_ONLY_TEXT:
1478 : case SID_PASTE_ONLY_FORMULA:
1479 : {
1480 0 : vcl::Window* pWin = GetViewData()->GetActiveWin();
1481 0 : if ( ScTransferObj::GetOwnClipboard( pWin ) ) // own cell data
1482 : {
1483 0 : rReq.SetSlot( FID_INS_CELL_CONTENTS );
1484 0 : OUString aFlags;
1485 0 : if ( nSlot == SID_PASTE_ONLY_VALUE )
1486 0 : aFlags = "V";
1487 0 : else if ( nSlot == SID_PASTE_ONLY_TEXT )
1488 0 : aFlags = "S";
1489 : else
1490 0 : aFlags = "F";
1491 0 : rReq.AppendItem( SfxStringItem( FID_INS_CELL_CONTENTS, aFlags ) );
1492 0 : ExecuteSlot( rReq, GetInterface() );
1493 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, 1)); // 1 = success
1494 0 : pTabViewShell->CellContentChanged();
1495 : }
1496 : else
1497 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, 0)); // 0 = fail
1498 0 : break;
1499 : }
1500 : case SID_PASTE_SPECIAL:
1501 : // differentiate between own cell data and draw objects/external data
1502 : // this makes FID_INS_CELL_CONTENTS superfluous
1503 : {
1504 0 : vcl::Window* pWin = GetViewData()->GetActiveWin();
1505 :
1506 : // Clipboard-ID given as parameter? Basic "PasteSpecial(Format)"
1507 0 : const SfxPoolItem* pItem=NULL;
1508 0 : if ( pReqArgs &&
1509 0 : pReqArgs->GetItemState(nSlot, true, &pItem) == SfxItemState::SET &&
1510 0 : pItem->ISA(SfxUInt32Item) )
1511 : {
1512 0 : sal_uLong nFormat = static_cast<const SfxUInt32Item*>(pItem)->GetValue();
1513 0 : bool bRet=true;
1514 : {
1515 0 : WaitObject aWait( GetViewData()->GetDialogParent() );
1516 0 : bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL );
1517 0 : if ( bDraw && nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE )
1518 0 : pTabViewShell->PasteDraw();
1519 : else
1520 0 : bRet = pTabViewShell->PasteFromSystem(nFormat, true); // TRUE: no error messages
1521 : }
1522 :
1523 0 : if ( bRet )
1524 : {
1525 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, bRet ? 1 : 0)); // 1 = success, 0 = fail
1526 0 : rReq.Done();
1527 : }
1528 : else
1529 : // if format is not available -> fallback to request without parameters
1530 0 : pItem = NULL;
1531 : }
1532 :
1533 0 : if ( !pItem )
1534 : {
1535 0 : if ( ScTransferObj::GetOwnClipboard( pWin ) ) // own cell data
1536 : {
1537 0 : rReq.SetSlot( FID_INS_CELL_CONTENTS );
1538 0 : ExecuteSlot( rReq, GetInterface() );
1539 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, 1)); // 1 = success
1540 : }
1541 : else // draw objects or external data
1542 : {
1543 0 : bool bDraw = ( ScDrawTransferObj::GetOwnClipboard( pWin ) != NULL );
1544 :
1545 0 : SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
1546 0 : GetPossibleClipboardFormats( aFormats );
1547 :
1548 0 : sal_uInt16 nFormatCount = aFormats.Count();
1549 0 : if ( nFormatCount )
1550 : {
1551 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1552 0 : boost::scoped_ptr<SfxAbstractPasteDialog> pDlg(pFact->CreatePasteDialog( pTabViewShell->GetDialogParent() ));
1553 0 : if ( pDlg )
1554 : {
1555 0 : for (sal_uInt16 i=0; i<nFormatCount; i++)
1556 : {
1557 0 : sal_uLong nFormatId = aFormats.GetClipbrdFormatId( i );
1558 0 : OUString aName = aFormats.GetClipbrdFormatName( i );
1559 : // special case for paste dialog: '*' is replaced by object type
1560 0 : if ( nFormatId == SOT_FORMATSTR_ID_EMBED_SOURCE )
1561 0 : aName = "*";
1562 0 : pDlg->Insert( nFormatId, aName );
1563 0 : }
1564 :
1565 : TransferableDataHelper aDataHelper(
1566 0 : TransferableDataHelper::CreateFromSystemClipboard( pWin ) );
1567 0 : sal_uLong nFormat = pDlg->GetFormat( aDataHelper.GetTransferable() );
1568 0 : if (nFormat > 0)
1569 : {
1570 : {
1571 0 : WaitObject aWait( GetViewData()->GetDialogParent() );
1572 0 : if ( bDraw && nFormat == SOT_FORMATSTR_ID_EMBED_SOURCE )
1573 0 : pTabViewShell->PasteDraw();
1574 : else
1575 0 : pTabViewShell->PasteFromSystem(nFormat);
1576 : }
1577 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, 1)); // 1 = success
1578 0 : rReq.AppendItem( SfxUInt32Item( nSlot, nFormat ) );
1579 0 : rReq.Done();
1580 : }
1581 : else
1582 : {
1583 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, 0)); // 0 = fail
1584 0 : rReq.Ignore();
1585 0 : }
1586 0 : }
1587 : }
1588 : else
1589 0 : rReq.SetReturnValue(SfxInt16Item(nSlot, 0)); // 0 = fail
1590 : }
1591 : }
1592 : }
1593 0 : pTabViewShell->CellContentChanged(); // => PasteFromSystem() ???
1594 0 : break;
1595 :
1596 : // other
1597 :
1598 : case FID_INS_ROWBRK:
1599 0 : pTabViewShell->InsertPageBreak( false );
1600 0 : rReq.Done();
1601 0 : break;
1602 :
1603 : case FID_INS_COLBRK:
1604 0 : pTabViewShell->InsertPageBreak( true );
1605 0 : rReq.Done();
1606 0 : break;
1607 :
1608 : case FID_DEL_ROWBRK:
1609 0 : pTabViewShell->DeletePageBreak( false );
1610 0 : rReq.Done();
1611 0 : break;
1612 :
1613 : case FID_DEL_COLBRK:
1614 0 : pTabViewShell->DeletePageBreak( true );
1615 0 : rReq.Done();
1616 0 : break;
1617 :
1618 : case SID_DETECTIVE_ADD_PRED:
1619 0 : pTabViewShell->DetectiveAddPred();
1620 0 : rReq.Done();
1621 0 : break;
1622 :
1623 : case SID_DETECTIVE_DEL_PRED:
1624 0 : pTabViewShell->DetectiveDelPred();
1625 0 : rReq.Done();
1626 0 : break;
1627 :
1628 : case SID_DETECTIVE_ADD_SUCC:
1629 0 : pTabViewShell->DetectiveAddSucc();
1630 0 : rReq.Done();
1631 0 : break;
1632 :
1633 : case SID_DETECTIVE_DEL_SUCC:
1634 0 : pTabViewShell->DetectiveDelSucc();
1635 0 : rReq.Done();
1636 0 : break;
1637 :
1638 : case SID_DETECTIVE_ADD_ERR:
1639 0 : pTabViewShell->DetectiveAddError();
1640 0 : rReq.Done();
1641 0 : break;
1642 :
1643 : case SID_DETECTIVE_INVALID:
1644 0 : pTabViewShell->DetectiveMarkInvalid();
1645 0 : rReq.Done();
1646 0 : break;
1647 :
1648 : case SID_DETECTIVE_REFRESH:
1649 0 : pTabViewShell->DetectiveRefresh();
1650 0 : rReq.Done();
1651 0 : break;
1652 :
1653 : case SID_DETECTIVE_MARK_PRED:
1654 0 : pTabViewShell->DetectiveMarkPred();
1655 0 : break;
1656 : case SID_DETECTIVE_MARK_SUCC:
1657 0 : pTabViewShell->DetectiveMarkSucc();
1658 0 : break;
1659 : case SID_INSERT_CURRENT_DATE:
1660 : pTabViewShell->InsertCurrentTime(
1661 0 : NUMBERFORMAT_DATE, ScGlobal::GetRscString(STR_UNDO_INSERT_CURRENT_DATE));
1662 0 : break;
1663 : case SID_INSERT_CURRENT_TIME:
1664 : pTabViewShell->InsertCurrentTime(
1665 0 : NUMBERFORMAT_TIME, ScGlobal::GetRscString(STR_UNDO_INSERT_CURRENT_TIME));
1666 0 : break;
1667 :
1668 : case SID_SPELL_DIALOG:
1669 : {
1670 0 : SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame();
1671 0 : if( rReq.GetArgs() )
1672 : pViewFrame->SetChildWindow( SID_SPELL_DIALOG,
1673 0 : static_cast< const SfxBoolItem& >( rReq.GetArgs()->
1674 0 : Get( SID_SPELL_DIALOG ) ).GetValue() );
1675 : else
1676 0 : pViewFrame->ToggleChildWindow( SID_SPELL_DIALOG );
1677 :
1678 0 : pViewFrame->GetBindings().Invalidate( SID_SPELL_DIALOG );
1679 0 : rReq.Ignore();
1680 : }
1681 0 : break;
1682 :
1683 : case SID_HANGUL_HANJA_CONVERSION:
1684 0 : pTabViewShell->DoHangulHanjaConversion();
1685 0 : break;
1686 :
1687 : case SID_CHINESE_CONVERSION:
1688 : {
1689 : //open ChineseTranslationDialog
1690 : Reference< XComponentContext > xContext(
1691 0 : ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one
1692 0 : if(xContext.is())
1693 : {
1694 0 : Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() );
1695 0 : if(xMCF.is())
1696 : {
1697 : Reference< ui::dialogs::XExecutableDialog > xDialog(
1698 0 : xMCF->createInstanceWithContext(
1699 : OUString("com.sun.star.linguistic2.ChineseTranslationDialog")
1700 0 : , xContext), UNO_QUERY);
1701 0 : Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY );
1702 0 : if( xInit.is() )
1703 : {
1704 : // initialize dialog
1705 0 : Reference< awt::XWindow > xDialogParentWindow(0);
1706 0 : Sequence<Any> aSeq(1);
1707 0 : Any* pArray = aSeq.getArray();
1708 0 : PropertyValue aParam;
1709 0 : aParam.Name = "ParentWindow";
1710 0 : aParam.Value <<= makeAny(xDialogParentWindow);
1711 0 : pArray[0] <<= makeAny(aParam);
1712 0 : xInit->initialize( aSeq );
1713 :
1714 : //execute dialog
1715 0 : sal_Int16 nDialogRet = xDialog->execute();
1716 0 : if( RET_OK == nDialogRet )
1717 : {
1718 : //get some parameters from the dialog
1719 0 : bool bToSimplified = true;
1720 0 : bool bUseVariants = true;
1721 0 : bool bCommonTerms = true;
1722 0 : Reference< beans::XPropertySet > xProp( xDialog, UNO_QUERY );
1723 0 : if( xProp.is() )
1724 : {
1725 : try
1726 : {
1727 0 : xProp->getPropertyValue("IsDirectionToSimplified") >>= bToSimplified;
1728 0 : xProp->getPropertyValue("IsUseCharacterVariants") >>= bUseVariants;
1729 0 : xProp->getPropertyValue("IsTranslateCommonTerms") >>= bCommonTerms;
1730 : }
1731 0 : catch( Exception& )
1732 : {
1733 : }
1734 : }
1735 :
1736 : //execute translation
1737 0 : LanguageType eSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED;
1738 0 : LanguageType eTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL;
1739 0 : sal_Int32 nOptions = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0;
1740 0 : if( !bCommonTerms )
1741 0 : nOptions |= i18n::TextConversionOption::CHARACTER_BY_CHARACTER;
1742 :
1743 : vcl::Font aTargetFont = OutputDevice::GetDefaultFont(
1744 : DEFAULTFONT_CJK_SPREADSHEET,
1745 0 : eTargetLang, DEFAULTFONT_FLAGS_ONLYONE );
1746 : ScConversionParam aConvParam( SC_CONVERSION_CHINESE_TRANSL,
1747 0 : eSourceLang, eTargetLang, aTargetFont, nOptions, false );
1748 0 : pTabViewShell->DoSheetConversion( aConvParam );
1749 0 : }
1750 : }
1751 0 : Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY );
1752 0 : if( xComponent.is() )
1753 0 : xComponent->dispose();
1754 0 : }
1755 0 : }
1756 : }
1757 0 : break;
1758 :
1759 : case SID_CONVERT_FORMULA_TO_VALUE:
1760 : {
1761 0 : pTabViewShell->ConvertFormulaToValue();
1762 : }
1763 0 : break;
1764 : case SID_THESAURUS:
1765 0 : pTabViewShell->DoThesaurus();
1766 0 : break;
1767 :
1768 : case SID_TOGGLE_REL:
1769 0 : pTabViewShell->DoRefConversion();
1770 0 : break;
1771 :
1772 : case SID_DEC_INDENT:
1773 0 : pTabViewShell->ChangeIndent( false );
1774 0 : break;
1775 : case SID_INC_INDENT:
1776 0 : pTabViewShell->ChangeIndent( true );
1777 0 : break;
1778 :
1779 : case FID_USE_NAME:
1780 : {
1781 0 : sal_uInt16 nFlags = pTabViewShell->GetCreateNameFlags();
1782 :
1783 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1784 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
1785 :
1786 0 : boost::scoped_ptr<AbstractScNameCreateDlg> pDlg(pFact->CreateScNameCreateDlg(pTabViewShell->GetDialogParent(), nFlags));
1787 : OSL_ENSURE(pDlg, "Dialog create fail!");
1788 :
1789 0 : if( pDlg->Execute() )
1790 : {
1791 0 : nFlags = pDlg->GetFlags();
1792 0 : pTabViewShell->CreateNames(nFlags);
1793 0 : rReq.Done();
1794 0 : }
1795 : }
1796 0 : break;
1797 :
1798 : case SID_CONSOLIDATE:
1799 : {
1800 : const SfxPoolItem* pItem;
1801 0 : if ( pReqArgs && SfxItemState::SET ==
1802 0 : pReqArgs->GetItemState( SCITEM_CONSOLIDATEDATA, true, &pItem ) )
1803 : {
1804 : const ScConsolidateParam& rParam =
1805 0 : static_cast<const ScConsolidateItem*>(pItem)->GetData();
1806 :
1807 0 : pTabViewShell->Consolidate( rParam );
1808 0 : GetViewData()->GetDocument()->SetConsolidateDlgData( &rParam );
1809 :
1810 0 : rReq.Done();
1811 : }
1812 : #if HAVE_FEATURE_SCRIPTING
1813 0 : else if (rReq.IsAPI())
1814 0 : SbxBase::SetError(SbxERR_BAD_PARAMETER);
1815 : #endif
1816 : }
1817 0 : break;
1818 :
1819 : case SID_INS_FUNCTION:
1820 : {
1821 0 : const SfxBoolItem* pOkItem = static_cast<const SfxBoolItem*>(&pReqArgs->Get( SID_DLG_RETOK ));
1822 :
1823 0 : if ( pOkItem->GetValue() ) // OK
1824 : {
1825 0 : OUString aFormula;
1826 0 : const SfxStringItem* pSItem = static_cast<const SfxStringItem*>(&pReqArgs->Get( SCITEM_STRING ));
1827 0 : const SfxBoolItem* pMatrixItem = static_cast<const SfxBoolItem*>(&pReqArgs->Get( SID_DLG_MATRIX ));
1828 :
1829 0 : aFormula += pSItem->GetValue();
1830 0 : pScMod->ActivateInputWindow( &aFormula, pMatrixItem->GetValue() );
1831 : }
1832 : else // CANCEL
1833 : {
1834 0 : pScMod->ActivateInputWindow( NULL );
1835 : }
1836 0 : rReq.Ignore(); // only SID_ENTER_STRING is recorded
1837 : }
1838 0 : break;
1839 :
1840 : case FID_DEFINE_NAME:
1841 0 : if ( pReqArgs )
1842 : {
1843 : const SfxPoolItem* pItem;
1844 0 : OUString aName, aSymbol, aAttrib;
1845 :
1846 0 : if( pReqArgs->HasItem( FID_DEFINE_NAME, &pItem ) )
1847 0 : aName = static_cast<const SfxStringItem*>(pItem)->GetValue();
1848 :
1849 0 : if( pReqArgs->HasItem( FN_PARAM_1, &pItem ) )
1850 0 : aSymbol = static_cast<const SfxStringItem*>(pItem)->GetValue();
1851 :
1852 0 : if( pReqArgs->HasItem( FN_PARAM_2, &pItem ) )
1853 0 : aAttrib = static_cast<const SfxStringItem*>(pItem)->GetValue();
1854 :
1855 0 : if ( !aName.isEmpty() && !aSymbol.isEmpty() )
1856 : {
1857 0 : if (pTabViewShell->InsertName( aName, aSymbol, aAttrib ))
1858 0 : rReq.Done();
1859 : #if HAVE_FEATURE_SCRIPTING
1860 : else
1861 0 : SbxBase::SetError( SbxERR_BAD_PARAMETER ); // Basic-error
1862 : #endif
1863 0 : }
1864 : }
1865 : else
1866 : {
1867 0 : sal_uInt16 nId = ScNameDlgWrapper::GetChildWindowId();
1868 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
1869 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
1870 :
1871 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
1872 : }
1873 0 : break;
1874 : case FID_ADD_NAME:
1875 : {
1876 0 : sal_uInt16 nId = ScNameDefDlgWrapper::GetChildWindowId();
1877 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
1878 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
1879 :
1880 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
1881 : }
1882 0 : break;
1883 :
1884 : case SID_OPENDLG_CONDFRMT:
1885 : case SID_OPENDLG_COLORSCALE:
1886 : case SID_OPENDLG_DATABAR:
1887 : case SID_OPENDLG_ICONSET:
1888 : case SID_OPENDLG_CONDDATE:
1889 : {
1890 :
1891 0 : ScRangeList aRangeList;
1892 0 : ScViewData* pData = GetViewData();
1893 0 : pData->GetMarkData().FillRangeListWithMarks(&aRangeList, false);
1894 :
1895 0 : ScDocument* pDoc = GetViewData()->GetDocument();
1896 0 : if(pDoc->IsTabProtected(pData->GetTabNo()))
1897 : {
1898 : //ErrorMessage( STR_ERR_CONDFORMAT_PROTECTED );
1899 0 : break;
1900 : }
1901 :
1902 0 : ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo());
1903 0 : if(aRangeList.empty())
1904 : {
1905 0 : ScRange* pRange = new ScRange(aPos);
1906 0 : aRangeList.push_back(pRange);
1907 : }
1908 :
1909 0 : sal_Int32 nKey = 0;
1910 0 : const ScPatternAttr* pPattern = pDoc->GetPattern(aPos.Col(), aPos.Row(), aPos.Tab());
1911 0 : const std::vector<sal_uInt32>& rCondFormats = static_cast<const ScCondFormatItem&>(pPattern->GetItem(ATTR_CONDITIONAL)).GetCondFormatData();
1912 0 : bool bContainsCondFormat = !rCondFormats.empty();
1913 0 : boost::scoped_ptr<ScCondFormatDlg> pCondFormatDlg;
1914 0 : if(bContainsCondFormat)
1915 : {
1916 0 : bool bContainsExistingCondFormat = false;
1917 0 : ScConditionalFormatList* pList = pDoc->GetCondFormList(aPos.Tab());
1918 0 : for (std::vector<sal_uInt32>::const_iterator itr = rCondFormats.begin(), itrEnd = rCondFormats.end();
1919 : itr != itrEnd; ++itr)
1920 : {
1921 : // check if at least one existing conditional format has the same range
1922 0 : const ScConditionalFormat* pCondFormat = pList->GetFormat(*itr);
1923 0 : if(!pCondFormat)
1924 0 : continue;
1925 :
1926 0 : bContainsExistingCondFormat = true;
1927 0 : const ScRangeList& rCondFormatRange = pCondFormat->GetRange();
1928 0 : if(rCondFormatRange == aRangeList)
1929 : {
1930 : // found a matching range, edit this conditional format
1931 0 : nKey = pCondFormat->GetKey();
1932 0 : pCondFormatDlg.reset( new ScCondFormatDlg( pTabViewShell->GetDialogParent(), pDoc, pCondFormat, rCondFormatRange, aPos, condformat::dialog::NONE ) );
1933 0 : break;
1934 : }
1935 : }
1936 :
1937 : // if not found a conditional format ask whether we should edit one of the existing
1938 : // or should create a new overlapping conditional format
1939 :
1940 0 : if(!pCondFormatDlg && bContainsExistingCondFormat)
1941 : {
1942 : QueryBox aBox( pTabViewShell->GetDialogParent(), WinBits( WB_YES_NO | WB_DEF_YES ),
1943 0 : ScGlobal::GetRscString(STR_EDIT_EXISTING_COND_FORMATS) );
1944 0 : bool bEditExisting = aBox.Execute() == RET_YES;
1945 0 : if(bEditExisting)
1946 : {
1947 : // differentiate between ranges where one conditional format is defined
1948 : // and several formats are defined
1949 : // if we have only one => open the cond format dlg to edit it
1950 : // otherwise open the manage cond format dlg
1951 0 : if(rCondFormats.size() == 1)
1952 : {
1953 0 : const ScConditionalFormat* pCondFormat = pList->GetFormat(rCondFormats[0]);
1954 : assert(pCondFormat);
1955 0 : const ScRangeList& rCondFormatRange = pCondFormat->GetRange();
1956 0 : nKey = pCondFormat->GetKey();
1957 0 : pCondFormatDlg.reset( new ScCondFormatDlg( pTabViewShell->GetDialogParent(), pDoc, pCondFormat, rCondFormatRange, aPos, condformat::dialog::NONE ) );
1958 : }
1959 : else
1960 : {
1961 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
1962 0 : boost::scoped_ptr<AbstractScCondFormatManagerDlg> pDlg(pFact->CreateScCondFormatMgrDlg( pTabViewShell->GetDialogParent(), pDoc, pList, aPos, RID_SCDLG_COND_FORMAT_MANAGER));
1963 0 : if(pDlg->Execute() == RET_OK && pDlg->CondFormatsChanged())
1964 : {
1965 0 : ScConditionalFormatList* pCondFormatList = pDlg->GetConditionalFormatList();
1966 0 : pData->GetDocShell()->GetDocFunc().SetConditionalFormatList(pCondFormatList, aPos.Tab());
1967 : }
1968 : // we need step out here because we don't want to open the normal dialog
1969 0 : break;
1970 : }
1971 : }
1972 : else
1973 : {
1974 : // define an overlapping conditional format
1975 : // does not need to be handled here
1976 0 : }
1977 :
1978 : }
1979 : }
1980 :
1981 0 : if(!pCondFormatDlg)
1982 : {
1983 0 : condformat::dialog::ScCondFormatDialogType eType = condformat::dialog::NONE;
1984 0 : switch(nSlot)
1985 : {
1986 : case SID_OPENDLG_CONDFRMT:
1987 0 : eType = condformat::dialog::CONDITION;
1988 0 : break;
1989 : case SID_OPENDLG_COLORSCALE:
1990 0 : eType = condformat::dialog::COLORSCALE;
1991 0 : break;
1992 : case SID_OPENDLG_DATABAR:
1993 0 : eType = condformat::dialog::DATABAR;
1994 0 : break;
1995 : case SID_OPENDLG_ICONSET:
1996 0 : eType = condformat::dialog::ICONSET;
1997 0 : break;
1998 : case SID_OPENDLG_CONDDATE:
1999 0 : eType = condformat::dialog::DATE;
2000 0 : break;
2001 : default:
2002 : assert(false);
2003 0 : break;
2004 : }
2005 0 : pCondFormatDlg.reset( new ScCondFormatDlg( pTabViewShell->GetDialogParent(), pDoc, NULL, aRangeList, aRangeList.GetTopLeftCorner(), eType ) );
2006 : }
2007 :
2008 0 : sal_uInt16 nId = 1;
2009 0 : pScMod->SetRefDialog( nId, true );
2010 :
2011 0 : if( pCondFormatDlg->Execute() == RET_OK )
2012 : {
2013 0 : ScConditionalFormat* pFormat = pCondFormatDlg->GetConditionalFormat();
2014 0 : if(pFormat)
2015 0 : pData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(nKey, pFormat, aPos.Tab(), pFormat->GetRange());
2016 : else
2017 0 : pData->GetDocShell()->GetDocFunc().ReplaceConditionalFormat(nKey, NULL, aPos.Tab(), ScRangeList());
2018 : }
2019 :
2020 0 : pScMod->SetRefDialog( nId, false );
2021 :
2022 : }
2023 0 : break;
2024 :
2025 : case SID_DEFINE_COLROWNAMERANGES:
2026 : {
2027 :
2028 0 : sal_uInt16 nId = ScColRowNameRangesDlgWrapper::GetChildWindowId();
2029 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
2030 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
2031 :
2032 0 : pScMod->SetRefDialog( nId, pWnd ? false : sal_True );
2033 :
2034 : }
2035 0 : break;
2036 :
2037 : case SID_UPDATECHART:
2038 : {
2039 0 : bool bAll = false;
2040 :
2041 0 : if( pReqArgs )
2042 : {
2043 : const SfxPoolItem* pItem;
2044 :
2045 0 : if( pReqArgs->HasItem( SID_UPDATECHART, &pItem ) )
2046 0 : bAll = static_cast<const SfxBoolItem*>(pItem)->GetValue();
2047 : }
2048 :
2049 0 : pTabViewShell->UpdateCharts( bAll );
2050 :
2051 0 : if( ! rReq.IsAPI() )
2052 : {
2053 0 : rReq.AppendItem( SfxBoolItem( SID_UPDATECHART, bAll ) );
2054 0 : rReq.Done();
2055 : }
2056 : }
2057 0 : break;
2058 :
2059 : case SID_TABOP:
2060 0 : if (pReqArgs)
2061 : {
2062 : const ScTabOpItem& rItem =
2063 : static_cast<const ScTabOpItem&>(
2064 0 : pReqArgs->Get( SID_TABOP ));
2065 :
2066 0 : pTabViewShell->TabOp( rItem.GetData() );
2067 :
2068 0 : rReq.Done( *pReqArgs );
2069 : }
2070 0 : break;
2071 :
2072 : case SID_SOLVE:
2073 0 : if (pReqArgs)
2074 : {
2075 : const ScSolveItem& rItem =
2076 : static_cast<const ScSolveItem&>(
2077 0 : pReqArgs->Get( SCITEM_SOLVEDATA ));
2078 :
2079 0 : pTabViewShell->Solve( rItem.GetData() );
2080 :
2081 0 : rReq.Done( *pReqArgs );
2082 : }
2083 0 : break;
2084 :
2085 : case FID_INSERT_NAME:
2086 : {
2087 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2088 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
2089 :
2090 0 : boost::scoped_ptr<AbstractScNamePasteDlg> pDlg(pFact->CreateScNamePasteDlg( pTabViewShell->GetDialogParent(), GetViewData()->GetDocShell() ));
2091 : OSL_ENSURE(pDlg, "Dialog create fail!");
2092 0 : switch( pDlg->Execute() )
2093 : {
2094 : case BTN_PASTE_LIST:
2095 0 : pTabViewShell->InsertNameList();
2096 0 : break;
2097 : case BTN_PASTE_NAME:
2098 : {
2099 0 : ScInputHandler* pHdl = pScMod->GetInputHdl( pTabViewShell );
2100 0 : if (pHdl)
2101 : {
2102 : // "=" in KeyEvent, switches to input-mode
2103 0 : (void)pScMod->InputKeyEvent( KeyEvent('=', vcl::KeyCode()) );
2104 :
2105 0 : std::vector<OUString> aNames = pDlg->GetSelectedNames();
2106 0 : if (!aNames.empty())
2107 : {
2108 0 : OUStringBuffer aBuffer;
2109 0 : for (std::vector<OUString>::const_iterator itr = aNames.begin();
2110 0 : itr != aNames.end(); ++itr)
2111 : {
2112 0 : aBuffer.append(*itr).append(' ');
2113 : }
2114 0 : pHdl->InsertFunction( aBuffer.makeStringAndClear(), false ); // without "()"
2115 0 : }
2116 : }
2117 : }
2118 0 : break;
2119 0 : }
2120 : }
2121 0 : break;
2122 :
2123 : case SID_RANGE_NOTETEXT:
2124 0 : if (pReqArgs)
2125 : {
2126 0 : const SfxStringItem& rTextItem = static_cast<const SfxStringItem&>(pReqArgs->Get( SID_RANGE_NOTETEXT ));
2127 :
2128 : // always cursor position
2129 0 : ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
2130 0 : pTabViewShell->SetNoteText( aPos, rTextItem.GetValue() );
2131 0 : rReq.Done();
2132 : }
2133 0 : break;
2134 :
2135 : case SID_INSERT_POSTIT:
2136 0 : if ( pReqArgs )
2137 : {
2138 0 : const SvxPostItAuthorItem& rAuthorItem = static_cast<const SvxPostItAuthorItem&>(pReqArgs->Get( SID_ATTR_POSTIT_AUTHOR ));
2139 0 : const SvxPostItDateItem& rDateItem = static_cast<const SvxPostItDateItem&>(pReqArgs->Get( SID_ATTR_POSTIT_DATE ));
2140 0 : const SvxPostItTextItem& rTextItem = static_cast<const SvxPostItTextItem&>(pReqArgs->Get( SID_ATTR_POSTIT_TEXT ));
2141 :
2142 0 : ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
2143 0 : pTabViewShell->ReplaceNote( aPos, rTextItem.GetValue(), &rAuthorItem.GetValue(), &rDateItem.GetValue() );
2144 0 : rReq.Done();
2145 : }
2146 : else
2147 : {
2148 0 : pTabViewShell->EditNote(); // note object to edit
2149 : }
2150 0 : break;
2151 :
2152 : case FID_NOTE_VISIBLE:
2153 : {
2154 0 : ScDocument* pDoc = GetViewData()->GetDocument();
2155 0 : ScAddress aPos( GetViewData()->GetCurX(), GetViewData()->GetCurY(), GetViewData()->GetTabNo() );
2156 0 : if( ScPostIt* pNote = pDoc->GetNote(aPos) )
2157 : {
2158 : bool bShow;
2159 : const SfxPoolItem* pItem;
2160 0 : if ( pReqArgs && (pReqArgs->GetItemState( FID_NOTE_VISIBLE, true, &pItem ) == SfxItemState::SET) )
2161 0 : bShow = static_cast<const SfxBoolItem*>(pItem)->GetValue();
2162 : else
2163 0 : bShow = !pNote->IsCaptionShown();
2164 :
2165 0 : pTabViewShell->ShowNote( bShow );
2166 :
2167 0 : if (!pReqArgs)
2168 0 : rReq.AppendItem( SfxBoolItem( FID_NOTE_VISIBLE, bShow ) );
2169 :
2170 0 : rReq.Done();
2171 0 : rBindings.Invalidate( FID_NOTE_VISIBLE );
2172 : }
2173 : else
2174 0 : rReq.Ignore();
2175 : }
2176 0 : break;
2177 :
2178 : case FID_HIDE_NOTE:
2179 : case FID_SHOW_NOTE:
2180 : {
2181 0 : bool bShowNote = nSlot == FID_SHOW_NOTE;
2182 0 : ScViewData* pData = GetViewData();
2183 0 : ScDocument* pDoc = pData->GetDocument();
2184 0 : ScMarkData& rMark = pData->GetMarkData();
2185 0 : bool bDone = false;
2186 :
2187 0 : if (!rMark.IsMarked() && !rMark.IsMultiMarked())
2188 : {
2189 : // Check current cell
2190 0 : ScAddress aPos( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() );
2191 0 : if( pDoc->GetNote(aPos) )
2192 : {
2193 0 : pData->GetDocShell()->GetDocFunc().ShowNote( aPos, bShowNote );
2194 0 : bDone = true;
2195 : }
2196 : }
2197 : else
2198 : {
2199 : // Check selection range
2200 0 : ScRangeListRef aRangesRef;
2201 0 : pData->GetMultiArea(aRangesRef);
2202 0 : ScRangeList aRanges = *aRangesRef;
2203 0 : size_t nRangeSize = aRanges.size();
2204 :
2205 0 : OUString aUndo = ScGlobal::GetRscString( bShowNote ? STR_UNDO_SHOWNOTE : STR_UNDO_HIDENOTE );
2206 0 : pData->GetDocShell()->GetUndoManager()->EnterListAction( aUndo, aUndo );
2207 :
2208 0 : for ( size_t i = 0; i < nRangeSize; ++i )
2209 : {
2210 0 : const ScRange * pRange = aRanges[i];
2211 0 : const SCROW nRow0 = pRange->aStart.Row();
2212 0 : const SCROW nRow1 = pRange->aEnd.Row();
2213 0 : const SCCOL nCol0 = pRange->aStart.Col();
2214 0 : const SCCOL nCol1 = pRange->aEnd.Col();
2215 0 : const SCTAB nRangeTab = pRange->aStart.Tab();
2216 : // Check by each cell
2217 0 : for ( SCROW nRow = nRow0; nRow <= nRow1; ++nRow )
2218 : {
2219 0 : for ( SCCOL nCol = nCol0; nCol <= nCol1; ++nCol )
2220 : {
2221 0 : if ( pDoc->HasNote(nCol, nRow, nRangeTab) && pDoc->IsBlockEditable( nRangeTab, nCol,nRow, nCol,nRow ) )
2222 : {
2223 0 : ScAddress aPos( nCol, nRow, nRangeTab );
2224 0 : pData->GetDocShell()->GetDocFunc().ShowNote( aPos, bShowNote );
2225 0 : bDone = true;
2226 : }
2227 : }
2228 : }
2229 : }
2230 :
2231 0 : pData->GetDocShell()->GetUndoManager()->LeaveListAction();
2232 :
2233 0 : if ( bDone )
2234 : {
2235 0 : rReq.Done();
2236 0 : rBindings.Invalidate( nSlot );
2237 : }
2238 : else
2239 0 : rReq.Ignore();
2240 : }
2241 : }
2242 0 : break;
2243 :
2244 : case SID_DELETE_NOTE:
2245 0 : pTabViewShell->DeleteContents( IDF_NOTE ); // delete all notes in selection
2246 0 : rReq.Done();
2247 0 : break;
2248 :
2249 : case SID_CHARMAP:
2250 0 : if( pReqArgs != NULL )
2251 : {
2252 0 : OUString aChars, aFontName;
2253 0 : const SfxItemSet *pArgs = rReq.GetArgs();
2254 0 : const SfxPoolItem* pItem = 0;
2255 0 : if ( pArgs )
2256 0 : pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem);
2257 0 : if ( pItem )
2258 : {
2259 0 : const SfxStringItem* pStringItem = PTR_CAST( SfxStringItem, pItem );
2260 0 : if ( pStringItem )
2261 0 : aChars = pStringItem->GetValue();
2262 0 : const SfxPoolItem* pFtItem = NULL;
2263 0 : pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem);
2264 0 : const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
2265 0 : if ( pFontItem )
2266 0 : aFontName = pFontItem->GetValue();
2267 : }
2268 :
2269 0 : if ( !aChars.isEmpty() )
2270 : {
2271 0 : vcl::Font aFont;
2272 : pTabViewShell->GetSelectionPattern()->GetFont( aFont, SC_AUTOCOL_BLACK, NULL, NULL, NULL,
2273 0 : pTabViewShell->GetSelectionScriptType() );
2274 0 : if ( !aFontName.isEmpty() )
2275 0 : aFont = vcl::Font( aFontName, Size(1,1) );
2276 0 : pTabViewShell->InsertSpecialChar( aChars, aFont );
2277 0 : if( ! rReq.IsAPI() )
2278 0 : rReq.Done();
2279 0 : }
2280 : }
2281 : else
2282 : {
2283 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
2284 :
2285 : // font color doesn't matter here
2286 0 : vcl::Font aCurFont;
2287 : pTabViewShell->GetSelectionPattern()->GetFont( aCurFont, SC_AUTOCOL_BLACK, NULL, NULL, NULL,
2288 0 : pTabViewShell->GetSelectionScriptType() );
2289 :
2290 0 : SfxAllItemSet aSet( GetPool() );
2291 0 : aSet.Put( SfxBoolItem( FN_PARAM_1, false ) );
2292 0 : aSet.Put( SvxFontItem( aCurFont.GetFamily(), aCurFont.GetName(), aCurFont.GetStyleName(), aCurFont.GetPitch(), aCurFont.GetCharSet(), GetPool().GetWhich(SID_ATTR_CHAR_FONT) ) );
2293 :
2294 : boost::scoped_ptr<SfxAbstractDialog> pDlg(pFact->CreateSfxDialog( pTabViewShell->GetDialogParent(), aSet,
2295 0 : pTabViewShell->GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ));
2296 :
2297 0 : if ( pDlg->Execute() == RET_OK )
2298 : {
2299 0 : SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pItem, SfxStringItem, SID_CHARMAP, false );
2300 0 : SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, false );
2301 :
2302 0 : if ( pItem && pFontItem )
2303 : {
2304 0 : vcl::Font aNewFont( pFontItem->GetFamilyName(), pFontItem->GetStyleName(), Size(1,1) );
2305 0 : aNewFont.SetCharSet( pFontItem->GetCharSet() );
2306 0 : aNewFont.SetPitch( pFontItem->GetPitch() );
2307 0 : pTabViewShell->InsertSpecialChar( pItem->GetValue(), aNewFont );
2308 0 : rReq.AppendItem( *pFontItem );
2309 0 : rReq.AppendItem( *pItem );
2310 0 : rReq.Done();
2311 : }
2312 0 : }
2313 : }
2314 0 : break;
2315 :
2316 : case SID_SELECT_SCENARIO:
2317 : {
2318 : // Testing
2319 :
2320 0 : if ( pReqArgs )
2321 : {
2322 : const SfxStringItem* pItem =
2323 0 : static_cast<const SfxStringItem*>(&pReqArgs->Get( SID_SELECT_SCENARIO ));
2324 :
2325 0 : if( pItem )
2326 : {
2327 0 : pTabViewShell->UseScenario( pItem->GetValue() );
2328 : //! why should the return value be valid?!?!
2329 0 : rReq.SetReturnValue( SfxStringItem( SID_SELECT_SCENARIO, pItem->GetValue() ) );
2330 0 : rReq.Done();
2331 : }
2332 : else
2333 : {
2334 : OSL_FAIL("NULL");
2335 : }
2336 : }
2337 : }
2338 0 : break;
2339 :
2340 : case SID_HYPERLINK_SETLINK:
2341 0 : if( pReqArgs )
2342 : {
2343 : const SfxPoolItem* pItem;
2344 0 : if( pReqArgs->HasItem( SID_HYPERLINK_SETLINK, &pItem ) )
2345 : {
2346 0 : const SvxHyperlinkItem* pHyper = static_cast<const SvxHyperlinkItem*>(pItem);
2347 0 : const OUString& rName = pHyper->GetName();
2348 0 : const OUString& rURL = pHyper->GetURL();
2349 0 : const OUString& rTarget = pHyper->GetTargetFrame();
2350 0 : sal_uInt16 nType = (sal_uInt16) pHyper->GetInsertMode();
2351 :
2352 0 : pTabViewShell->InsertURL( rName, rURL, rTarget, nType );
2353 0 : rReq.Done();
2354 : }
2355 : else
2356 0 : rReq.Ignore();
2357 : }
2358 0 : break;
2359 :
2360 : case SID_OPENDLG_CONDFRMT_MANAGER:
2361 : {
2362 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2363 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
2364 :
2365 0 : ScViewData* pData = GetViewData();
2366 0 : ScDocument* pDoc = pData->GetDocument();
2367 :
2368 0 : if(pDoc->IsTabProtected(pData->GetTabNo()))
2369 : {
2370 0 : pTabViewShell->ErrorMessage( STR_ERR_CONDFORMAT_PROTECTED );
2371 0 : break;
2372 : }
2373 :
2374 0 : ScAddress aPos(pData->GetCurX(), pData->GetCurY(), pData->GetTabNo());
2375 :
2376 0 : ScConditionalFormatList* pList = pDoc->GetCondFormList( aPos.Tab() );
2377 0 : boost::scoped_ptr<AbstractScCondFormatManagerDlg> pDlg(pFact->CreateScCondFormatMgrDlg( pTabViewShell->GetDialogParent(), pDoc, pList, aPos, RID_SCDLG_COND_FORMAT_MANAGER));
2378 0 : if(pDlg->Execute() == RET_OK && pDlg->CondFormatsChanged())
2379 : {
2380 0 : ScConditionalFormatList* pCondFormatList = pDlg->GetConditionalFormatList();
2381 0 : pData->GetDocShell()->GetDocFunc().SetConditionalFormatList(pCondFormatList, aPos.Tab());
2382 0 : }
2383 : }
2384 0 : break;
2385 :
2386 : case SID_EXTERNAL_SOURCE:
2387 : {
2388 0 : OUString aFile;
2389 0 : OUString aFilter;
2390 0 : OUString aOptions;
2391 0 : OUString aSource;
2392 0 : sal_uLong nRefresh=0;
2393 :
2394 0 : SFX_REQUEST_ARG( rReq, pFile, SfxStringItem, SID_FILE_NAME, false );
2395 0 : SFX_REQUEST_ARG( rReq, pSource, SfxStringItem, FN_PARAM_1, false );
2396 0 : if ( pFile && pSource )
2397 : {
2398 0 : aFile = pFile->GetValue();
2399 0 : aSource = pSource->GetValue();
2400 0 : SFX_REQUEST_ARG( rReq, pFilter, SfxStringItem, SID_FILTER_NAME, false );
2401 0 : if ( pFilter )
2402 0 : aFilter = pFilter->GetValue();
2403 0 : SFX_REQUEST_ARG( rReq, pOptions, SfxStringItem, SID_FILE_FILTEROPTIONS, false );
2404 0 : if ( pOptions )
2405 0 : aOptions = pOptions->GetValue();
2406 0 : SFX_REQUEST_ARG( rReq, pRefresh, SfxUInt32Item, FN_PARAM_2, false );
2407 0 : if ( pRefresh )
2408 0 : nRefresh = pRefresh->GetValue();
2409 : }
2410 : else
2411 : {
2412 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2413 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
2414 :
2415 0 : delete pImpl->m_pLinkedDlg;
2416 : pImpl->m_pLinkedDlg =
2417 0 : pFact->CreateScLinkedAreaDlg(pTabViewShell->GetDialogParent());
2418 : OSL_ENSURE(pImpl->m_pLinkedDlg, "Dialog create fail!");
2419 0 : delete pImpl->m_pRequest;
2420 0 : pImpl->m_pRequest = new SfxRequest( rReq );
2421 0 : pImpl->m_pLinkedDlg->StartExecuteModal( LINK( this, ScCellShell, DialogClosed ) );
2422 0 : return;
2423 : }
2424 :
2425 0 : ExecuteExternalSource( aFile, aFilter, aOptions, aSource, nRefresh, rReq );
2426 : }
2427 0 : break;
2428 :
2429 : default:
2430 : OSL_FAIL("incorrect slot in ExecuteEdit");
2431 0 : break;
2432 : }
2433 : }
2434 :
2435 0 : void ScCellShell::ExecuteTrans( SfxRequest& rReq )
2436 : {
2437 0 : sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() );
2438 0 : if ( nType )
2439 : {
2440 0 : GetViewData()->GetView()->TransliterateText( nType );
2441 0 : rReq.Done();
2442 : }
2443 0 : }
2444 :
2445 0 : void ScCellShell::ExecuteRotateTrans( SfxRequest& rReq )
2446 : {
2447 0 : if( rReq.GetSlot() == SID_TRANSLITERATE_ROTATE_CASE )
2448 0 : GetViewData()->GetView()->TransliterateText( m_aRotateCase.getNextMode() );
2449 0 : }
2450 :
2451 0 : void ScCellShell::ExecuteExternalSource(
2452 : const OUString& _rFile, const OUString& _rFilter, const OUString& _rOptions,
2453 : const OUString& _rSource, sal_uLong _nRefresh, SfxRequest& _rRequest )
2454 : {
2455 0 : if ( !_rFile.isEmpty() && !_rSource.isEmpty() ) // filter may be empty
2456 : {
2457 0 : ScRange aLinkRange;
2458 0 : bool bMove = false;
2459 :
2460 0 : ScViewData* pData = GetViewData();
2461 0 : ScMarkData& rMark = pData->GetMarkData();
2462 0 : rMark.MarkToSimple();
2463 0 : if ( rMark.IsMarked() )
2464 : {
2465 0 : rMark.GetMarkArea( aLinkRange );
2466 0 : bMove = true; // insert/delete cells to fit range
2467 : }
2468 : else
2469 0 : aLinkRange = ScRange( pData->GetCurX(), pData->GetCurY(), pData->GetTabNo() );
2470 :
2471 0 : pData->GetDocFunc().InsertAreaLink( _rFile, _rFilter, _rOptions, _rSource,
2472 0 : aLinkRange, _nRefresh, bMove, false );
2473 0 : _rRequest.Done();
2474 : }
2475 : else
2476 0 : _rRequest.Ignore();
2477 0 : }
2478 :
2479 : namespace {
2480 :
2481 0 : bool isDPSourceValid(const ScDPObject& rDPObj)
2482 : {
2483 0 : if (rDPObj.IsImportData())
2484 : {
2485 : // If the data type is database, check if the database is still valid.
2486 0 : const ScImportSourceDesc* pDesc = rDPObj.GetImportSourceDesc();
2487 0 : if (!pDesc)
2488 0 : return false;
2489 :
2490 0 : const ScDPSaveData* pSaveData = rDPObj.GetSaveData();
2491 0 : const ScDPDimensionSaveData* pDimData = NULL;
2492 0 : if (pSaveData)
2493 0 : pDimData = pSaveData->GetExistingDimensionData();
2494 :
2495 0 : const ScDPCache* pCache = pDesc->CreateCache(pDimData);
2496 0 : if (!pCache)
2497 : // cashe creation failed, probably due to invalid connection.
2498 0 : return false;
2499 : }
2500 0 : return true;
2501 : }
2502 :
2503 : }
2504 :
2505 0 : void ScCellShell::ExecuteDataPilotDialog()
2506 : {
2507 0 : ScModule* pScMod = SC_MOD();
2508 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
2509 0 : ScViewData* pData = GetViewData();
2510 0 : ScDocument* pDoc = pData->GetDocument();
2511 :
2512 0 : ::boost::scoped_ptr<ScDPObject> pNewDPObject(NULL);
2513 :
2514 : // ScPivot is no longer used...
2515 : ScDPObject* pDPObj = pDoc->GetDPAtCursor(
2516 0 : pData->GetCurX(), pData->GetCurY(),
2517 0 : pData->GetTabNo() );
2518 0 : if ( pDPObj ) // on an existing table?
2519 : {
2520 0 : if (isDPSourceValid(*pDPObj))
2521 0 : pNewDPObject.reset(new ScDPObject(*pDPObj));
2522 : }
2523 : else // create new table
2524 : {
2525 0 : sal_uLong nSrcErrorId = 0;
2526 :
2527 : // select database range or data
2528 0 : pTabViewShell->GetDBData( true, SC_DB_OLD );
2529 0 : ScMarkData& rMark = GetViewData()->GetMarkData();
2530 0 : if ( !rMark.IsMarked() && !rMark.IsMultiMarked() )
2531 0 : pTabViewShell->MarkDataArea( false );
2532 :
2533 : // output to cursor position for non-sheet data
2534 0 : ScAddress aDestPos( pData->GetCurX(), pData->GetCurY(),
2535 0 : pData->GetTabNo() );
2536 :
2537 : // first select type of source data
2538 :
2539 0 : bool bEnableExt = ScDPObject::HasRegisteredSources();
2540 :
2541 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2542 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
2543 :
2544 : ::boost::scoped_ptr<AbstractScDataPilotSourceTypeDlg> pTypeDlg(
2545 : pFact->CreateScDataPilotSourceTypeDlg(
2546 0 : pTabViewShell->GetDialogParent(), bEnableExt));
2547 :
2548 : // Populate named ranges (if any).
2549 0 : ScRangeName* pRangeName = pDoc->GetRangeName();
2550 0 : if (pRangeName)
2551 : {
2552 0 : ScRangeName::const_iterator itr = pRangeName->begin(), itrEnd = pRangeName->end();
2553 0 : for (; itr != itrEnd; ++itr)
2554 0 : pTypeDlg->AppendNamedRange(itr->second->GetName());
2555 : }
2556 :
2557 : OSL_ENSURE(pTypeDlg, "Dialog create fail!");
2558 0 : if ( pTypeDlg->Execute() == RET_OK )
2559 : {
2560 0 : if ( pTypeDlg->IsExternal() )
2561 : {
2562 0 : uno::Sequence<OUString> aSources = ScDPObject::GetRegisteredSources();
2563 : ::boost::scoped_ptr<AbstractScDataPilotServiceDlg> pServDlg(
2564 : pFact->CreateScDataPilotServiceDlg(
2565 0 : pTabViewShell->GetDialogParent(), aSources, RID_SCDLG_DAPISERVICE));
2566 :
2567 : OSL_ENSURE(pServDlg, "Dialog create fail!");
2568 0 : if ( pServDlg->Execute() == RET_OK )
2569 : {
2570 : ScDPServiceDesc aServDesc(
2571 0 : pServDlg->GetServiceName(),
2572 0 : pServDlg->GetParSource(),
2573 0 : pServDlg->GetParName(),
2574 0 : pServDlg->GetParUser(),
2575 0 : pServDlg->GetParPass() );
2576 0 : pNewDPObject.reset(new ScDPObject(pDoc));
2577 0 : pNewDPObject->SetServiceData( aServDesc );
2578 0 : }
2579 : }
2580 0 : else if ( pTypeDlg->IsDatabase() )
2581 : {
2582 : OSL_ENSURE(pFact, "ScAbstractFactory create fail!");
2583 :
2584 : ::boost::scoped_ptr<AbstractScDataPilotDatabaseDlg> pDataDlg(
2585 : pFact->CreateScDataPilotDatabaseDlg(
2586 0 : pTabViewShell->GetDialogParent()));
2587 :
2588 : OSL_ENSURE(pDataDlg, "Dialog create fail!");
2589 0 : if ( pDataDlg->Execute() == RET_OK )
2590 : {
2591 0 : ScImportSourceDesc aImpDesc(pDoc);
2592 0 : pDataDlg->GetValues( aImpDesc );
2593 0 : pNewDPObject.reset(new ScDPObject(pDoc));
2594 0 : pNewDPObject->SetImportDesc( aImpDesc );
2595 0 : }
2596 : }
2597 0 : else if (pTypeDlg->IsNamedRange())
2598 : {
2599 0 : OUString aName = pTypeDlg->GetSelectedNamedRange();
2600 0 : ScSheetSourceDesc aShtDesc(pDoc);
2601 0 : aShtDesc.SetRangeName(aName);
2602 0 : nSrcErrorId = aShtDesc.CheckSourceRange();
2603 0 : if (!nSrcErrorId)
2604 : {
2605 0 : pNewDPObject.reset(new ScDPObject(pDoc));
2606 0 : pNewDPObject->SetSheetDesc(aShtDesc);
2607 0 : }
2608 : }
2609 : else // selection
2610 : {
2611 : //! use database ranges (select before type dialog?)
2612 0 : ScRange aRange;
2613 0 : ScMarkType eType = GetViewData()->GetSimpleArea(aRange);
2614 0 : if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE )
2615 : {
2616 : // Shrink the range to the data area.
2617 0 : SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col();
2618 0 : SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row();
2619 0 : if (pDoc->ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow))
2620 : {
2621 0 : aRange.aStart.SetCol(nStartCol);
2622 0 : aRange.aStart.SetRow(nStartRow);
2623 0 : aRange.aEnd.SetCol(nEndCol);
2624 0 : aRange.aEnd.SetRow(nEndRow);
2625 0 : rMark.SetMarkArea(aRange);
2626 0 : pTabViewShell->MarkRange(aRange);
2627 : }
2628 :
2629 0 : bool bOK = true;
2630 0 : if ( pDoc->HasSubTotalCells( aRange ) )
2631 : {
2632 : // confirm selection if it contains SubTotal cells
2633 :
2634 : QueryBox aBox( pTabViewShell->GetDialogParent(),
2635 : WinBits(WB_YES_NO | WB_DEF_YES),
2636 0 : ScGlobal::GetRscString(STR_DATAPILOT_SUBTOTAL) );
2637 0 : if (aBox.Execute() == RET_NO)
2638 0 : bOK = false;
2639 : }
2640 0 : if (bOK)
2641 : {
2642 0 : ScSheetSourceDesc aShtDesc(pDoc);
2643 0 : aShtDesc.SetSourceRange(aRange);
2644 0 : nSrcErrorId = aShtDesc.CheckSourceRange();
2645 0 : if (!nSrcErrorId)
2646 : {
2647 0 : pNewDPObject.reset(new ScDPObject(pDoc));
2648 0 : pNewDPObject->SetSheetDesc( aShtDesc );
2649 : }
2650 :
2651 : // output below source data
2652 0 : if ( aRange.aEnd.Row()+2 <= MAXROW - 4 )
2653 0 : aDestPos = ScAddress( aRange.aStart.Col(),
2654 0 : aRange.aEnd.Row()+2,
2655 0 : aRange.aStart.Tab() );
2656 : }
2657 : }
2658 : }
2659 : }
2660 :
2661 0 : if (nSrcErrorId)
2662 : {
2663 : // Error occurred during data creation. Launch an error and bail out.
2664 0 : InfoBox aBox(pTabViewShell->GetDialogParent(), ScGlobal::GetRscString(nSrcErrorId));
2665 0 : aBox.Execute();
2666 0 : return;
2667 : }
2668 :
2669 0 : if ( pNewDPObject )
2670 0 : pNewDPObject->SetOutRange( aDestPos );
2671 : }
2672 :
2673 0 : pTabViewShell->SetDialogDPObject( pNewDPObject.get() ); // is copied
2674 0 : if ( pNewDPObject )
2675 : {
2676 : // start layout dialog
2677 :
2678 0 : sal_uInt16 nId = ScPivotLayoutWrapper::GetChildWindowId();
2679 0 : SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
2680 0 : SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
2681 0 : pScMod->SetRefDialog( nId, pWnd ? false : true );
2682 0 : }
2683 : }
2684 :
2685 0 : void ScCellShell::ExecuteXMLSourceDialog()
2686 : {
2687 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2688 0 : if (!pFact)
2689 0 : return;
2690 :
2691 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
2692 0 : if (!pTabViewShell)
2693 0 : return;
2694 :
2695 0 : ScModule* pScMod = SC_MOD();
2696 :
2697 0 : sal_uInt16 nId = ScXMLSourceDlgWrapper::GetChildWindowId();
2698 0 : SfxViewFrame* pViewFrame = pTabViewShell->GetViewFrame();
2699 0 : SfxChildWindow* pWnd = pViewFrame->GetChildWindow(nId);
2700 0 : pScMod->SetRefDialog(nId, pWnd ? false : true);
2701 : }
2702 :
2703 0 : void ScCellShell::ExecuteSubtotals(SfxRequest& rReq)
2704 : {
2705 0 : ScTabViewShell* pTabViewShell = GetViewData()->GetViewShell();
2706 0 : const SfxItemSet* pArgs = rReq.GetArgs();
2707 0 : if ( pArgs )
2708 : {
2709 0 : pTabViewShell->DoSubTotals( static_cast<const ScSubTotalItem&>( pArgs->Get( SCITEM_SUBTDATA )).
2710 0 : GetSubTotalData() );
2711 0 : rReq.Done();
2712 0 : return;
2713 : }
2714 :
2715 0 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg;
2716 0 : ScSubTotalParam aSubTotalParam;
2717 0 : SfxItemSet aArgSet( GetPool(), SCITEM_SUBTDATA, SCITEM_SUBTDATA );
2718 :
2719 : // Only get existing named database range.
2720 0 : ScDBData* pDBData = pTabViewShell->GetDBData(true, SC_DB_OLD);
2721 0 : if (!pDBData)
2722 : {
2723 : // No existing DB data at this position. Create an
2724 : // anonymous DB.
2725 0 : pDBData = pTabViewShell->GetAnonymousDBData();
2726 0 : ScRange aDataRange;
2727 0 : pDBData->GetArea(aDataRange);
2728 0 : pTabViewShell->MarkRange(aDataRange, false);
2729 : }
2730 :
2731 0 : pDBData->GetSubTotalParam( aSubTotalParam );
2732 0 : aSubTotalParam.bRemoveOnly = false;
2733 :
2734 0 : aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA, GetViewData(), &aSubTotalParam ) );
2735 0 : ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
2736 : assert(pFact); //"ScAbstractFactory create fail
2737 :
2738 0 : pDlg.reset(pFact->CreateScSubTotalDlg(pTabViewShell->GetDialogParent(), &aArgSet));
2739 : assert(pDlg); // "Dialog create fail
2740 0 : pDlg->SetCurPageId(1);
2741 :
2742 0 : short bResult = pDlg->Execute();
2743 :
2744 0 : if ( (bResult == RET_OK) || (bResult == SCRET_REMOVE) )
2745 : {
2746 0 : const SfxItemSet* pOutSet = NULL;
2747 :
2748 0 : if ( bResult == RET_OK )
2749 : {
2750 0 : pOutSet = pDlg->GetOutputItemSet();
2751 : aSubTotalParam =
2752 : static_cast<const ScSubTotalItem&>(
2753 0 : pOutSet->Get( SCITEM_SUBTDATA )).
2754 0 : GetSubTotalData();
2755 : }
2756 : else // if (bResult == SCRET_REMOVE)
2757 : {
2758 0 : pOutSet = &aArgSet;
2759 0 : aSubTotalParam.bRemoveOnly = true;
2760 0 : aSubTotalParam.bReplace = true;
2761 : aArgSet.Put( ScSubTotalItem( SCITEM_SUBTDATA,
2762 : GetViewData(),
2763 0 : &aSubTotalParam ) );
2764 : }
2765 :
2766 0 : pTabViewShell->DoSubTotals( aSubTotalParam );
2767 0 : rReq.Done( *pOutSet );
2768 : }
2769 : else
2770 0 : GetViewData()->GetDocShell()->CancelAutoDBRange();
2771 : }
2772 :
2773 0 : void ScCellShell::ExecuteFillSingleEdit()
2774 : {
2775 0 : ScAddress aCurPos = GetViewData()->GetCurPos();
2776 :
2777 0 : OUString aInit;
2778 :
2779 0 : if (aCurPos.Row() > 0)
2780 : {
2781 : // Get the initial text value from the above cell.
2782 :
2783 0 : ScDocument* pDoc = GetViewData()->GetDocument();
2784 0 : ScRefCellValue aCell;
2785 0 : ScAddress aPrevPos = aCurPos;
2786 0 : aPrevPos.IncRow(-1);
2787 0 : aCell.assign(*pDoc, aPrevPos);
2788 :
2789 0 : if (aCell.meType == CELLTYPE_FORMULA)
2790 : {
2791 0 : aInit = "=";
2792 0 : const ScTokenArray* pCode = aCell.mpFormula->GetCode();
2793 0 : sc::TokenStringContext aCxt(pDoc, pDoc->GetGrammar());
2794 0 : aInit += pCode->CreateString(aCxt, aCurPos);
2795 : }
2796 : else
2797 0 : aInit = aCell.getString(pDoc);
2798 : }
2799 :
2800 0 : SC_MOD()->SetInputMode(SC_INPUT_TABLE, &aInit);
2801 0 : }
2802 :
2803 0 : IMPL_LINK_NOARG(ScCellShell, DialogClosed)
2804 : {
2805 : assert(pImpl->m_pLinkedDlg && "ScCellShell::DialogClosed(): invalid request");
2806 : assert(pImpl->m_pRequest && "ScCellShell::DialogClosed(): invalid request");
2807 0 : OUString sFile, sFilter, sOptions, sSource;
2808 0 : sal_uLong nRefresh = 0;
2809 :
2810 0 : if ( pImpl->m_pLinkedDlg->GetResult() == RET_OK )
2811 : {
2812 0 : sFile = pImpl->m_pLinkedDlg->GetURL();
2813 0 : sFilter = pImpl->m_pLinkedDlg->GetFilter();
2814 0 : sOptions = pImpl->m_pLinkedDlg->GetOptions();
2815 0 : sSource = pImpl->m_pLinkedDlg->GetSource();
2816 0 : nRefresh = pImpl->m_pLinkedDlg->GetRefresh();
2817 0 : if ( !sFile.isEmpty() )
2818 0 : pImpl->m_pRequest->AppendItem( SfxStringItem( SID_FILE_NAME, sFile ) );
2819 0 : if ( !sFilter.isEmpty() )
2820 0 : pImpl->m_pRequest->AppendItem( SfxStringItem( SID_FILTER_NAME, sFilter ) );
2821 0 : if ( !sOptions.isEmpty() )
2822 0 : pImpl->m_pRequest->AppendItem( SfxStringItem( SID_FILE_FILTEROPTIONS, sOptions ) );
2823 0 : if ( !sSource.isEmpty() )
2824 0 : pImpl->m_pRequest->AppendItem( SfxStringItem( FN_PARAM_1, sSource ) );
2825 0 : if ( nRefresh )
2826 0 : pImpl->m_pRequest->AppendItem( SfxUInt32Item( FN_PARAM_2, nRefresh ) );
2827 : }
2828 :
2829 0 : ExecuteExternalSource( sFile, sFilter, sOptions, sSource, nRefresh, *(pImpl->m_pRequest) );
2830 0 : return 0;
2831 228 : }
2832 :
2833 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|