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 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
28
29 #include <comphelper/processfactory.hxx>
30 #include <i18npool/mslangid.hxx>
31 #include <sfx2/bindings.hxx>
32 #include <sfx2/dispatch.hxx>
33 #include <sfx2/request.hxx>
34 #include <tools/shl.hxx>
35 #include <svx/svdview.hxx>
36 #include <editeng/spltitem.hxx>
37 #include <editeng/lrspitem.hxx>
38 #include <editeng/ulspitem.hxx>
39 #include <editeng/orphitem.hxx>
40 #include <editeng/brkitem.hxx>
41 #include <editeng/widwitem.hxx>
42 #include <editeng/kernitem.hxx>
43 #include <editeng/escpitem.hxx>
44 #include <editeng/lspcitem.hxx>
45 #include <editeng/adjitem.hxx>
46 #include <editeng/crsditem.hxx>
47 #include <editeng/shdditem.hxx>
48 #include <editeng/hyznitem.hxx>
49 #include <editeng/udlnitem.hxx>
50 #include <editeng/fontitem.hxx>
51 #include <editeng/fhgtitem.hxx>
52 #include <editeng/colritem.hxx>
53 #include <editeng/wghtitem.hxx>
54 #include <editeng/cntritem.hxx>
55 #include <editeng/postitem.hxx>
56 #include <editeng/frmdiritem.hxx>
57 #include <svx/svdoutl.hxx>
58 #include <sfx2/viewfrm.hxx>
59 #include <svl/whiter.hxx>
60 #include <svl/cjkoptions.hxx>
61 #include <svl/ctloptions.hxx>
62 #include <svtools/langtab.hxx>
63 #include <svl/languageoptions.hxx>
64 #include <sfx2/bindings.hxx>
65 #include <vcl/msgbox.hxx>
66 #include <sfx2/dispatch.hxx>
67 #include <sfx2/request.hxx>
68 #include <editeng/flditem.hxx>
69 #include <editeng/editstat.hxx>
70 #include <svx/hlnkitem.hxx>
71 #include <svx/htmlmode.hxx>
72 #include <svl/languageoptions.hxx>
73 #include <svl/slstitm.hxx>
74 #include <editeng/langitem.hxx>
75 #include <svtools/langtab.hxx>
76 #include <editeng/unolingu.hxx>
77 #include <editeng/scripttypeitem.hxx>
78 #include <editeng/writingmodeitem.hxx>
79 #include <editeng/eeitem.hxx>
80 #include <editeng/editeng.hxx>
81 #include <editeng/editdata.hxx>
82 #include <editeng/outliner.hxx>
83 #include <vcl/window.hxx>
84 #include <editeng/editview.hxx>
85 #include <vcl/outdev.hxx>
86 #include <editeng/hyznitem.hxx>
87 #include <editeng/kernitem.hxx>
88 #include <editeng/langitem.hxx>
89 #include <editeng/lspcitem.hxx>
90 #include <editeng/orphitem.hxx>
91 #include <editeng/outliner.hxx>
92 #include <editeng/postitem.hxx>
93 #include <editeng/scripttypeitem.hxx>
94 #include <editeng/shdditem.hxx>
95 #include <editeng/spltitem.hxx>
96 #include <svx/svdoutl.hxx>
97 #include <svx/svdview.hxx>
98 #include <editeng/udlnitem.hxx>
99 #include <editeng/unolingu.hxx>
100 #include <editeng/wghtitem.hxx>
101 #include <editeng/widwitem.hxx>
102 #include <editeng/writingmodeitem.hxx>
103 #include <tools/shl.hxx>
104 #include <vcl/msgbox.hxx>
105 #include <vcl/outdev.hxx>
106 #include <vcl/window.hxx>
107
108 #include <cmdid.h>
109 #include <doc.hxx>
110 #include <docstat.hxx>
111 #include <drwtxtsh.hxx>
112 #include <edtwin.hxx>
113 #include <globals.hrc>
114 #include <hintids.hxx>
115 #include <initui.hxx> // fuer SpellPointer
116 #include <langhelper.hxx>
117 #include <pardlg.hxx>
118 #include <shells.hrc>
119 #include <string.h>
120 #include <swdtflvr.hxx>
121 #include <swmodule.hxx>
122 #include <swwait.hxx>
123 #include <uitool.hxx>
124 #include <viewopt.hxx>
125 #include <wrtsh.hxx>
126 #include <wview.hxx>
127
128 #include "swabstdlg.hxx"
129 #include "chrdlg.hrc"
130 #include "misc.hrc"
131
132
133 #include <langhelper.hxx>
134
135 using namespace ::com::sun::star;
136
137 /*--------------------------------------------------------------------
138 Beschreibung:
139 --------------------------------------------------------------------*/
140
Execute(SfxRequest & rReq)141 void SwDrawTextShell::Execute( SfxRequest &rReq )
142 {
143 SwWrtShell &rSh = GetShell();
144 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
145 SfxItemSet aEditAttr(pOLV->GetAttribs());
146 SfxItemSet aNewAttr(*aEditAttr.GetPool(), aEditAttr.GetRanges());
147
148 const sal_uInt16 nSlot = rReq.GetSlot();
149
150 const sal_uInt16 nWhich = GetPool().GetWhich(nSlot);
151 const SfxItemSet *pNewAttrs = rReq.GetArgs();
152
153 bool bRestoreSelection = false;
154 ESelection aOldSelection;
155
156 sal_uInt16 nEEWhich = 0;
157 switch (nSlot)
158 {
159 case SID_LANGUAGE_STATUS:
160 {
161 aOldSelection = pOLV->GetSelection();
162 if (!pOLV->GetEditView().HasSelection())
163 {
164 bRestoreSelection = true;
165 pOLV->GetEditView().SelectCurrentWord();
166 }
167
168 bRestoreSelection = SwLangHelper::SetLanguageStatus(pOLV,rReq,GetView(),rSh);
169 break;
170 }
171
172 case SID_THES:
173 {
174 String aReplaceText;
175 SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES, sal_False );
176 if (pItem2)
177 aReplaceText = pItem2->GetValue();
178 if (aReplaceText.Len() > 0)
179 ReplaceTextWithSynonym( pOLV->GetEditView(), aReplaceText );
180 break;
181 }
182
183 case SID_ATTR_CHAR_FONT:
184 case SID_ATTR_CHAR_FONTHEIGHT:
185 case SID_ATTR_CHAR_WEIGHT:
186 case SID_ATTR_CHAR_POSTURE:
187 {
188 SfxItemPool* pPool2 = aEditAttr.GetPool()->GetSecondaryPool();
189 if( !pPool2 )
190 pPool2 = aEditAttr.GetPool();
191 SvxScriptSetItem aSetItem( nSlot, *pPool2 );
192
193 // #i78017 establish the same behaviour as in Writer
194 sal_uInt16 nScriptTypes = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
195 if (nSlot == SID_ATTR_CHAR_FONT)
196 nScriptTypes = pOLV->GetSelectedScriptType();
197
198 aSetItem.PutItemForScriptType( nScriptTypes, pNewAttrs->Get( nWhich ) );
199 aNewAttr.Put( aSetItem.GetItemSet() );
200 }
201 break;
202
203 case SID_ATTR_CHAR_COLOR: nEEWhich = EE_CHAR_COLOR; break;
204
205 case SID_ATTR_CHAR_UNDERLINE:
206 {
207 if ( pNewAttrs )
208 {
209 const SvxTextLineItem& rTextLineItem = static_cast< const SvxTextLineItem& >( pNewAttrs->Get( pNewAttrs->GetPool()->GetWhich(nSlot) ) );
210 aNewAttr.Put( SvxUnderlineItem( rTextLineItem.GetLineStyle(), EE_CHAR_UNDERLINE ) );
211 }
212 else
213 {
214 FontUnderline eFU = ((const SvxUnderlineItem&)aEditAttr.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
215 aNewAttr.Put( SvxUnderlineItem(eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE) );
216 }
217 }
218 break;
219
220 case SID_ATTR_CHAR_OVERLINE:
221 {
222 FontUnderline eFO = ((const SvxOverlineItem&)aEditAttr.Get(EE_CHAR_OVERLINE)).GetLineStyle();
223 aNewAttr.Put(SvxOverlineItem(eFO == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_OVERLINE));
224 }
225 break;
226
227 case SID_ATTR_CHAR_CONTOUR: nEEWhich = EE_CHAR_OUTLINE; break;
228 case SID_ATTR_CHAR_SHADOWED: nEEWhich = EE_CHAR_SHADOW; break;
229 case SID_ATTR_CHAR_STRIKEOUT: nEEWhich = EE_CHAR_STRIKEOUT; break;
230 case SID_ATTR_CHAR_WORDLINEMODE: nEEWhich = EE_CHAR_WLM; break;
231 case SID_ATTR_CHAR_RELIEF : nEEWhich = EE_CHAR_RELIEF; break;
232 case SID_ATTR_CHAR_LANGUAGE : nEEWhich = EE_CHAR_LANGUAGE;break;
233 case SID_ATTR_CHAR_KERNING : nEEWhich = EE_CHAR_KERNING; break;
234 case SID_ATTR_CHAR_SCALEWIDTH: nEEWhich = EE_CHAR_FONTWIDTH; break;
235 case SID_ATTR_CHAR_AUTOKERN : nEEWhich = EE_CHAR_PAIRKERNING; break;
236 case SID_ATTR_CHAR_ESCAPEMENT: nEEWhich = EE_CHAR_ESCAPEMENT; break;
237 case SID_ATTR_PARA_ADJUST_LEFT:
238 aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_LEFT, EE_PARA_JUST));
239 break;
240 case SID_ATTR_PARA_ADJUST_CENTER:
241 aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_CENTER, EE_PARA_JUST));
242 break;
243 case SID_ATTR_PARA_ADJUST_RIGHT:
244 aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_RIGHT, EE_PARA_JUST));
245 break;
246 case SID_ATTR_PARA_ADJUST_BLOCK:
247 aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_BLOCK, EE_PARA_JUST));
248 break;
249 case SID_ATTR_PARA_LRSPACE:
250 {
251 SvxLRSpaceItem aParaMargin((const SvxLRSpaceItem&)rReq.
252 GetArgs()->Get(nSlot));
253 aParaMargin.SetWhich( EE_PARA_LRSPACE );
254 aNewAttr.Put(aParaMargin);
255 rReq.Done();
256 }
257 break;
258 case SID_ATTR_PARA_LINESPACE:
259 {
260 SvxLineSpacingItem aLineSpace = (const SvxLineSpacingItem&)pNewAttrs->Get(
261 GetPool().GetWhich(nSlot));
262 aLineSpace.SetWhich( EE_PARA_SBL );
263 aNewAttr.Put( aLineSpace );
264 rReq.Done();
265 }
266 break;
267 case SID_ATTR_PARA_ULSPACE:
268 {
269 SvxULSpaceItem aULSpace = (const SvxULSpaceItem&)pNewAttrs->Get(
270 GetPool().GetWhich(nSlot));
271 aULSpace.SetWhich( EE_PARA_ULSPACE );
272 aNewAttr.Put( aULSpace );
273 rReq.Done();
274 }
275 break;
276
277 case SID_ATTR_PARA_LINESPACE_10:
278 {
279 SvxLineSpacingItem aItem(SVX_LINESPACE_ONE_LINE, EE_PARA_SBL);
280 aItem.SetPropLineSpace(100);
281 aNewAttr.Put(aItem);
282 }
283 break;
284 case SID_ATTR_PARA_LINESPACE_15:
285 {
286 SvxLineSpacingItem aItem(SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL);
287 aItem.SetPropLineSpace(150);
288 aNewAttr.Put(aItem);
289 }
290 break;
291 case SID_ATTR_PARA_LINESPACE_20:
292 {
293 SvxLineSpacingItem aItem(SVX_LINESPACE_TWO_LINES, EE_PARA_SBL);
294 aItem.SetPropLineSpace(200);
295 aNewAttr.Put(aItem);
296 }
297 break;
298
299 case FN_SET_SUPER_SCRIPT:
300 {
301 SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
302 SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
303 aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
304
305 if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
306 aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
307 else
308 aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
309 aNewAttr.Put( aItem, EE_CHAR_ESCAPEMENT );
310 }
311 break;
312 case FN_SET_SUB_SCRIPT:
313 {
314 SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
315 SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
316 aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
317
318 if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
319 aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
320 else
321 aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
322 aNewAttr.Put( aItem, EE_CHAR_ESCAPEMENT );
323 }
324 break;
325
326 case SID_CHAR_DLG_EFFECT:
327 case SID_CHAR_DLG:
328 case SID_CHAR_DLG_FOR_PARAGRAPH:
329 {
330 const SfxItemSet* pArgs = rReq.GetArgs();
331
332 if( !pArgs )
333 {
334 aOldSelection = pOLV->GetSelection();
335 if (nSlot == SID_CHAR_DLG_FOR_PARAGRAPH)
336 {
337 // select current paragraph (and restore selection later on...)
338 EditView & rEditView = pOLV->GetEditView();
339 SwLangHelper::SelectPara( rEditView, rEditView.GetSelection() );
340 bRestoreSelection = true;
341 }
342
343 SwView* pView = &GetView();
344 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
345 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) );
346 SfxItemSet aDlgAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END);
347
348 // util::Language gibts an der EditEngine nicht! Daher nicht im Set.
349
350 aDlgAttr.Put( aEditAttr );
351 aDlgAttr.Put( SvxKerningItem(0, RES_CHRATR_KERNING) );
352
353 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
354 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
355
356 SfxAbstractTabDialog* pDlg = pFact->CreateSwCharDlg( pView->GetWindow(), *pView, aDlgAttr, DLG_CHAR,0, sal_True );
357 DBG_ASSERT(pDlg, "Dialogdiet fail!");
358 if (nSlot == SID_CHAR_DLG_EFFECT)
359 {
360 pDlg->SetCurPageId(TP_CHAR_EXT);
361 }
362 sal_uInt16 nRet = pDlg->Execute();
363 if(RET_OK == nRet )
364 {
365 rReq.Done( *( pDlg->GetOutputItemSet() ) );
366 aNewAttr.Put(*pDlg->GetOutputItemSet());
367 }
368 delete( pDlg );
369 if(RET_OK != nRet)
370 return ;
371 }
372 else
373 aNewAttr.Put(*pArgs);
374 }
375 break;
376 case FN_FORMAT_FOOTNOTE_DLG:
377 {
378 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
379 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
380
381 VclAbstractDialog* pDlg = pFact->CreateSwFootNoteOptionDlg( GetView().GetWindow(), rView.GetWrtShell(), DLG_DOC_FOOTNOTE );
382 DBG_ASSERT(pDlg, "Dialogdiet fail!");
383 pDlg->Execute();
384 delete pDlg;
385 break;
386 }
387 case FN_NUMBERING_OUTLINE_DLG:
388 {
389 SfxItemSet aTmp(GetPool(), FN_PARAM_1, FN_PARAM_1);
390 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
391 DBG_ASSERT(pFact, "Dialogdiet fail!");
392 SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_TAB_OUTLINE,
393 GetView().GetWindow(), &aTmp, GetView().GetWrtShell());
394 DBG_ASSERT(pDlg, "Dialogdiet fail!");
395 pDlg->Execute();
396 delete pDlg;
397 rReq.Done();
398 }
399 break;
400 case SID_OPEN_XML_FILTERSETTINGS:
401 {
402 try
403 {
404 uno::Reference < ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), uno::UNO_QUERY);
405 if( xDialog.is() )
406 {
407 xDialog->execute();
408 }
409 }
410 catch( uno::Exception& )
411 {
412 }
413 rReq.Ignore ();
414 }
415 break;
416 case FN_WORDCOUNT_DIALOG:
417 {
418 SwDocStat aCurr;
419 SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() );
420 {
421 SwWait aWait( *GetView().GetDocShell(), true );
422 rSh.StartAction();
423 rSh.CountWords( aCurr );
424 rSh.UpdateDocStat( aDocStat );
425 rSh.EndAction();
426 }
427
428 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
429 DBG_ASSERT(pFact, "Dialogdiet fail!");
430 AbstractSwWordCountDialog* pDialog = pFact->CreateSwWordCountDialog( GetView().GetWindow() );
431 pDialog->SetValues(aCurr, aDocStat );
432 pDialog->Execute();
433 delete pDialog;
434 }
435 break;
436 case SID_PARA_DLG:
437 {
438 const SfxItemSet* pArgs = rReq.GetArgs();
439
440 if (!pArgs)
441 {
442 SwView* pView = &GetView();
443 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
444 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)) );
445 SfxItemSet aDlgAttr(GetPool(),
446 EE_ITEMS_START, EE_ITEMS_END,
447 SID_ATTR_PARA_HYPHENZONE, SID_ATTR_PARA_HYPHENZONE,
448 SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_SPLIT,
449 SID_ATTR_PARA_WIDOWS, SID_ATTR_PARA_WIDOWS,
450 SID_ATTR_PARA_ORPHANS, SID_ATTR_PARA_ORPHANS,
451 0);
452
453 aDlgAttr.Put(aEditAttr);
454
455 // Die Werte sind erst einmal uebernommen worden, um den Dialog anzuzeigen.
456 // Muss natuerlich noch geaendert werden
457 // aDlgAttr.Put( SvxParaDlgLimitsItem( 567 * 50, 5670) );
458
459 aDlgAttr.Put( SvxHyphenZoneItem( sal_False, RES_PARATR_HYPHENZONE) );
460 aDlgAttr.Put( SvxFmtBreakItem( SVX_BREAK_NONE, RES_BREAK ) );
461 aDlgAttr.Put( SvxFmtSplitItem( sal_True, RES_PARATR_SPLIT ) );
462 aDlgAttr.Put( SvxWidowsItem( 0, RES_PARATR_WIDOWS ) );
463 aDlgAttr.Put( SvxOrphansItem( 0, RES_PARATR_ORPHANS ) );
464
465 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
466 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
467
468 SfxAbstractTabDialog* pDlg = pFact->CreateSwParaDlg( GetView().GetWindow(), GetView(), aDlgAttr,DLG_STD, DLG_PARA, 0, sal_True );
469 DBG_ASSERT(pDlg, "Dialogdiet fail!");
470 sal_uInt16 nRet = pDlg->Execute();
471 if(RET_OK == nRet)
472 {
473 rReq.Done( *( pDlg->GetOutputItemSet() ) );
474 aNewAttr.Put(*pDlg->GetOutputItemSet());
475 }
476 delete( pDlg );
477 if(RET_OK != nRet)
478 return;
479 }
480 else
481 aNewAttr.Put(*pArgs);
482 }
483 break;
484 case SID_AUTOSPELL_CHECK:
485 {
486 //!! JP 16.03.2001: why?? pSdrView = rSh.GetDrawView();
487 //!! JP 16.03.2001: why?? pOutliner = pSdrView->GetTextEditOutliner();
488 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
489 sal_uInt32 nCtrl = pOutliner->GetControlWord();
490
491 sal_Bool bSet = ((const SfxBoolItem&)rReq.GetArgs()->Get(
492 nSlot)).GetValue();
493 if(bSet)
494 nCtrl |= EE_CNTRL_ONLINESPELLING|EE_CNTRL_ALLOWBIGOBJS;
495 else
496 nCtrl &= ~EE_CNTRL_ONLINESPELLING;
497 pOutliner->SetControlWord(nCtrl);
498
499 rView.ExecuteSlot(rReq);
500 }
501 break;
502 case SID_HYPERLINK_SETLINK:
503 {
504 const SfxPoolItem* pItem = 0;
505 if(pNewAttrs)
506 pNewAttrs->GetItemState(nSlot, sal_False, &pItem);
507
508 if(pItem)
509 {
510 const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
511 SvxURLField aFld(rHLinkItem.GetURL(), rHLinkItem.GetName(), SVXURLFORMAT_APPDEFAULT);
512 aFld.SetTargetFrame(rHLinkItem.GetTargetFrame());
513
514 const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
515
516 if (pFieldItem && pFieldItem->GetField()->ISA(SvxURLField))
517 {
518 // Feld selektieren, so dass es beim Insert geloescht wird
519 ESelection aSel = pOLV->GetSelection();
520 aSel.nEndPos++;
521 pOLV->SetSelection(aSel);
522 }
523 pOLV->InsertField(SvxFieldItem(aFld, EE_FEATURE_FIELD));
524 }
525 }
526 break;
527
528 case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
529 case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
530 // Shellwechsel!
531 {
532 SdrObject* pTmpObj = pSdrView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
533 SdrPageView* pTmpPV = pSdrView->GetSdrPageView();
534 SdrView* pTmpView = pSdrView;
535
536 pSdrView->SdrEndTextEdit(sal_True);
537
538 SfxItemSet aAttr( *aNewAttr.GetPool(),
539 SDRATTR_TEXTDIRECTION,
540 SDRATTR_TEXTDIRECTION );
541
542 aAttr.Put( SvxWritingModeItem(
543 nSlot == SID_TEXTDIRECTION_LEFT_TO_RIGHT ?
544 text::WritingMode_LR_TB
545 : text::WritingMode_TB_RL, SDRATTR_TEXTDIRECTION ) );
546 pTmpView->SetAttributes( aAttr );
547
548 rSh.GetView().BeginTextEdit( pTmpObj, pTmpPV, &rSh.GetView().GetEditWin(), sal_False);
549 rSh.GetView().AttrChangedNotify( &rSh );
550 }
551 return;
552
553 case SID_ATTR_PARA_LEFT_TO_RIGHT:
554 case SID_ATTR_PARA_RIGHT_TO_LEFT:
555 {
556 SdrObject* pTmpObj = pSdrView->GetMarkedObjectList().GetMark(0)->GetMarkedSdrObj();
557 SdrPageView* pTmpPV = pSdrView->GetSdrPageView();
558 SdrView* pTmpView = pSdrView;
559
560 pSdrView->SdrEndTextEdit(sal_True);
561 sal_Bool bLeftToRight = nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT;
562
563 const SfxPoolItem* pPoolItem;
564 if( pNewAttrs && SFX_ITEM_SET == pNewAttrs->GetItemState( nSlot, sal_True, &pPoolItem ) )
565 {
566 if( !( (SfxBoolItem*)pPoolItem)->GetValue() )
567 bLeftToRight = !bLeftToRight;
568 }
569 SfxItemSet aAttr( *aNewAttr.GetPool(),
570 EE_PARA_JUST, EE_PARA_JUST,
571 EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR,
572 0 );
573
574 sal_uInt16 nAdjust = SVX_ADJUST_LEFT;
575 if( SFX_ITEM_ON == aEditAttr.GetItemState(EE_PARA_JUST, sal_True, &pPoolItem ) )
576 nAdjust = ( (SvxAdjustItem*)pPoolItem)->GetEnumValue();
577
578 if( bLeftToRight )
579 {
580 aAttr.Put( SvxFrameDirectionItem( FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) );
581 if( nAdjust == SVX_ADJUST_RIGHT )
582 aAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
583 }
584 else
585 {
586 aAttr.Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
587 if( nAdjust == SVX_ADJUST_LEFT )
588 aAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
589 }
590 pTmpView->SetAttributes( aAttr );
591 rSh.GetView().BeginTextEdit( pTmpObj, pTmpPV, &rSh.GetView().GetEditWin(), sal_False );
592 rSh.GetView().AttrChangedNotify( &rSh );
593 }
594 return;
595 default:
596 ASSERT(!this, falscher Dispatcher);
597 return;
598 }
599 if(nEEWhich && pNewAttrs)
600 aNewAttr.Put(pNewAttrs->Get(nWhich), nEEWhich);
601
602 SetAttrToMarked(aNewAttr);
603
604 GetView().GetViewFrame()->GetBindings().InvalidateAll(sal_False);
605
606 if (IsTextEdit() && pOLV->GetOutliner()->IsModified())
607 rSh.SetModified();
608
609 if (bRestoreSelection)
610 {
611 // restore selection
612 pOLV->GetEditView().SetSelection( aOldSelection );
613 }
614 }
615
616 /*--------------------------------------------------------------------
617 Beschreibung:
618 --------------------------------------------------------------------*/
619
GetState(SfxItemSet & rSet)620 void SwDrawTextShell::GetState(SfxItemSet& rSet)
621 {
622 if (!IsTextEdit()) // Sonst manchmal Absturz!
623 return;
624
625 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
626 SfxWhichIter aIter(rSet);
627 sal_uInt16 nWhich = aIter.FirstWhich();
628
629 SfxItemSet aEditAttr( pOLV->GetAttribs() );
630 const SfxPoolItem *pAdjust = 0, *pLSpace = 0, *pEscItem = 0;
631 int eAdjust, nLSpace, nEsc;
632
633 while(nWhich)
634 {
635 sal_uInt16 nSlotId = GetPool().GetSlotId( nWhich );
636 sal_Bool bFlag = sal_False;
637 switch( nSlotId )
638 {
639 case SID_LANGUAGE_STATUS://20412:
640 {
641 nSlotId = SwLangHelper::GetLanguageStatus(pOLV,rSet);;
642 break;
643 }
644
645 case SID_THES:
646 {
647 String aStatusVal;
648 LanguageType nLang = LANGUAGE_NONE;
649 bool bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, pOLV->GetEditView() );
650 rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
651
652 // disable "Thesaurus" context menu entry if there is nothing to look up
653 uno::Reference< linguistic2::XThesaurus > xThes( ::GetThesaurus() );
654 lang::Locale aLocale( SvxCreateLocale( nLang ) );
655 if (!bIsLookUpWord ||
656 !xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( aLocale ))
657 rSet.DisableItem( SID_THES );
658
659 //! avoid puting the same item as SfxBoolItem at the end of this function
660 nSlotId = 0;
661 break;
662 }
663
664 case SID_ATTR_PARA_ADJUST_LEFT: eAdjust = SVX_ADJUST_LEFT; goto ASK_ADJUST;
665 case SID_ATTR_PARA_ADJUST_RIGHT: eAdjust = SVX_ADJUST_RIGHT; goto ASK_ADJUST;
666 case SID_ATTR_PARA_ADJUST_CENTER: eAdjust = SVX_ADJUST_CENTER; goto ASK_ADJUST;
667 case SID_ATTR_PARA_ADJUST_BLOCK: eAdjust = SVX_ADJUST_BLOCK; goto ASK_ADJUST;
668 ASK_ADJUST:
669 {
670 if( !pAdjust )
671 aEditAttr.GetItemState( EE_PARA_JUST, sal_False, &pAdjust);
672
673 if( !pAdjust || IsInvalidItem( pAdjust ))
674 rSet.InvalidateItem( nSlotId ), nSlotId = 0;
675 else
676 bFlag = eAdjust == ((SvxAdjustItem*)pAdjust)->GetAdjust();
677 }
678 break;
679
680 case SID_ATTR_PARA_LRSPACE:
681 {
682 SfxItemState eState = aEditAttr.GetItemState(EE_PARA_LRSPACE);
683 if( eState >= SFX_ITEM_DEFAULT )
684 {
685 SvxLRSpaceItem aLR = (const SvxLRSpaceItem&) aEditAttr.Get( EE_PARA_LRSPACE );
686 aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
687 rSet.Put(aLR);
688 }
689 else
690 rSet.InvalidateItem(nSlotId);
691 nSlotId = 0;
692 }
693 break;
694 case SID_ATTR_PARA_LINESPACE:
695 {
696 SfxItemState eState = aEditAttr.GetItemState(EE_PARA_SBL);
697 if( eState >= SFX_ITEM_DEFAULT )
698 {
699 SvxLineSpacingItem aLR = (const SvxLineSpacingItem&) aEditAttr.Get( EE_PARA_SBL );
700 rSet.Put(aLR);
701 }
702 else
703 rSet.InvalidateItem(nSlotId);
704 nSlotId = 0;
705 }
706 break;
707 case SID_ATTR_PARA_ULSPACE:
708 {
709 SfxItemState eState = aEditAttr.GetItemState(EE_PARA_ULSPACE);
710 if( eState >= SFX_ITEM_DEFAULT )
711 {
712 SvxULSpaceItem aULSpace = (const SvxULSpaceItem&) aEditAttr.Get( EE_PARA_ULSPACE );
713 aULSpace.SetWhich(SID_ATTR_PARA_ULSPACE);
714 rSet.Put(aULSpace);
715 }
716 else
717 rSet.InvalidateItem(nSlotId);
718 nSlotId = 0;
719 }
720 break;
721
722 case SID_ATTR_PARA_LINESPACE_10: nLSpace = 100; goto ASK_LINESPACE;
723 case SID_ATTR_PARA_LINESPACE_15: nLSpace = 150; goto ASK_LINESPACE;
724 case SID_ATTR_PARA_LINESPACE_20: nLSpace = 200; goto ASK_LINESPACE;
725 ASK_LINESPACE:
726 {
727 if( !pLSpace )
728 aEditAttr.GetItemState( EE_PARA_SBL, sal_False, &pLSpace );
729
730 if( !pLSpace || IsInvalidItem( pLSpace ))
731 rSet.InvalidateItem( nSlotId ), nSlotId = 0;
732 else if( nLSpace == ((const SvxLineSpacingItem*)pLSpace)->
733 GetPropLineSpace() )
734 bFlag = sal_True;
735 else
736 nSlotId = 0;
737 }
738 break;
739
740 case FN_SET_SUPER_SCRIPT: nEsc = SVX_ESCAPEMENT_SUPERSCRIPT;
741 goto ASK_ESCAPE;
742 case FN_SET_SUB_SCRIPT: nEsc = SVX_ESCAPEMENT_SUBSCRIPT;
743 goto ASK_ESCAPE;
744 ASK_ESCAPE:
745 {
746 if( !pEscItem )
747 pEscItem = &aEditAttr.Get( EE_CHAR_ESCAPEMENT );
748
749 if( nEsc == ((const SvxEscapementItem*)
750 pEscItem)->GetEnumValue() )
751 bFlag = sal_True;
752 else
753 nSlotId = 0;
754 }
755 break;
756
757 case SID_THESAURUS:
758 {
759 // disable "Thesaurus" if the language is not supported
760 const SfxPoolItem &rItem = GetShell().GetDoc()->GetDefault(
761 GetWhichOfScript( RES_CHRATR_LANGUAGE,
762 GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage())) );
763 LanguageType nLang = ((const SvxLanguageItem &) rItem).GetLanguage();
764
765 uno::Reference< linguistic2::XThesaurus > xThes( ::GetThesaurus() );
766 if (!xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( SvxCreateLocale( nLang ) ))
767 rSet.DisableItem( SID_THESAURUS );
768 nSlotId = 0;
769 }
770 break;
771 case SID_HANGUL_HANJA_CONVERSION:
772 case SID_CHINESE_CONVERSION:
773 {
774 if (!SvtCJKOptions().IsAnyEnabled())
775 {
776 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_False );
777 rSet.DisableItem(nWhich);
778 }
779 else
780 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_True );
781 }
782 break;
783
784 case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
785 case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
786 if ( !SvtLanguageOptions().IsVerticalTextEnabled() )
787 {
788 rSet.DisableItem( nSlotId );
789 nSlotId = 0;
790 }
791 else
792 {
793 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
794 if( pOutliner )
795 bFlag = pOutliner->IsVertical() ==
796 (SID_TEXTDIRECTION_TOP_TO_BOTTOM == nSlotId);
797 else
798 {
799 text::WritingMode eMode = (text::WritingMode)
800 ( (const SvxWritingModeItem&) aEditAttr.Get( SDRATTR_TEXTDIRECTION ) ).GetValue();
801
802 if( nSlotId == SID_TEXTDIRECTION_LEFT_TO_RIGHT )
803 {
804 bFlag = eMode == text::WritingMode_LR_TB;
805 }
806 else
807 {
808 bFlag = eMode != text::WritingMode_TB_RL;
809 }
810 }
811 }
812 break;
813 case SID_ATTR_PARA_LEFT_TO_RIGHT:
814 case SID_ATTR_PARA_RIGHT_TO_LEFT:
815 {
816 if ( !SvtLanguageOptions().IsCTLFontEnabled() )
817 {
818 rSet.DisableItem( nWhich );
819 nSlotId = 0;
820 }
821 else
822 {
823 SdrOutliner * pOutliner = pSdrView->GetTextEditOutliner();
824 if(pOutliner && pOutliner->IsVertical())
825 {
826 rSet.DisableItem( nWhich );
827 nSlotId = 0;
828 }
829 else
830 {
831 switch( ( ( (SvxFrameDirectionItem&) aEditAttr.Get( EE_PARA_WRITINGDIR ) ) ).GetValue() )
832 {
833 case FRMDIR_HORI_LEFT_TOP:
834 bFlag = nWhich == SID_ATTR_PARA_LEFT_TO_RIGHT;
835 break;
836
837 case FRMDIR_HORI_RIGHT_TOP:
838 bFlag = nWhich != SID_ATTR_PARA_LEFT_TO_RIGHT;
839 break;
840 }
841 }
842 }
843 }
844 break;
845 case SID_TRANSLITERATE_HALFWIDTH:
846 case SID_TRANSLITERATE_FULLWIDTH:
847 case SID_TRANSLITERATE_HIRAGANA:
848 case SID_TRANSLITERATE_KATAGANA:
849 {
850 SvtCJKOptions aCJKOptions;
851 if(!aCJKOptions.IsChangeCaseMapEnabled())
852 {
853 rSet.DisableItem(nWhich);
854 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_False );
855 }
856 else
857 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_True );
858 }
859 break;
860 case SID_INSERT_RLM :
861 case SID_INSERT_LRM :
862 case SID_INSERT_ZWNBSP :
863 case SID_INSERT_ZWSP:
864 {
865 SvtCTLOptions aCTLOptions;
866 sal_Bool bEnabled = aCTLOptions.IsCTLFontEnabled();
867 GetView().GetViewFrame()->GetBindings().SetVisibleState( nWhich, bEnabled );
868 if(!bEnabled)
869 rSet.DisableItem(nWhich);
870 }
871 break;
872 default:
873 nSlotId = 0; // don't know this slot
874 break;
875 }
876
877 if( nSlotId )
878 rSet.Put( SfxBoolItem( nWhich, bFlag ));
879
880 nWhich = aIter.NextWhich();
881 }
882 }
883
884 /*--------------------------------------------------------------------
885 Beschreibung:
886 --------------------------------------------------------------------*/
GetDrawTxtCtrlState(SfxItemSet & rSet)887 void SwDrawTextShell::GetDrawTxtCtrlState(SfxItemSet& rSet)
888 {
889 if (!IsTextEdit()) // Sonst Absturz!
890 return;
891
892 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
893 SfxItemSet aEditAttr(pOLV->GetAttribs());
894
895 SfxWhichIter aIter(rSet);
896 sal_uInt16 nWhich = aIter.FirstWhich();
897 sal_uInt16 nScriptType = pOLV->GetSelectedScriptType();
898 while(nWhich)
899 {
900 sal_uInt16 nEEWhich = 0;
901 sal_uInt16 nSlotId = GetPool().GetSlotId( nWhich );
902 switch( nSlotId )
903 {
904 case SID_ATTR_CHAR_FONT:
905 case SID_ATTR_CHAR_FONTHEIGHT:
906 case SID_ATTR_CHAR_WEIGHT:
907 case SID_ATTR_CHAR_POSTURE:
908 {
909 SfxItemPool* pEditPool = aEditAttr.GetPool()->GetSecondaryPool();
910 if( !pEditPool )
911 pEditPool = aEditAttr.GetPool();
912 SvxScriptSetItem aSetItem( nSlotId, *pEditPool );
913 aSetItem.GetItemSet().Put( aEditAttr, sal_False );
914 const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScriptType );
915 if( pI )
916 rSet.Put( *pI, nWhich );
917 else
918 rSet.InvalidateItem( nWhich );
919 }
920 break;
921 case SID_ATTR_CHAR_COLOR: nEEWhich = EE_CHAR_COLOR; break;
922 case SID_ATTR_CHAR_UNDERLINE: nEEWhich = EE_CHAR_UNDERLINE;break;
923 case SID_ATTR_CHAR_OVERLINE: nEEWhich = EE_CHAR_OVERLINE;break;
924 case SID_ATTR_CHAR_CONTOUR: nEEWhich = EE_CHAR_OUTLINE; break;
925 case SID_ATTR_CHAR_SHADOWED: nEEWhich = EE_CHAR_SHADOW;break;
926 case SID_ATTR_CHAR_STRIKEOUT: nEEWhich = EE_CHAR_STRIKEOUT;break;
927 case SID_AUTOSPELL_CHECK:
928 {
929 const SfxPoolItem* pState = rView.GetSlotState(nWhich);
930 if (pState)
931 rSet.Put(SfxBoolItem(nWhich, ((const SfxBoolItem*)pState)->GetValue()));
932 else
933 rSet.DisableItem( nWhich );
934 break;
935 }
936 case SID_ATTR_CHAR_WORDLINEMODE: nEEWhich = EE_CHAR_WLM; break;
937 case SID_ATTR_CHAR_RELIEF : nEEWhich = EE_CHAR_RELIEF; break;
938 case SID_ATTR_CHAR_LANGUAGE : nEEWhich = EE_CHAR_LANGUAGE;break;
939 case SID_ATTR_CHAR_KERNING : nEEWhich = EE_CHAR_KERNING; break;
940 case SID_ATTR_CHAR_SCALEWIDTH: nEEWhich = EE_CHAR_FONTWIDTH;break;
941 case SID_ATTR_CHAR_AUTOKERN : nEEWhich = EE_CHAR_PAIRKERNING; break;
942 case SID_ATTR_CHAR_ESCAPEMENT: nEEWhich = EE_CHAR_ESCAPEMENT; break;
943 }
944 if(nEEWhich)
945 rSet.Put(aEditAttr.Get(nEEWhich, sal_True), nWhich);
946
947 nWhich = aIter.NextWhich();
948 }
949 }
950
951 /*--------------------------------------------------------------------
952 Beschreibung:
953 --------------------------------------------------------------------*/
ExecClpbrd(SfxRequest & rReq)954 void SwDrawTextShell::ExecClpbrd(SfxRequest &rReq)
955 {
956 if (!IsTextEdit()) // Sonst Absturz!
957 return;
958
959 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
960
961 ESelection aSel(pOLV->GetSelection());
962 const sal_Bool bCopy = (aSel.nStartPara != aSel.nEndPara) || (aSel.nStartPos != aSel.nEndPos);
963 sal_uInt16 nId = rReq.GetSlot();
964 switch( nId )
965 {
966 case SID_CUT:
967 if (bCopy)
968 pOLV->Cut();
969 return;
970
971 case SID_COPY:
972 if (bCopy)
973 pOLV->Copy();
974 return;
975
976 case SID_PASTE:
977 pOLV->PasteSpecial();
978 break;
979
980 default:
981 DBG_ERROR("falscher Dispatcher");
982 return;
983 }
984 }
985
986 /*--------------------------------------------------------------------
987 Beschreibung: ClipBoard-Status
988 --------------------------------------------------------------------*/
StateClpbrd(SfxItemSet & rSet)989 void SwDrawTextShell::StateClpbrd(SfxItemSet &rSet)
990 {
991 if (!IsTextEdit()) // Sonst Absturz!
992 return;
993
994 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
995 ESelection aSel(pOLV->GetSelection());
996 const sal_Bool bCopy = (aSel.nStartPara != aSel.nEndPara) ||
997 (aSel.nStartPos != aSel.nEndPos);
998
999
1000 SfxWhichIter aIter(rSet);
1001 sal_uInt16 nWhich = aIter.FirstWhich();
1002
1003 while(nWhich)
1004 {
1005 switch(nWhich)
1006 {
1007 case SID_CUT:
1008 case SID_COPY:
1009 if( !bCopy )
1010 rSet.DisableItem( nWhich );
1011 break;
1012
1013 case SID_PASTE:
1014 {
1015 TransferableDataHelper aDataHelper(
1016 TransferableDataHelper::CreateFromSystemClipboard( &GetView().GetEditWin() ) );
1017
1018 if( !aDataHelper.GetXTransferable().is()
1019 || !SwTransferable::IsPaste( GetShell(), aDataHelper ) )
1020 {
1021 rSet.DisableItem( nWhich );
1022 }
1023 }
1024 break;
1025
1026 case SID_PASTE_SPECIAL:
1027 case SID_CLIPBOARD_FORMAT_ITEMS:
1028 rSet.DisableItem( nWhich );
1029 break;
1030 }
1031
1032 nWhich = aIter.NextWhich();
1033 }
1034 }
1035
1036 /*--------------------------------------------------------------------
1037 Beschreibung: Hyperlink-Status
1038 --------------------------------------------------------------------*/
1039
StateInsert(SfxItemSet & rSet)1040 void SwDrawTextShell::StateInsert(SfxItemSet &rSet)
1041 {
1042 if (!IsTextEdit()) // Sonst Absturz!
1043 return;
1044
1045 OutlinerView* pOLV = pSdrView->GetTextEditOutlinerView();
1046 SfxWhichIter aIter(rSet);
1047 sal_uInt16 nWhich = aIter.FirstWhich();
1048
1049 while(nWhich)
1050 {
1051 switch(nWhich)
1052 {
1053 case SID_HYPERLINK_GETLINK:
1054 {
1055 SvxHyperlinkItem aHLinkItem;
1056 aHLinkItem.SetInsertMode(HLINK_FIELD);
1057
1058 const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
1059
1060 if (pFieldItem)
1061 {
1062 const SvxFieldData* pField = pFieldItem->GetField();
1063
1064 if (pField->ISA(SvxURLField))
1065 {
1066 aHLinkItem.SetName(((const SvxURLField*) pField)->GetRepresentation());
1067 aHLinkItem.SetURL(((const SvxURLField*) pField)->GetURL());
1068 aHLinkItem.SetTargetFrame(((const SvxURLField*) pField)->GetTargetFrame());
1069 }
1070 }
1071 else
1072 {
1073 String sSel(pOLV->GetSelected());
1074 sSel.Erase(255);
1075 sSel.EraseTrailingChars();
1076 aHLinkItem.SetName(sSel);
1077 }
1078
1079 sal_uInt16 nHtmlMode = ::GetHtmlMode(GetView().GetDocShell());
1080 aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
1081 ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0)));
1082
1083 rSet.Put(aHLinkItem);
1084 }
1085 break;
1086 }
1087 nWhich = aIter.NextWhich();
1088 }
1089 }
1090
1091