xref: /trunk/main/sw/source/ui/shells/annotsh.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 #include <hintids.hxx>
32 
33 #include <com/sun/star/i18n/TransliterationModules.hpp>
34 #include <com/sun/star/i18n/TransliterationModulesExtra.hpp>
35 #include <com/sun/star/i18n/TextConversionOption.hpp>
36 #include <com/sun/star/ui/dialogs/XExecutableDialog.hpp>
37 #include <com/sun/star/lang/XInitialization.hpp>
38 
39 #include <tools/shl.hxx>
40 #include <i18npool/mslangid.hxx>
41 #include <sfx2/objface.hxx>
42 #include <sfx2/viewfrm.hxx>
43 #include <sfx2/bindings.hxx>
44 #include <sfx2/dispatch.hxx>
45 #include <sfx2/request.hxx>
46 #include <editeng/spltitem.hxx>
47 #include <editeng/orphitem.hxx>
48 #include <editeng/brkitem.hxx>
49 #include <editeng/widwitem.hxx>
50 #include <editeng/kernitem.hxx>
51 #include <editeng/escpitem.hxx>
52 #include <editeng/lspcitem.hxx>
53 #include <editeng/adjitem.hxx>
54 #include <editeng/crsditem.hxx>
55 #include <editeng/shdditem.hxx>
56 #include <editeng/hyznitem.hxx>
57 #include <editeng/udlnitem.hxx>
58 #include <editeng/fontitem.hxx>
59 #include <editeng/fhgtitem.hxx>
60 #include <svx/clipfmtitem.hxx>
61 #include <svl/stritem.hxx>
62 #include <svl/slstitm.hxx>
63 #include <editeng/colritem.hxx>
64 #include <editeng/wghtitem.hxx>
65 #include <editeng/cntritem.hxx>
66 #include <editeng/postitem.hxx>
67 #include <editeng/frmdiritem.hxx>
68 #include <svx/svdoutl.hxx>
69 #include <svl/whiter.hxx>
70 #include <svl/cjkoptions.hxx>
71 #include <svl/ctloptions.hxx>
72 #include <unotools/useroptions.hxx>
73 #include <vcl/msgbox.hxx>
74 #include <editeng/flditem.hxx>
75 #include <editeng/editstat.hxx>
76 #include <svx/hlnkitem.hxx>
77 #include <svx/htmlmode.hxx>
78 #include <editeng/langitem.hxx>
79 #include <editeng/unolingu.hxx>
80 #include <editeng/scripttypeitem.hxx>
81 #include <editeng/writingmodeitem.hxx>
82 #include <swundo.hxx>
83 #include <doc.hxx>
84 #include <viewopt.hxx>
85 #include <wrtsh.hxx>
86 #include <uitool.hxx>
87 #include <popup.hrc>
88 #include <pardlg.hxx>
89 #include <swdtflvr.hxx>
90 #include <drwtxtsh.hxx>
91 #include <swmodule.hxx>
92 #include <initui.hxx>
93 #include <edtwin.hxx>
94 #include <swwait.hxx>
95 #include <docstat.hxx>
96 
97 #include <cmdid.h>
98 #include <globals.hrc>
99 #include <shells.hrc>
100 #include <breakit.hxx>
101 #include "annotsh.hxx"
102 #include "view.hxx"
103 #include <PostItMgr.hxx>
104 #include <SidebarWin.hxx>
105 
106 #include "swtypes.hxx"
107 
108 #include <svx/svxdlg.hxx>
109 #include <svx/dialogs.hrc>
110 
111 #include <svx/svxids.hrc>
112 #include <svl/itempool.hxx>
113 #include <editeng/outliner.hxx>
114 #include <editeng/editeng.hxx>
115 #include <editeng/editview.hxx>
116 
117 #include <svl/languageoptions.hxx>
118 #include <editeng/langitem.hxx>
119 #include <svtools/langtab.hxx>
120 #include <svl/slstitm.hxx>
121 
122 #include <docsh.hxx>
123 #include <svl/undo.hxx>
124 #include "swabstdlg.hxx"
125 #include "chrdlg.hrc"
126 #include "misc.hrc"
127 #include <app.hrc>
128 
129 #include <comphelper/processfactory.hxx>
130 
131 #include <cppuhelper/bootstrap.hxx>
132 
133 #include <langhelper.hxx>
134 
135 using namespace ::com::sun::star;
136 using namespace ::com::sun::star::uno;
137 using namespace ::com::sun::star::beans;
138 using namespace ::com::sun::star::i18n;
139 
140 #define SwAnnotationShell
141 
142 #include <sfx2/msg.hxx>
143 #include <swslots.hxx>
144 
145 SFX_IMPL_INTERFACE(SwAnnotationShell, SfxShell, SW_RES(STR_SHELLNAME_DRAW_TEXT))
146 {
147     SFX_OBJECTBAR_REGISTRATION(SFX_OBJECTBAR_OBJECT, SW_RES(RID_TEXT_TOOLBOX));
148     SFX_POPUPMENU_REGISTRATION(SW_RES(MN_ANNOTATION_POPUPMENU));
149 }
150 
151 TYPEINIT1(SwAnnotationShell,SfxShell)
152 
153 SwAnnotationShell::SwAnnotationShell( SwView& r )
154 : rView(r)
155 {
156     SwWrtShell &rSh = rView.GetWrtShell();
157     SetPool(rSh.GetAttrPool().GetSecondaryPool());
158 }
159 
160 SwAnnotationShell::~SwAnnotationShell()
161 {
162 }
163 
164 ::svl::IUndoManager* SwAnnotationShell::GetUndoManager()
165 {
166     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
167     if ( !pPostItMgr ||
168          !pPostItMgr->HasActiveSidebarWin() )
169     {
170         DBG_ASSERT(pPostItMgr,"PostItMgr::Layout(): We are looping forever");
171         return 0;
172     }
173     return &pPostItMgr->GetActiveSidebarWin()->GetOutlinerView()->GetOutliner()->GetUndoManager();
174 }
175 
176 void SwAnnotationShell::Exec( SfxRequest &rReq )
177 {
178     //TODO: clean this up!!!!
179     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
180     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
181         return;
182 
183     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
184     SfxItemSet aEditAttr(pOLV->GetAttribs());
185     SfxItemSet aNewAttr(*aEditAttr.GetPool(), aEditAttr.GetRanges());
186 
187     sal_uInt16 nSlot = rReq.GetSlot();
188     sal_uInt16 nWhich = GetPool().GetWhich(nSlot);
189     const SfxItemSet *pNewAttrs = rReq.GetArgs();
190     sal_uInt16 nEEWhich = 0;
191     switch (nSlot)
192     {
193         case SID_ATTR_CHAR_FONT:
194         case SID_ATTR_CHAR_FONTHEIGHT:
195         case SID_ATTR_CHAR_WEIGHT:
196         case SID_ATTR_CHAR_POSTURE:
197             {
198                 SfxItemPool* pSecondPool = aEditAttr.GetPool()->GetSecondaryPool();
199                 if( !pSecondPool )
200                     pSecondPool = aEditAttr.GetPool();
201                 SvxScriptSetItem aSetItem( nSlot, *pSecondPool );
202                 aSetItem.PutItemForScriptType( pOLV->GetSelectedScriptType(), pNewAttrs->Get( nWhich ));
203                 aNewAttr.Put( aSetItem.GetItemSet() );
204                 rReq.Done();
205                 break;
206             }
207         case SID_ATTR_CHAR_COLOR: nEEWhich = EE_CHAR_COLOR; break;
208         case SID_ATTR_CHAR_UNDERLINE:
209         {
210             FontUnderline eFU = ((const SvxUnderlineItem&)aEditAttr.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
211             aNewAttr.Put(SvxUnderlineItem(eFU == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_UNDERLINE));
212             break;
213         }
214         case SID_ATTR_CHAR_OVERLINE:
215         {
216             FontUnderline eFO = ((const SvxOverlineItem&)aEditAttr.Get(EE_CHAR_OVERLINE)).GetLineStyle();
217             aNewAttr.Put(SvxOverlineItem(eFO == UNDERLINE_SINGLE ? UNDERLINE_NONE : UNDERLINE_SINGLE, EE_CHAR_OVERLINE));
218             break;
219         }
220         case SID_ATTR_CHAR_CONTOUR:     nEEWhich = EE_CHAR_OUTLINE; break;
221         case SID_ATTR_CHAR_SHADOWED:    nEEWhich = EE_CHAR_SHADOW; break;
222         case SID_ATTR_CHAR_STRIKEOUT:   nEEWhich = EE_CHAR_STRIKEOUT; break;
223         case SID_ATTR_CHAR_WORDLINEMODE: nEEWhich = EE_CHAR_WLM; break;
224         case SID_ATTR_CHAR_RELIEF      : nEEWhich = EE_CHAR_RELIEF;  break;
225         case SID_ATTR_CHAR_LANGUAGE    : nEEWhich = EE_CHAR_LANGUAGE;break;
226         case SID_ATTR_CHAR_KERNING     : nEEWhich = EE_CHAR_KERNING; break;
227         case SID_ATTR_CHAR_SCALEWIDTH:   nEEWhich = EE_CHAR_FONTWIDTH; break;
228         case SID_ATTR_CHAR_AUTOKERN  :   nEEWhich = EE_CHAR_PAIRKERNING; break;
229         case SID_ATTR_CHAR_ESCAPEMENT:   nEEWhich = EE_CHAR_ESCAPEMENT; break;
230         case SID_ATTR_PARA_ADJUST_LEFT:
231             aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_LEFT, EE_PARA_JUST));
232         break;
233         case SID_ATTR_PARA_ADJUST_CENTER:
234             aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_CENTER, EE_PARA_JUST));
235         break;
236         case SID_ATTR_PARA_ADJUST_RIGHT:
237             aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_RIGHT, EE_PARA_JUST));
238         break;
239         case SID_ATTR_PARA_ADJUST_BLOCK:
240             aNewAttr.Put(SvxAdjustItem(SVX_ADJUST_BLOCK, EE_PARA_JUST));
241         break;
242 
243         case SID_ATTR_PARA_LINESPACE_10:
244         {
245             SvxLineSpacingItem aItem(SVX_LINESPACE_ONE_LINE, EE_PARA_SBL);
246             aItem.SetPropLineSpace(100);
247             aNewAttr.Put(aItem);
248         }
249         break;
250         case SID_ATTR_PARA_LINESPACE_15:
251         {
252             SvxLineSpacingItem aItem(SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL);
253             aItem.SetPropLineSpace(150);
254             aNewAttr.Put(aItem);
255         }
256         break;
257         case SID_ATTR_PARA_LINESPACE_20:
258         {
259             SvxLineSpacingItem aItem(SVX_LINESPACE_TWO_LINES, EE_PARA_SBL);
260             aItem.SetPropLineSpace(200);
261             aNewAttr.Put(aItem);
262         }
263         break;
264         case SID_SELECTALL:
265         {
266             Outliner * pOutliner = pOLV->GetOutliner();
267             if(pOutliner)
268             {
269                 sal_uLong nParaCount = pOutliner->GetParagraphCount();
270                 if (nParaCount > 0)
271                     pOLV->SelectRange(0L, sal_uInt16(nParaCount) );
272             }
273             break;
274         }
275         case FN_FORMAT_RESET:
276         {
277             pPostItMgr->GetActiveSidebarWin()->ResetAttributes();
278             rReq.Done();
279             break;
280         }
281         case FN_SET_SUPER_SCRIPT:
282         {
283             SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
284             SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
285                             aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
286 
287             if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
288                 aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
289             else
290                 aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
291             aNewAttr.Put( aItem, EE_CHAR_ESCAPEMENT );
292         }
293         break;
294         case FN_SET_SUB_SCRIPT:
295         {
296             SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
297             SvxEscapement eEsc = (SvxEscapement ) ( (const SvxEscapementItem&)
298                             aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
299 
300             if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
301                 aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
302             else
303                 aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
304             aNewAttr.Put( aItem, EE_CHAR_ESCAPEMENT );
305         }
306         break;
307         case SID_HYPERLINK_SETLINK:
308         {
309             const SfxPoolItem* pItem = 0;
310             if(pNewAttrs)
311                 pNewAttrs->GetItemState(nSlot, sal_False, &pItem);
312 
313             if(pItem)
314             {
315                 const SvxHyperlinkItem& rHLinkItem = *(const SvxHyperlinkItem *)pItem;
316                 SvxURLField aFld(rHLinkItem.GetURL(), rHLinkItem.GetName(), SVXURLFORMAT_APPDEFAULT);
317                 aFld.SetTargetFrame(rHLinkItem.GetTargetFrame());
318 
319                 const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
320 
321                 if (pFieldItem && pFieldItem->GetField()->ISA(SvxURLField))
322                 {
323                     // Feld selektieren, so dass es beim Insert geloescht wird
324                     ESelection aSel = pOLV->GetSelection();
325                     aSel.nEndPos++;
326                     pOLV->SetSelection(aSel);
327                 }
328                 if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED)
329                     pOLV->InsertField(SvxFieldItem(aFld, EE_FEATURE_FIELD));
330             }
331             break;
332         }
333         case FN_INSERT_SOFT_HYPHEN:
334         case FN_INSERT_HARDHYPHEN:
335         case FN_INSERT_HARD_SPACE:
336         case SID_INSERT_RLM :
337         case SID_INSERT_LRM :
338         case SID_INSERT_ZWNBSP :
339         case SID_INSERT_ZWSP:
340         {
341             sal_Unicode cIns = 0;
342             switch(rReq.GetSlot())
343             {
344                 case FN_INSERT_SOFT_HYPHEN: cIns = CHAR_SOFTHYPHEN; break;
345                 case FN_INSERT_HARDHYPHEN: cIns = CHAR_HARDHYPHEN; break;
346                 case FN_INSERT_HARD_SPACE: cIns = CHAR_HARDBLANK; break;
347                 case SID_INSERT_RLM : cIns = CHAR_RLM ; break;
348                 case SID_INSERT_LRM : cIns = CHAR_LRM ; break;
349                 case SID_INSERT_ZWSP : cIns = CHAR_ZWSP ; break;
350                 case SID_INSERT_ZWNBSP: cIns = CHAR_ZWNBSP; break;
351             }
352             pOLV->InsertText( String(cIns));
353             rReq.Done();
354             break;
355         }
356         case SID_CHARMAP:
357         {
358             if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED)
359                 InsertSymbol(rReq);
360             break;
361         }
362             case FN_INSERT_STRING:
363                 {
364             const SfxPoolItem* pItem = 0;
365             if(pNewAttrs)
366                 pNewAttrs->GetItemState(nSlot, sal_False, &pItem );
367                         if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED)
368                                 pOLV->InsertText(((const SfxStringItem *)pItem)->GetValue());
369                         break;
370                 }
371 
372         case FN_FORMAT_FOOTNOTE_DLG:
373         {
374             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
375             DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");
376 
377             VclAbstractDialog* pDlg = pFact->CreateSwFootNoteOptionDlg( rView.GetWindow(), rView.GetWrtShell(), DLG_DOC_FOOTNOTE );
378             DBG_ASSERT(pDlg, "Dialogdiet fail!");
379             pDlg->Execute();
380             delete pDlg;
381             break;
382         }
383         case FN_NUMBERING_OUTLINE_DLG:
384         {
385             SfxItemSet aTmp(GetPool(), FN_PARAM_1, FN_PARAM_1);
386             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
387             DBG_ASSERT(pFact, "Dialogdiet fail!");
388             SfxAbstractTabDialog* pDlg = pFact->CreateSwTabDialog( DLG_TAB_OUTLINE,
389                                                         rView.GetWindow(), &aTmp, rView.GetWrtShell());
390             DBG_ASSERT(pDlg, "Dialogdiet fail!");
391             pDlg->Execute();
392             delete pDlg;
393             rReq.Done();
394         }
395         break;
396         case SID_OPEN_XML_FILTERSETTINGS:
397         {
398             try
399             {
400                 uno::Reference < ui::dialogs::XExecutableDialog > xDialog(::comphelper::getProcessServiceFactory()->createInstance(rtl::OUString::createFromAscii("com.sun.star.comp.ui.XSLTFilterDialog")), uno::UNO_QUERY);
401                 if( xDialog.is() )
402                 {
403                     xDialog->execute();
404                 }
405             }
406             catch( uno::Exception& )
407             {
408             }
409             rReq.Ignore ();
410         }
411         break;
412         case FN_WORDCOUNT_DIALOG:
413         {
414             SwWrtShell &rSh = rView.GetWrtShell();
415             SwDocStat aCurr;
416             SwDocStat aDocStat( rSh.getIDocumentStatistics()->GetDocStat() );
417             {
418                 SwWait aWait( *rView.GetDocShell(), sal_True );
419                 rSh.StartAction();
420                 rSh.CountWords( aCurr );
421                 rSh.UpdateDocStat( aDocStat );
422                 rSh.EndAction();
423             }
424 
425             SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();
426             DBG_ASSERT(pFact, "Dialogdiet fail!");
427             AbstractSwWordCountDialog* pDialog = pFact->CreateSwWordCountDialog( rView.GetWindow() );
428             pDialog->SetValues(aCurr, aDocStat );
429             pDialog->Execute();
430             delete pDialog;
431         }
432         break;
433         case SID_CHAR_DLG:
434         {
435             const SfxItemSet* pArgs = rReq.GetArgs();
436 
437             if( !pArgs )
438             {
439                 /* mod
440                 SwView* pView = &GetView();
441                 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
442                 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
443                 */
444                 SfxItemSet aDlgAttr(GetPool(), EE_ITEMS_START, EE_ITEMS_END);
445 
446                 // util::Language gibts an der EditEngine nicht! Daher nicht im Set.
447 
448                 aDlgAttr.Put( aEditAttr );
449                 aDlgAttr.Put( SvxKerningItem(0, RES_CHRATR_KERNING) );
450 
451                 //CHINA001 SwCharDlg* pDlg = new SwCharDlg(pView->GetWindow(), *pView, aDlgAttr, 0, sal_True);
452                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();//CHINA001
453                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");//CHINA001
454 
455                 SfxAbstractTabDialog* pDlg = pFact->CreateSwCharDlg( rView.GetWindow(), rView, aDlgAttr, DLG_CHAR,0, sal_True );
456                 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
457                 sal_uInt16 nRet = pDlg->Execute();
458                 if(RET_OK == nRet )
459                 {
460                     rReq.Done( *( pDlg->GetOutputItemSet() ) );
461                     aNewAttr.Put(*pDlg->GetOutputItemSet());
462                 }
463                 delete( pDlg );
464                 if(RET_OK != nRet)
465                     return ;
466             }
467             else
468                 aNewAttr.Put(*pArgs);
469         break;
470         }
471         case SID_PARA_DLG:
472         {
473             const SfxItemSet* pArgs = rReq.GetArgs();
474 
475             if (!pArgs)
476             {
477                 /* mod todo ???
478                 SwView* pView = &GetView();
479                 FieldUnit eMetric = ::GetDfltMetric(0 != PTR_CAST(SwWebView, pView));
480                 SW_MOD()->PutItem(SfxUInt16Item(SID_ATTR_METRIC, eMetric));
481                 */
482                 SfxItemSet aDlgAttr(GetPool(),
483                                     EE_ITEMS_START, EE_ITEMS_END,
484                                     SID_ATTR_PARA_HYPHENZONE, SID_ATTR_PARA_HYPHENZONE,
485                                     SID_ATTR_PARA_SPLIT, SID_ATTR_PARA_SPLIT,
486                                     SID_ATTR_PARA_WIDOWS, SID_ATTR_PARA_WIDOWS,
487                                     SID_ATTR_PARA_ORPHANS, SID_ATTR_PARA_ORPHANS,
488                                     0);
489 
490                 aDlgAttr.Put(aEditAttr);
491 
492 
493                 aDlgAttr.Put( SvxHyphenZoneItem( sal_False, RES_PARATR_HYPHENZONE) );
494                 aDlgAttr.Put( SvxFmtBreakItem( SVX_BREAK_NONE, RES_BREAK ) );
495                 aDlgAttr.Put( SvxFmtSplitItem( sal_True, RES_PARATR_SPLIT ) );
496                 aDlgAttr.Put( SvxWidowsItem( 0, RES_PARATR_WIDOWS ) );
497                 aDlgAttr.Put( SvxOrphansItem( 0, RES_PARATR_ORPHANS ) );
498 
499                 //CHINA001 SwParaDlg* pDlg = new SwParaDlg(GetView().GetWindow(), GetView(), aDlgAttr, DLG_STD, 0, sal_True);
500 
501                 SwAbstractDialogFactory* pFact = SwAbstractDialogFactory::Create();//CHINA001
502                 DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!");//CHINA001
503 
504                 SfxAbstractTabDialog* pDlg = pFact->CreateSwParaDlg( rView.GetWindow(), rView, aDlgAttr,DLG_STD, DLG_PARA, 0, sal_True );
505                 DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
506                 sal_uInt16 nRet = pDlg->Execute();
507                 if(RET_OK == nRet)
508                 {
509                     rReq.Done( *( pDlg->GetOutputItemSet() ) );
510                     aNewAttr.Put(*pDlg->GetOutputItemSet());
511                 }
512                 delete( pDlg );
513                 if(RET_OK != nRet)
514                     return;
515             }
516             else
517                 aNewAttr.Put(*pArgs);
518             break;
519         }
520 
521         case SID_AUTOSPELL_CHECK:
522         {
523             rView.ExecuteSlot(rReq);
524             break;
525         }
526         case SID_ATTR_PARA_LEFT_TO_RIGHT:
527         case SID_ATTR_PARA_RIGHT_TO_LEFT:
528         {
529             sal_Bool bLeftToRight = nSlot == SID_ATTR_PARA_LEFT_TO_RIGHT;
530 
531             const SfxPoolItem* pPoolItem;
532             if( pNewAttrs && SFX_ITEM_SET == pNewAttrs->GetItemState( nSlot, sal_True, &pPoolItem ) )
533             {
534                 if( !( (SfxBoolItem*)pPoolItem)->GetValue() )
535                     bLeftToRight = !bLeftToRight;
536             }
537             SfxItemSet aAttr( *aNewAttr.GetPool(),
538                         EE_PARA_JUST, EE_PARA_JUST,
539                         EE_PARA_WRITINGDIR, EE_PARA_WRITINGDIR,
540                         0 );
541 
542             sal_uInt16 nAdjust = SVX_ADJUST_LEFT;
543             if( SFX_ITEM_ON == aEditAttr.GetItemState(EE_PARA_JUST, sal_True, &pPoolItem ) )
544                 nAdjust = ( (SvxAdjustItem*)pPoolItem)->GetEnumValue();
545 
546             if( bLeftToRight )
547             {
548                 aAttr.Put( SvxFrameDirectionItem( FRMDIR_HORI_LEFT_TOP, EE_PARA_WRITINGDIR ) );
549                 if( nAdjust == SVX_ADJUST_RIGHT )
550                     aAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
551             }
552             else
553             {
554                 aAttr.Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
555                 if( nAdjust == SVX_ADJUST_LEFT )
556                     aAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
557             }
558             pOLV->SetAttribs(aAttr);
559             break;
560         }
561     }
562 
563     if(nEEWhich && pNewAttrs)
564         aNewAttr.Put(pNewAttrs->Get(nWhich), nEEWhich);
565 
566     Rectangle aNullRect;
567     Rectangle aOutRect = pOLV->GetOutputArea();
568     if (aNullRect != aOutRect)
569         pOLV->SetAttribs(aNewAttr);
570 
571     rView.GetViewFrame()->GetBindings().InvalidateAll(sal_False);
572     if ( pOLV->GetOutliner()->IsModified() )
573         rView.GetWrtShell().SetModified();
574 
575 }
576 
577 void SwAnnotationShell::GetState(SfxItemSet& rSet)
578 {
579     //TODO: clean this up!!!
580     // FN_SET_SUPER_SCRIPT
581     //SID_ATTR_PARA_ADJUST
582     //SID_ATTR_PARA_ADJUST_BLOCK
583 
584     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
585     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
586         return;
587 
588     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
589     SfxItemSet aEditAttr(pOLV->GetAttribs());
590 
591     SfxWhichIter aIter(rSet);
592     sal_uInt16 nWhich = aIter.FirstWhich();
593     while(nWhich)
594     {
595         sal_uInt16 nEEWhich = 0;
596         sal_uInt16 nSlotId = GetPool().GetSlotId( nWhich );
597         switch( nSlotId )
598         {
599             case SID_ATTR_CHAR_FONT:
600             case SID_ATTR_CHAR_FONTHEIGHT:
601             case SID_ATTR_CHAR_WEIGHT:
602             case SID_ATTR_CHAR_POSTURE:
603                 {
604                     if ( pOLV )
605                     {
606                         sal_uInt16 nScriptType = pOLV->GetSelectedScriptType();
607                         SfxItemPool* pSecondPool = aEditAttr.GetPool()->GetSecondaryPool();
608                         if( !pSecondPool )
609                             pSecondPool = aEditAttr.GetPool();
610                         SvxScriptSetItem aSetItem( nSlotId, *pSecondPool );
611                         aSetItem.GetItemSet().Put( aEditAttr, sal_False );
612                         const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScriptType );
613                         if( pI )
614                             rSet.Put( *pI, nWhich );
615                         else
616                             rSet.InvalidateItem( nWhich );
617                     }
618                     else
619                         rSet.InvalidateItem( nWhich );
620                 }
621                 break;
622             case SID_ATTR_CHAR_COLOR: nEEWhich = EE_CHAR_COLOR; break;
623             case SID_ATTR_CHAR_UNDERLINE: nEEWhich = EE_CHAR_UNDERLINE;break;
624             case SID_ATTR_CHAR_OVERLINE: nEEWhich = EE_CHAR_OVERLINE;break;
625             case SID_ATTR_CHAR_CONTOUR: nEEWhich = EE_CHAR_OUTLINE; break;
626             case SID_ATTR_CHAR_SHADOWED:  nEEWhich = EE_CHAR_SHADOW;break;
627             case SID_ATTR_CHAR_STRIKEOUT: nEEWhich = EE_CHAR_STRIKEOUT;break;
628             case SID_ATTR_CHAR_LANGUAGE    : nEEWhich = EE_CHAR_LANGUAGE;break;
629             case FN_SET_SUPER_SCRIPT:
630             case FN_SET_SUB_SCRIPT:
631             {
632                 sal_uInt16 nEsc = 0;
633                 const SfxPoolItem *pEscItem = 0;
634                 if (nWhich==FN_SET_SUPER_SCRIPT)
635                     nEsc = SVX_ESCAPEMENT_SUPERSCRIPT;
636                 else
637                     nEsc = SVX_ESCAPEMENT_SUBSCRIPT;
638 
639                 if( !pEscItem )
640                     pEscItem = &aEditAttr.Get( EE_CHAR_ESCAPEMENT );
641 
642                 if( nEsc == ((const SvxEscapementItem*)pEscItem)->GetEnumValue() )
643                     rSet.Put( SfxBoolItem( nWhich, sal_True ));
644                 else
645                     rSet.InvalidateItem( nWhich );
646                 break;
647             }
648             case SID_ATTR_PARA_ADJUST_LEFT:
649             case SID_ATTR_PARA_ADJUST_RIGHT:
650             case SID_ATTR_PARA_ADJUST_CENTER:
651             case SID_ATTR_PARA_ADJUST_BLOCK:
652                 {
653                     const SfxPoolItem *pAdjust = 0;
654                     int eAdjust = 0;
655 
656                     if (nWhich==SID_ATTR_PARA_ADJUST_LEFT)
657                         eAdjust = SVX_ADJUST_LEFT;
658                     else
659                     if (nWhich==SID_ATTR_PARA_ADJUST_RIGHT)
660                         eAdjust = SVX_ADJUST_RIGHT;
661                     else
662                     if (nWhich==SID_ATTR_PARA_ADJUST_CENTER)
663                         eAdjust = SVX_ADJUST_CENTER;
664                     else
665                     if (nWhich==SID_ATTR_PARA_ADJUST_BLOCK)
666                         eAdjust = SVX_ADJUST_BLOCK;
667 
668                     if( !pAdjust )
669                         aEditAttr.GetItemState( EE_PARA_JUST, sal_False, &pAdjust);
670 
671                     if( !pAdjust || IsInvalidItem( pAdjust ))
672                         rSet.InvalidateItem( nSlotId ), nSlotId = 0;
673                     else
674                     {
675                         if ( eAdjust == ((const SvxAdjustItem*)pAdjust)->GetAdjust())
676                             rSet.Put( SfxBoolItem( nWhich, sal_True ));
677                         else
678                             rSet.InvalidateItem( nWhich );
679                     }
680                     break;
681                 }
682             case SID_ATTR_PARA_LINESPACE_10:
683             case SID_ATTR_PARA_LINESPACE_15:
684             case SID_ATTR_PARA_LINESPACE_20:
685                 {
686                     const SfxPoolItem *pLSpace = 0;
687                     int nLSpace = 0;
688 
689                     if (nWhich==SID_ATTR_PARA_LINESPACE_10)
690                         nLSpace = 100;
691                     else
692                     if (nWhich==SID_ATTR_PARA_LINESPACE_15)
693                         nLSpace = 150;
694                     else
695                     if (nWhich==SID_ATTR_PARA_LINESPACE_20)
696                         nLSpace = 200;
697 
698                     if( !pLSpace )
699                         aEditAttr.GetItemState( EE_PARA_SBL, sal_False, &pLSpace );
700 
701                     if( !pLSpace || IsInvalidItem( pLSpace ))
702                         rSet.InvalidateItem( nSlotId ), nSlotId = 0;
703                     else
704                     {
705                         if( nLSpace == ((const SvxLineSpacingItem*)pLSpace)->GetPropLineSpace() )
706                             rSet.Put( SfxBoolItem( nWhich, sal_True ));
707                         else
708                             rSet.InvalidateItem( nWhich );
709                     }
710                     break;
711                 }
712             case SID_AUTOSPELL_CHECK:
713             {
714                 const SfxPoolItem* pState = rView.GetSlotState(nWhich);
715                 if (pState)
716                     rSet.Put(SfxBoolItem(nWhich, ((const SfxBoolItem*)pState)->GetValue()));
717                 else
718                     rSet.DisableItem( nWhich );
719                 break;
720             }
721             case SID_ATTR_PARA_LEFT_TO_RIGHT:
722             case SID_ATTR_PARA_RIGHT_TO_LEFT:
723             {
724                 if ( !SvtLanguageOptions().IsCTLFontEnabled() )
725                     rSet.DisableItem( nWhich );
726                 else
727                 {
728                     if(pOLV->GetOutliner() && pOLV->GetOutliner()->IsVertical())
729                         rSet.DisableItem( nWhich );
730                     else
731                     {
732                         sal_Bool bFlag = sal_False;
733                         switch( ( ( (SvxFrameDirectionItem&) aEditAttr.Get( EE_PARA_WRITINGDIR ) ) ).GetValue() )
734                         {
735                             case FRMDIR_HORI_LEFT_TOP:
736                             {
737                                 bFlag = nWhich == SID_ATTR_PARA_LEFT_TO_RIGHT;
738                                 rSet.Put( SfxBoolItem( nWhich, bFlag ));
739                                 break;
740                             }
741                             case FRMDIR_HORI_RIGHT_TOP:
742                             {
743                                 bFlag = nWhich != SID_ATTR_PARA_LEFT_TO_RIGHT;
744                                 rSet.Put( SfxBoolItem( nWhich, bFlag ));
745                                 break;
746                             }
747                         }
748                     }
749                 }
750             }
751             break;
752             case SID_INSERT_RLM :
753             case SID_INSERT_LRM :
754             case SID_INSERT_ZWNBSP :
755             case SID_INSERT_ZWSP:
756             {
757                 SvtCTLOptions aCTLOptions;
758                 sal_Bool bEnabled = aCTLOptions.IsCTLFontEnabled();
759                 rView.GetViewFrame()->GetBindings().SetVisibleState( nWhich, bEnabled );
760                 if(!bEnabled)
761                     rSet.DisableItem(nWhich);
762             }
763             break;
764             default:
765                 rSet.InvalidateItem( nWhich );
766                 break;
767         }
768 
769         if(nEEWhich)
770             rSet.Put(aEditAttr.Get(nEEWhich, sal_True), nWhich);
771 
772         if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()==SwPostItHelper::DELETED)
773             rSet.DisableItem( nWhich );
774 
775         nWhich = aIter.NextWhich();
776     }
777 }
778 
779 void SwAnnotationShell::ExecSearch(SfxRequest& rReq, sal_Bool bNoMessage)
780 {
781     rView.ExecSearch(rReq,bNoMessage);
782 }
783 
784 void SwAnnotationShell::StateSearch(SfxItemSet &rSet)
785 {
786     rView.StateSearch(rSet);
787 }
788 
789 void SwAnnotationShell::ExecClpbrd(SfxRequest &rReq)
790 {
791     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
792     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
793         return;
794 
795     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
796     SfxItemSet aEditAttr(pOLV->GetAttribs());
797     SfxItemSet aNewAttr(*aEditAttr.GetPool(), aEditAttr.GetRanges());
798 
799     long aOldHeight = pPostItMgr->GetActiveSidebarWin()->GetPostItTextHeight();
800     sal_uInt16 nSlot = rReq.GetSlot();
801     switch (nSlot)
802     {
803         case SID_CUT:
804             if ( (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED) && pOLV->HasSelection() )
805                 pOLV->Cut();
806             break;
807         case SID_COPY:
808             if( pOLV->HasSelection() )
809                 pOLV->Copy();
810             break;
811         case SID_PASTE:
812             if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED)
813                 pOLV->Paste();
814             break;
815         case SID_PASTE_SPECIAL:
816         {
817             if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED)
818             {
819                 SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
820                 SfxAbstractPasteDialog* pDlg = pFact->CreatePasteDialog( &rView.GetEditWin() );
821 
822                 pDlg->Insert( SOT_FORMAT_STRING, aEmptyStr );
823                 pDlg->Insert( SOT_FORMAT_RTF,    aEmptyStr );
824 
825                 TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( &rView.GetEditWin() ) );
826 
827                 sal_uLong nFormat = pDlg->GetFormat( aDataHelper.GetTransferable() );
828 
829                 if (nFormat > 0)
830                 {
831                     if (nFormat == SOT_FORMAT_STRING)
832                         pOLV->Paste();
833                     else
834                         pOLV->PasteSpecial();
835                 }
836                 delete pDlg;
837             }
838             break;
839         }
840         case SID_CLIPBOARD_FORMAT_ITEMS:
841         {
842             sal_uLong nFormat = 0;
843             const SfxPoolItem* pItem;
844             if ( rReq.GetArgs() && rReq.GetArgs()->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET &&
845                                     pItem->ISA(SfxUInt32Item) )
846             {
847                 nFormat = ((const SfxUInt32Item*)pItem)->GetValue();
848             }
849 
850             if ( nFormat )
851             {
852                 if (SOT_FORMAT_STRING == nFormat)
853                     pOLV->Paste();
854                 else
855                     pOLV->PasteSpecial();
856             }
857             break;
858         }
859     }
860     pPostItMgr->GetActiveSidebarWin()->ResizeIfNeccessary(aOldHeight,pPostItMgr->GetActiveSidebarWin()->GetPostItTextHeight());
861 }
862 
863 void SwAnnotationShell::StateClpbrd(SfxItemSet &rSet)
864 {
865     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
866     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
867         return;
868     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
869 
870     TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( &rView.GetEditWin() ) );
871     bool bPastePossible = ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) || aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
872     bPastePossible = bPastePossible &&  (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()!=SwPostItHelper::DELETED);
873 
874     SfxWhichIter aIter(rSet);
875     sal_uInt16 nWhich = aIter.FirstWhich();
876 
877     while(nWhich)
878     {
879         switch(nWhich)
880         {
881             case SID_CUT:
882             {
883                 if ( (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()==SwPostItHelper::DELETED) || !pOLV->HasSelection() )
884                     rSet.DisableItem( nWhich );
885             }
886             case SID_COPY:
887             {
888                 if( !pOLV->HasSelection() )
889                     rSet.DisableItem( nWhich );
890                 break;
891             }
892             case SID_PASTE:
893             case SID_PASTE_SPECIAL:
894                 {
895                     if( !bPastePossible )
896                         rSet.DisableItem( nWhich );
897                     break;
898                 }
899             case SID_CLIPBOARD_FORMAT_ITEMS:
900                 {
901                     if ( bPastePossible )
902                     {
903                         SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
904                         if ( aDataHelper.HasFormat( SOT_FORMAT_RTF ) )
905                             aFormats.AddClipbrdFormat( SOT_FORMAT_RTF );
906                         //if ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) )
907                             aFormats.AddClipbrdFormat( SOT_FORMAT_STRING );
908                         rSet.Put( aFormats );
909                     }
910                     else
911                         rSet.DisableItem( nWhich );
912                     break;
913                 }
914         }
915         nWhich = aIter.NextWhich();
916     }
917 }
918 
919 void SwAnnotationShell::StateStatusLine(SfxItemSet &rSet)
920 {
921     SfxWhichIter aIter( rSet );
922     sal_uInt16 nWhich = aIter.FirstWhich();
923 
924     while( nWhich )
925     {
926         switch( nWhich )
927         {
928             case FN_STAT_SELMODE:
929             {
930                 rSet.Put(SfxUInt16Item(FN_STAT_SELMODE, 0));
931                 rSet.DisableItem( nWhich );
932                 break;
933             }
934             case FN_STAT_TEMPLATE:
935             {
936                 rSet.DisableItem( nWhich );
937                 break;
938             }
939         }
940         nWhich = aIter.NextWhich();
941     }
942 }
943 
944 void SwAnnotationShell::StateInsert(SfxItemSet &rSet)
945 {
946     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
947     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
948         return;
949 
950     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
951     SfxWhichIter aIter(rSet);
952     sal_uInt16 nWhich = aIter.FirstWhich();
953 
954     while(nWhich)
955     {
956         switch(nWhich)
957         {
958             case SID_HYPERLINK_GETLINK:
959                 {
960                     SvxHyperlinkItem aHLinkItem;
961                     aHLinkItem.SetInsertMode(HLINK_FIELD);
962 
963                     const SvxFieldItem* pFieldItem = pOLV->GetFieldAtSelection();
964 
965                     if (pFieldItem)
966                     {
967                         const SvxFieldData* pField = pFieldItem->GetField();
968 
969                         if (pField->ISA(SvxURLField))
970                         {
971                             aHLinkItem.SetName(((const SvxURLField*) pField)->GetRepresentation());
972                             aHLinkItem.SetURL(((const SvxURLField*) pField)->GetURL());
973                             aHLinkItem.SetTargetFrame(((const SvxURLField*) pField)->GetTargetFrame());
974                         }
975                     }
976                     else
977                     {
978                         String sSel(pOLV->GetSelected());
979                         sSel.Erase(255);
980                         sSel.EraseTrailingChars();
981                         aHLinkItem.SetName(sSel);
982                     }
983 
984                     sal_uInt16 nHtmlMode = ::GetHtmlMode(rView.GetDocShell());
985                     aHLinkItem.SetInsertMode((SvxLinkInsertMode)(aHLinkItem.GetInsertMode() |
986                         ((nHtmlMode & HTMLMODE_ON) != 0 ? HLINK_HTMLMODE : 0)));
987 
988                     rSet.Put(aHLinkItem);
989                 }
990                 break;
991         }
992 
993         if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()==SwPostItHelper::DELETED)
994             rSet.DisableItem( nWhich );
995 
996         nWhich = aIter.NextWhich();
997     }
998 }
999 
1000 
1001 void SwAnnotationShell::NoteExec(SfxRequest &rReq)
1002 {
1003     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1004     if ( !pPostItMgr )
1005         return;
1006 
1007     sal_uInt16 nSlot = rReq.GetSlot();
1008     switch (nSlot)
1009     {
1010         case FN_REPLY:
1011         case FN_POSTIT:
1012         case FN_DELETE_COMMENT:
1013             if ( pPostItMgr->HasActiveSidebarWin() )
1014                 pPostItMgr->GetActiveSidebarWin()->ExecuteCommand(nSlot);
1015             break;
1016         case FN_DELETE_ALL_NOTES:
1017             pPostItMgr->Delete();
1018             break;
1019         case FN_DELETE_NOTE_AUTHOR:
1020         {
1021             SFX_REQUEST_ARG( rReq, pItem, SfxStringItem, nSlot, sal_False);
1022             if ( pItem )
1023                 pPostItMgr->Delete( pItem->GetValue() );
1024             break;
1025         }
1026         case FN_HIDE_NOTE:
1027             /*
1028             if ( Mgr()->GetActiveSidebarWin() == this )
1029             {
1030                 Mgr()->SetActivePostIt(0);
1031                 // put the cursor back into the document
1032                 SwitchToFieldPos();
1033             }
1034             Mgr()->Hide(mpFld);
1035             */
1036             break;
1037         case FN_HIDE_ALL_NOTES:
1038             pPostItMgr->Hide();
1039             break;
1040         case FN_HIDE_NOTE_AUTHOR:
1041         {
1042             SFX_REQUEST_ARG( rReq, pItem, SfxStringItem, nSlot, sal_False);
1043             if ( pItem )
1044                 pPostItMgr->Hide( pItem->GetValue() );
1045         }
1046     }
1047 }
1048 
1049 void SwAnnotationShell::GetNoteState(SfxItemSet &rSet)
1050 {
1051     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1052     SfxWhichIter aIter(rSet);
1053     sal_uInt16 nWhich = aIter.FirstWhich();
1054     while(nWhich)
1055     {
1056         sal_uInt16 nSlotId = GetPool().GetSlotId( nWhich );
1057         switch( nSlotId )
1058         {
1059             case FN_POSTIT:
1060             case FN_DELETE_NOTE_AUTHOR:
1061             case FN_DELETE_ALL_NOTES:
1062             case FN_HIDE_NOTE:
1063             case FN_HIDE_NOTE_AUTHOR:
1064             case FN_HIDE_ALL_NOTES:
1065             case FN_DELETE_COMMENT:
1066             {
1067                 if ( !pPostItMgr ||
1068                      !pPostItMgr->HasActiveAnnotationWin() )
1069                 {
1070                     rSet.DisableItem(nWhich);
1071                 }
1072                 break;
1073             }
1074             case FN_REPLY:
1075             {
1076                 if ( !pPostItMgr ||
1077                      !pPostItMgr->HasActiveAnnotationWin() )
1078                 {
1079                     rSet.DisableItem(nWhich);
1080                 }
1081                 else
1082                 {
1083                     SvtUserOptions aUserOpt;
1084                     String sAuthor;
1085                     if( !(sAuthor = aUserOpt.GetFullName()).Len())
1086                             if( !(sAuthor = aUserOpt.GetID()).Len() )
1087                         sAuthor = String( SW_RES( STR_REDLINE_UNKNOWN_AUTHOR ));
1088                     if (sAuthor == pPostItMgr->GetActiveSidebarWin()->GetAuthor())
1089                         rSet.DisableItem(nWhich);
1090                 }
1091                 break;
1092             }
1093             default:
1094                 rSet.InvalidateItem( nWhich );
1095                 break;
1096         }
1097 
1098         if (pPostItMgr->HasActiveSidebarWin())
1099         {
1100             if ( (pPostItMgr->GetActiveSidebarWin()->IsProtected()) &&
1101                     ( (nSlotId==FN_DELETE_COMMENT) || (nSlotId==FN_REPLY) ) )
1102                 rSet.DisableItem( nWhich );
1103         }
1104         nWhich = aIter.NextWhich();
1105     }
1106 }
1107 
1108 void SwAnnotationShell::ExecLingu(SfxRequest &rReq)
1109 {
1110     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1111     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
1112         return;
1113 
1114     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
1115     SfxItemSet aEditAttr(pOLV->GetAttribs());
1116     sal_uInt16 nSlot = rReq.GetSlot();
1117     SwWrtShell &rSh = rView.GetWrtShell();
1118     bool bRestoreSelection = false;
1119     ESelection aOldSelection;
1120 
1121     switch (nSlot)
1122     {
1123         case SID_LANGUAGE_STATUS:
1124         {
1125             aOldSelection = pOLV->GetSelection();
1126             if (!pOLV->GetEditView().HasSelection())
1127             {
1128                 bRestoreSelection   = true;
1129                 pOLV->GetEditView().SelectCurrentWord();
1130             }
1131 
1132             bRestoreSelection = SwLangHelper::SetLanguageStatus(pOLV,rReq,rView,rSh);
1133             break;
1134         }
1135         case SID_THES:
1136         {
1137             String aReplaceText;
1138             SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES, sal_False );
1139             if (pItem2)
1140                 aReplaceText = pItem2->GetValue();
1141             if (aReplaceText.Len() > 0)
1142                 ReplaceTextWithSynonym( pOLV->GetEditView(), aReplaceText );
1143             break;
1144         }
1145         case SID_THESAURUS:
1146         {
1147             pOLV->StartThesaurus();
1148             break;
1149         }
1150         case SID_HANGUL_HANJA_CONVERSION:
1151             pOLV->StartTextConversion( LANGUAGE_KOREAN, LANGUAGE_KOREAN, NULL,
1152                     i18n::TextConversionOption::CHARACTER_BY_CHARACTER, sal_True, sal_False );
1153             break;
1154 
1155         case SID_CHINESE_CONVERSION:
1156         {
1157                 //open ChineseTranslationDialog
1158                 Reference< XComponentContext > xContext(
1159                     ::cppu::defaultBootstrap_InitialComponentContext() ); //@todo get context from calc if that has one
1160                 if(xContext.is())
1161                 {
1162                     Reference< lang::XMultiComponentFactory > xMCF( xContext->getServiceManager() );
1163                     if(xMCF.is())
1164                     {
1165                         Reference< ui::dialogs::XExecutableDialog > xDialog(
1166                                 xMCF->createInstanceWithContext(
1167                                     rtl::OUString::createFromAscii("com.sun.star.linguistic2.ChineseTranslationDialog")
1168                                     , xContext), UNO_QUERY);
1169                         Reference< lang::XInitialization > xInit( xDialog, UNO_QUERY );
1170                         if( xInit.is() )
1171                         {
1172                             //  initialize dialog
1173                             Reference< awt::XWindow > xDialogParentWindow(0);
1174                             Sequence<Any> aSeq(1);
1175                             Any* pArray = aSeq.getArray();
1176                             PropertyValue aParam;
1177                             aParam.Name = rtl::OUString::createFromAscii("ParentWindow");
1178                             aParam.Value <<= makeAny(xDialogParentWindow);
1179                             pArray[0] <<= makeAny(aParam);
1180                             xInit->initialize( aSeq );
1181 
1182                             //execute dialog
1183                             sal_Int16 nDialogRet = xDialog->execute();
1184                             if( RET_OK == nDialogRet )
1185                             {
1186                                 //get some parameters from the dialog
1187                                 sal_Bool bToSimplified = sal_True;
1188                                 sal_Bool bUseVariants = sal_True;
1189                                 sal_Bool bCommonTerms = sal_True;
1190                                 Reference< beans::XPropertySet >  xProp( xDialog, UNO_QUERY );
1191                                 if( xProp.is() )
1192                                 {
1193                                     try
1194                                     {
1195                                         xProp->getPropertyValue( C2U("IsDirectionToSimplified") ) >>= bToSimplified;
1196                                         xProp->getPropertyValue( C2U("IsUseCharacterVariants") ) >>= bUseVariants;
1197                                         xProp->getPropertyValue( C2U("IsTranslateCommonTerms") ) >>= bCommonTerms;
1198                                     }
1199                                     catch( Exception& )
1200                                     {
1201                                     }
1202                                 }
1203 
1204                                 //execute translation
1205                                 sal_Int16 nSourceLang = bToSimplified ? LANGUAGE_CHINESE_TRADITIONAL : LANGUAGE_CHINESE_SIMPLIFIED;
1206                                 sal_Int16 nTargetLang = bToSimplified ? LANGUAGE_CHINESE_SIMPLIFIED : LANGUAGE_CHINESE_TRADITIONAL;
1207                                 sal_Int32 nOptions    = bUseVariants ? i18n::TextConversionOption::USE_CHARACTER_VARIANTS : 0;
1208                                 if( !bCommonTerms )
1209                                     nOptions = nOptions | i18n::TextConversionOption::CHARACTER_BY_CHARACTER;
1210 
1211                                 Font aTargetFont = pOLV->GetWindow()->GetDefaultFont( DEFAULTFONT_CJK_TEXT,
1212                                             nTargetLang, DEFAULTFONT_FLAGS_ONLYONE );
1213 
1214                                 pOLV->StartTextConversion( nSourceLang, nTargetLang, &aTargetFont, nOptions, sal_False, sal_False );
1215                             }
1216                         }
1217                         Reference< lang::XComponent > xComponent( xDialog, UNO_QUERY );
1218                         if( xComponent.is() )
1219                             xComponent->dispose();
1220                     }
1221                 }
1222             }
1223             break;
1224     }
1225 
1226     if (bRestoreSelection)
1227     {
1228         // restore selection
1229         pOLV->GetEditView().SetSelection( aOldSelection );
1230     }
1231 }
1232 
1233 void SwAnnotationShell::GetLinguState(SfxItemSet &rSet)
1234 {
1235     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1236     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
1237         return;
1238 
1239     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
1240     SfxItemSet aEditAttr(pOLV->GetAttribs());
1241 
1242     SfxWhichIter aIter(rSet);
1243     sal_uInt16 nWhich = aIter.FirstWhich();
1244     while(nWhich)
1245     {
1246         switch (nWhich)
1247         {
1248             case SID_LANGUAGE_STATUS:
1249             {
1250                 SwLangHelper::GetLanguageStatus(pOLV,rSet);
1251                 break;
1252             }
1253 
1254             case SID_THES:
1255             {
1256                 String          aStatusVal;
1257                 LanguageType    nLang = LANGUAGE_NONE;
1258                 bool bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, pOLV->GetEditView() );
1259                 rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
1260 
1261                 // disable "Thesaurus" context menu entry if there is nothing to look up
1262                 uno::Reference< linguistic2::XThesaurus >  xThes( ::GetThesaurus() );
1263                 lang::Locale aLocale( SvxCreateLocale( nLang ) );
1264                 if (!bIsLookUpWord ||
1265                     !xThes.is() || nLang == LANGUAGE_NONE || !xThes->hasLocale( aLocale ))
1266                     rSet.DisableItem( SID_THES );
1267                 break;
1268             }
1269 
1270             // disable "Thesaurus" if the language is not supported
1271             case SID_THESAURUS:
1272             {
1273                 const SfxPoolItem &rItem = rView.GetWrtShell().GetDoc()->GetDefault(
1274                             GetWhichOfScript( RES_CHRATR_LANGUAGE,
1275                             GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage())) );
1276                 LanguageType nLang = ((const SvxLanguageItem &)
1277                                                         rItem).GetLanguage();
1278                 uno::Reference< linguistic2::XThesaurus >  xThes( ::GetThesaurus() );
1279                 if (!xThes.is() || nLang == LANGUAGE_NONE ||
1280                     !xThes->hasLocale( SvxCreateLocale( nLang ) ))
1281                     rSet.DisableItem( SID_THESAURUS );
1282             }
1283             break;
1284             case SID_HANGUL_HANJA_CONVERSION:
1285             case SID_CHINESE_CONVERSION:
1286             {
1287                 if (!SvtCJKOptions().IsAnyEnabled())
1288                 {
1289                     rView.GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_False );
1290                     rSet.DisableItem(nWhich);
1291                 }
1292                 else
1293                     rView.GetViewFrame()->GetBindings().SetVisibleState( nWhich, sal_True );
1294             }
1295             break;
1296         }
1297 
1298         if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()==SwPostItHelper::DELETED)
1299             rSet.DisableItem( nWhich );
1300 
1301         nWhich = aIter.NextWhich();
1302     }
1303 }
1304 
1305 void SwAnnotationShell::ExecTransliteration(SfxRequest &rReq)
1306 {
1307     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1308     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
1309         return;
1310 
1311     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
1312 
1313     using namespace ::com::sun::star::i18n;
1314     {
1315         sal_uInt32 nMode = 0;
1316 
1317         switch( rReq.GetSlot() )
1318         {
1319             case SID_TRANSLITERATE_SENTENCE_CASE:
1320                 nMode = TransliterationModulesExtra::SENTENCE_CASE;
1321                 break;
1322             case SID_TRANSLITERATE_TITLE_CASE:
1323                 nMode = TransliterationModulesExtra::TITLE_CASE;
1324                 break;
1325             case SID_TRANSLITERATE_TOGGLE_CASE:
1326                 nMode = TransliterationModulesExtra::TOGGLE_CASE;
1327                 break;
1328             case SID_TRANSLITERATE_UPPER:
1329                 nMode = TransliterationModules_LOWERCASE_UPPERCASE;
1330                 break;
1331             case SID_TRANSLITERATE_LOWER:
1332                 nMode = TransliterationModules_UPPERCASE_LOWERCASE;
1333                 break;
1334             case SID_TRANSLITERATE_HALFWIDTH:
1335                 nMode = TransliterationModules_FULLWIDTH_HALFWIDTH;
1336                 break;
1337             case SID_TRANSLITERATE_FULLWIDTH:
1338                 nMode = TransliterationModules_HALFWIDTH_FULLWIDTH;
1339                 break;
1340             case SID_TRANSLITERATE_HIRAGANA:
1341                 nMode = TransliterationModules_KATAKANA_HIRAGANA;
1342                 break;
1343             case SID_TRANSLITERATE_KATAGANA:
1344                 nMode = TransliterationModules_HIRAGANA_KATAKANA;
1345                 break;
1346 
1347             default:
1348                 ASSERT(!this, "falscher Dispatcher");
1349         }
1350 
1351         if( nMode )
1352         {
1353             pOLV->TransliterateText( nMode );
1354         }
1355     }
1356 }
1357 
1358 void SwAnnotationShell::ExecUndo(SfxRequest &rReq)
1359 {
1360     const SfxItemSet* pArgs = rReq.GetArgs();
1361     ::svl::IUndoManager* pUndoManager = GetUndoManager();
1362     SwWrtShell &rSh = rView.GetWrtShell();
1363 
1364     long aOldHeight = rView.GetPostItMgr()->HasActiveSidebarWin()
1365                       ? rView.GetPostItMgr()->GetActiveSidebarWin()->GetPostItTextHeight()
1366                       : 0;
1367 
1368     sal_uInt16 nId = rReq.GetSlot();
1369     sal_uInt16 nCnt = 1;
1370     const SfxPoolItem* pItem=0;
1371     if( pArgs && SFX_ITEM_SET == pArgs->GetItemState( nId, sal_False, &pItem ) )
1372         nCnt = ((SfxUInt16Item*)pItem)->GetValue();
1373     switch( nId )
1374     {
1375         case SID_UNDO:
1376         {
1377             if ( pUndoManager )
1378             {
1379                 sal_uInt16 nCount = pUndoManager->GetUndoActionCount();
1380                 sal_uInt16 nSteps = nCnt;
1381                 if ( nCount < nCnt )
1382                 {
1383                     nCnt = nCnt - nCount;
1384                     nSteps = nCount;
1385                 }
1386                 else
1387                     nCnt = 0;
1388 
1389                 while( nSteps-- )
1390                     pUndoManager->Undo();
1391             }
1392 
1393             if ( nCnt )
1394                 rSh.Do( SwWrtShell::UNDO, nCnt );
1395 
1396             break;
1397         }
1398 
1399         case SID_REDO:
1400         {
1401             if ( pUndoManager )
1402             {
1403                 sal_uInt16 nCount = pUndoManager->GetRedoActionCount();
1404                 sal_uInt16 nSteps = nCnt;
1405                 if ( nCount < nCnt )
1406                 {
1407                     nCnt = nCnt - nCount;
1408                     nSteps = nCount;
1409                 }
1410                 else
1411                     nCnt = 0;
1412 
1413                 while( nSteps-- )
1414                     pUndoManager->Redo();
1415             }
1416 
1417             if ( nCnt )
1418                 rSh.Do( SwWrtShell::REDO, nCnt );
1419 
1420             break;
1421         }
1422     }
1423 
1424     rView.GetViewFrame()->GetBindings().InvalidateAll(sal_False);
1425 
1426     if (rView.GetPostItMgr()->HasActiveSidebarWin())
1427         rView.GetPostItMgr()->GetActiveSidebarWin()->ResizeIfNeccessary(aOldHeight,rView.GetPostItMgr()->GetActiveSidebarWin()->GetPostItTextHeight());
1428 }
1429 
1430 void SwAnnotationShell::StateUndo(SfxItemSet &rSet)
1431 {
1432     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1433     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
1434         return;
1435 
1436     SfxWhichIter aIter(rSet);
1437     sal_uInt16 nWhich = aIter.FirstWhich();
1438     ::svl::IUndoManager* pUndoManager = GetUndoManager();
1439     SfxViewFrame *pSfxViewFrame = rView.GetViewFrame();
1440     SwWrtShell &rSh = rView.GetWrtShell();
1441 
1442     while( nWhich )
1443     {
1444         switch ( nWhich )
1445         {
1446         case SID_UNDO:
1447             {
1448                 sal_uInt16 nCount = pUndoManager->GetUndoActionCount();
1449                 if ( nCount )
1450                     pSfxViewFrame->GetSlotState( nWhich, pSfxViewFrame->GetInterface(), &rSet );
1451                 else if (rSh.GetLastUndoInfo(0, 0))
1452                 {
1453                     rSet.Put( SfxStringItem( nWhich, rSh.GetDoString(SwWrtShell::UNDO)) );
1454                 }
1455                 else
1456                     rSet.DisableItem(nWhich);
1457                 break;
1458             }
1459         case SID_REDO:
1460             {
1461                 sal_uInt16 nCount = pUndoManager->GetRedoActionCount();
1462                 if ( nCount )
1463                     pSfxViewFrame->GetSlotState( nWhich, pSfxViewFrame->GetInterface(), &rSet );
1464                 else if (rSh.GetFirstRedoInfo(0))
1465                 {
1466                     rSet.Put(SfxStringItem( nWhich, rSh.GetDoString(SwWrtShell::REDO)) );
1467                 }
1468                 else
1469                     rSet.DisableItem(nWhich);
1470                 break;
1471             }
1472         case SID_GETUNDOSTRINGS:
1473         case SID_GETREDOSTRINGS:
1474             {
1475                 if( pUndoManager )
1476                 {
1477                     UniString (::svl::IUndoManager:: *fnGetComment)( size_t, bool const ) const;
1478 
1479                     sal_uInt16 nCount;
1480                     if( SID_GETUNDOSTRINGS == nWhich )
1481                     {
1482                         nCount = pUndoManager->GetUndoActionCount();
1483                         fnGetComment = &::svl::IUndoManager::GetUndoActionComment;
1484                     }
1485                     else
1486                     {
1487                         nCount = pUndoManager->GetRedoActionCount();
1488                         fnGetComment = &::svl::IUndoManager::GetRedoActionComment;
1489                     }
1490 
1491                     String sList;
1492                     if( nCount )
1493                     {
1494                         for( sal_uInt16 n = 0; n < nCount; ++n )
1495                             ( sList += (pUndoManager->*fnGetComment)( n, ::svl::IUndoManager::TopLevel ) )
1496                                     += '\n';
1497                     }
1498 
1499                     SfxStringListItem aItem( nWhich );
1500                     if ((nWhich == SID_GETUNDOSTRINGS) &&
1501                         rSh.GetLastUndoInfo(0, 0))
1502                     {
1503                         rSh.GetDoStrings( SwWrtShell::UNDO, aItem );
1504                     }
1505                     else if ((nWhich == SID_GETREDOSTRINGS) &&
1506                              (rSh.GetFirstRedoInfo(0)))
1507                     {
1508                         rSh.GetDoStrings( SwWrtShell::UNDO, aItem );
1509                     }
1510 
1511                     sList += aItem.GetString();
1512                     aItem.SetString( sList );
1513                     rSet.Put( aItem );
1514                 }
1515                 else
1516                     rSet.DisableItem( nWhich );
1517             }
1518             break;
1519 
1520         default:
1521             {
1522                 pSfxViewFrame->GetSlotState( nWhich, pSfxViewFrame->GetInterface(), &rSet );
1523                 break;
1524             }
1525 
1526         }
1527 
1528         if (pPostItMgr->GetActiveSidebarWin()->GetLayoutStatus()==SwPostItHelper::DELETED)
1529             rSet.DisableItem( nWhich );
1530 
1531         nWhich = aIter.NextWhich();
1532     }
1533 }
1534 
1535 void SwAnnotationShell::StateDisableItems( SfxItemSet &rSet )
1536 {
1537     SfxWhichIter aIter(rSet);
1538     sal_uInt16 nWhich = aIter.FirstWhich();
1539     while (nWhich)
1540     {
1541         rSet.DisableItem( nWhich );
1542         nWhich = aIter.NextWhich();
1543     }
1544 }
1545 
1546 void SwAnnotationShell::InsertSymbol(SfxRequest& rReq)
1547 {
1548     SwPostItMgr* pPostItMgr = rView.GetPostItMgr();
1549     if ( !pPostItMgr || !pPostItMgr->HasActiveSidebarWin() )
1550         return;
1551 
1552     OutlinerView* pOLV = pPostItMgr->GetActiveSidebarWin()->GetOutlinerView();
1553 
1554     const SfxItemSet *pArgs = rReq.GetArgs();
1555     const SfxPoolItem* pItem = 0;
1556     if( pArgs )
1557         pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), sal_False, &pItem);
1558 
1559     String sSym;
1560     String sFontName;
1561     if ( pItem )
1562     {
1563         sSym = ((const SfxStringItem*)pItem)->GetValue();
1564         const SfxPoolItem* pFtItem = NULL;
1565         pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), sal_False, &pFtItem);
1566         const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
1567         if ( pFontItem )
1568             sFontName = pFontItem->GetValue();
1569     }
1570 
1571     SfxItemSet aSet(pOLV->GetAttribs());
1572     sal_uInt16 nScript = pOLV->GetSelectedScriptType();
1573     SvxFontItem aSetDlgFont( RES_CHRATR_FONT );
1574     {
1575         SvxScriptSetItem aSetItem( SID_ATTR_CHAR_FONT, *aSet.GetPool() );
1576         aSetItem.GetItemSet().Put( aSet, sal_False );
1577         const SfxPoolItem* pI = aSetItem.GetItemOfScript( nScript );
1578         if( pI )
1579             aSetDlgFont = *(SvxFontItem*)pI;
1580         else
1581             aSetDlgFont = (SvxFontItem&)aSet.Get( GetWhichOfScript(
1582                         SID_ATTR_CHAR_FONT,
1583                         GetI18NScriptTypeOfLanguage( (sal_uInt16)GetAppLanguage() ) ));
1584         if (!sFontName.Len())
1585             sFontName = aSetDlgFont.GetFamilyName();
1586     }
1587 
1588     Font aFont(sFontName, Size(1,1));
1589     if( !sSym.Len() )
1590     {
1591         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
1592 
1593         SfxAllItemSet aAllSet( GetPool() );
1594         aAllSet.Put( SfxBoolItem( FN_PARAM_1, sal_False ) );
1595 
1596         SwViewOption aOpt(*rView.GetWrtShell().GetViewOptions());
1597         String sSymbolFont = aOpt.GetSymbolFont();
1598         if( sSymbolFont.Len() )
1599             aAllSet.Put( SfxStringItem( SID_FONT_NAME, sSymbolFont ) );
1600         else
1601             aAllSet.Put( SfxStringItem( SID_FONT_NAME, aSetDlgFont.GetFamilyName() ) );
1602 
1603         // Wenn Zeichen selektiert ist kann es angezeigt werden
1604         SfxAbstractDialog* pDlg = pFact->CreateSfxDialog( rView.GetWindow(), aAllSet,
1605             rView.GetViewFrame()->GetFrame().GetFrameInterface(), RID_SVXDLG_CHARMAP );
1606 
1607         sal_uInt16 nResult = pDlg->Execute();
1608         if( nResult == RET_OK )
1609         {
1610             SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pCItem, SfxStringItem, SID_CHARMAP, sal_False );
1611             SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFontItem, SvxFontItem, SID_ATTR_CHAR_FONT, sal_False );
1612             if ( pFontItem )
1613             {
1614                 aFont.SetName( pFontItem->GetFamilyName() );
1615                 aFont.SetStyleName( pFontItem->GetStyleName() );
1616                 aFont.SetCharSet( pFontItem->GetCharSet() );
1617                 aFont.SetPitch( pFontItem->GetPitch() );
1618             }
1619 
1620             if ( pCItem )
1621             {
1622                 sSym  = pCItem->GetValue();
1623                 aOpt.SetSymbolFont(aFont.GetName());
1624                 SW_MOD()->ApplyUsrPref(aOpt, &rView);
1625             }
1626         }
1627 
1628         delete( pDlg );
1629     }
1630 
1631     if( sSym.Len() )
1632     {
1633         // nicht flackern
1634         pOLV->HideCursor();
1635         Outliner * pOutliner = pOLV->GetOutliner();
1636         pOutliner->SetUpdateMode(sal_False);
1637 
1638         SfxItemSet aOldSet( pOLV->GetAttribs() );
1639         SfxItemSet aFontSet( *aOldSet.GetPool(),
1640                             EE_CHAR_FONTINFO, EE_CHAR_FONTINFO,
1641                             EE_CHAR_FONTINFO_CJK, EE_CHAR_FONTINFO_CJK,
1642                             EE_CHAR_FONTINFO_CTL, EE_CHAR_FONTINFO_CTL,
1643                             0 );
1644         aFontSet.Set( aOldSet );
1645 
1646         // String einfuegen
1647         pOLV->InsertText( sSym);
1648 
1649         // attributieren (Font setzen)
1650         SfxItemSet aSetFont( *aFontSet.GetPool(), aFontSet.GetRanges() );
1651         SvxFontItem aFontItem (aFont.GetFamily(),    aFont.GetName(),
1652                                 aFont.GetStyleName(), aFont.GetPitch(),
1653                                 aFont.GetCharSet(),
1654                                 EE_CHAR_FONTINFO );
1655         sal_uInt16 nScriptBreak = pBreakIt->GetAllScriptsOfText( sSym );
1656         if( SCRIPTTYPE_LATIN & nScriptBreak )
1657             aSetFont.Put( aFontItem, EE_CHAR_FONTINFO );
1658         if( SCRIPTTYPE_ASIAN & nScriptBreak )
1659             aSetFont.Put( aFontItem, EE_CHAR_FONTINFO_CJK );
1660         if( SCRIPTTYPE_COMPLEX & nScriptBreak )
1661             aSetFont.Put( aFontItem, EE_CHAR_FONTINFO_CTL );
1662         pOLV->SetAttribs(aSetFont);
1663 
1664         // Selektion loeschen
1665         ESelection aSel(pOLV->GetSelection());
1666         aSel.nStartPara = aSel.nEndPara;
1667         aSel.nStartPos = aSel.nEndPos;
1668         pOLV->SetSelection(aSel);
1669 
1670         // Alten Font restaurieren
1671         pOLV->SetAttribs( aFontSet );
1672 
1673         // ab jetzt wieder anzeigen
1674         pOutliner->SetUpdateMode(sal_True);
1675         pOLV->ShowCursor();
1676 
1677         rReq.AppendItem( SfxStringItem( GetPool().GetWhich(SID_CHARMAP), sSym ) );
1678         if(aFont.GetName().Len())
1679             rReq.AppendItem( SfxStringItem( SID_ATTR_SPECIALCHAR, aFont.GetName() ) );
1680         rReq.Done();
1681     }
1682 }
1683