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 <config_features.h>
21 :
22 : #include <hintids.hxx>
23 : #include <comphelper/string.hxx>
24 : #include <svl/globalnameitem.hxx>
25 : #include <svl/ownlist.hxx>
26 : #include <sfx2/frmdescr.hxx>
27 : #include <sfx2/objface.hxx>
28 : #include <sfx2/lnkbase.hxx>
29 :
30 : #include <tools/errinf.hxx>
31 : #include <svx/svdview.hxx>
32 : #include <svl/ptitem.hxx>
33 : #include <svl/stritem.hxx>
34 : #include <unotools/moduleoptions.hxx>
35 : #include <vcl/msgbox.hxx>
36 : #include <sfx2/fcontnr.hxx>
37 : #include <svx/hlnkitem.hxx>
38 : #include <svl/srchitem.hxx>
39 : #include <sfx2/dispatch.hxx>
40 : #include <sfx2/docfile.hxx>
41 : #include <svl/urihelper.hxx>
42 : #include <basic/sbxvar.hxx>
43 : #include <svl/whiter.hxx>
44 : #include <sfx2/request.hxx>
45 : #include <editeng/opaqitem.hxx>
46 : #include <editeng/fontitem.hxx>
47 : #include <editeng/adjustitem.hxx>
48 : #include <editeng/boxitem.hxx>
49 : #include <editeng/sizeitem.hxx>
50 : #include <editeng/svxacorr.hxx>
51 : #include <editeng/scripttypeitem.hxx>
52 : #include <vcl/graphicfilter.hxx>
53 : #include <sfx2/htmlmode.hxx>
54 : #include <svx/pfiledlg.hxx>
55 : #include <svtools/htmlcfg.hxx>
56 : #include <com/sun/star/i18n/TransliterationModules.hpp>
57 : #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
58 : #include <com/sun/star/embed/Aspects.hpp>
59 :
60 : #include <comphelper/classids.hxx>
61 : #include <editeng/acorrcfg.hxx>
62 : #include <wdocsh.hxx>
63 : #include <fmtinfmt.hxx>
64 : #include <fmtclds.hxx>
65 : #include <fmtsrnd.hxx>
66 : #include <fmtfsize.hxx>
67 : #include <swmodule.hxx>
68 : #include <wrtsh.hxx>
69 : #include <view.hxx>
70 : #include <docsh.hxx>
71 : #include <doc.hxx>
72 : #include <IDocumentChartDataProviderAccess.hxx>
73 : #include <uitool.hxx>
74 : #include <cmdid.h>
75 : #include <globals.hrc>
76 : #include <frmmgr.hxx>
77 : #include <textsh.hxx>
78 : #include <frmfmt.hxx>
79 : #include <tablemgr.hxx>
80 : #include <swundo.hxx>
81 : #include <shellio.hxx>
82 : #include <frmdlg.hxx>
83 : #include <usrpref.hxx>
84 : #include <swtable.hxx>
85 : #include <tblafmt.hxx>
86 : #include <caption.hxx>
87 : #include <idxmrk.hxx>
88 : #include <poolfmt.hxx>
89 : #include <breakit.hxx>
90 : #include <crsskip.hxx>
91 : #include <modcfg.hxx>
92 : #include <column.hxx>
93 : #include <edtwin.hxx>
94 : #include <shells.hrc>
95 : #include <popup.hrc>
96 : #include <swerror.h>
97 : #include <unochart.hxx>
98 :
99 : #include <chartins.hxx>
100 :
101 : #define SwTextShell
102 : #include <sfx2/msg.hxx>
103 : #include <sfx2/sidebar/EnumContext.hxx>
104 : #include <swslots.hxx>
105 : #include <SwRewriter.hxx>
106 : #include <comcore.hrc>
107 :
108 : using namespace ::com::sun::star;
109 :
110 : #include <svx/svxdlg.hxx>
111 : #include <svx/dialogs.hrc>
112 : #include "swabstdlg.hxx"
113 : #include <misc.hrc>
114 : #include <table.hrc>
115 : #include <frmui.hrc>
116 : #include <unomid.h>
117 : #include <boost/scoped_ptr.hpp>
118 :
119 322888 : SFX_IMPL_INTERFACE(SwTextShell, SwBaseShell)
120 :
121 59 : void SwTextShell::InitInterface_Impl()
122 : {
123 59 : GetStaticInterface()->RegisterPopupMenu(SW_RES(MN_TEXT_POPUPMENU));
124 :
125 59 : GetStaticInterface()->RegisterObjectBar(SFX_OBJECTBAR_OBJECT, RID_TEXT_TOOLBOX);
126 :
127 59 : GetStaticInterface()->RegisterChildWindow(FN_EDIT_FORMULA);
128 59 : GetStaticInterface()->RegisterChildWindow(FN_INSERT_FIELD);
129 59 : GetStaticInterface()->RegisterChildWindow(FN_INSERT_IDX_ENTRY_DLG);
130 59 : GetStaticInterface()->RegisterChildWindow(FN_INSERT_AUTH_ENTRY_DLG);
131 59 : GetStaticInterface()->RegisterChildWindow(SID_RUBY_DIALOG);
132 59 : GetStaticInterface()->RegisterChildWindow(FN_WORDCOUNT_DIALOG);
133 59 : }
134 :
135 43182 : TYPEINIT1(SwTextShell,SwBaseShell)
136 :
137 2 : void SwTextShell::ExecInsert(SfxRequest &rReq)
138 : {
139 2 : SwWrtShell &rSh = GetShell();
140 :
141 : OSL_ENSURE( !rSh.IsObjSelected() && !rSh.IsFrmSelected(),
142 : "wrong shell on dispatcher" );
143 :
144 2 : const SfxItemSet *pArgs = rReq.GetArgs();
145 2 : const SfxPoolItem* pItem = 0;
146 2 : const sal_uInt16 nSlot = rReq.GetSlot();
147 2 : if(pArgs)
148 2 : pArgs->GetItemState(nSlot, false, &pItem );
149 :
150 2 : switch( nSlot )
151 : {
152 : case FN_INSERT_STRING:
153 2 : if( pItem )
154 2 : rSh.InsertByWord(static_cast<const SfxStringItem *>(pItem)->GetValue());
155 2 : break;
156 :
157 : case FN_INSERT_SOFT_HYPHEN:
158 0 : if( CHAR_SOFTHYPHEN != rSh.SwCrsrShell::GetChar( true, 0 ) &&
159 0 : CHAR_SOFTHYPHEN != rSh.SwCrsrShell::GetChar( true, -1 ))
160 0 : rSh.Insert( OUString( CHAR_SOFTHYPHEN ) );
161 0 : break;
162 :
163 : case FN_INSERT_HARDHYPHEN:
164 : case FN_INSERT_HARD_SPACE:
165 : {
166 0 : const sal_Unicode cIns = FN_INSERT_HARD_SPACE == nSlot ? CHAR_HARDBLANK : CHAR_HARDHYPHEN;
167 :
168 0 : SvxAutoCorrCfg& rACfg = SvxAutoCorrCfg::Get();
169 0 : SvxAutoCorrect* pACorr = rACfg.GetAutoCorrect();
170 0 : if( pACorr && rACfg.IsAutoFormatByInput()
171 0 : && pACorr->IsAutoCorrFlag(
172 0 : CapitalStartSentence | CapitalStartWord | AddNonBrkSpace | ChgOrdinalNumber | ChgToEnEmDash | SetINetAttr | Autocorrect ) )
173 : {
174 0 : rSh.AutoCorrect( *pACorr, cIns );
175 : }
176 : else
177 : {
178 0 : rSh.Insert( OUString( cIns ) );
179 : }
180 : }
181 0 : break;
182 :
183 : case SID_INSERT_RLM :
184 : case SID_INSERT_LRM :
185 : case SID_INSERT_ZWNBSP :
186 : case SID_INSERT_ZWSP:
187 : {
188 0 : sal_Unicode cIns = 0;
189 0 : switch(nSlot)
190 : {
191 0 : case SID_INSERT_RLM : cIns = CHAR_RLM ; break;
192 0 : case SID_INSERT_LRM : cIns = CHAR_LRM ; break;
193 0 : case SID_INSERT_ZWSP : cIns = CHAR_ZWSP ; break;
194 0 : case SID_INSERT_ZWNBSP: cIns = CHAR_ZWNBSP; break;
195 : }
196 0 : rSh.Insert( OUString( cIns ) );
197 : }
198 0 : break;
199 :
200 : case FN_INSERT_BREAK:
201 : {
202 0 : if( !rSh.CrsrInsideInputField() )
203 : {
204 0 : rSh.SplitNode();
205 : }
206 : else
207 : {
208 0 : rSh.InsertLineBreak();
209 : }
210 : }
211 0 : rReq.Done();
212 0 : break;
213 :
214 : case FN_INSERT_PAGEBREAK:
215 0 : rSh.InsertPageBreak();
216 0 : rReq.Done();
217 0 : break;
218 :
219 : case FN_INSERT_LINEBREAK:
220 0 : rSh.InsertLineBreak();
221 0 : rReq.Done();
222 0 : break;
223 :
224 : case FN_INSERT_COLUMN_BREAK:
225 0 : rSh.InsertColumnBreak();
226 0 : rReq.Done();
227 0 : break;
228 :
229 : case SID_HYPERLINK_SETLINK:
230 0 : if (pItem)
231 0 : InsertHyperlink(*static_cast<const SvxHyperlinkItem *>(pItem));
232 0 : rReq.Done();
233 0 : break;
234 :
235 : #if HAVE_FEATURE_AVMEDIA
236 : case SID_INSERT_AVMEDIA:
237 0 : rReq.SetReturnValue(SfxBoolItem(nSlot, InsertMediaDlg( rReq )));
238 0 : break;
239 :
240 : case SID_INSERT_SOUND:
241 : case SID_INSERT_VIDEO:
242 : {
243 0 : SvxPluginFileDlg aDlg( &GetView().GetViewFrame()->GetWindow(), nSlot );
244 0 : aDlg.SetContext( nSlot == SID_INSERT_SOUND? sfx2::FileDialogHelper::SW_INSERT_SOUND : sfx2::FileDialogHelper::SW_INSERT_VIDEO );
245 :
246 0 : if ( ERRCODE_NONE == aDlg.Execute() )
247 : {
248 : // Determine URL
249 0 : OUString aStrURL( aDlg.GetPath() );
250 0 : aStrURL = URIHelper::SmartRel2Abs(
251 0 : INetURLObject(), aStrURL, URIHelper::GetMaybeFileHdl() );
252 :
253 0 : INetURLObject url;
254 0 : url.SetSmartProtocol( INetProtocol::File );
255 :
256 0 : if ( url.SetURL( aStrURL, INetURLObject::WAS_ENCODED ) )
257 : {
258 0 : OUString aName;
259 0 : comphelper::EmbeddedObjectContainer aCnt;
260 0 : svt::EmbeddedObjectRef xObj( aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), aName ), embed::Aspects::MSOLE_CONTENT );
261 0 : if ( xObj.is() )
262 : {
263 0 : svt::EmbeddedObjectRef::TryRunningState( xObj.GetObject() );
264 :
265 : // set properties from dialog
266 0 : uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
267 0 : if ( xSet.is() )
268 : {
269 0 : xSet->setPropertyValue("PluginURL",
270 0 : uno::makeAny( OUString( url.GetMainURL( INetURLObject::NO_DECODE ) ) ) );
271 0 : }
272 : }
273 :
274 0 : rSh.InsertObject( xObj, 0, true, nSlot);
275 0 : }
276 0 : }
277 : }
278 0 : break;
279 : #endif
280 :
281 : case SID_INSERT_OBJECT:
282 : case SID_INSERT_PLUGIN:
283 : {
284 0 : SFX_REQUEST_ARG( rReq, pNameItem, SfxGlobalNameItem, SID_INSERT_OBJECT, false );
285 0 : SvGlobalName *pName = NULL;
286 0 : SvGlobalName aName;
287 0 : if ( pNameItem )
288 : {
289 0 : aName = pNameItem->GetValue();
290 0 : pName = &aName;
291 : }
292 :
293 0 : SFX_REQUEST_ARG( rReq, pClassLocationItem, SfxStringItem, FN_PARAM_2, false );
294 0 : SFX_REQUEST_ARG( rReq, pCommandsItem, SfxStringItem, FN_PARAM_3, false );
295 : //TODO/LATER: recording currently not working, need code for Commandlist
296 0 : svt::EmbeddedObjectRef xObj;
297 0 : if( nSlot == SID_INSERT_PLUGIN && ( pClassLocationItem || pCommandsItem ) )
298 : {
299 0 : OUString sClassLocation;
300 0 : if(pClassLocationItem)
301 0 : sClassLocation = pClassLocationItem->GetValue();
302 :
303 0 : SvCommandList aCommandList;
304 0 : if(pCommandsItem)
305 : {
306 : sal_Int32 nTemp;
307 0 : aCommandList.AppendCommands( pCommandsItem->GetValue(), &nTemp );
308 : }
309 :
310 : {
311 0 : comphelper::EmbeddedObjectContainer aCnt;
312 0 : OUString sName;
313 : xObj.Assign( aCnt.CreateEmbeddedObject( SvGlobalName( SO3_PLUGIN_CLASSID ).GetByteSequence(), sName ),
314 0 : embed::Aspects::MSOLE_CONTENT );
315 0 : svt::EmbeddedObjectRef::TryRunningState( xObj.GetObject() );
316 0 : uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
317 0 : if ( xSet.is() )
318 : {
319 : try
320 : {
321 0 : if ( !sClassLocation.isEmpty() )
322 0 : xSet->setPropertyValue("PluginURL",
323 : uno::makeAny(
324 : OUString(
325 : URIHelper::SmartRel2Abs(
326 : INetURLObject(), sClassLocation,
327 0 : URIHelper::GetMaybeFileHdl()) ) ) );
328 0 : uno::Sequence< beans::PropertyValue > aSeq;
329 0 : if ( aCommandList.size() )
330 : {
331 0 : aCommandList.FillSequence( aSeq );
332 0 : xSet->setPropertyValue("PluginCommands", uno::makeAny( aSeq ) );
333 0 : }
334 : }
335 0 : catch (const uno::Exception&)
336 : {
337 : }
338 0 : }
339 : }
340 :
341 0 : if(xObj.is())
342 0 : rSh.InsertOleObject( xObj );
343 : }
344 : else
345 : {
346 : OSL_ENSURE( !pNameItem || nSlot == SID_INSERT_OBJECT, "Superfluous argument!" );
347 0 : rSh.InsertObject( xObj, pName, true, nSlot);
348 0 : rReq.Done();
349 : }
350 0 : break;
351 : }
352 : case SID_INSERT_FLOATINGFRAME:
353 : {
354 0 : svt::EmbeddedObjectRef xObj;
355 0 : SFX_REQUEST_ARG( rReq, pNameItem, SfxStringItem, FN_PARAM_1, false );
356 0 : SFX_REQUEST_ARG( rReq, pURLItem, SfxStringItem, FN_PARAM_2, false );
357 0 : SFX_REQUEST_ARG( rReq, pMarginItem, SvxSizeItem, FN_PARAM_3, false );
358 0 : SFX_REQUEST_ARG( rReq, pScrollingItem, SfxByteItem, FN_PARAM_4, false );
359 0 : SFX_REQUEST_ARG( rReq, pBorderItem, SfxBoolItem, FN_PARAM_5, false );
360 :
361 0 : if(pURLItem) // URL is a _must_
362 : {
363 0 : comphelper::EmbeddedObjectContainer aCnt;
364 0 : OUString aName;
365 : xObj.Assign( aCnt.CreateEmbeddedObject( SvGlobalName( SO3_IFRAME_CLASSID ).GetByteSequence(), aName ),
366 0 : embed::Aspects::MSOLE_CONTENT );
367 0 : svt::EmbeddedObjectRef::TryRunningState( xObj.GetObject() );
368 0 : uno::Reference < beans::XPropertySet > xSet( xObj->getComponent(), uno::UNO_QUERY );
369 0 : if ( xSet.is() )
370 : {
371 : try
372 : {
373 0 : ScrollingMode eScroll = ScrollingAuto;
374 0 : if( pScrollingItem && pScrollingItem->GetValue() <= ScrollingAuto )
375 0 : eScroll = (ScrollingMode) pScrollingItem->GetValue();
376 :
377 0 : Size aMargin;
378 0 : if ( pMarginItem )
379 0 : aMargin = pMarginItem->GetSize();
380 :
381 0 : if ( pURLItem )
382 0 : xSet->setPropertyValue("FrameURL", uno::makeAny( OUString( pURLItem->GetValue() ) ) );
383 0 : if ( pNameItem )
384 0 : xSet->setPropertyValue("FrameName", uno::makeAny( OUString( pNameItem->GetValue() ) ) );
385 :
386 0 : if ( eScroll == ScrollingAuto )
387 0 : xSet->setPropertyValue("FrameIsAutoScroll",
388 0 : uno::makeAny( true ) );
389 : else
390 0 : xSet->setPropertyValue("FrameIsScrollingMode",
391 0 : uno::makeAny( eScroll == ScrollingYes ) );
392 :
393 0 : if ( pBorderItem )
394 0 : xSet->setPropertyValue("FrameIsBorder",
395 0 : uno::makeAny( pBorderItem->GetValue() ) );
396 :
397 0 : if ( pMarginItem )
398 : {
399 0 : xSet->setPropertyValue("FrameMarginWidth",
400 0 : uno::makeAny( sal_Int32( aMargin.Width() ) ) );
401 :
402 0 : xSet->setPropertyValue("FrameMarginHeight",
403 0 : uno::makeAny( sal_Int32( aMargin.Height() ) ) );
404 : }
405 : }
406 0 : catch (const uno::Exception&)
407 : {
408 : }
409 : }
410 :
411 0 : rSh.InsertOleObject( xObj );
412 : }
413 : else
414 : {
415 0 : rSh.InsertObject( xObj, 0, true, nSlot);
416 0 : rReq.Done();
417 0 : }
418 : }
419 0 : break;
420 : case SID_INSERT_DIAGRAM:
421 : {
422 0 : SvtModuleOptions aMOpt;
423 0 : if ( !aMOpt.IsChart() )
424 0 : break;
425 0 : if(!rReq.IsAPI())
426 : {
427 0 : SfxViewFrame* pVFrame = GetView().GetViewFrame();
428 0 : SwInsertChart( &GetView().GetEditWin(), &pVFrame->GetBindings() );
429 : }
430 : else
431 : {
432 0 : uno::Reference< chart2::data::XDataProvider > xDataProvider;
433 0 : bool bFillWithData = true;
434 0 : OUString aRangeString;
435 0 : if (!GetShell().IsTableComplexForChart())
436 : {
437 0 : SwFrameFormat* pTableFormat = GetShell().GetTableFormat();
438 0 : aRangeString = pTableFormat->GetName();
439 0 : aRangeString += OUString( '.' );
440 0 : aRangeString += GetShell().GetBoxNms();
441 :
442 : // get table data provider
443 0 : xDataProvider.set( GetView().GetDocShell()->getIDocumentChartDataProviderAccess()->GetChartDataProvider() );
444 : }
445 : else
446 0 : bFillWithData = false; // will create chart with only it's default image
447 :
448 0 : SwTableFUNC( &rSh, false ).InsertChart( xDataProvider, bFillWithData, aRangeString );
449 0 : rSh.LaunchOLEObj();
450 :
451 0 : svt::EmbeddedObjectRef& xObj = rSh.GetOLEObject();
452 0 : if(pItem && xObj.is())
453 : {
454 0 : Size aSize(static_cast<const SvxSizeItem*>(pItem)->GetSize());
455 : aSize = OutputDevice::LogicToLogic
456 0 : ( aSize, MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM ) );
457 :
458 0 : if(aSize.Width() > MINLAY&& aSize.Height()> MINLAY)
459 : {
460 0 : awt::Size aSz;
461 0 : aSz.Width = aSize.Width();
462 0 : aSz.Height = aSize.Height();
463 0 : xObj->setVisualAreaSize( xObj.GetViewAspect(), aSz );
464 : }
465 0 : }
466 0 : }
467 : }
468 0 : break;
469 :
470 : case FN_INSERT_SMA:
471 : {
472 : // #i34343# Inserting a math object into an autocompletion crashes
473 : // the suggestion has to be removed before
474 0 : GetView().GetEditWin().StopQuickHelp();
475 0 : SvGlobalName aGlobalName( SO3_SM_CLASSID );
476 0 : rSh.InsertObject( svt::EmbeddedObjectRef(), &aGlobalName, true, 0 );
477 : }
478 0 : break;
479 :
480 : case FN_INSERT_TABLE:
481 0 : InsertTable( rReq );
482 0 : break;
483 :
484 : case FN_INSERT_FRAME_INTERACT_NOCOL:
485 : case FN_INSERT_FRAME_INTERACT:
486 : {
487 0 : sal_uInt16 nCols = 1;
488 0 : bool bModifier1 = rReq.GetModifier() == KEY_MOD1;
489 0 : if(pArgs)
490 : {
491 0 : if(FN_INSERT_FRAME_INTERACT_NOCOL != nSlot &&
492 0 : pArgs->GetItemState(SID_ATTR_COLUMNS, false, &pItem) == SfxItemState::SET)
493 0 : nCols = static_cast<const SfxUInt16Item *>(pItem)->GetValue();
494 0 : if(pArgs->GetItemState(SID_MODIFIER, false, &pItem) == SfxItemState::SET)
495 0 : bModifier1 |= KEY_MOD1 == static_cast<const SfxUInt16Item *>(pItem)->GetValue();
496 : }
497 0 : if(bModifier1 )
498 : {
499 0 : SwEditWin& rEdtWin = GetView().GetEditWin();
500 0 : Size aWinSize = rEdtWin.GetSizePixel();
501 0 : Point aStartPos(aWinSize.Width()/2, aWinSize.Height() / 2);
502 0 : aStartPos = rEdtWin.PixelToLogic(aStartPos);
503 0 : aStartPos.X() -= 8 * MM50;
504 0 : aStartPos.Y() -= 4 * MM50;
505 0 : Size aSize(16 * MM50, 8 * MM50);
506 0 : GetShell().LockPaint();
507 0 : GetShell().StartAllAction();
508 0 : SwFlyFrmAttrMgr aMgr( true, GetShellPtr(), FRMMGR_TYPE_TEXT );
509 0 : if(nCols > 1)
510 : {
511 0 : SwFormatCol aCol;
512 0 : aCol.Init( nCols, aCol.GetGutterWidth(), aCol.GetWishWidth() );
513 0 : aMgr.SetCol( aCol );
514 : }
515 0 : aMgr.InsertFlyFrm(FLY_AT_PARA, aStartPos, aSize);
516 0 : GetShell().EndAllAction();
517 0 : GetShell().UnlockPaint();
518 : }
519 : else
520 : {
521 0 : GetView().InsFrmMode(nCols);
522 : }
523 0 : rReq.Ignore();
524 : }
525 0 : break;
526 : case FN_INSERT_FRAME:
527 : {
528 0 : bool bSingleCol = false;
529 0 : if( 0!= dynamic_cast< SwWebDocShell*>( GetView().GetDocShell()) )
530 : {
531 0 : SvxHtmlOptions& rHtmlOpt = SvxHtmlOptions::Get();
532 0 : if( HTML_CFG_MSIE == rHtmlOpt.GetExportMode() )
533 : {
534 0 : bSingleCol = true;
535 : }
536 :
537 : }
538 : // Create new border
539 0 : SwFlyFrmAttrMgr aMgr( true, GetShellPtr(), FRMMGR_TYPE_TEXT );
540 0 : if(pArgs)
541 : {
542 0 : Size aSize(aMgr.GetSize());
543 0 : aSize.Width() = GetShell().GetAnyCurRect(RECT_PAGE_PRT).Width();
544 0 : Point aPos = aMgr.GetPos();
545 0 : RndStdIds eAnchor = FLY_AT_PARA;
546 0 : if(pArgs->GetItemState(nSlot, false, &pItem) == SfxItemState::SET)
547 0 : eAnchor = (RndStdIds)static_cast<const SfxUInt16Item *>(pItem)->GetValue();
548 0 : if(pArgs->GetItemState(FN_PARAM_1, false, &pItem) == SfxItemState::SET)
549 0 : aPos = static_cast<const SfxPointItem *>(pItem)->GetValue();
550 0 : if(pArgs->GetItemState(FN_PARAM_2, false, &pItem) == SfxItemState::SET)
551 0 : aSize = static_cast<const SvxSizeItem *>(pItem)->GetSize();
552 0 : if(pArgs->GetItemState(SID_ATTR_COLUMNS, false, &pItem) == SfxItemState::SET)
553 : {
554 0 : const sal_uInt16 nCols = static_cast<const SfxUInt16Item *>(pItem)->GetValue();
555 0 : if( !bSingleCol && 1 < nCols )
556 : {
557 0 : SwFormatCol aFormatCol;
558 0 : aFormatCol.Init( nCols , (rReq.IsAPI() ? 0
559 0 : : DEF_GUTTER_WIDTH), USHRT_MAX );
560 0 : aMgr.SetCol(aFormatCol);
561 : }
562 : }
563 :
564 0 : GetShell().LockPaint();
565 0 : GetShell().StartAllAction();
566 :
567 0 : aMgr.InsertFlyFrm(eAnchor, aPos, aSize);
568 :
569 0 : GetShell().EndAllAction();
570 0 : GetShell().UnlockPaint();
571 : }
572 : else
573 : {
574 : static const sal_uInt16 aFrmAttrRange[] =
575 : {
576 : RES_FRMATR_BEGIN, RES_FRMATR_END-1,
577 : SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER,
578 : FN_GET_PRINT_AREA, FN_GET_PRINT_AREA,
579 : SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
580 : FN_SET_FRM_NAME, FN_SET_FRM_NAME,
581 : SID_HTML_MODE, SID_HTML_MODE,
582 : 0
583 : };
584 :
585 0 : SfxItemSet aSet(GetPool(), aFrmAttrRange );
586 0 : aSet.Put(SfxUInt16Item(SID_HTML_MODE, ::GetHtmlMode(GetView().GetDocShell())));
587 0 : const SwRect &rPg = GetShell().GetAnyCurRect(RECT_PAGE);
588 0 : SwFormatFrmSize aFrmSize(ATT_VAR_SIZE, rPg.Width(), rPg.Height());
589 0 : aFrmSize.SetWhich(GetPool().GetWhich(SID_ATTR_PAGE_SIZE));
590 0 : aSet.Put(aFrmSize);
591 :
592 0 : const SwRect &rPr = GetShell().GetAnyCurRect(RECT_PAGE_PRT);
593 0 : SwFormatFrmSize aPrtSize(ATT_VAR_SIZE, rPr.Width(), rPr.Height());
594 0 : aPrtSize.SetWhich(GetPool().GetWhich(FN_GET_PRINT_AREA));
595 0 : aSet.Put(aPrtSize);
596 :
597 0 : aSet.Put(aMgr.GetAttrSet());
598 0 : aSet.SetParent( aMgr.GetAttrSet().GetParent() );
599 :
600 : // Delete minimum size in columns.
601 0 : SvxBoxInfoItem aBoxInfo(static_cast<const SvxBoxInfoItem &>(aSet.Get(SID_ATTR_BORDER_INNER)));
602 0 : const SvxBoxItem& rBox = static_cast<const SvxBoxItem&>(aSet.Get(RES_BOX));
603 0 : aBoxInfo.SetMinDist(false);
604 0 : aBoxInfo.SetDefDist(rBox.GetDistance(SvxBoxItemLine::LEFT));
605 0 : aSet.Put(aBoxInfo);
606 :
607 0 : FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebDocShell, GetView().GetDocShell()));
608 0 : SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, static_cast< sal_uInt16 >(eMetric)));
609 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
610 : OSL_ENSURE(pFact, "Dialog creation failed!");
611 : boost::scoped_ptr<SfxAbstractTabDialog> pDlg(pFact->CreateFrmTabDialog("FrameDialog",
612 0 : GetView().GetViewFrame(),
613 0 : &GetView().GetViewFrame()->GetWindow(),
614 0 : aSet, true));
615 : OSL_ENSURE(pDlg, "Dialog creation failed!");
616 0 : if(pDlg->Execute() == RET_OK && pDlg->GetOutputItemSet())
617 : {
618 : //local variable necessary at least after call of .AutoCaption() because this could be deleted at this point
619 0 : SwWrtShell& rShell = GetShell();
620 0 : rShell.LockPaint();
621 0 : rShell.StartAllAction();
622 0 : rShell.StartUndo(UNDO_INSERT);
623 :
624 0 : const SfxItemSet* pOutSet = pDlg->GetOutputItemSet();
625 0 : aMgr.SetAttrSet(*pOutSet);
626 :
627 : // At first delete the selection at the ClickToEditField.
628 0 : if( rShell.IsInClickToEdit() )
629 0 : rShell.DelRight();
630 :
631 0 : aMgr.InsertFlyFrm();
632 :
633 : uno::Reference< frame::XDispatchRecorder > xRecorder =
634 0 : GetView().GetViewFrame()->GetBindings().GetRecorder();
635 0 : if ( xRecorder.is() )
636 : {
637 : //FN_INSERT_FRAME
638 0 : sal_uInt16 nAnchor = (sal_uInt16)aMgr.GetAnchor();
639 0 : rReq.AppendItem(SfxUInt16Item(nSlot, nAnchor));
640 0 : rReq.AppendItem(SfxPointItem(FN_PARAM_1, rShell.GetObjAbsPos()));
641 0 : rReq.AppendItem(SvxSizeItem(FN_PARAM_2, rShell.GetObjSize()));
642 0 : rReq.Done();
643 : }
644 :
645 0 : GetView().AutoCaption(FRAME_CAP);
646 :
647 : {
648 0 : SwRewriter aRewriter;
649 :
650 0 : aRewriter.AddRule(UndoArg1, SW_RESSTR(STR_FRAME));
651 :
652 0 : rShell.EndUndo(UNDO_INSERT, &aRewriter);
653 : }
654 0 : rShell.EndAllAction();
655 0 : rShell.UnlockPaint();
656 0 : }
657 : }
658 0 : break;
659 : }
660 : case FN_FORMAT_COLUMN :
661 : {
662 0 : SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
663 : OSL_ENSURE(pFact, "Dialog creation failed!");
664 0 : boost::scoped_ptr<VclAbstractDialog> pColDlg(pFact->CreateVclAbstractDialog( GetView().GetWindow(), rSh, DLG_COLUMN));
665 : OSL_ENSURE(pColDlg, "Dialog creation failed!");
666 0 : pColDlg->Execute();
667 : }
668 0 : break;
669 :
670 : default:
671 : OSL_ENSURE(false, "wrong dispatcher");
672 0 : return;
673 : }
674 : }
675 :
676 0 : static bool lcl_IsMarkInSameSection( SwWrtShell& rWrtSh, const SwSection* pSect )
677 : {
678 0 : rWrtSh.SwapPam();
679 0 : bool bRet = pSect == rWrtSh.GetCurrSection();
680 0 : rWrtSh.SwapPam();
681 0 : return bRet;
682 : }
683 :
684 1066 : void SwTextShell::StateInsert( SfxItemSet &rSet )
685 : {
686 1066 : const bool bHtmlModeOn = ::GetHtmlMode(GetView().GetDocShell()) & HTMLMODE_ON;
687 1066 : SfxWhichIter aIter( rSet );
688 1066 : SwWrtShell &rSh = GetShell();
689 1066 : sal_uInt16 nWhich = aIter.FirstWhich();
690 2132 : SvtModuleOptions aMOpt;
691 : SfxObjectCreateMode eCreateMode =
692 1066 : GetView().GetDocShell()->GetCreateMode();
693 :
694 1066 : rSh.Push();
695 1066 : const bool bCrsrInHidden = rSh.SelectHiddenRange();
696 1066 : rSh.Pop();
697 :
698 3588 : while ( nWhich )
699 : {
700 1456 : switch ( nWhich )
701 : {
702 : case SID_INSERT_AVMEDIA:
703 : case SID_INSERT_SOUND:
704 : case SID_INSERT_VIDEO:
705 0 : if ( GetShell().IsSelFrmMode()
706 0 : || GetShell().CrsrInsideInputField()
707 0 : || SfxObjectCreateMode::EMBEDDED == eCreateMode
708 0 : || bCrsrInHidden )
709 : {
710 0 : rSet.DisableItem( nWhich );
711 : }
712 0 : break;
713 :
714 : case SID_INSERT_DIAGRAM:
715 1456 : if( !aMOpt.IsChart()
716 728 : || GetShell().CrsrInsideInputField()
717 728 : || eCreateMode == SfxObjectCreateMode::EMBEDDED
718 1456 : || bCrsrInHidden )
719 : {
720 0 : rSet.DisableItem( nWhich );
721 : }
722 728 : break;
723 :
724 : case FN_INSERT_SMA:
725 1454 : if( !aMOpt.IsMath()
726 727 : || eCreateMode == SfxObjectCreateMode::EMBEDDED
727 727 : || bCrsrInHidden
728 1454 : || rSh.CrsrInsideInputField() )
729 : {
730 0 : rSet.DisableItem( nWhich );
731 : }
732 727 : break;
733 :
734 : case SID_INSERT_FLOATINGFRAME:
735 : case SID_INSERT_OBJECT:
736 : case SID_INSERT_PLUGIN:
737 : {
738 1 : if( eCreateMode == SfxObjectCreateMode::EMBEDDED || bCrsrInHidden )
739 : {
740 0 : rSet.DisableItem( nWhich );
741 : }
742 2 : else if( GetShell().IsSelFrmMode()
743 1 : || GetShell().CrsrInsideInputField() )
744 : {
745 0 : rSet.DisableItem( nWhich );
746 : }
747 1 : else if(SID_INSERT_FLOATINGFRAME == nWhich && bHtmlModeOn)
748 : {
749 0 : SvxHtmlOptions& rHtmlOpt = SvxHtmlOptions::Get();
750 0 : const sal_uInt16 nExport = rHtmlOpt.GetExportMode();
751 0 : if(HTML_CFG_MSIE != nExport && HTML_CFG_WRITER != nExport )
752 0 : rSet.DisableItem(nWhich);
753 : }
754 : }
755 1 : break;
756 :
757 : case FN_INSERT_FRAME_INTERACT_NOCOL :
758 : case FN_INSERT_FRAME_INTERACT:
759 : {
760 0 : if( GetShell().IsSelFrmMode()
761 0 : || GetShell().CrsrInsideInputField()
762 0 : || bCrsrInHidden )
763 0 : rSet.DisableItem(nWhich);
764 : }
765 0 : break;
766 :
767 : case SID_HYPERLINK_GETLINK:
768 : {
769 0 : SfxItemSet aSet(GetPool(), RES_TXTATR_INETFMT, RES_TXTATR_INETFMT);
770 0 : rSh.GetCurAttr( aSet );
771 :
772 0 : SvxHyperlinkItem aHLinkItem;
773 : const SfxPoolItem* pItem;
774 0 : if(SfxItemState::SET == aSet.GetItemState(RES_TXTATR_INETFMT, false, &pItem))
775 : {
776 0 : const SwFormatINetFormat* pINetFormat = static_cast<const SwFormatINetFormat*>(pItem);
777 0 : aHLinkItem.SetURL(pINetFormat->GetValue());
778 0 : aHLinkItem.SetTargetFrame(pINetFormat->GetTargetFrame());
779 0 : aHLinkItem.SetIntName(pINetFormat->GetName());
780 0 : const SvxMacro *pMacro = pINetFormat->GetMacro( SFX_EVENT_MOUSEOVER_OBJECT );
781 0 : if( pMacro )
782 0 : aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSEOVER_OBJECT, *pMacro);
783 :
784 0 : pMacro = pINetFormat->GetMacro( SFX_EVENT_MOUSECLICK_OBJECT );
785 0 : if( pMacro )
786 0 : aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSECLICK_OBJECT, *pMacro);
787 :
788 0 : pMacro = pINetFormat->GetMacro( SFX_EVENT_MOUSEOUT_OBJECT );
789 0 : if( pMacro )
790 0 : aHLinkItem.SetMacro(HYPERDLG_EVENT_MOUSEOUT_OBJECT, *pMacro);
791 :
792 : // Get the text of the Link.
793 0 : rSh.StartAction();
794 0 : rSh.CreateCrsr();
795 0 : rSh.SwCrsrShell::SelectTextAttr(RES_TXTATR_INETFMT,true);
796 0 : OUString sLinkName = rSh.GetSelText();
797 0 : aHLinkItem.SetName(sLinkName);
798 0 : aHLinkItem.SetInsertMode(HLINK_FIELD);
799 0 : rSh.DestroyCrsr();
800 0 : rSh.EndAction();
801 : }
802 : else
803 : {
804 0 : OUString sReturn = rSh.GetSelText();
805 0 : sReturn = sReturn.copy(0, std::min<sal_Int32>(255, sReturn.getLength()));
806 0 : aHLinkItem.SetName(comphelper::string::stripEnd(sReturn, ' '));
807 : }
808 :
809 0 : aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
810 0 : (bHtmlModeOn ? HLINK_HTMLMODE : 0)));
811 : aHLinkItem.SetMacroEvents ( HYPERDLG_EVENT_MOUSEOVER_OBJECT|
812 0 : HYPERDLG_EVENT_MOUSECLICK_OBJECT | HYPERDLG_EVENT_MOUSEOUT_OBJECT );
813 :
814 0 : rSet.Put(aHLinkItem);
815 : }
816 0 : break;
817 :
818 : case FN_INSERT_FRAME:
819 0 : if (rSh.IsSelFrmMode() )
820 : {
821 0 : const int nSel = rSh.GetSelectionType();
822 0 : if( ((nsSelectionType::SEL_GRF | nsSelectionType::SEL_OLE ) & nSel ) || bCrsrInHidden )
823 0 : rSet.DisableItem(nWhich);
824 : }
825 0 : else if ( rSh.CrsrInsideInputField() )
826 : {
827 0 : rSet.DisableItem(nWhich);
828 : }
829 0 : break;
830 :
831 : case FN_FORMAT_COLUMN :
832 : {
833 : //#i80458# column dialog cannot work if the selection contains different page styles and different sections
834 0 : bool bDisable = true;
835 0 : if( rSh.GetFlyFrameFormat() || rSh.GetSelectedPageDescs() )
836 0 : bDisable = false;
837 0 : if( bDisable )
838 : {
839 0 : const SwSection* pCurrSection = rSh.GetCurrSection();
840 0 : const sal_uInt16 nFullSectCnt = rSh.GetFullSelectedSectionCount();
841 0 : if( pCurrSection && ( !rSh.HasSelection() || 0 != nFullSectCnt ))
842 0 : bDisable = false;
843 0 : else if(
844 0 : rSh.HasSelection() && rSh.IsInsRegionAvailable() &&
845 0 : ( !pCurrSection || ( 1 != nFullSectCnt &&
846 0 : lcl_IsMarkInSameSection( rSh, pCurrSection ) )))
847 0 : bDisable = false;
848 : }
849 0 : if(bDisable)
850 0 : rSet.DisableItem(nWhich);
851 : }
852 0 : break;
853 : }
854 1456 : nWhich = aIter.NextWhich();
855 1066 : }
856 1066 : }
857 :
858 0 : void SwTextShell::ExecDelete(SfxRequest &rReq)
859 : {
860 0 : SwWrtShell &rSh = GetShell();
861 0 : switch( rReq.GetSlot() )
862 : {
863 : case FN_DELETE_SENT:
864 0 : if( rSh.IsTableMode() )
865 : {
866 0 : rSh.DeleteRow();
867 0 : rSh.EnterStdMode();
868 : }
869 : else
870 0 : rSh.DelToEndOfSentence();
871 0 : break;
872 : case FN_DELETE_BACK_SENT:
873 0 : rSh.DelToStartOfSentence();
874 0 : break;
875 : case FN_DELETE_WORD:
876 0 : rSh.DelNxtWord();
877 0 : break;
878 : case FN_DELETE_BACK_WORD:
879 0 : rSh.DelPrvWord();
880 0 : break;
881 : case FN_DELETE_LINE:
882 0 : rSh.DelToEndOfLine();
883 0 : break;
884 : case FN_DELETE_BACK_LINE:
885 0 : rSh.DelToStartOfLine();
886 0 : break;
887 : case FN_DELETE_PARA:
888 0 : rSh.DelToEndOfPara();
889 0 : break;
890 : case FN_DELETE_BACK_PARA:
891 0 : rSh.DelToStartOfPara();
892 0 : break;
893 : case FN_DELETE_WHOLE_LINE:
894 0 : rSh.DelLine();
895 0 : break;
896 : default:
897 : OSL_ENSURE(false, "wrong dispatcher");
898 0 : return;
899 : }
900 0 : rReq.Done();
901 : }
902 :
903 0 : void SwTextShell::ExecTransliteration( SfxRequest & rReq )
904 : {
905 : using namespace ::com::sun::star::i18n;
906 0 : sal_uInt32 nMode = 0;
907 :
908 0 : switch( rReq.GetSlot() )
909 : {
910 : case SID_TRANSLITERATE_SENTENCE_CASE:
911 0 : nMode = TransliterationModulesExtra::SENTENCE_CASE;
912 0 : break;
913 : case SID_TRANSLITERATE_TITLE_CASE:
914 0 : nMode = TransliterationModulesExtra::TITLE_CASE;
915 0 : break;
916 : case SID_TRANSLITERATE_TOGGLE_CASE:
917 0 : nMode = TransliterationModulesExtra::TOGGLE_CASE;
918 0 : break;
919 : case SID_TRANSLITERATE_UPPER:
920 0 : nMode = TransliterationModules_LOWERCASE_UPPERCASE;
921 0 : break;
922 : case SID_TRANSLITERATE_LOWER:
923 0 : nMode = TransliterationModules_UPPERCASE_LOWERCASE;
924 0 : break;
925 :
926 : case SID_TRANSLITERATE_HALFWIDTH:
927 0 : nMode = TransliterationModules_FULLWIDTH_HALFWIDTH;
928 0 : break;
929 : case SID_TRANSLITERATE_FULLWIDTH:
930 0 : nMode = TransliterationModules_HALFWIDTH_FULLWIDTH;
931 0 : break;
932 :
933 : case SID_TRANSLITERATE_HIRAGANA:
934 0 : nMode = TransliterationModules_KATAKANA_HIRAGANA;
935 0 : break;
936 : case SID_TRANSLITERATE_KATAGANA:
937 0 : nMode = TransliterationModules_HIRAGANA_KATAKANA;
938 0 : break;
939 :
940 : default:
941 : OSL_ENSURE(false, "wrong dispatcher");
942 : }
943 :
944 0 : if( nMode )
945 0 : GetShell().TransliterateText( nMode );
946 0 : }
947 :
948 0 : void SwTextShell::ExecRotateTransliteration( SfxRequest & rReq )
949 : {
950 0 : if( rReq.GetSlot() == SID_TRANSLITERATE_ROTATE_CASE )
951 0 : GetShell().TransliterateText( m_aRotateCase.getNextMode() );
952 0 : }
953 :
954 2778 : SwTextShell::SwTextShell(SwView &_rView) :
955 2778 : SwBaseShell(_rView), pPostItFieldMgr( 0 )
956 : {
957 2778 : SetName(OUString("Text"));
958 2778 : SetHelpId(SW_TEXTSHELL);
959 2778 : SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_Text));
960 2778 : }
961 :
962 5546 : SwTextShell::~SwTextShell()
963 : {
964 5546 : }
965 :
966 0 : void SwTextShell::InsertSymbol( SfxRequest& rReq )
967 : {
968 0 : const SfxItemSet *pArgs = rReq.GetArgs();
969 0 : const SfxPoolItem* pItem = 0;
970 0 : if( pArgs )
971 0 : pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), false, &pItem);
972 :
973 0 : OUString aChars, aFontName;
974 0 : if ( pItem )
975 : {
976 0 : aChars = static_cast<const SfxStringItem*>(pItem)->GetValue();
977 0 : const SfxPoolItem* pFtItem = NULL;
978 0 : pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), false, &pFtItem);
979 0 : const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
980 0 : if ( pFontItem )
981 0 : aFontName = pFontItem->GetValue();
982 : }
983 :
984 0 : SwWrtShell &rSh = GetShell();
985 0 : SfxItemSet aSet( GetPool(), RES_CHRATR_FONT, RES_CHRATR_FONT,
986 : RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT,
987 : RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT,
988 0 : 0 );
989 0 : rSh.GetCurAttr( aSet );
990 0 : SvtScriptType nScript = rSh.GetScriptType();
991 :
992 0 : SvxFontItem aFont( RES_CHRATR_FONT );
993 : {
994 0 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() );
995 0 : aSetItem.GetItemSet().Put( aSet, false );
996 0 : const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript );
997 0 : if( pI )
998 0 : aFont = *static_cast<const SvxFontItem*>(pI);
999 : else
1000 : aFont = static_cast<const SvxFontItem&>(
1001 : aSet.Get(
1002 : GetWhichOfScript(
1003 : RES_CHRATR_FONT,
1004 0 : SvtLanguageOptions::GetI18NScriptTypeOfLanguage( GetAppLanguage() ) )));
1005 0 : if (aFontName.isEmpty())
1006 0 : aFontName = aFont.GetFamilyName();
1007 : }
1008 :
1009 0 : vcl::Font aNewFont(aFontName, Size(1,1)); // Size only because CTOR.
1010 0 : if( aChars.isEmpty() )
1011 : {
1012 : // Set selected font as default.
1013 0 : SfxAllItemSet aAllSet( rSh.GetAttrPool() );
1014 0 : aAllSet.Put( SfxBoolItem( FN_PARAM_1, false ) );
1015 :
1016 0 : SwViewOption aOpt(*GetShell().GetViewOptions());
1017 0 : OUString sSymbolFont = aOpt.GetSymbolFont();
1018 0 : if( aFontName.isEmpty() && !sSymbolFont.isEmpty() )
1019 0 : aAllSet.Put( SfxStringItem( SID_FONT_NAME, sSymbolFont ) );
1020 : else
1021 0 : aAllSet.Put( SfxStringItem( SID_FONT_NAME, aFont.GetFamilyName() ) );
1022 :
1023 0 : SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1024 0 : boost::scoped_ptr<SfxAbstractDialog> pDlg(pFact->CreateSfxDialog( GetView().GetWindow(), aAllSet,
1025 0 : GetView().GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP ));
1026 0 : if( RET_OK == pDlg->Execute() )
1027 : {
1028 0 : SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pCItem, SfxStringItem, SID_CHARMAP, false );
1029 0 : SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, false );
1030 0 : if ( pFontItem )
1031 : {
1032 0 : aNewFont.SetName( pFontItem->GetFamilyName() );
1033 0 : aNewFont.SetStyleName( pFontItem->GetStyleName() );
1034 0 : aNewFont.SetCharSet( pFontItem->GetCharSet() );
1035 0 : aNewFont.SetPitch( pFontItem->GetPitch() );
1036 : }
1037 :
1038 0 : if ( pCItem )
1039 : {
1040 0 : aChars = pCItem->GetValue();
1041 0 : aOpt.SetSymbolFont(aNewFont.GetName());
1042 0 : SW_MOD()->ApplyUsrPref(aOpt, &GetView());
1043 : }
1044 0 : }
1045 : }
1046 :
1047 0 : if( !aChars.isEmpty() )
1048 : {
1049 0 : rSh.StartAllAction();
1050 :
1051 : // Delete selected content.
1052 0 : SwRewriter aRewriter;
1053 0 : aRewriter.AddRule(UndoArg1, SW_RESSTR(STR_SPECIALCHAR));
1054 :
1055 0 : rSh.StartUndo( UNDO_INSERT, &aRewriter );
1056 0 : if ( rSh.HasSelection() )
1057 : {
1058 0 : rSh.DelRight();
1059 0 : aSet.ClearItem();
1060 0 : rSh.GetCurAttr( aSet );
1061 :
1062 0 : SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() );
1063 0 : aSetItem.GetItemSet().Put( aSet, false );
1064 0 : const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript );
1065 0 : if( pI )
1066 0 : aFont = *static_cast<const SvxFontItem*>(pI);
1067 : else
1068 : aFont = static_cast<const SvxFontItem&>(aSet.Get( GetWhichOfScript(
1069 : RES_CHRATR_FONT,
1070 0 : SvtLanguageOptions::GetI18NScriptTypeOfLanguage( GetAppLanguage() ) )));
1071 : }
1072 :
1073 : // Insert character.
1074 0 : rSh.Insert( aChars );
1075 :
1076 : // #108876# a font attribute has to be set always due to a guessed script type
1077 0 : if( !aNewFont.GetName().isEmpty() )
1078 : {
1079 0 : SvxFontItem aNewFontItem( aFont );
1080 0 : aNewFontItem.SetFamilyName( aNewFont.GetName());
1081 0 : aNewFontItem.SetFamily( aNewFont.GetFamily());
1082 0 : aNewFontItem.SetPitch( aNewFont.GetPitch());
1083 0 : aNewFontItem.SetCharSet( aNewFont.GetCharSet() );
1084 :
1085 0 : SfxItemSet aRestoreSet( GetPool(), RES_CHRATR_FONT, RES_CHRATR_FONT,
1086 : RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT,
1087 0 : RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT, 0 );
1088 :
1089 0 : nScript = g_pBreakIt->GetAllScriptsOfText( aChars );
1090 0 : if( SvtScriptType::LATIN & nScript )
1091 : {
1092 0 : aRestoreSet.Put( aSet.Get( RES_CHRATR_FONT, true ) );
1093 0 : aSet.Put( aNewFontItem, RES_CHRATR_FONT);
1094 : }
1095 0 : if( SvtScriptType::ASIAN & nScript )
1096 : {
1097 0 : aRestoreSet.Put( aSet.Get( RES_CHRATR_CJK_FONT, true ) );
1098 0 : aSet.Put( aNewFontItem, RES_CHRATR_CJK_FONT );
1099 : }
1100 0 : if( SvtScriptType::COMPLEX & nScript )
1101 : {
1102 0 : aRestoreSet.Put( aSet.Get( RES_CHRATR_CTL_FONT, true ) );
1103 0 : aSet.Put( aNewFontItem, RES_CHRATR_CTL_FONT );
1104 : }
1105 :
1106 0 : rSh.SetMark();
1107 0 : rSh.ExtendSelection( false, aChars.getLength() );
1108 0 : rSh.SetAttrSet( aSet, SetAttrMode::DONTEXPAND | SetAttrMode::NOFORMATATTR );
1109 0 : if( !rSh.IsCrsrPtAtEnd() )
1110 0 : rSh.SwapPam();
1111 :
1112 0 : rSh.ClearMark();
1113 :
1114 : // #i75891#
1115 : // SETATTR_DONTEXPAND does not work if there are already hard attributes.
1116 : // Therefore we have to restore the font attributes.
1117 0 : rSh.SetMark();
1118 0 : rSh.SetAttrSet( aRestoreSet );
1119 0 : rSh.ClearMark();
1120 :
1121 0 : rSh.UpdateAttr();
1122 0 : aFont = aNewFontItem;
1123 : }
1124 :
1125 0 : rSh.EndAllAction();
1126 0 : rSh.EndUndo();
1127 :
1128 0 : if ( !aChars.isEmpty() )
1129 : {
1130 0 : rReq.AppendItem( SfxStringItem( GetPool().GetWhich(SID_CHARMAP), aChars ) );
1131 0 : rReq.AppendItem( SfxStringItem( SID_ATTR_SPECIALCHAR, aNewFont.GetName() ) );
1132 0 : rReq.Done();
1133 0 : }
1134 0 : }
1135 177 : }
1136 :
1137 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|