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