1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27 #include "OutlineViewShell.hxx"
28
29 #include <com/sun/star/presentation/XPresentation2.hpp>
30
31 #include "app.hrc"
32 #include <svx/hlnkitem.hxx>
33 #include <sfx2/docfile.hxx>
34 #include <sfx2/dispatch.hxx>
35 #include <sfx2/request.hxx>
36 #include <svl/eitem.hxx>
37 #ifndef _ZOOMITEM_HXX //autogen
38 #include <svx/zoomitem.hxx>
39 #endif
40 #include <vcl/msgbox.hxx>
41 #include <editeng/eeitem.hxx>
42 #include <editeng/flditem.hxx>
43 #include <editeng/editstat.hxx>
44 #include "optsitem.hxx"
45 #include <unotools/useroptions.hxx>
46
47 #include <sfx2/viewfrm.hxx>
48 #include "Outliner.hxx"
49 #include "Window.hxx"
50 #include "OutlineViewShell.hxx"
51 #include "fubullet.hxx"
52 #include "fuolbull.hxx"
53 #include "FrameView.hxx"
54 #include "fuzoom.hxx"
55 #include "fuscale.hxx"
56 #include "fuchar.hxx"
57 #include "fuinsfil.hxx"
58 #include "fuprobjs.hxx"
59 #include "futhes.hxx"
60 #include "futempl.hxx"
61 #include "fusldlg.hxx"
62 #include "zoomlist.hxx"
63 #include "fuexpand.hxx"
64 #include "fusumry.hxx"
65 #include "fucushow.hxx"
66 #include "drawdoc.hxx"
67 #include "sdattr.hxx"
68 #include "ViewShellBase.hxx"
69 #include "sdabstdlg.hxx"
70 #include "framework/FrameworkHelper.hxx"
71 #include "DrawViewShell.hxx"
72
73 using namespace ::com::sun::star::uno;
74 using namespace ::com::sun::star::presentation;
75
76 namespace sd {
77
78
79 /************************************************************************/
80
81 /*************************************************************************
82 |*
83 |* SfxRequests fuer temporaere Funktionen
84 |*
85 \************************************************************************/
86
FuTemporary(SfxRequest & rReq)87 void OutlineViewShell::FuTemporary(SfxRequest &rReq)
88 {
89 DeactivateCurrentFunction();
90
91 OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
92 sal_uInt16 nSId = rReq.GetSlot();
93
94 switch( nSId )
95 {
96 case SID_ATTR_ZOOM:
97 {
98 const SfxItemSet* pArgs = rReq.GetArgs();
99
100 if ( pArgs )
101 {
102 SvxZoomType eZT = ( ( const SvxZoomItem& ) pArgs->
103 Get( SID_ATTR_ZOOM ) ).GetType();
104 switch( eZT )
105 {
106 case SVX_ZOOM_PERCENT:
107 SetZoom( (long) ( ( const SvxZoomItem& ) pArgs->
108 Get( SID_ATTR_ZOOM ) ).GetValue() );
109 Invalidate( SID_ATTR_ZOOM );
110 Invalidate( SID_ATTR_ZOOMSLIDER );
111 break;
112 default:
113 break;
114 }
115 rReq.Done();
116 }
117 else
118 {
119 // hier den Zoom-Dialog oeffnen
120 SetCurrentFunction( FuScale::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
121 }
122 Cancel();
123 }
124 break;
125
126 case SID_ATTR_ZOOMSLIDER:
127 {
128 const SfxItemSet* pArgs = rReq.GetArgs();
129
130 if (pArgs && pArgs->Count () == 1 )
131 {
132 SFX_REQUEST_ARG (rReq, pScale, SfxUInt16Item, SID_ATTR_ZOOMSLIDER, sal_False);
133 if (CHECK_RANGE (5, pScale->GetValue (), 3000))
134 {
135 SetZoom (pScale->GetValue ());
136
137 SfxBindings& rBindings = GetViewFrame()->GetBindings();
138 rBindings.Invalidate( SID_ATTR_ZOOM );
139 rBindings.Invalidate( SID_ZOOM_IN );
140 rBindings.Invalidate( SID_ZOOM_OUT );
141 rBindings.Invalidate( SID_ATTR_ZOOMSLIDER );
142
143 }
144 }
145
146 Cancel();
147 rReq.Done ();
148 break;
149 }
150
151 case SID_ZOOM_OUT:
152 {
153 SetCurrentFunction( FuZoom::Create(this, GetActiveWindow(), pOlView, GetDoc(), rReq) );
154 // Beendet sich selbst, kein Cancel() notwendig!
155 rReq.Done();
156 }
157 break;
158
159 case SID_SIZE_REAL:
160 {
161 SetZoom( 100 );
162 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
163 GetActiveWindow()->GetOutputSizePixel()) );
164 mpZoomList->InsertZoomRect(aVisAreaWin);
165 Invalidate( SID_ATTR_ZOOM );
166 Invalidate( SID_ATTR_ZOOMSLIDER );
167 Cancel();
168 rReq.Done();
169 }
170 break;
171
172 case SID_ZOOM_IN:
173 {
174 SetZoom( Max( (long) ( GetActiveWindow()->GetZoom() / 2 ), (long) GetActiveWindow()->GetMinZoom() ) );
175 Rectangle aVisAreaWin = GetActiveWindow()->PixelToLogic( Rectangle( Point(0,0),
176 GetActiveWindow()->GetOutputSizePixel()) );
177 mpZoomList->InsertZoomRect(aVisAreaWin);
178 Invalidate( SID_ATTR_ZOOM );
179 Invalidate( SID_ZOOM_OUT);
180 Invalidate( SID_ZOOM_IN );
181 Invalidate( SID_ATTR_ZOOMSLIDER );
182 Cancel();
183 rReq.Done();
184 }
185 break;
186
187 case SID_OUTLINE_COLLAPSE_ALL:
188 {
189 pOutlinerView->CollapseAll();
190 Cancel();
191 rReq.Done();
192 }
193 break;
194
195 case SID_OUTLINE_COLLAPSE:
196 {
197 pOutlinerView->Collapse();
198 Cancel();
199 rReq.Done();
200 }
201 break;
202
203 case SID_OUTLINE_EXPAND_ALL:
204 {
205 pOutlinerView->ExpandAll();
206 Cancel();
207 rReq.Done();
208 }
209 break;
210
211 case SID_OUTLINE_EXPAND:
212 {
213 pOutlinerView->Expand();
214 Cancel();
215 rReq.Done();
216 }
217 break;
218
219 case SID_OUTLINE_FORMAT:
220 {
221 ::Outliner* pOutl = pOutlinerView->GetOutliner();
222 pOutl->SetFlatMode( !pOutl->IsFlatMode() );
223 Invalidate( SID_COLORVIEW );
224 Cancel();
225 rReq.Done();
226 }
227 break;
228
229 case SID_SELECTALL:
230 {
231 ::Outliner* pOutl = pOlView->GetOutliner();
232 sal_uLong nParaCount = pOutl->GetParagraphCount();
233 if (nParaCount > 0)
234 {
235 pOutlinerView->SelectRange( 0, (sal_uInt16) nParaCount );
236 }
237 Cancel();
238 }
239 break;
240
241 case SID_PRESENTATION:
242 case SID_REHEARSE_TIMINGS:
243 {
244 pOlView->PrepareClose();
245
246 Reference< XPresentation2 > xPresentation( GetDoc()->getPresentation() );
247 if( xPresentation.is() )
248 {
249 if( ( SID_REHEARSE_TIMINGS != rReq.GetSlot() ) )
250 xPresentation->start();
251 else
252 xPresentation->rehearseTimings();
253 }
254 Cancel();
255 rReq.Done();
256 }
257 break;
258
259 case SID_COLORVIEW:
260 {
261 ::Outliner* pOutl = pOutlinerView->GetOutliner();
262 sal_uLong nCntrl = pOutl->GetControlWord();
263
264 if ( !(nCntrl & EE_CNTRL_NOCOLORS) )
265 {
266 // Farbansicht ist eingeschaltet: ausschalten
267 pOutl->SetControlWord(nCntrl | EE_CNTRL_NOCOLORS);
268 }
269 else
270 {
271 // Farbansicht ist ausgeschaltet: einschalten
272 pOutl->SetControlWord(nCntrl & ~EE_CNTRL_NOCOLORS);
273 }
274
275 InvalidateWindows();
276 Invalidate( SID_COLORVIEW );
277 Cancel();
278 rReq.Done();
279 }
280 break;
281
282 case SID_STYLE_EDIT:
283 case SID_STYLE_UPDATE_BY_EXAMPLE:
284 {
285 if( rReq.GetArgs() )
286 {
287 SetCurrentFunction( FuTemplate::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
288 Cancel();
289 }
290
291 rReq.Ignore ();
292 }
293 break;
294
295 case SID_PRESENTATION_DLG:
296 {
297 SetCurrentFunction( FuSlideShowDlg::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
298 Cancel();
299 }
300 break;
301
302 case SID_CUSTOMSHOW_DLG:
303 {
304 SetCurrentFunction( FuCustomShowDlg::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
305 Cancel();
306 }
307 break;
308 }
309
310 if(HasCurrentFunction())
311 GetCurrentFunction()->Activate();
312
313 Invalidate( SID_OUTLINE_COLLAPSE_ALL );
314 Invalidate( SID_OUTLINE_COLLAPSE );
315 Invalidate( SID_OUTLINE_EXPAND_ALL );
316 Invalidate( SID_OUTLINE_EXPAND );
317
318 SfxBindings& rBindings = GetViewFrame()->GetBindings();
319 rBindings.Invalidate( SID_OUTLINE_LEFT );
320 rBindings.Invalidate( SID_OUTLINE_RIGHT );
321 rBindings.Invalidate( SID_OUTLINE_UP );
322 rBindings.Invalidate( SID_OUTLINE_DOWN );
323
324 Invalidate( SID_OUTLINE_FORMAT );
325 Invalidate( SID_COLORVIEW );
326 Invalidate(SID_CUT);
327 Invalidate(SID_COPY);
328 Invalidate(SID_PASTE);
329 }
330
FuTemporaryModify(SfxRequest & rReq)331 void OutlineViewShell::FuTemporaryModify(SfxRequest &rReq)
332 {
333 sal_uInt16 nSId = rReq.GetSlot();
334 std::auto_ptr< OutlineViewModelChangeGuard > aGuard;
335 if (nSId != SID_OUTLINE_BULLET && nSId != FN_SVX_SET_BULLET && nSId != FN_SVX_SET_NUMBER)
336 {
337 aGuard.reset( new OutlineViewModelChangeGuard(*pOlView) );
338 }
339 DeactivateCurrentFunction();
340
341 OutlinerView* pOutlinerView = pOlView->GetViewByWindow( GetActiveWindow() );
342 //sal_uInt16 nSId = rReq.GetSlot();
343
344 switch( nSId )
345 {
346 case SID_HYPERLINK_SETLINK:
347 {
348 const SfxItemSet* pReqArgs = rReq.GetArgs();
349
350 if (pReqArgs)
351 {
352 SvxHyperlinkItem* pHLItem =
353 (SvxHyperlinkItem*) &pReqArgs->Get(SID_HYPERLINK_SETLINK);
354
355 SvxFieldItem aURLItem(SvxURLField(pHLItem->GetURL(),
356 pHLItem->GetName(),
357 SVXURLFORMAT_REPR), EE_FEATURE_FIELD);
358 ESelection aSel( pOutlinerView->GetSelection() );
359 pOutlinerView->InsertField(aURLItem);
360 if ( aSel.nStartPos <= aSel.nEndPos )
361 aSel.nEndPos = aSel.nStartPos + 1;
362 else
363 aSel.nStartPos = aSel.nEndPos + 1;
364 pOutlinerView->SetSelection( aSel );
365 }
366
367 Cancel();
368 rReq.Ignore ();
369 }
370 break;
371
372 case FN_INSERT_SOFT_HYPHEN:
373 case FN_INSERT_HARDHYPHEN:
374 case FN_INSERT_HARD_SPACE:
375 case SID_INSERT_RLM :
376 case SID_INSERT_LRM :
377 case SID_INSERT_ZWNBSP :
378 case SID_INSERT_ZWSP:
379 case SID_CHARMAP:
380 {
381 SetCurrentFunction( FuBullet::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
382 Cancel();
383 }
384 break;
385
386 case SID_OUTLINE_BULLET:
387 case FN_SVX_SET_BULLET:
388 case FN_SVX_SET_NUMBER:
389 {
390 SetCurrentFunction( FuOutlineBullet::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
391 Cancel();
392 }
393 break;
394
395 case SID_THESAURUS:
396 {
397 SetCurrentFunction( FuThesaurus::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
398 Cancel();
399 rReq.Ignore ();
400 }
401 break;
402
403 case SID_CHAR_DLG_EFFECT:
404 case SID_CHAR_DLG:
405 {
406 SetCurrentFunction( FuChar::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
407 Cancel();
408 }
409 break;
410
411 case SID_INSERTFILE:
412 {
413 SetCurrentFunction( FuInsertFile::Create(this, GetActiveWindow(), pOlView, GetDoc(), rReq) );
414 Cancel();
415 }
416 break;
417
418 case SID_PRESENTATIONOBJECT:
419 {
420 SetCurrentFunction( FuPresentationObjects::Create(this, GetActiveWindow(), pOlView, GetDoc(), rReq) );
421 Cancel();
422 }
423 break;
424
425 case SID_SET_DEFAULT:
426 {
427 // 1. Selektion merken (kriegt die eselige EditEngine nicht selbst
428 // auf die Reihe!)
429 // 2. Update auf False (sonst flackert's noch staerker
430 // an allen selektierten Absaetzen:
431 // a. deren Vorlage nochmal setzen, um absatzweite harte Attribute
432 // zu entfernen
433 // b. harte Zeichenattribute loeschen
434 // 3. Update auf True und Selektion wieder setzen
435 /*
436 ESelection aEsel= pOutlinerView->GetSelection();
437 Outliner* pOutl = pOutlinerView->GetOutliner();
438 pOutl->SetUpdateMode(sal_False);
439 List* pSelectedParas = pOutlinerView->CreateSelectionList();
440 Paragraph* pPara = (Paragraph*)pSelectedParas->First();
441 while (pPara)
442 {
443 sal_uLong nParaPos = pOutl->GetAbsPos(pPara);
444 String aName;
445 SfxStyleFamily aFamily;
446 pOutl->GetStyleSheet(nParaPos, aName, aFamily);
447 pOutl->SetStyleSheet(nParaPos, aName, aFamily);
448 pOutl->QuickRemoveCharAttribs(nParaPos);
449 pPara = (Paragraph*)pSelectedParas->Next();
450 }
451 delete pSelectedParas;
452 pOutl->SetUpdateMode(sal_True);
453 pOutlinerView->SetSelection(aEsel);
454 */
455 pOutlinerView->RemoveAttribs(sal_True); // sal_True = auch Absatzattribute
456 Cancel();
457 rReq.Done();
458 }
459 break;
460
461 case SID_SUMMARY_PAGE:
462 {
463 pOlView->SetSelectedPages();
464 SetCurrentFunction( FuSummaryPage::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
465 pOlView->GetOutliner()->Clear();
466 pOlView->FillOutliner();
467 pOlView->GetActualPage();
468 Cancel();
469 }
470 break;
471
472 case SID_EXPAND_PAGE:
473 {
474 pOlView->SetSelectedPages();
475 SetCurrentFunction( FuExpandPage::Create( this, GetActiveWindow(), pOlView, GetDoc(), rReq ) );
476 pOlView->GetOutliner()->Clear();
477 pOlView->FillOutliner();
478 pOlView->GetActualPage();
479 Cancel();
480 }
481 break;
482
483 case SID_INSERT_FLD_DATE_FIX:
484 case SID_INSERT_FLD_DATE_VAR:
485 case SID_INSERT_FLD_TIME_FIX:
486 case SID_INSERT_FLD_TIME_VAR:
487 case SID_INSERT_FLD_AUTHOR:
488 case SID_INSERT_FLD_PAGE:
489 case SID_INSERT_FLD_PAGES:
490 case SID_INSERT_FLD_FILE:
491 {
492 SvxFieldItem* pFieldItem = 0;
493
494 switch( nSId )
495 {
496 case SID_INSERT_FLD_DATE_FIX:
497 pFieldItem = new SvxFieldItem(
498 SvxDateField( Date(), SVXDATETYPE_FIX ), EE_FEATURE_FIELD );
499 break;
500
501 case SID_INSERT_FLD_DATE_VAR:
502 pFieldItem = new SvxFieldItem( SvxDateField(), EE_FEATURE_FIELD );
503 break;
504
505 case SID_INSERT_FLD_TIME_FIX:
506 pFieldItem = new SvxFieldItem(
507 SvxExtTimeField( Time(), SVXTIMETYPE_FIX ), EE_FEATURE_FIELD );
508 break;
509
510 case SID_INSERT_FLD_TIME_VAR:
511 pFieldItem = new SvxFieldItem( SvxExtTimeField(), EE_FEATURE_FIELD );
512 break;
513
514 case SID_INSERT_FLD_AUTHOR:
515 {
516 SvtUserOptions aUserOptions;
517 pFieldItem = new SvxFieldItem(
518 SvxAuthorField(
519 aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() )
520 , EE_FEATURE_FIELD );
521 }
522 break;
523
524 case SID_INSERT_FLD_PAGE:
525 pFieldItem = new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD );
526 break;
527
528 case SID_INSERT_FLD_PAGES:
529 pFieldItem = new SvxFieldItem( SvxPagesField(), EE_FEATURE_FIELD );
530 break;
531
532 case SID_INSERT_FLD_FILE:
533 {
534 String aName;
535 if( GetDocSh()->HasName() )
536 aName = GetDocSh()->GetMedium()->GetName();
537 //else
538 // aName = GetDocSh()->GetName();
539 pFieldItem = new SvxFieldItem( SvxExtFileField( aName ), EE_FEATURE_FIELD );
540 }
541 break;
542 }
543
544 const SvxFieldItem* pOldFldItem = pOutlinerView->GetFieldAtSelection();
545
546 if( pOldFldItem && ( pOldFldItem->GetField()->ISA( SvxURLField ) ||
547 pOldFldItem->GetField()->ISA( SvxDateField ) ||
548 pOldFldItem->GetField()->ISA( SvxTimeField ) ||
549 pOldFldItem->GetField()->ISA( SvxExtTimeField ) ||
550 pOldFldItem->GetField()->ISA( SvxExtFileField ) ||
551 pOldFldItem->GetField()->ISA( SvxAuthorField ) ||
552 pOldFldItem->GetField()->ISA( SvxPageField ) ||
553 pOldFldItem->GetField()->ISA( SvxPagesField )) )
554 {
555 // Feld selektieren, so dass es beim Insert geloescht wird
556 ESelection aSel = pOutlinerView->GetSelection();
557 if( aSel.nStartPos == aSel.nEndPos )
558 aSel.nEndPos++;
559 pOutlinerView->SetSelection( aSel );
560 }
561
562 if( pFieldItem )
563 pOutlinerView->InsertField( *pFieldItem );
564
565 delete pFieldItem;
566
567 Cancel();
568 rReq.Ignore ();
569 }
570 break;
571
572 case SID_MODIFY_FIELD:
573 {
574 const SvxFieldItem* pFldItem = pOutlinerView->GetFieldAtSelection();
575
576 if( pFldItem && (pFldItem->GetField()->ISA( SvxDateField ) ||
577 pFldItem->GetField()->ISA( SvxAuthorField ) ||
578 pFldItem->GetField()->ISA( SvxExtFileField ) ||
579 pFldItem->GetField()->ISA( SvxExtTimeField ) ) )
580 {
581 // Dialog...
582 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
583 AbstractSdModifyFieldDlg* pDlg = pFact ? pFact->CreateSdModifyFieldDlg(GetActiveWindow(), pFldItem->GetField(), pOutlinerView->GetAttribs() ) : 0;
584 if( pDlg && (pDlg->Execute() == RET_OK) )
585 {
586 SvxFieldData* pField = pDlg->GetField();
587 if( pField )
588 {
589 SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD );
590 //pOLV->DeleteSelected(); <-- fehlt leider !
591 // Feld selektieren, so dass es beim Insert geloescht wird
592 ESelection aSel = pOutlinerView->GetSelection();
593 sal_Bool bSel = sal_True;
594 if( aSel.nStartPos == aSel.nEndPos )
595 {
596 bSel = sal_False;
597 aSel.nEndPos++;
598 }
599 pOutlinerView->SetSelection( aSel );
600
601 pOutlinerView->InsertField( aFieldItem );
602
603 // Selektion wird wieder in den Ursprungszustand gebracht
604 if( !bSel )
605 aSel.nEndPos--;
606 pOutlinerView->SetSelection( aSel );
607
608 delete pField;
609 }
610
611 SfxItemSet aSet( pDlg->GetItemSet() );
612 if( aSet.Count() )
613 {
614 pOutlinerView->SetAttribs( aSet );
615
616 ::Outliner* pOutliner = pOutlinerView->GetOutliner();
617 if( pOutliner )
618 pOutliner->UpdateFields();
619 }
620 }
621 delete pDlg;
622 }
623
624 Cancel();
625 rReq.Ignore ();
626 }
627 break;
628 }
629
630 if(HasCurrentFunction())
631 GetCurrentFunction()->Activate();
632
633 Invalidate( SID_OUTLINE_COLLAPSE_ALL );
634 Invalidate( SID_OUTLINE_COLLAPSE );
635 Invalidate( SID_OUTLINE_EXPAND_ALL );
636 Invalidate( SID_OUTLINE_EXPAND );
637
638 SfxBindings& rBindings = GetViewFrame()->GetBindings();
639 rBindings.Invalidate( SID_OUTLINE_LEFT );
640 rBindings.Invalidate( SID_OUTLINE_RIGHT );
641 rBindings.Invalidate( SID_OUTLINE_UP );
642 rBindings.Invalidate( SID_OUTLINE_DOWN );
643
644 Invalidate( SID_OUTLINE_FORMAT );
645 Invalidate( SID_COLORVIEW );
646 Invalidate(SID_CUT);
647 Invalidate(SID_COPY);
648 Invalidate(SID_PASTE);
649 }
650
651
652 } // end of namespace sd
653