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