xref: /AOO41X/main/sw/source/ui/shells/drawsh.cxx (revision fe617e93560c0575040cf13b538ba840fa9e2479)
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_sw.hxx"
26 
27 
28 #include <tools/shl.hxx>
29 #include <svx/svdview.hxx>
30 #include <svx/svdotext.hxx>
31 #include <svl/whiter.hxx>
32 #include <svx/fontwork.hxx>
33 #include <sfx2/request.hxx>
34 #include <sfx2/bindings.hxx>
35 #include <sfx2/objface.hxx>
36 #include <svl/itemiter.hxx>
37 #include <svl/srchitem.hxx>
38 #include <svx/xftsfit.hxx>
39 #include <svx/extrusionbar.hxx>
40 #include <svx/fontworkbar.hxx>
41 #include <svx/tbxcustomshapes.hxx>
42 #include <uitool.hxx>
43 #include <wview.hxx>
44 #include <swmodule.hxx>
45 #include <swwait.hxx>
46 #include <docstat.hxx>
47 #include <IDocumentStatistics.hxx>
48 
49 #include <comphelper/processfactory.hxx>
50 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
51 
52 #include <svx/xtable.hxx>
53 #include <sfx2/sidebar/EnumContext.hxx>
54 
55 #include "swundo.hxx"
56 #include "wrtsh.hxx"
57 #include "cmdid.h"
58 #include "globals.hrc"
59 #include "helpid.h"
60 #include "popup.hrc"
61 #include "shells.hrc"
62 #include "drwbassh.hxx"
63 #include "drawsh.hxx"
64 
65 #define SwDrawShell
66 #include <sfx2/msg.hxx>
67 #include "swslots.hxx"
68 #include "swabstdlg.hxx" //CHINA001
69 #include "misc.hrc"
70 
71 using namespace ::com::sun::star;
72 using namespace ::com::sun::star::uno;
73 
74 SFX_IMPL_INTERFACE(SwDrawShell, SwDrawBaseShell, SW_RES(STR_SHELLNAME_DRAW))
75 {
76     SFX_POPUPMENU_REGISTRATION(SW_RES(MN_DRAW_POPUPMENU));
77     SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_DRAW_TOOLBOX));
78     SFX_CHILDWINDOW_REGISTRATION(SvxFontWorkChildWindow::GetChildWindowId());
79 }
80 
81 TYPEINIT1(SwDrawShell,SwDrawBaseShell)
82 
83 /*--------------------------------------------------------------------
84     Beschreibung:
85  --------------------------------------------------------------------*/
86 
87 
88 void SwDrawShell::Execute(SfxRequest &rReq)
89 {
90     SwWrtShell          &rSh = GetShell();
91     SdrView             *pSdrView = rSh.GetDrawView();
92     const SfxItemSet    *pArgs = rReq.GetArgs();
93     SfxBindings         &rBnd  = GetView().GetViewFrame()->GetBindings();
94     sal_uInt16               nSlotId = rReq.GetSlot();
95     sal_Bool                 bChanged = pSdrView->GetModel()->IsChanged();
96 
97     pSdrView->GetModel()->SetChanged(sal_False);
98 
99     const SfxPoolItem* pItem;
100     if(pArgs)
101         pArgs->GetItemState(nSlotId, sal_False, &pItem);
102 
103     sal_Bool bMirror = sal_True;
104 
105     switch (nSlotId)
106     {
107         case SID_OBJECT_ROTATE:
108             if (rSh.IsObjSelected() && pSdrView->IsRotateAllowed())
109             {
110                 if (GetView().IsDrawRotate())
111                     rSh.SetDragMode(SDRDRAG_MOVE);
112                 else
113                     rSh.SetDragMode(SDRDRAG_ROTATE);
114 
115                 GetView().FlipDrawRotate();
116             }
117             break;
118 
119         case SID_BEZIER_EDIT:
120             if (GetView().IsDrawRotate())
121             {
122                 rSh.SetDragMode(SDRDRAG_MOVE);
123                 GetView().FlipDrawRotate();
124             }
125             GetView().FlipDrawSelMode();
126             pSdrView->SetFrameDragSingles(GetView().IsDrawSelMode());
127             GetView().AttrChangedNotify(&rSh); // Shellwechsel...
128             break;
129 
130         case SID_OBJECT_HELL:
131             if (rSh.IsObjSelected())
132             {
133                 rSh.StartUndo( UNDO_START );
134                 SetWrapMode(FN_FRAME_WRAPTHRU_TRANSP);
135                 rSh.SelectionToHell();
136                 rSh.EndUndo( UNDO_END );
137                 rBnd.Invalidate(SID_OBJECT_HEAVEN);
138             }
139             break;
140 
141         case SID_OBJECT_HEAVEN:
142             if (rSh.IsObjSelected())
143             {
144                 rSh.StartUndo( UNDO_START );
145                 SetWrapMode(FN_FRAME_WRAPTHRU);
146                 rSh.SelectionToHeaven();
147                 rSh.EndUndo( UNDO_END );
148                 rBnd.Invalidate(SID_OBJECT_HELL);
149             }
150             break;
151 
152         case FN_TOOL_HIERARCHIE:
153             if (rSh.IsObjSelected())
154             {
155                 rSh.StartUndo( UNDO_START );
156                 if (rSh.GetLayerId() == 0)
157                 {
158                     SetWrapMode(FN_FRAME_WRAPTHRU);
159                     rSh.SelectionToHeaven();
160                 }
161                 else
162                 {
163                     SetWrapMode(FN_FRAME_WRAPTHRU_TRANSP);
164                     rSh.SelectionToHell();
165                 }
166                 rSh.EndUndo( UNDO_END );
167                 rBnd.Invalidate( SID_OBJECT_HELL );
168                 rBnd.Invalidate( SID_OBJECT_HEAVEN );
169             }
170             break;
171 
172         case FN_FLIP_HORZ_GRAFIC:
173         case SID_FLIP_HORIZONTAL:
174             bMirror = sal_False;
175             /* no break */
176         case FN_FLIP_VERT_GRAFIC:
177         case SID_FLIP_VERTICAL:
178             rSh.MirrorSelection( bMirror );
179             break;
180 
181         case SID_FONTWORK:
182         {
183             FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, &rSh.GetView()));
184             SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) );
185             SfxViewFrame* pVFrame = GetView().GetViewFrame();
186             if (pArgs)
187             {
188                 pVFrame->SetChildWindow(SvxFontWorkChildWindow::GetChildWindowId(),
189                     ((const SfxBoolItem&)(pArgs->Get(SID_FONTWORK))).GetValue());
190             }
191             else
192                 pVFrame->ToggleChildWindow( SvxFontWorkChildWindow::GetChildWindowId() );
193             pVFrame->GetBindings().Invalidate(SID_FONTWORK);
194         }
195         break;
196         case FN_FORMAT_FOOTNOTE_DLG:
197         {
198             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
199             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
200 
201             VclAbstractDialog* pDlg = pFact->CreateSwFootNoteOptionDlg( GetView().GetWindow(), GetView().GetWrtShell(), DLG_DOC_FOOTNOTE );
202             DBG_ASSERT(pDlg, "Dialogdiet fail!");
203             pDlg->Execute();
204             delete pDlg;
205             break;
206         }
207         case FN_NUMBERING_OUTLINE_DLG:
208         {
209             SfxItemSet aTmp(GetPool(), FN_PARAM_1, FN_PARAM_1);
210             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
211             DBG_ASSERT(pFact, "Dialogdiet fail!");
212             SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_TAB_OUTLINE,
213                                                         GetView().GetWindow(), &aTmp, GetView().GetWrtShell());
214             DBG_ASSERT(pDlg, "Dialogdiet fail!");
215             pDlg->Execute();
216             delete pDlg;
217             rReq.Done();
218         }
219         break;
220         case SID_OPEN_XML_FILTERSETTINGS:
221         {
222             try
223             {
224                 uno::Reference < ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), uno::UNO_QUERY);
225                 if( xDialog.is() )
226                 {
227                     xDialog->execute();
228                 }
229             }
230             catch( uno::Exception& )
231             {
232             }
233             rReq.Ignore ();
234         }
235         break;
236         case FN_WORDCOUNT_DIALOG:
237         {
238             SwDocStat aCurr;
239             SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() );
240             {
241                 SwWait aWait( *GetView().GetDocShell(), sal_True );
242                 rSh.StartAction();
243                 rSh.CountWords( aCurr );
244                 rSh.UpdateDocStat( aDocStat );
245                 rSh.EndAction();
246             }
247 
248             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
249             DBG_ASSERT(pFact, "Dialogdiet fail!");
250             AbstractSwWordCountDialog* pDialog = pFact->CreateSwWordCountDialog( GetView().GetWindow() );
251             pDialog->SetValues(aCurr, aDocStat );
252             pDialog->Execute();
253             delete pDialog;
254         }
255         break;
256         case SID_EXTRUSION_TOOGLE:
257         case SID_EXTRUSION_TILT_DOWN:
258         case SID_EXTRUSION_TILT_UP:
259         case SID_EXTRUSION_TILT_LEFT:
260         case SID_EXTRUSION_TILT_RIGHT:
261         case SID_EXTRUSION_3D_COLOR:
262         case SID_EXTRUSION_DEPTH:
263         case SID_EXTRUSION_DIRECTION:
264         case SID_EXTRUSION_PROJECTION:
265         case SID_EXTRUSION_LIGHTING_DIRECTION:
266         case SID_EXTRUSION_LIGHTING_INTENSITY:
267         case SID_EXTRUSION_SURFACE:
268         case SID_EXTRUSION_DEPTH_FLOATER:
269         case SID_EXTRUSION_DIRECTION_FLOATER:
270         case SID_EXTRUSION_LIGHTING_FLOATER:
271         case SID_EXTRUSION_SURFACE_FLOATER:
272         case SID_EXTRUSION_DEPTH_DIALOG:
273             svx::ExtrusionBar::execute( pSdrView, rReq, rBnd );
274             rReq.Ignore ();
275             break;
276 
277         case SID_FONTWORK_SHAPE:
278         case SID_FONTWORK_SHAPE_TYPE:
279         case SID_FONTWORK_ALIGNMENT:
280         case SID_FONTWORK_SAME_LETTER_HEIGHTS:
281         case SID_FONTWORK_CHARACTER_SPACING:
282         case SID_FONTWORK_KERN_CHARACTER_PAIRS:
283         case SID_FONTWORK_CHARACTER_SPACING_FLOATER:
284         case SID_FONTWORK_ALIGNMENT_FLOATER:
285         case SID_FONTWORK_CHARACTER_SPACING_DIALOG:
286             svx::FontworkBar::execute( pSdrView, rReq, rBnd );
287             rReq.Ignore ();
288             break;
289 
290         default:
291             DBG_ASSERT(!this, "falscher Dispatcher");
292             return;
293     }
294     if (pSdrView->GetModel()->IsChanged())
295         rSh.SetModified();
296     else if (bChanged)
297         pSdrView->GetModel()->SetChanged(sal_True);
298 }
299 
300 /*--------------------------------------------------------------------
301     Beschreibung:
302  --------------------------------------------------------------------*/
303 
304 
305 
306 void SwDrawShell::GetState(SfxItemSet& rSet)
307 {
308     SwWrtShell &rSh = GetShell();
309     SdrView* pSdrView = rSh.GetDrawViewWithValidMarkList();
310     SfxWhichIter aIter( rSet );
311     sal_uInt16 nWhich = aIter.FirstWhich();
312     sal_Bool bProtected = rSh.IsSelObjProtected(FLYPROTECT_CONTENT);
313 
314     if (!bProtected)    // Im Parent nachsehen
315         bProtected |= rSh.IsSelObjProtected( FLYPROTECT_CONTENT|FLYPROTECT_PARENT ) != 0;
316 
317     while( nWhich )
318     {
319         switch( nWhich )
320         {
321             case SID_OBJECT_HELL:
322                 if ( !rSh.IsObjSelected() || rSh.GetLayerId() == 0 || bProtected )
323                     rSet.DisableItem( nWhich );
324                 break;
325 
326             case SID_OBJECT_HEAVEN:
327                 if ( !rSh.IsObjSelected() || rSh.GetLayerId() == 1 || bProtected )
328                     rSet.DisableItem( nWhich );
329                 break;
330 
331             case FN_TOOL_HIERARCHIE:
332                 if ( !rSh.IsObjSelected() || bProtected )
333                     rSet.DisableItem( nWhich );
334                 break;
335 
336             case SID_OBJECT_ROTATE:
337             {
338                 const sal_Bool bIsRotate = GetView().IsDrawRotate();
339                 if ( (!bIsRotate && !pSdrView->IsRotateAllowed()) || bProtected )
340                     rSet.DisableItem( nWhich );
341                 else
342                     rSet.Put( SfxBoolItem( nWhich, bIsRotate ) );
343             }
344             break;
345 
346             case SID_BEZIER_EDIT:
347                 if (!Disable(rSet, nWhich))
348                     rSet.Put( SfxBoolItem( nWhich, !GetView().IsDrawSelMode()));
349             break;
350 
351             case FN_FLIP_HORZ_GRAFIC:
352             case SID_FLIP_HORIZONTAL:
353                 if ( !pSdrView->IsMirrorAllowed() || bProtected )
354                     rSet.DisableItem( nWhich );
355                 break;
356 
357             case FN_FLIP_VERT_GRAFIC:
358             case SID_FLIP_VERTICAL:
359                 if ( !pSdrView->IsMirrorAllowed() || bProtected )
360                     rSet.DisableItem( nWhich );
361                 break;
362 
363             case SID_FONTWORK:
364             {
365                 if (bProtected)
366                     rSet.DisableItem( nWhich );
367                 else
368                 {
369                     const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId();
370                     rSet.Put(SfxBoolItem( nWhich , GetView().GetViewFrame()->HasChildWindow(nId)));
371                 }
372             }
373             break;
374         }
375         nWhich = aIter.NextWhich();
376     }
377     svx::ExtrusionBar::getState( pSdrView, rSet );
378     svx::FontworkBar::getState( pSdrView, rSet );
379 }
380 
381 /*--------------------------------------------------------------------
382     Beschreibung:
383  --------------------------------------------------------------------*/
384 
385 
386 
387 SwDrawShell::SwDrawShell(SwView &_rView) :
388     SwDrawBaseShell(_rView)
389 {
390     SetHelpId(SW_DRAWSHELL);
391     SetName(String::CreateFromAscii("Draw"));
392 
393     SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Draw));
394 }
395 
396 /*************************************************************************
397 |*
398 |* SfxRequests fuer FontWork bearbeiten
399 |*
400 \************************************************************************/
401 
402 
403 
404 void SwDrawShell::ExecFormText(SfxRequest& rReq)
405 {
406     SwWrtShell &rSh = GetShell();
407     SdrView*    pDrView = rSh.GetDrawView();
408     sal_Bool        bChanged = pDrView->GetModel()->IsChanged();
409     pDrView->GetModel()->SetChanged(sal_False);
410 
411     const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
412 
413     if ( rMarkList.GetMarkCount() == 1 && rReq.GetArgs() )
414     {
415         const SfxItemSet& rSet = *rReq.GetArgs();
416         const SfxPoolItem* pItem;
417 
418         if ( pDrView->IsTextEdit() )
419         {
420             pDrView->SdrEndTextEdit( sal_True );
421             GetView().AttrChangedNotify(&rSh);
422         }
423 
424         if ( rSet.GetItemState(XATTR_FORMTXTSTDFORM, sal_True, &pItem) ==
425              SFX_ITEM_SET &&
426             ((const XFormTextStdFormItem*) pItem)->GetValue() != XFTFORM_NONE )
427         {
428 
429             const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId();
430 
431             SvxFontWorkDialog* pDlg = (SvxFontWorkDialog*)(GetView().GetViewFrame()->
432                                         GetChildWindow(nId)->GetWindow());
433 
434             pDlg->CreateStdFormObj(*pDrView, *pDrView->GetSdrPageView(),
435                                     rSet, *rMarkList.GetMark(0)->GetMarkedSdrObj(),
436                                    ((const XFormTextStdFormItem*) pItem)->
437                                    GetValue());
438 
439         }
440         else
441             pDrView->SetAttributes(rSet);
442     }
443     if (pDrView->GetModel()->IsChanged())
444         rSh.SetModified();
445     else
446         if (bChanged)
447             pDrView->GetModel()->SetChanged(sal_True);
448 }
449 
450 /*************************************************************************
451 |*
452 |* Statuswerte fuer FontWork zurueckgeben
453 |*
454 \************************************************************************/
455 
456 
457 
458 void SwDrawShell::GetFormTextState(SfxItemSet& rSet)
459 {
460     SwWrtShell &rSh = GetShell();
461     SdrView* pDrView = rSh.GetDrawView();
462     const SdrMarkList& rMarkList = pDrView->GetMarkedObjectList();
463     const SdrObject* pObj = NULL;
464     SvxFontWorkDialog* pDlg = NULL;
465 
466     const sal_uInt16 nId = SvxFontWorkChildWindow::GetChildWindowId();
467 
468     SfxViewFrame* pVFrame = GetView().GetViewFrame();
469     if ( pVFrame->HasChildWindow(nId) )
470         pDlg = (SvxFontWorkDialog*)(pVFrame->GetChildWindow(nId)->GetWindow());
471 
472     if ( rMarkList.GetMarkCount() == 1 )
473         pObj = rMarkList.GetMark(0)->GetMarkedSdrObj();
474 
475     if ( pObj == NULL || !pObj->ISA(SdrTextObj) ||
476         !((SdrTextObj*) pObj)->HasText() )
477     {
478 #define XATTR_ANZ 12
479         static const sal_uInt16 nXAttr[ XATTR_ANZ ] =
480         {
481             XATTR_FORMTXTSTYLE, XATTR_FORMTXTADJUST, XATTR_FORMTXTDISTANCE,
482             XATTR_FORMTXTSTART, XATTR_FORMTXTMIRROR, XATTR_FORMTXTSTDFORM,
483             XATTR_FORMTXTHIDEFORM, XATTR_FORMTXTOUTLINE, XATTR_FORMTXTSHADOW,
484             XATTR_FORMTXTSHDWCOLOR, XATTR_FORMTXTSHDWXVAL, XATTR_FORMTXTSHDWYVAL
485         };
486         for( sal_uInt16 i = 0; i < XATTR_ANZ; )
487             rSet.DisableItem( nXAttr[ i++ ] );
488     }
489     else
490     {
491         if ( pDlg )
492             pDlg->SetColorTable(XColorTable::GetStdColorTable());
493 
494         pDrView->GetAttributes( rSet );
495     }
496 }
497