xref: /AOO41X/main/sd/source/ui/view/drviewsb.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
27 #include <comphelper/processfactory.hxx>
28 #include <svx/svdlayer.hxx>
29 #ifndef _SVXIDS_HXX
30 #include <svx/svxids.hrc>
31 #endif
32 #include <sfx2/msgpool.hxx>
33 #include <svx/hyprlink.hxx>
34 #include <sfx2/viewfrm.hxx>
35 #include <svx/hlnkitem.hxx>
36 #include <tools/urlobj.hxx>
37 #include <editeng/eeitem.hxx>
38 #ifndef _FLDITEM_HXX
39 #include <editeng/flditem.hxx>
40 #endif
41 #include <vcl/msgbox.hxx>
42 #include <sfx2/request.hxx>
43 #include <sfx2/dispatch.hxx>
44 #include <svx/svdorect.hxx>
45 #include <sfx2/docfile.hxx>
46 #include <basic/sbstar.hxx>
47 #include <basic/sberrors.hxx>
48 #include <svx/fmshell.hxx>
49 #include <svx/svxdlg.hxx>
50 #include <svx/dialogs.hrc>
51 #include <unotools/useroptions.hxx>
52 
53 #include "app.hrc"
54 #include "strings.hrc"
55 #include "res_bmp.hrc"
56 #include "glob.hrc"
57 #include "Outliner.hxx"
58 #include "Window.hxx"
59 #include "app.hxx"
60 #include "sdattr.hxx"
61 #include "drawdoc.hxx"
62 #include "DrawDocShell.hxx"
63 #include "sdresid.hxx"
64 #include "sdpage.hxx"
65 #include "DrawViewShell.hxx"
66 #include "drawview.hxx"
67 #include "unmodpg.hxx"
68 #include "undolayer.hxx"
69 #include "ViewShellBase.hxx"
70 #include "FormShellManager.hxx"
71 #include "LayerTabBar.hxx"
72 #include "sdabstdlg.hxx"
73 #include "SlideSorterViewShell.hxx"
74 #include "SlideSorter.hxx"
75 #include "controller/SlideSorterController.hxx"
76 
77 #define RET_DELETE  100
78 
79 namespace sd {
80 
81 /*************************************************************************
82 |*
83 |* SfxRequests fuer temporaere Funktionen
84 |*
85 \************************************************************************/
86 
FuTemp02(SfxRequest & rReq)87 void DrawViewShell::FuTemp02(SfxRequest& rReq)
88 {
89     sal_uInt16 nSId = rReq.GetSlot();
90     switch( nSId )
91     {
92         case SID_INSERTLAYER:
93         {
94             if ( mpDrawView->IsTextEdit() )
95             {
96                 mpDrawView->SdrEndTextEdit();
97             }
98 
99             SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
100             sal_uInt16 nLayerCnt = rLayerAdmin.GetLayerCount();
101             sal_uInt16 nLayer = nLayerCnt - 2 + 1;
102             String aLayerName ( SdResId(STR_LAYER) ), aLayerTitle, aLayerDesc;
103             aLayerName += String::CreateFromInt32( (sal_Int32)nLayer );
104             sal_Bool bIsVisible = sal_False;
105             sal_Bool bIsLocked = sal_False;
106             sal_Bool bIsPrintable = sal_False;
107 
108             const SfxItemSet* pArgs = rReq.GetArgs();
109 
110             if (! pArgs)
111             {
112                 SfxItemSet aNewAttr( GetDoc()->GetPool(), ATTR_LAYER_START, ATTR_LAYER_END );
113 
114                 aNewAttr.Put( SdAttrLayerName( aLayerName ) );
115                 aNewAttr.Put( SdAttrLayerTitle() );
116                 aNewAttr.Put( SdAttrLayerDesc() );
117                 aNewAttr.Put( SdAttrLayerVisible() );
118                 aNewAttr.Put( SdAttrLayerPrintable() );
119                 aNewAttr.Put( SdAttrLayerLocked() );
120                 aNewAttr.Put( SdAttrLayerThisPage() );
121 
122                 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
123                 AbstractSdInsertLayerDlg* pDlg = pFact ? pFact->CreateSdInsertLayerDlg(NULL, aNewAttr, true, String( SdResId( STR_INSERTLAYER ) ) ) : 0;
124                 if( pDlg )
125                 {
126                     pDlg->SetHelpId( SD_MOD()->GetSlotPool()->GetSlot( SID_INSERTLAYER )->GetCommand() );
127 
128                     // Ueberpruefung auf schon vorhandene Namen
129                     sal_Bool bLoop = sal_True;
130                     while( bLoop && pDlg->Execute() == RET_OK )
131                     {
132                         pDlg->GetAttr( aNewAttr );
133                         aLayerName   = ((SdAttrLayerName &) aNewAttr.Get (ATTR_LAYER_NAME)).GetValue ();
134 
135                         if( rLayerAdmin.GetLayer( aLayerName, sal_False )
136                             || aLayerName.Len()==0 )
137                         {
138                             // Name ist schon vorhanden
139                             WarningBox aWarningBox (
140                                 GetParentWindow(),
141                                 WinBits( WB_OK ),
142                                 String(SdResId( STR_WARN_NAME_DUPLICATE)));
143                             aWarningBox.Execute();
144                         }
145                         else
146                             bLoop = sal_False;
147                     }
148                     if( bLoop ) // wurde abgebrochen
149                     {
150                         delete pDlg;
151 
152                         Cancel();
153                         rReq.Ignore ();
154                         break;
155                     }
156                     else
157                     {
158                         //pDlg->GetAttr( aNewAttr );
159                         //aLayerName     = ((SdAttrLayerName &) aNewAttr.Get (ATTR_LAYER_NAME)).GetValue ();
160                         aLayerTitle  = ((SdAttrLayerTitle &) aNewAttr.Get (ATTR_LAYER_TITLE)).GetValue ();
161                         aLayerDesc   = ((SdAttrLayerDesc &) aNewAttr.Get (ATTR_LAYER_DESC)).GetValue ();
162                         bIsVisible   = ((SdAttrLayerVisible &) aNewAttr.Get (ATTR_LAYER_VISIBLE)).GetValue ();
163                         bIsLocked    = ((SdAttrLayerLocked &) aNewAttr.Get (ATTR_LAYER_LOCKED)).GetValue () ;
164                         bIsPrintable = ((SdAttrLayerPrintable &) aNewAttr.Get (ATTR_LAYER_PRINTABLE)).GetValue () ;
165 
166                         delete pDlg;
167                     }
168                 }
169             }
170             else if (pArgs->Count () != 4)
171                  {
172                      StarBASIC::FatalError (SbERR_WRONG_ARGS);
173                      Cancel();
174                      rReq.Ignore ();
175                      break;
176                  }
177                  else
178                  {
179                      SFX_REQUEST_ARG (rReq, pLayerName, SfxStringItem, ID_VAL_LAYERNAME, sal_False);
180                      SFX_REQUEST_ARG (rReq, pIsVisible, SfxBoolItem, ID_VAL_ISVISIBLE, sal_False);
181                      SFX_REQUEST_ARG (rReq, pIsLocked, SfxBoolItem, ID_VAL_ISLOCKED, sal_False);
182                      SFX_REQUEST_ARG (rReq, pIsPrintable, SfxBoolItem, ID_VAL_ISPRINTABLE, sal_False);
183 
184                      aLayerName   = pLayerName->GetValue ();
185                      bIsVisible   = pIsVisible->GetValue ();
186                      bIsLocked    = pIsLocked->GetValue ();
187                      bIsPrintable = pIsPrintable->GetValue ();
188                  }
189 
190             String aPrevLayer = mpDrawView->GetActiveLayer();
191             String aName;
192             SdrLayer* pLayer;
193             sal_uInt16 nPrevLayer = 0;
194             nLayerCnt = rLayerAdmin.GetLayerCount();
195 
196             for ( nLayer = 0; nLayer < nLayerCnt; nLayer++ )
197             {
198                 pLayer = rLayerAdmin.GetLayer(nLayer);
199                 aName = pLayer->GetName();
200 
201                 if ( aPrevLayer == aName )
202                 {
203 //                    nPrevLayer = nLayer;
204                     nPrevLayer = Max(nLayer, (sal_uInt16) 4);
205                 }
206             }
207 
208             mpDrawView->InsertNewLayer(aLayerName, nPrevLayer + 1);
209             pLayer = rLayerAdmin.GetLayer(aLayerName, sal_False);
210             if( pLayer )
211             {
212                 pLayer->SetTitle( aLayerTitle );
213                 pLayer->SetDescription( aLayerDesc );
214             }
215 
216             mpDrawView->SetLayerVisible( aLayerName, bIsVisible );
217             mpDrawView->SetLayerLocked( aLayerName, bIsLocked);
218             mpDrawView->SetLayerPrintable(aLayerName, bIsPrintable);
219 
220             mpDrawView->SetActiveLayer(aLayerName);
221 
222             ResetActualLayer();
223 
224             GetDoc()->SetChanged(sal_True);
225 
226             GetViewFrame()->GetDispatcher()->Execute(SID_SWITCHLAYER,
227                     SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
228 
229             Cancel();
230             rReq.Done ();
231         }
232         break;
233 
234         case SID_MODIFYLAYER:
235         {
236             if ( mpDrawView->IsTextEdit() )
237             {
238                 mpDrawView->SdrEndTextEdit();
239             }
240 
241             SdrLayerAdmin& rLayerAdmin = GetDoc()->GetLayerAdmin();
242             sal_uInt16 nCurPage = GetLayerTabControl()->GetCurPageId();
243             String aLayerName( GetLayerTabControl()->GetPageText(nCurPage) );
244             SdrLayer* pLayer = rLayerAdmin.GetLayer(aLayerName, sal_False);
245 
246             String aLayerTitle( pLayer->GetTitle() );
247             String aLayerDesc( pLayer->GetDescription() );
248 
249             String aOldLayerName( aLayerName );
250             String aOldLayerTitle( aLayerTitle );
251             String aOldLayerDesc( aLayerDesc );
252 
253             sal_Bool bIsVisible, bIsLocked, bIsPrintable;
254             sal_Bool bOldIsVisible = bIsVisible = mpDrawView->IsLayerVisible(aLayerName);
255             sal_Bool bOldIsLocked = bIsLocked = mpDrawView->IsLayerLocked(aLayerName);
256             sal_Bool bOldIsPrintable = bIsPrintable = mpDrawView->IsLayerPrintable(aLayerName);
257 
258 
259             const SfxItemSet* pArgs = rReq.GetArgs();
260             // darf der Layer geloescht werden ?
261             bool bDelete = true;
262 
263             String aLayoutLayer ( SdResId(STR_LAYER_LAYOUT) );
264             String aControlsLayer ( SdResId(STR_LAYER_CONTROLS) );
265             String aMeasureLinesLayer ( SdResId(STR_LAYER_MEASURELINES) );
266             String aBackgroundLayer( SdResId(STR_LAYER_BCKGRND) );
267             String aBackgroundObjLayer( SdResId(STR_LAYER_BCKGRNDOBJ) );
268 
269             if( aLayerName == aLayoutLayer       || aLayerName == aControlsLayer ||
270                 aLayerName == aMeasureLinesLayer ||
271                 aLayerName == aBackgroundLayer   || aLayerName == aBackgroundObjLayer )
272             {
273                 bDelete = false;
274             }
275 
276             if (! pArgs)
277             {
278                 SfxItemSet aNewAttr( GetDoc()->GetPool(), ATTR_LAYER_START, ATTR_LAYER_END );
279 
280                 aNewAttr.Put( SdAttrLayerName( aLayerName ) );
281                 aNewAttr.Put( SdAttrLayerTitle( aLayerTitle ) );
282                 aNewAttr.Put( SdAttrLayerDesc( aLayerDesc ) );
283                 aNewAttr.Put( SdAttrLayerVisible( bIsVisible ) );
284                 aNewAttr.Put( SdAttrLayerLocked( bIsLocked ) );
285                 aNewAttr.Put( SdAttrLayerPrintable( bIsPrintable ) );
286                 aNewAttr.Put( SdAttrLayerThisPage() );
287 
288                 SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
289                 AbstractSdInsertLayerDlg* pDlg = pFact ? pFact->CreateSdInsertLayerDlg(NULL, aNewAttr, bDelete, String( SdResId( STR_MODIFYLAYER ) ) ) : 0;
290                 if( pDlg )
291                 {
292                     pDlg->SetHelpId( SD_MOD()->GetSlotPool()->GetSlot( SID_MODIFYLAYER )->GetCommand() );
293 
294                     // Ueberpruefung auf schon vorhandene Namen
295                     sal_Bool    bLoop = sal_True;
296                     sal_uInt16  nRet = 0;
297                     while( bLoop && ( (nRet = pDlg->Execute()) == RET_OK ) )
298                     {
299                         pDlg->GetAttr( aNewAttr );
300                         aLayerName   = ((SdAttrLayerName &) aNewAttr.Get (ATTR_LAYER_NAME)).GetValue ();
301 
302                         if( (rLayerAdmin.GetLayer( aLayerName, sal_False ) &&
303                              aLayerName != aOldLayerName) || aLayerName.Len()==0 )
304                         {
305                             // Name ist schon vorhanden
306                             WarningBox aWarningBox (
307                                 GetParentWindow(),
308                                 WinBits( WB_OK ),
309                                 String( SdResId( STR_WARN_NAME_DUPLICATE)));
310                             aWarningBox.Execute();
311                         }
312                         else
313                             bLoop = sal_False;
314                     }
315                     switch (nRet)
316                     {
317                         case RET_OK :
318                             aLayerTitle  = ((SdAttrLayerTitle &) aNewAttr.Get (ATTR_LAYER_TITLE)).GetValue ();
319                             aLayerDesc   = ((SdAttrLayerDesc &) aNewAttr.Get (ATTR_LAYER_DESC)).GetValue ();
320                             bIsVisible   = ((const SdAttrLayerVisible &) aNewAttr.Get (ATTR_LAYER_VISIBLE)).GetValue ();
321                             bIsLocked    = ((const SdAttrLayerLocked &) aNewAttr.Get (ATTR_LAYER_LOCKED)).GetValue ();
322                             bIsPrintable = ((const SdAttrLayerLocked &) aNewAttr.Get (ATTR_LAYER_PRINTABLE)).GetValue ();
323 
324                             delete pDlg;
325                             break;
326 
327                         default :
328                             delete pDlg;
329                             rReq.Ignore ();
330                             Cancel ();
331                             return;
332                     }
333                 }
334             }
335             else if (pArgs->Count () == 4)
336             {
337                 SFX_REQUEST_ARG (rReq, pLayerName, SfxStringItem, ID_VAL_LAYERNAME, sal_False);
338                 SFX_REQUEST_ARG (rReq, pIsVisible, SfxBoolItem, ID_VAL_ISVISIBLE, sal_False);
339                 SFX_REQUEST_ARG (rReq, pIsLocked, SfxBoolItem, ID_VAL_ISLOCKED, sal_False);
340                 SFX_REQUEST_ARG (rReq, pIsPrintable, SfxBoolItem, ID_VAL_ISPRINTABLE, sal_False);
341 
342                 aLayerName   = pLayerName->GetValue ();
343                 bIsVisible   = pIsVisible->GetValue ();
344                 bIsLocked    = pIsLocked->GetValue ();
345                 bIsPrintable = pIsPrintable->GetValue ();
346             }
347             else
348             {
349                 StarBASIC::FatalError (SbERR_WRONG_ARGS);
350                 Cancel ();
351                 rReq.Ignore ();
352                 break;
353             }
354 
355             ::svl::IUndoManager* pManager = GetDoc()->GetDocSh()->GetUndoManager();
356             SdLayerModifyUndoAction* pAction = new SdLayerModifyUndoAction(
357                 GetDoc(),
358                 pLayer,
359                 // old values
360                 aOldLayerName,
361                 aOldLayerTitle,
362                 aOldLayerDesc,
363                 bOldIsVisible,
364                 bOldIsLocked,
365                 bOldIsPrintable,
366                 // new values
367                 aLayerName,
368                 aLayerTitle,
369                 aLayerDesc,
370                 bIsVisible,
371                 bIsLocked,
372                 bIsPrintable
373                 );
374             pManager->AddUndoAction( pAction );
375 
376             ModifyLayer( pLayer, aLayerName, aLayerTitle, aLayerDesc, bIsVisible, bIsLocked, bIsPrintable );
377 
378             Cancel();
379             rReq.Done ();
380         }
381         break;
382 
383         case SID_RENAMELAYER:
384         {
385             if ( mpDrawView->IsTextEdit() )
386             {
387                 mpDrawView->SdrEndTextEdit();
388             }
389 
390             GetLayerTabControl()->StartEditMode(
391                 GetLayerTabControl()->GetCurPageId() );
392 
393             Cancel();
394             rReq.Ignore ();
395         }
396         break;
397 
398         case SID_EDIT_HYPERLINK :
399         {
400             GetViewFrame()->GetDispatcher()->Execute( SID_HYPERLINK_DIALOG );
401 
402             Cancel();
403             rReq.Done ();
404         }
405         break;
406 
407         case SID_OPEN_HYPERLINK:
408         {
409             OutlinerView* pOutView = mpDrawView->GetTextEditOutlinerView();
410             if ( pOutView )
411             {
412                 const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
413                 if ( pFieldItem )
414                 {
415                     const SvxFieldData* pField = pFieldItem->GetField();
416                     if( pField && pField->ISA( SvxURLField ) )
417                     {
418                         const SvxURLField* pURLField = static_cast< const SvxURLField* >( pField );
419 
420                         SfxStringItem aUrl( SID_FILE_NAME, pURLField->GetURL() );
421                         SfxStringItem aTarget( SID_TARGETNAME, pURLField->GetTargetFrame() );
422 
423                         String aReferName;
424                         SfxViewFrame* pFrame = GetViewFrame();
425                         SfxMedium* pMed = pFrame->GetObjectShell()->GetMedium();
426                         if (pMed)
427                             aReferName = pMed->GetName();
428 
429                         SfxFrameItem aFrm( SID_DOCFRAME, pFrame );
430                         SfxStringItem aReferer( SID_REFERER, aReferName );
431 
432                         SfxBoolItem aNewView( SID_OPEN_NEW_VIEW, sal_False );
433                         SfxBoolItem aBrowsing( SID_BROWSE, sal_True );
434 
435                         SfxViewFrame* pViewFrm = SfxViewFrame::Current();
436                         if (pViewFrm)
437                             pViewFrm->GetDispatcher()->Execute( SID_OPENDOC,
438                                                         SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD,
439                                                         &aUrl, &aTarget,
440                                                         &aFrm, &aReferer,
441                                                         &aNewView, &aBrowsing,
442                                                         0L );
443                     }
444                 }
445             }
446             Cancel();
447             rReq.Done ();
448         }
449         break;
450 
451         case SID_HYPERLINK_SETLINK:
452         {
453             const SfxItemSet* pReqArgs = rReq.GetArgs();
454 
455             if (pReqArgs)
456             {
457                 SvxHyperlinkItem* pHLItem =
458                 (SvxHyperlinkItem*) &pReqArgs->Get(SID_HYPERLINK_SETLINK);
459 
460                 if (pHLItem->GetInsertMode() == HLINK_FIELD)
461                 {
462                     InsertURLField(pHLItem->GetURL(), pHLItem->GetName(),
463                                    pHLItem->GetTargetFrame(), NULL);
464                 }
465                 else if (pHLItem->GetInsertMode() == HLINK_BUTTON)
466                 {
467                     InsertURLButton(pHLItem->GetURL(), pHLItem->GetName(),
468                                     pHLItem->GetTargetFrame(), NULL);
469                 }
470                 else if (pHLItem->GetInsertMode() == HLINK_DEFAULT)
471                 {
472                     OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
473 
474                     if (pOlView)
475                     {
476                         InsertURLField(pHLItem->GetURL(), pHLItem->GetName(),
477                                        pHLItem->GetTargetFrame(), NULL);
478                     }
479                     else
480                     {
481                         InsertURLButton(pHLItem->GetURL(), pHLItem->GetName(),
482                                         pHLItem->GetTargetFrame(), NULL);
483                     }
484                 }
485             }
486 
487             Cancel();
488             rReq.Ignore ();
489         }
490         break;
491 
492         case SID_INSERT_FLD_DATE_FIX:
493         case SID_INSERT_FLD_DATE_VAR:
494         case SID_INSERT_FLD_TIME_FIX:
495         case SID_INSERT_FLD_TIME_VAR:
496         case SID_INSERT_FLD_AUTHOR:
497         case SID_INSERT_FLD_PAGE:
498         case SID_INSERT_FLD_PAGES:
499         case SID_INSERT_FLD_FILE:
500         {
501             sal_uInt16 nMul = 1;
502             SvxFieldItem* pFieldItem = 0;
503 
504             switch( nSId )
505             {
506                 case SID_INSERT_FLD_DATE_FIX:
507                     pFieldItem = new SvxFieldItem(
508                         SvxDateField( Date(), SVXDATETYPE_FIX ), EE_FEATURE_FIELD );
509                 break;
510 
511                 case SID_INSERT_FLD_DATE_VAR:
512                     pFieldItem = new SvxFieldItem( SvxDateField(), EE_FEATURE_FIELD );
513                 break;
514 
515                 case SID_INSERT_FLD_TIME_FIX:
516                     pFieldItem = new SvxFieldItem(
517                         SvxExtTimeField( Time(), SVXTIMETYPE_FIX ), EE_FEATURE_FIELD );
518                 break;
519 
520                 case SID_INSERT_FLD_TIME_VAR:
521                     pFieldItem = new SvxFieldItem( SvxExtTimeField(), EE_FEATURE_FIELD );
522                 break;
523 
524                 case SID_INSERT_FLD_AUTHOR:
525                 {
526                     SvtUserOptions aUserOptions;
527                     pFieldItem = new SvxFieldItem(
528                             SvxAuthorField(
529                                 aUserOptions.GetFirstName(), aUserOptions.GetLastName(), aUserOptions.GetID() ), EE_FEATURE_FIELD );
530                 }
531                 break;
532 
533                 case SID_INSERT_FLD_PAGE:
534                 {
535                     pFieldItem = new SvxFieldItem( SvxPageField(), EE_FEATURE_FIELD );
536                     nMul = 3;
537                 }
538                 break;
539 
540                 case SID_INSERT_FLD_PAGES:
541                 {
542                     pFieldItem = new SvxFieldItem( SvxPagesField(), EE_FEATURE_FIELD );
543                     nMul = 3;
544                 }
545                 break;
546 
547                 case SID_INSERT_FLD_FILE:
548                 {
549                     String aName;
550                     if( GetDocSh()->HasName() )
551                         aName = GetDocSh()->GetMedium()->GetName();
552                     //else
553                     //  aName = GetDocSh()->GetName();
554                     pFieldItem = new SvxFieldItem( SvxExtFileField( aName ), EE_FEATURE_FIELD );
555                 }
556                 break;
557             }
558 
559             OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
560 
561             if( pOLV )
562             {
563                 const SvxFieldItem* pOldFldItem = pOLV->GetFieldAtSelection();
564 
565                 if( pOldFldItem && ( pOldFldItem->GetField()->ISA( SvxURLField ) ||
566                                     pOldFldItem->GetField()->ISA( SvxDateField ) ||
567                                     pOldFldItem->GetField()->ISA( SvxTimeField ) ||
568                                     pOldFldItem->GetField()->ISA( SvxExtTimeField ) ||
569                                     pOldFldItem->GetField()->ISA( SvxExtFileField ) ||
570                                     pOldFldItem->GetField()->ISA( SvxAuthorField ) ||
571                                     pOldFldItem->GetField()->ISA( SvxPageField ) ) )
572                 {
573                     // Feld selektieren, so dass es beim Insert geloescht wird
574                     ESelection aSel = pOLV->GetSelection();
575                     if( aSel.nStartPos == aSel.nEndPos )
576                         aSel.nEndPos++;
577                     pOLV->SetSelection( aSel );
578                 }
579 
580                 if( pFieldItem )
581                     pOLV->InsertField( *pFieldItem );
582             }
583             else
584             {
585                 Outliner* pOutl = GetDoc()->GetInternalOutliner();
586                 pOutl->Init( OUTLINERMODE_TEXTOBJECT );
587                 sal_uInt16 nOutlMode = pOutl->GetMode();
588                 pOutl->SetStyleSheet( 0, NULL );
589                 pOutl->QuickInsertField( *pFieldItem, ESelection() );
590                 OutlinerParaObject* pOutlParaObject = pOutl->CreateParaObject();
591 
592                 SdrRectObj* pRectObj = new SdrRectObj( OBJ_TEXT );
593                 pRectObj->SetMergedItem(SdrTextAutoGrowWidthItem(sal_True));
594 
595                 pOutl->UpdateFields();
596                 pOutl->SetUpdateMode( sal_True );
597                 Size aSize( pOutl->CalcTextSize() );
598                 aSize.Width() *= nMul;
599                 pOutl->SetUpdateMode( sal_False );
600 
601                 Point aPos;
602                 Rectangle aRect( aPos, GetActiveWindow()->GetOutputSizePixel() );
603                 aPos = aRect.Center();
604                 aPos = GetActiveWindow()->PixelToLogic(aPos);
605                 aPos.X() -= aSize.Width() / 2;
606                 aPos.Y() -= aSize.Height() / 2;
607 
608                 Rectangle aLogicRect(aPos, aSize);
609                 pRectObj->SetLogicRect(aLogicRect);
610                 pRectObj->SetOutlinerParaObject( pOutlParaObject );
611                 mpDrawView->InsertObjectAtView(pRectObj, *mpDrawView->GetSdrPageView());
612                 pOutl->Init( nOutlMode );
613             }
614 
615             delete pFieldItem;
616 
617             Cancel();
618             rReq.Ignore ();
619         }
620         break;
621 
622         case SID_MODIFY_FIELD:
623         {
624             OutlinerView* pOLV = mpDrawView->GetTextEditOutlinerView();
625 
626             if( pOLV )
627             {
628                 const SvxFieldItem* pFldItem = pOLV->GetFieldAtSelection();
629 
630                 if( pFldItem && (pFldItem->GetField()->ISA( SvxDateField ) ||
631                                  pFldItem->GetField()->ISA( SvxAuthorField ) ||
632                                  pFldItem->GetField()->ISA( SvxExtFileField ) ||
633                                  pFldItem->GetField()->ISA( SvxExtTimeField ) ) )
634                 {
635                     // Dialog...
636                     SdAbstractDialogFactory* pFact = SdAbstractDialogFactory::Create();
637                     AbstractSdModifyFieldDlg* pDlg = pFact ? pFact->CreateSdModifyFieldDlg(GetActiveWindow(), pFldItem->GetField(), pOLV->GetAttribs() ) : 0;
638                     if( pDlg && pDlg->Execute() == RET_OK )
639                     {
640                         // #108538#
641                         // To make a correct SetAttribs() call at the utlinerView
642                         // it is necessary to split the actions here
643                         SvxFieldData* pField = pDlg->GetField();
644                         ESelection aSel = pOLV->GetSelection();
645                         sal_Bool bSelectionWasModified(sal_False);
646 
647                         if( pField )
648                         {
649                             SvxFieldItem aFieldItem( *pField, EE_FEATURE_FIELD );
650 
651                             if( aSel.nStartPos == aSel.nEndPos )
652                             {
653                                 bSelectionWasModified = sal_True;
654                                 aSel.nEndPos++;
655                                 pOLV->SetSelection( aSel );
656                             }
657 
658                             pOLV->InsertField( aFieldItem );
659 
660                             // #108538# select again for eventual SetAttribs call
661                             pOLV->SetSelection( aSel );
662                         }
663 
664                         SfxItemSet aSet( pDlg->GetItemSet() );
665 
666                         if( aSet.Count() )
667                         {
668                             pOLV->SetAttribs( aSet );
669 
670                             ::Outliner* pOutliner = pOLV->GetOutliner();
671                             if( pOutliner )
672                                 pOutliner->UpdateFields();
673                         }
674 
675                         if(pField)
676                         {
677                             // #108538# restore selection to original
678                             if(bSelectionWasModified)
679                             {
680                                 aSel.nEndPos--;
681                                 pOLV->SetSelection( aSel );
682                             }
683 
684                             delete pField;
685                         }
686                     }
687                     delete pDlg;
688                 }
689             }
690 
691             Cancel();
692             rReq.Ignore ();
693         }
694         break;
695 
696         case SID_OPEN_XML_FILTERSETTINGS:
697         {
698             try
699             {
700                 com::sun::star::uno::Reference < ::com::sun::star::ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), com::sun::star::uno::UNO_QUERY);
701                 if( xDialog.is() )
702                 {
703                     xDialog->execute();
704                 }
705             }
706             catch( ::com::sun::star::uno::RuntimeException& )
707             {
708             }
709 
710             Cancel();
711             rReq.Ignore ();
712         }
713         break;
714 
715         default:
716         {
717             // switch Anweisung wegen CLOOKS aufgeteilt. Alle case-Anweisungen die
718             // eine Fu???? -Funktion aufrufen, sind in die Methode FuTemp03 (drviewsb)
719             // gewandert.
720             FuTemp03(rReq);
721         }
722         break;
723     };
724 };
725 
RenameSlide(sal_uInt16 nPageId,const String & rName)726 bool DrawViewShell::RenameSlide( sal_uInt16 nPageId, const String & rName  )
727 {
728     sal_Bool   bOutDummy;
729     if( GetDoc()->GetPageByName( rName, bOutDummy ) != SDRPAGE_NOTFOUND )
730         return false;
731 
732     SdPage* pPageToRename = NULL;
733     PageKind ePageKind = GetPageKind();
734 
735     if( GetEditMode() == EM_PAGE )
736     {
737         pPageToRename = GetDoc()->GetSdPage( nPageId - 1, ePageKind );
738 
739         // Undo
740         SdPage* pUndoPage = pPageToRename;
741         SdrLayerAdmin &  rLayerAdmin = GetDoc()->GetLayerAdmin();
742         sal_uInt8 nBackground = rLayerAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRND )), sal_False );
743         sal_uInt8 nBgObj = rLayerAdmin.GetLayerID( String( SdResId( STR_LAYER_BCKGRNDOBJ )), sal_False );
744         SetOfByte aVisibleLayers = mpActualPage->TRG_GetMasterPageVisibleLayers();
745 
746         // (#67720#)
747         ::svl::IUndoManager* pManager = GetDoc()->GetDocSh()->GetUndoManager();
748         ModifyPageUndoAction* pAction = new ModifyPageUndoAction(
749             GetDoc(), pUndoPage, rName, pUndoPage->GetAutoLayout(),
750             aVisibleLayers.IsSet( nBackground ),
751             aVisibleLayers.IsSet( nBgObj ));
752         pManager->AddUndoAction( pAction );
753 
754         // rename
755         pPageToRename->SetName( rName );
756 
757         if( ePageKind == PK_STANDARD )
758         {
759             // also rename notes-page
760             SdPage* pNotesPage = GetDoc()->GetSdPage( nPageId - 1, PK_NOTES );
761             pNotesPage->SetName( rName );
762         }
763     }
764     else
765     {
766         // rename MasterPage -> rename LayoutTemplate
767         pPageToRename = GetDoc()->GetMasterSdPage( nPageId - 1, ePageKind );
768         GetDoc()->RenameLayoutTemplate( pPageToRename->GetLayoutName(), rName );
769     }
770 
771     bool bSuccess = ( sal_False != rName.Equals( pPageToRename->GetName()));
772 
773     if( bSuccess )
774     {
775         // user edited page names may be changed by the page so update control
776         maTabControl.SetPageText( nPageId, rName );
777 
778         // set document to modified state
779         GetDoc()->SetChanged( sal_True );
780 
781         // inform navigator about change
782         SfxBoolItem aItem( SID_NAVIGATOR_INIT, sal_True );
783         GetViewFrame()->GetDispatcher()->Execute(
784             SID_NAVIGATOR_INIT, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aItem, 0L );
785 
786         // Tell the slide sorter about the name change (necessary for
787         // accessibility.)
788         slidesorter::SlideSorterViewShell* pSlideSorterViewShell
789             = slidesorter::SlideSorterViewShell::GetSlideSorter(GetViewShellBase());
790         if (pSlideSorterViewShell != NULL)
791         {
792             pSlideSorterViewShell->GetSlideSorter().GetController().PageNameHasChanged(
793                 nPageId-1, rName);
794         }
795     }
796 
797     return bSuccess;
798 }
799 
800 
801 
802 
IMPL_LINK(DrawViewShell,RenameSlideHdl,AbstractSvxNameDialog *,pDialog)803 IMPL_LINK( DrawViewShell, RenameSlideHdl, AbstractSvxNameDialog*, pDialog )
804 {
805     if( ! pDialog )
806         return 0;
807 
808     String aNewName;
809     pDialog->GetName( aNewName );
810 
811     SdPage* pCurrentPage = GetDoc()->GetSdPage( maTabControl.GetCurPageId() - 1, GetPageKind() );
812 
813     return pCurrentPage && ( aNewName.Equals( pCurrentPage->GetName() ) || GetDocSh()->IsNewPageNameValid( aNewName ) );
814 }
815 
816 
817 
818 
ModifyLayer(SdrLayer * pLayer,const String & rLayerName,const String & rLayerTitle,const String & rLayerDesc,bool bIsVisible,bool bIsLocked,bool bIsPrintable)819 void DrawViewShell::ModifyLayer (
820     SdrLayer* pLayer,
821     const String& rLayerName,
822     const String& rLayerTitle,
823     const String& rLayerDesc,
824     bool bIsVisible,
825     bool bIsLocked,
826     bool bIsPrintable)
827 {
828     if( pLayer )
829     {
830         const sal_uInt16 nPageCount = GetLayerTabControl()->GetPageCount();
831         sal_uInt16 nCurPage = 0;
832         sal_uInt16 nPos;
833         for( nPos = 0; nPos < nPageCount; nPos++ )
834         {
835             sal_uInt16 nId = GetLayerTabControl()->GetPageId( nPos );
836             if( pLayer->GetName() == GetLayerTabControl()->GetPageText( nId ) )
837             {
838                 nCurPage = nId;
839                 break;
840             }
841         }
842 
843         pLayer->SetName( rLayerName );
844         pLayer->SetTitle( rLayerTitle );
845         pLayer->SetDescription( rLayerDesc );
846         mpDrawView->SetLayerVisible( rLayerName, bIsVisible );
847         mpDrawView->SetLayerLocked( rLayerName, bIsLocked);
848         mpDrawView->SetLayerPrintable(rLayerName, bIsPrintable);
849 
850         GetDoc()->SetChanged(sal_True);
851 
852         GetLayerTabControl()->SetPageText(nCurPage, rLayerName);
853 
854         TabBarPageBits nBits = 0;
855 
856         if (!bIsVisible)
857         {
858             // Unsichtbare Layer werden anders dargestellt
859             nBits = TPB_SPECIAL;
860         }
861 
862         GetLayerTabControl()->SetPageBits(nCurPage, nBits);
863 
864         GetViewFrame()->GetDispatcher()->Execute(
865             SID_SWITCHLAYER,
866             SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD);
867 
868         // Call Invalidate at the form shell.
869         FmFormShell* pFormShell = GetViewShellBase().GetFormShellManager()->GetFormShell();
870         if (pFormShell != NULL)
871             pFormShell->Invalidate();
872     }
873 }
874 
875 } // end of namespace sd
876