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