xref: /AOO41X/main/sc/source/ui/drawfunc/drtxtob.cxx (revision 97e8a92935060941ca19899fb79596f616025ec0)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26 
27 
28 
29 //-------------------------------------------------------------------------
30 
31 #include <com/sun/star/linguistic2/XThesaurus.hpp>
32 #include <com/sun/star/lang/Locale.hpp>
33 
34 #include "scitems.hxx"
35 
36 #include <editeng/adjitem.hxx>
37 #include <svx/clipfmtitem.hxx>
38 #include <editeng/cntritem.hxx>
39 #include <editeng/crsditem.hxx>
40 #include <editeng/editeng.hxx>
41 #include <editeng/escpitem.hxx>
42 #include <editeng/flditem.hxx>
43 #include <editeng/fontitem.hxx>
44 #include <editeng/frmdiritem.hxx>
45 #include <editeng/lrspitem.hxx>
46 #include <editeng/lspcitem.hxx>
47 #include <editeng/ulspitem.hxx>
48 #include <svx/hlnkitem.hxx>
49 #include <editeng/lspcitem.hxx>
50 #include <svx/svdoutl.hxx>
51 #include <editeng/unolingu.hxx>
52 #include <editeng/outlobj.hxx>
53 #include <editeng/postitem.hxx>
54 #include <editeng/scripttypeitem.hxx>
55 #include <editeng/shdditem.hxx>
56 #include <svl/srchitem.hxx>
57 #include <editeng/udlnitem.hxx>
58 #include <editeng/wghtitem.hxx>
59 #include <editeng/writingmodeitem.hxx>
60 #include <sfx2/app.hxx>
61 #include <sfx2/dispatch.hxx>
62 #include <sfx2/objface.hxx>
63 #include <sfx2/objsh.hxx>
64 #include <sfx2/request.hxx>
65 #include <sfx2/viewfrm.hxx>
66 #include <svtools/cliplistener.hxx>
67 #include <svtools/transfer.hxx>
68 #include <svl/whiter.hxx>
69 #include <svl/languageoptions.hxx>
70 #include <vcl/msgbox.hxx>
71 
72 #include <svx/svxdlg.hxx>
73 #include <svx/dialogs.hrc>
74 #include <sfx2/sidebar/EnumContext.hxx>
75 
76 #include "sc.hrc"
77 #include "globstr.hrc"
78 #include "scmod.hxx"
79 #include "drtxtob.hxx"
80 #include "fudraw.hxx"
81 #include "viewdata.hxx"
82 #include "document.hxx"
83 #include "drawview.hxx"
84 #include "viewutil.hxx"
85 #include "scresid.hxx"
86 #include "tabvwsh.hxx"
87 
88 #define ScDrawTextObjectBar
89 #include "scslots.hxx"
90 
91 
92 using namespace ::com::sun::star;
93 
94 
95 SFX_IMPL_INTERFACE( ScDrawTextObjectBar, SfxShell, ScResId(SCSTR_DRAWTEXTSHELL) )
96 {
97 	SFX_OBJECTBAR_REGISTRATION( SFX_OBJECTBAR_OBJECT|SFX_VISIBILITY_STANDARD|SFX_VISIBILITY_SERVER,
98 								ScResId(RID_TEXT_TOOLBOX) );
99 	SFX_POPUPMENU_REGISTRATION( ScResId(RID_POPUP_DRAWTEXT) );
100 	SFX_CHILDWINDOW_REGISTRATION( ScGetFontWorkId() );
101 }
102 
103 TYPEINIT1( ScDrawTextObjectBar, SfxShell );
104 
105 
106 
107 // abschalten der nicht erwuenschten Acceleratoren:
108 
109 void ScDrawTextObjectBar::StateDisableItems( SfxItemSet &rSet )
110 {
111 	SfxWhichIter aIter(rSet);
112 	sal_uInt16 nWhich = aIter.FirstWhich();
113 
114 	while (nWhich)
115 	{
116 		rSet.DisableItem( nWhich );
117 		nWhich = aIter.NextWhich();
118 	}
119 }
120 
121 ScDrawTextObjectBar::ScDrawTextObjectBar(ScViewData* pData) :
122 	SfxShell(pData->GetViewShell()),
123 	pViewData(pData),
124 	pClipEvtLstnr(NULL),
125 	bPastePossible(sal_False)
126 {
127 	SetPool( pViewData->GetScDrawView()->GetDefaultAttr().GetPool() );
128 
129 	//	UndoManager wird beim Umschalten in den Edit-Modus umgesetzt...
130     ::svl::IUndoManager* pMgr = pViewData->GetSfxDocShell()->GetUndoManager();
131     SetUndoManager( pMgr );
132     if ( !pViewData->GetDocument()->IsUndoEnabled() )
133     {
134         pMgr->SetMaxUndoActionCount( 0 );
135     }
136 
137 	SetHelpId( HID_SCSHELL_DRTXTOB );
138 	SetName(String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("DrawText")));
139     SfxShell::SetContextName(sfx2::sidebar::EnumContext::GetContextName(sfx2::sidebar::EnumContext::Context_DrawText));
140 }
141 
142 __EXPORT ScDrawTextObjectBar::~ScDrawTextObjectBar()
143 {
144 	if ( pClipEvtLstnr )
145 	{
146 		pClipEvtLstnr->AddRemoveListener( pViewData->GetActiveWin(), sal_False );
147 
148         //  #122057# The listener may just now be waiting for the SolarMutex and call the link
149         //  afterwards, in spite of RemoveListener. So the link has to be reset, too.
150         pClipEvtLstnr->ClearCallbackLink();
151 
152 		pClipEvtLstnr->release();
153 	}
154 }
155 
156 //========================================================================
157 //
158 //			Funktionen
159 //
160 //========================================================================
161 
162 void __EXPORT ScDrawTextObjectBar::Execute( SfxRequest &rReq )
163 {
164 	ScDrawView* pView = pViewData->GetScDrawView();
165 	OutlinerView* pOutView = pView->GetTextEditOutlinerView();
166 	Outliner* pOutliner = pView->GetTextEditOutliner();
167 
168 	if (!pOutView || !pOutliner)
169 	{
170 		ExecuteGlobal( rReq );				// auf ganze Objekte
171 		return;
172 	}
173 
174 	const SfxItemSet* pReqArgs = rReq.GetArgs();
175 	sal_uInt16 nSlot = rReq.GetSlot();
176 	switch ( nSlot )
177 	{
178 		case SID_COPY:
179 			pOutView->Copy();
180 			break;
181 
182 		case SID_CUT:
183 			pOutView->Cut();
184 			break;
185 
186 		case SID_PASTE:
187 			pOutView->PasteSpecial();
188 			break;
189 
190 		case SID_CLIPBOARD_FORMAT_ITEMS:
191 			{
192 				sal_uLong nFormat = 0;
193 				const SfxPoolItem* pItem;
194 				if ( pReqArgs &&
195 					 pReqArgs->GetItemState(nSlot, sal_True, &pItem) == SFX_ITEM_SET &&
196 					 pItem->ISA(SfxUInt32Item) )
197 				{
198 					nFormat = ((const SfxUInt32Item*)pItem)->GetValue();
199 				}
200 
201 				if ( nFormat )
202 				{
203 					if (nFormat == SOT_FORMAT_STRING)
204 						pOutView->Paste();
205 					else
206 						pOutView->PasteSpecial();
207 				}
208 			}
209 			break;
210 
211         case SID_PASTE_SPECIAL:
212 			ExecutePasteContents( rReq );
213 			break;
214 
215 		case SID_SELECTALL:
216 			{
217 				sal_uLong nCount = pOutliner->GetParagraphCount();
218 				ESelection aSel( 0,0,(sal_uInt16)nCount,0 );
219 				pOutView->SetSelection( aSel );
220 			}
221 			break;
222 
223 		case SID_CHARMAP:
224 			{
225 				const SvxFontItem& rItem = (const SvxFontItem&)
226 							pOutView->GetAttribs().Get(EE_CHAR_FONTINFO);
227 
228 				String aString;
229 				SvxFontItem aNewItem( EE_CHAR_FONTINFO );
230 
231 				const SfxItemSet *pArgs = rReq.GetArgs();
232 				const SfxPoolItem* pItem = 0;
233 				if( pArgs )
234 					pArgs->GetItemState(GetPool().GetWhich(SID_CHARMAP), sal_False, &pItem);
235 
236 				if ( pItem )
237 				{
238 					aString = ((const SfxStringItem*)pItem)->GetValue();
239 					const SfxPoolItem* pFtItem = NULL;
240 					pArgs->GetItemState( GetPool().GetWhich(SID_ATTR_SPECIALCHAR), sal_False, &pFtItem);
241 					const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
242 					if ( pFontItem )
243 					{
244 						String aFontName(pFontItem->GetValue());
245 					    Font aFont(aFontName, Size(1,1)); // Size nur wg. CTOR
246 						aNewItem = SvxFontItem( aFont.GetFamily(), aFont.GetName(),
247 									aFont.GetStyleName(), aFont.GetPitch(),
248                                     aFont.GetCharSet(), ATTR_FONT  );
249 					}
250 					else
251 						aNewItem = rItem;
252 				}
253 				else
254 					ScViewUtil::ExecuteCharMap( rItem, *pViewData->GetViewShell()->GetViewFrame(), aNewItem, aString );
255 
256 				if ( aString.Len() )
257 				{
258 					SfxItemSet aSet( pOutliner->GetEmptyItemSet() );
259 					aSet.Put( aNewItem );
260 					//	SetAttribs an der View selektiert ein Wort, wenn nichts selektiert ist
261 					pOutView->GetOutliner()->QuickSetAttribs( aSet, pOutView->GetSelection() );
262 					pOutView->InsertText(aString);
263 				}
264 
265 				Invalidate( SID_ATTR_CHAR_FONT );
266 			}
267 			break;
268 
269 		case SID_HYPERLINK_SETLINK:
270 			if( pReqArgs )
271 			{
272 				const SfxPoolItem* pItem;
273 				if ( pReqArgs->GetItemState( SID_HYPERLINK_SETLINK, sal_True, &pItem ) == SFX_ITEM_SET )
274 				{
275 					const SvxHyperlinkItem* pHyper = (const SvxHyperlinkItem*) pItem;
276 					const String& rName		= pHyper->GetName();
277 					const String& rURL		= pHyper->GetURL();
278 					const String& rTarget	= pHyper->GetTargetFrame();
279 					SvxLinkInsertMode eMode = pHyper->GetInsertMode();
280 
281 					sal_Bool bDone = sal_False;
282 					if ( pOutView && ( eMode == HLINK_DEFAULT || eMode == HLINK_FIELD ) )
283 					{
284 						const SvxFieldItem*	pFieldItem = pOutView->GetFieldAtSelection();
285 						if (pFieldItem)
286 						{
287 							const SvxFieldData* pField = pFieldItem->GetField();
288 							if ( pField && pField->ISA(SvxURLField) )
289 							{
290 								//	altes Feld selektieren
291 
292 								ESelection aSel = pOutView->GetSelection();
293 								aSel.Adjust();
294 								aSel.nEndPara = aSel.nStartPara;
295 								aSel.nEndPos = aSel.nStartPos + 1;
296 								pOutView->SetSelection( aSel );
297 							}
298 						}
299 
300 						//	neues Feld einfuegen
301 
302 						SvxURLField aURLField( rURL, rName, SVXURLFORMAT_REPR );
303 						aURLField.SetTargetFrame( rTarget );
304                         SvxFieldItem aURLItem( aURLField, EE_FEATURE_FIELD );
305 						pOutView->InsertField( aURLItem );
306 
307 						//	select new field
308 
309 						ESelection aSel = pOutView->GetSelection();
310 						if ( aSel.nStartPos == aSel.nEndPos && aSel.nStartPos > 0 )
311 						{
312 							//	Cursor is behind the inserted field -> extend selection to the left
313 
314 							--aSel.nStartPos;
315 							pOutView->SetSelection( aSel );
316 						}
317 
318 						bDone = sal_True;
319 					}
320 
321 					if (!bDone)
322 						ExecuteGlobal( rReq );		// normal an der View
323 
324 					//	InsertURL an der ViewShell schaltet bei "Text" die DrawShell ab !!!
325 				}
326 			}
327 			break;
328 
329         case SID_OPEN_HYPERLINK:
330             {
331                 if ( pOutView )
332                 {
333                     const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
334                     if ( pFieldItem )
335                     {
336                         const SvxFieldData* pField = pFieldItem->GetField();
337                         if( pField && pField->ISA( SvxURLField ) )
338                         {
339                             const SvxURLField* pURLField = static_cast< const SvxURLField* >( pField );
340                             ScGlobal::OpenURL( pURLField->GetURL(), pURLField->GetTargetFrame() );
341                         }
342                     }
343                 }
344             }
345             break;
346 
347 		case SID_ENABLE_HYPHENATION:
348 		case SID_TEXTDIRECTION_LEFT_TO_RIGHT:
349 		case SID_TEXTDIRECTION_TOP_TO_BOTTOM:
350 #if 0 // DR
351 		    if (IsNoteEdit())
352 		    {
353 		        pView->CaptionTextDirection( rReq.GetSlot());     // process Notes before we end the text edit.
354 		        ExecuteGlobal( rReq );
355 		        pViewData->GetDispatcher().Execute(pViewData->GetView()->GetDrawFuncPtr()->GetSlotID(), SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
356 		    }
357 		    else
358 #endif
359 		    {
360 		        pView->ScEndTextEdit();	// end text edit before switching direction
361 		        ExecuteGlobal( rReq );
362 		        // restore consistent state between shells and functions:
363 		        pViewData->GetDispatcher().Execute(SID_OBJECT_SELECT, SFX_CALLMODE_SLOT | SFX_CALLMODE_RECORD);
364 		    }
365             break;
366 
367 #if 0
368 		// Hyphenation is handled above - text edit is ended
369 		case SID_ENABLE_HYPHENATION:
370 			// force loading of hyphenator (object is skipped in repaint)
371 			((ScDrawLayer*)pView->GetModel())->UseHyphenator();
372 			pOutliner->SetHyphenator( LinguMgr::GetHyphenator() );
373 			ExecuteGlobal( rReq );
374 			break;
375 #endif
376 
377         case SID_THES:
378             {
379                 String aReplaceText;
380                 SFX_REQUEST_ARG( rReq, pItem2, SfxStringItem, SID_THES, sal_False );
381                 if (pItem2)
382                     aReplaceText = pItem2->GetValue();
383                 if (aReplaceText.Len() > 0)
384                     ReplaceTextWithSynonym( pOutView->GetEditView(), aReplaceText );
385             }
386             break;
387 
388         case SID_THESAURUS:
389             {
390                 pOutView->StartThesaurus();
391             }
392             break;
393 
394     }
395 }
396 
397 void __EXPORT ScDrawTextObjectBar::GetState( SfxItemSet& rSet )
398 {
399 	SfxViewFrame* pViewFrm = pViewData->GetViewShell()->GetViewFrame();
400 	sal_Bool bHasFontWork = pViewFrm->HasChildWindow(SID_FONTWORK);
401 	sal_Bool bDisableFontWork = sal_False;
402 
403 	if (IsNoteEdit())
404 	{
405         // #i21255# notes now support rich text formatting (#i74140# but not fontwork)
406         bDisableFontWork = sal_True;
407 	}
408 
409 	if ( bDisableFontWork )
410 		rSet.DisableItem( SID_FONTWORK	);
411 	else
412 		rSet.Put(SfxBoolItem(SID_FONTWORK, bHasFontWork));
413 
414 	if ( rSet.GetItemState( SID_HYPERLINK_GETLINK ) != SFX_ITEM_UNKNOWN )
415 	{
416 		SvxHyperlinkItem aHLinkItem;
417 		SdrView* pView = pViewData->GetScDrawView();
418 		OutlinerView* pOutView = pView->GetTextEditOutlinerView();
419 		if ( pOutView )
420 		{
421 			sal_Bool bField = sal_False;
422 			const SvxFieldItem*	pFieldItem = pOutView->GetFieldAtSelection();
423 			if (pFieldItem)
424 			{
425 				const SvxFieldData* pField = pFieldItem->GetField();
426 				if ( pField && pField->ISA(SvxURLField) )
427 				{
428 					const SvxURLField* pURLField = (const SvxURLField*) pField;
429 					aHLinkItem.SetName( pURLField->GetRepresentation() );
430 					aHLinkItem.SetURL( pURLField->GetURL() );
431 					aHLinkItem.SetTargetFrame( pURLField->GetTargetFrame() );
432 					bField = sal_True;
433 				}
434 			}
435 			if (!bField)
436 			{
437 				// use selected text as name for urls
438 				String sReturn = pOutView->GetSelected();
439 				sReturn.Erase(255);
440 				sReturn.EraseTrailingChars();
441 				aHLinkItem.SetName(sReturn);
442 			}
443 		}
444 		rSet.Put(aHLinkItem);
445 	}
446 
447     if ( rSet.GetItemState( SID_OPEN_HYPERLINK ) != SFX_ITEM_UNKNOWN )
448     {
449         SdrView* pView = pViewData->GetScDrawView();
450         OutlinerView* pOutView = pView->GetTextEditOutlinerView();
451         bool bEnable = false;
452         if ( pOutView )
453         {
454             const SvxFieldItem* pFieldItem = pOutView->GetFieldAtSelection();
455             if ( pFieldItem )
456             {
457                 const SvxFieldData* pField = pFieldItem->GetField();
458                 bEnable = pField && pField->ISA( SvxURLField );
459             }
460         }
461         if( !bEnable )
462             rSet.DisableItem( SID_OPEN_HYPERLINK );
463     }
464 
465     if( rSet.GetItemState( SID_TRANSLITERATE_HALFWIDTH ) != SFX_ITEM_UNKNOWN )
466         ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_HALFWIDTH );
467     if( rSet.GetItemState( SID_TRANSLITERATE_FULLWIDTH ) != SFX_ITEM_UNKNOWN )
468         ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_FULLWIDTH );
469     if( rSet.GetItemState( SID_TRANSLITERATE_HIRAGANA ) != SFX_ITEM_UNKNOWN )
470         ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_HIRAGANA );
471     if( rSet.GetItemState( SID_TRANSLITERATE_KATAGANA ) != SFX_ITEM_UNKNOWN )
472         ScViewUtil::HideDisabledSlot( rSet, pViewFrm->GetBindings(), SID_TRANSLITERATE_KATAGANA );
473 
474 	if ( rSet.GetItemState( SID_ENABLE_HYPHENATION ) != SFX_ITEM_UNKNOWN )
475 	{
476 		SdrView* pView = pViewData->GetScDrawView();
477 		SfxItemSet aAttrs( pView->GetModel()->GetItemPool() );
478 		pView->GetAttributes( aAttrs );
479 		if( aAttrs.GetItemState( EE_PARA_HYPHENATE ) >= SFX_ITEM_AVAILABLE )
480 		{
481 			sal_Bool bValue = ( (const SfxBoolItem&) aAttrs.Get( EE_PARA_HYPHENATE ) ).GetValue();
482 			rSet.Put( SfxBoolItem( SID_ENABLE_HYPHENATION, bValue ) );
483 		}
484 	}
485 
486     if ( rSet.GetItemState( SID_THES ) != SFX_ITEM_UNKNOWN  ||
487          rSet.GetItemState( SID_THESAURUS ) != SFX_ITEM_UNKNOWN )
488     {
489         SdrView * pView = pViewData->GetScDrawView();
490         OutlinerView* pOutView = pView->GetTextEditOutlinerView();
491 
492         String          aStatusVal;
493         LanguageType    nLang = LANGUAGE_NONE;
494         bool bIsLookUpWord = false;
495         if ( pOutView )
496         {
497             EditView& rEditView = pOutView->GetEditView();
498             bIsLookUpWord = GetStatusValueForThesaurusFromContext( aStatusVal, nLang, rEditView );
499         }
500         rSet.Put( SfxStringItem( SID_THES, aStatusVal ) );
501 
502         // disable thesaurus main menu and context menu entry if there is nothing to look up
503         sal_Bool bCanDoThesaurus = ScModule::HasThesaurusLanguage( nLang );
504         if (!bIsLookUpWord || !bCanDoThesaurus)
505             rSet.DisableItem( SID_THES );
506         if (!bCanDoThesaurus)
507             rSet.DisableItem( SID_THESAURUS );
508     }
509 }
510 
511 IMPL_LINK( ScDrawTextObjectBar, ClipboardChanged, TransferableDataHelper*, pDataHelper )
512 {
513 	if ( pDataHelper )
514 	{
515 		bPastePossible = ( pDataHelper->HasFormat( SOT_FORMAT_STRING ) || pDataHelper->HasFormat( SOT_FORMAT_RTF ) );
516 
517 		SfxBindings& rBindings = pViewData->GetBindings();
518 		rBindings.Invalidate( SID_PASTE );
519         rBindings.Invalidate( SID_PASTE_SPECIAL );
520 		rBindings.Invalidate( SID_CLIPBOARD_FORMAT_ITEMS );
521 	}
522 	return 0;
523 }
524 
525 void __EXPORT ScDrawTextObjectBar::GetClipState( SfxItemSet& rSet )
526 {
527 	SdrView* pView = pViewData->GetScDrawView();
528 	if ( !pView->GetTextEditOutlinerView() )
529 	{
530 		GetGlobalClipState( rSet );
531 		return;
532 	}
533 
534 	if ( !pClipEvtLstnr )
535 	{
536 		// create listener
537 		pClipEvtLstnr = new TransferableClipboardListener( LINK( this, ScDrawTextObjectBar, ClipboardChanged ) );
538 		pClipEvtLstnr->acquire();
539 		Window* pWin = pViewData->GetActiveWin();
540 		pClipEvtLstnr->AddRemoveListener( pWin, sal_True );
541 
542 		// get initial state
543 		TransferableDataHelper aDataHelper( TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
544 		bPastePossible = ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) || aDataHelper.HasFormat( SOT_FORMAT_RTF ) );
545 	}
546 
547 	SfxWhichIter aIter( rSet );
548 	sal_uInt16 nWhich = aIter.FirstWhich();
549 	while (nWhich)
550 	{
551 		switch (nWhich)
552 		{
553 			case SID_PASTE:
554             case SID_PASTE_SPECIAL:
555 				if( !bPastePossible )
556 					rSet.DisableItem( nWhich );
557 				break;
558 			case SID_CLIPBOARD_FORMAT_ITEMS:
559 				if ( bPastePossible )
560 				{
561 					SvxClipboardFmtItem aFormats( SID_CLIPBOARD_FORMAT_ITEMS );
562 					TransferableDataHelper aDataHelper(
563 							TransferableDataHelper::CreateFromSystemClipboard( pViewData->GetActiveWin() ) );
564 
565 					if ( aDataHelper.HasFormat( SOT_FORMAT_STRING ) )
566 						aFormats.AddClipbrdFormat( SOT_FORMAT_STRING );
567 					if ( aDataHelper.HasFormat( SOT_FORMAT_RTF ) )
568 						aFormats.AddClipbrdFormat( SOT_FORMAT_RTF );
569 
570 					rSet.Put( aFormats );
571 				}
572 				else
573 					rSet.DisableItem( nWhich );
574 				break;
575 		}
576 		nWhich = aIter.NextWhich();
577 	}
578 }
579 
580 //========================================================================
581 //
582 //			Attribute
583 //
584 //========================================================================
585 
586 void __EXPORT ScDrawTextObjectBar::ExecuteToggle( SfxRequest &rReq )
587 {
588 	//	Unterstreichung
589 
590 	SdrView* pView = pViewData->GetScDrawView();
591 
592 	sal_uInt16 nSlot = rReq.GetSlot();
593 
594 	SfxItemSet aSet( pView->GetDefaultAttr() );
595 
596 	SfxItemSet aViewAttr(pView->GetModel()->GetItemPool());
597 	pView->GetAttributes(aViewAttr);
598 
599 	//	Unterstreichung
600 	FontUnderline eOld = ((const SvxUnderlineItem&) aViewAttr.
601 										Get(EE_CHAR_UNDERLINE)).GetLineStyle();
602 	FontUnderline eNew = eOld;
603 	switch (nSlot)
604 	{
605 		case SID_ULINE_VAL_NONE:
606 			eNew = UNDERLINE_NONE;
607 			break;
608 		case SID_ULINE_VAL_SINGLE:
609 			eNew = ( eOld == UNDERLINE_SINGLE ) ? UNDERLINE_NONE : UNDERLINE_SINGLE;
610 			break;
611 		case SID_ULINE_VAL_DOUBLE:
612 			eNew = ( eOld == UNDERLINE_DOUBLE ) ? UNDERLINE_NONE : UNDERLINE_DOUBLE;
613 			break;
614 		case SID_ULINE_VAL_DOTTED:
615 			eNew = ( eOld == UNDERLINE_DOTTED ) ? UNDERLINE_NONE : UNDERLINE_DOTTED;
616 			break;
617 		default:
618 			break;
619 	}
620 	aSet.Put( SvxUnderlineItem( eNew, EE_CHAR_UNDERLINE ) );
621 
622 	pView->SetAttributes( aSet );
623 	rReq.Done();
624 	pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
625 }
626 
627 void lcl_RemoveFields( OutlinerView& rOutView )
628 {
629 	//!	Outliner should have RemoveFields with a selection
630 
631 	Outliner* pOutliner = rOutView.GetOutliner();
632 	if (!pOutliner) return;
633 
634 	ESelection aOldSel = rOutView.GetSelection();
635 	ESelection aSel = aOldSel;
636 	aSel.Adjust();
637 	xub_StrLen nNewEnd = aSel.nEndPos;
638 
639 	sal_Bool bUpdate = pOutliner->GetUpdateMode();
640 	sal_Bool bChanged = sal_False;
641 
642 	//!	GetPortions and GetAttribs should be const!
643 	EditEngine& rEditEng = (EditEngine&)pOutliner->GetEditEngine();
644 
645 	sal_uLong nParCount = pOutliner->GetParagraphCount();
646 	for (sal_uLong nPar=0; nPar<nParCount; nPar++)
647 		if ( nPar >= aSel.nStartPara && nPar <= aSel.nEndPara )
648 		{
649 			SvUShorts aPortions;
650 			rEditEng.GetPortions( (sal_uInt16)nPar, aPortions );
651 			//!	GetPortions should use xub_StrLen instead of sal_uInt16
652 
653 			for ( sal_uInt16 nPos = aPortions.Count(); nPos; )
654 			{
655 				--nPos;
656 				sal_uInt16 nEnd = aPortions.GetObject( nPos );
657 				sal_uInt16 nStart = nPos ? aPortions.GetObject( nPos - 1 ) : 0;
658 				// fields are single characters
659 				if ( nEnd == nStart+1 &&
660 					 ( nPar > aSel.nStartPara || nStart >= aSel.nStartPos ) &&
661 					 ( nPar < aSel.nEndPara   || nEnd   <= aSel.nEndPos ) )
662 				{
663 					ESelection aFieldSel( (sal_uInt16)nPar, nStart, (sal_uInt16)nPar, nEnd );
664 					SfxItemSet aSet = rEditEng.GetAttribs( aFieldSel );
665 					if ( aSet.GetItemState( EE_FEATURE_FIELD ) == SFX_ITEM_ON )
666 					{
667 						if (!bChanged)
668 						{
669 							if (bUpdate)
670 								pOutliner->SetUpdateMode( sal_False );
671 							String aName = ScGlobal::GetRscString( STR_UNDO_DELETECONTENTS );
672 							pOutliner->GetUndoManager().EnterListAction( aName, aName );
673 							bChanged = sal_True;
674 						}
675 
676 						String aFieldText = rEditEng.GetText( aFieldSel );
677 						pOutliner->QuickInsertText( aFieldText, aFieldSel );
678 						if ( nPar == aSel.nEndPara )
679 						{
680                             nNewEnd = sal::static_int_cast<xub_StrLen>( nNewEnd + aFieldText.Len() );
681 							--nNewEnd;
682 						}
683 					}
684 				}
685 			}
686 		}
687 
688 	if (bUpdate && bChanged)
689 	{
690 		pOutliner->GetUndoManager().LeaveListAction();
691 		pOutliner->SetUpdateMode( sal_True );
692 	}
693 
694 	if ( aOldSel.IsEqual( aSel ) )			// aSel is adjusted
695 		aOldSel.nEndPos = nNewEnd;
696 	else
697 		aOldSel.nStartPos = nNewEnd;		// if aOldSel is backwards
698 	rOutView.SetSelection( aOldSel );
699 }
700 
701 void __EXPORT ScDrawTextObjectBar::ExecuteAttr( SfxRequest &rReq )
702 {
703 	SdrView*			pView = pViewData->GetScDrawView();
704 	const SfxItemSet*	pArgs = rReq.GetArgs();
705 	sal_uInt16				nSlot = rReq.GetSlot();
706 
707 	sal_Bool bArgsInReq = ( pArgs != NULL );
708 	if ( !bArgsInReq )
709 	{
710 		SfxItemSet aEditAttr(pView->GetModel()->GetItemPool());
711 		pView->GetAttributes(aEditAttr);
712 		SfxItemSet	aNewAttr( *aEditAttr.GetPool(), aEditAttr.GetRanges() );
713 		sal_Bool		bDone = sal_True;
714 
715 		switch ( nSlot )
716 		{
717 			case SID_TEXT_STANDARD:	// Harte Textattributierung loeschen
718 			{
719 				OutlinerView* pOutView = pView->IsTextEdit() ?
720 								pView->GetTextEditOutlinerView() : NULL;
721 				if ( pOutView )
722 					pOutView->Paint( Rectangle() );
723 
724 				SfxItemSet aEmptyAttr( *aEditAttr.GetPool(), EE_ITEMS_START, EE_ITEMS_END );
725 				pView->SetAttributes( aEmptyAttr, sal_True );
726 
727 				if ( pOutView )
728 				{
729 					lcl_RemoveFields( *pOutView );
730 					pOutView->ShowCursor();
731 				}
732 
733 				rReq.Done( aEmptyAttr );
734 				pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
735 				bDone = sal_False; // bereits hier passiert
736 			}
737 			break;
738 
739 			case SID_CHAR_DLG_EFFECT:
740 			case SID_CHAR_DLG:						// Dialog-Button
741 			case SID_ATTR_CHAR_FONT:				// Controller nicht angezeigt
742 			case SID_ATTR_CHAR_FONTHEIGHT:
743 				bDone = ExecuteCharDlg( aEditAttr, aNewAttr , nSlot);
744 				break;
745 
746 			case SID_PARA_DLG:
747 				bDone = ExecuteParaDlg( aEditAttr, aNewAttr );
748 				break;
749 
750 			case SID_ATTR_CHAR_WEIGHT:
751 				aNewAttr.Put( (const SvxWeightItem&)aEditAttr.Get( EE_CHAR_WEIGHT ) );
752 				break;
753 
754 			case SID_ATTR_CHAR_POSTURE:
755 				aNewAttr.Put( (const SvxPostureItem&)aEditAttr.Get( EE_CHAR_ITALIC ) );
756 				break;
757 
758 			case SID_ATTR_CHAR_UNDERLINE:
759 				aNewAttr.Put( (const SvxUnderlineItem&)aEditAttr.Get( EE_CHAR_UNDERLINE ) );
760 				break;
761 
762 			case SID_ATTR_CHAR_OVERLINE:
763 				aNewAttr.Put( (const SvxOverlineItem&)aEditAttr.Get( EE_CHAR_OVERLINE ) );
764 				break;
765 
766 			case SID_ATTR_CHAR_CONTOUR:
767 				aNewAttr.Put( (const SvxContourItem&)aEditAttr.Get( EE_CHAR_OUTLINE ) );
768 				break;
769 
770 			case SID_ATTR_CHAR_SHADOWED:
771 				aNewAttr.Put( (const SvxShadowedItem&)aEditAttr.Get( EE_CHAR_SHADOW ) );
772 				break;
773 
774 			case SID_ATTR_CHAR_STRIKEOUT:
775 				aNewAttr.Put( (const SvxCrossedOutItem&)aEditAttr.Get( EE_CHAR_STRIKEOUT ) );
776 				break;
777 
778 			case SID_ALIGNLEFT:
779             case SID_ALIGN_ANY_LEFT:
780 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
781 				break;
782 
783 			case SID_ALIGNCENTERHOR:
784             case SID_ALIGN_ANY_HCENTER:
785 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
786 				break;
787 
788 			case SID_ALIGNRIGHT:
789             case SID_ALIGN_ANY_RIGHT:
790 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
791 				break;
792 
793 			case SID_ALIGNBLOCK:
794             case SID_ALIGN_ANY_JUSTIFIED:
795 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST ) );
796 				break;
797 
798 			case SID_ATTR_PARA_LINESPACE_10:
799 				{
800 					SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_LINE, EE_PARA_SBL );
801 					aItem.SetPropLineSpace( 100 );
802 					aNewAttr.Put( aItem );
803 				}
804 				break;
805 
806 			case SID_ATTR_PARA_LINESPACE_15:
807 				{
808 					SvxLineSpacingItem aItem( SVX_LINESPACE_ONE_POINT_FIVE_LINES, EE_PARA_SBL );
809 					aItem.SetPropLineSpace( 150 );
810 					aNewAttr.Put( aItem );
811 				}
812 				break;
813 
814 			case SID_ATTR_PARA_LINESPACE_20:
815 				{
816 					SvxLineSpacingItem aItem( SVX_LINESPACE_TWO_LINES, EE_PARA_SBL );
817 					aItem.SetPropLineSpace( 200 );
818 					aNewAttr.Put( aItem );
819 				}
820 				break;
821 
822 			case SID_SET_SUPER_SCRIPT:
823 				{
824 					SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
825 					SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
826 									aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
827 
828 					if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
829 						aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
830 					else
831 						aItem.SetEscapement( SVX_ESCAPEMENT_SUPERSCRIPT );
832 					aNewAttr.Put( aItem );
833 				}
834 				break;
835 			case SID_SET_SUB_SCRIPT:
836 				{
837 					SvxEscapementItem aItem(EE_CHAR_ESCAPEMENT);
838 					SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
839 									aEditAttr.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
840 
841 					if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
842 						aItem.SetEscapement( SVX_ESCAPEMENT_OFF );
843 					else
844 						aItem.SetEscapement( SVX_ESCAPEMENT_SUBSCRIPT );
845 					aNewAttr.Put( aItem );
846 				}
847 				break;
848 
849 			case SID_DRAWTEXT_ATTR_DLG:
850 				{
851 					SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
852 					SfxAbstractTabDialog *pDlg = pFact->CreateTextTabDialog( pViewData->GetDialogParent(), &aEditAttr, pView );
853 
854 					bDone = ( RET_OK == pDlg->Execute() );
855 
856 					if ( bDone )
857 						aNewAttr.Put( *pDlg->GetOutputItemSet() );
858 
859 					delete pDlg;
860 				}
861 				break;
862 		}
863 
864 		if ( bDone ) // wurden Attribute geaendert?
865 		{
866 			rReq.Done( aNewAttr );
867 			pArgs = rReq.GetArgs();
868 		}
869 	}
870 
871 	if ( pArgs )
872 	{
873 		if ( bArgsInReq &&
874 			( nSlot == SID_ATTR_CHAR_FONT || nSlot == SID_ATTR_CHAR_FONTHEIGHT ||
875 			  nSlot == SID_ATTR_CHAR_WEIGHT || nSlot == SID_ATTR_CHAR_POSTURE ) )
876 		{
877 			// font items from toolbox controller have to be applied for the right script type
878 
879 			// #i78017 establish the same behaviour as in Writer
880 			sal_uInt16 nScript = SCRIPTTYPE_LATIN | SCRIPTTYPE_ASIAN | SCRIPTTYPE_COMPLEX;
881 			if (nSlot == SID_ATTR_CHAR_FONT)
882 				nScript = pView->GetScriptType();
883 
884 			SfxItemPool& rPool = GetPool();
885 			SvxScriptSetItem aSetItem( nSlot, rPool );
886 			sal_uInt16 nWhich = rPool.GetWhich( nSlot );
887 			aSetItem.PutItemForScriptType( nScript, pArgs->Get( nWhich ) );
888 
889 			pView->SetAttributes( aSetItem.GetItemSet() );
890 		}
891 		else if( nSlot == SID_ATTR_PARA_LRSPACE )
892 		{
893 			sal_uInt16 nId = SID_ATTR_PARA_LRSPACE;
894 			const SvxLRSpaceItem& rItem = (const SvxLRSpaceItem&)
895 				pArgs->Get( nId );
896 			SfxItemSet aEditAttr( GetPool(), EE_PARA_LRSPACE, EE_PARA_LRSPACE );
897 			nId = EE_PARA_LRSPACE;
898 			SvxLRSpaceItem aLRSpaceItem( rItem.GetLeft(),
899 				rItem.GetRight(), rItem.GetTxtLeft(),
900 				rItem.GetTxtFirstLineOfst(), nId );
901 			aEditAttr.Put( aLRSpaceItem );
902 //			rReq.Done( aEditAttr );
903 //			pArgs = rReq.GetArgs();
904 //			pView->SetAttributes( *pArgs );
905 			pView->SetAttributes( aEditAttr );
906 //			Invalidate(SID_ATTR_PARA_LRSPACE);
907 		}
908 		else if( nSlot == SID_ATTR_PARA_LINESPACE )
909 		{
910 			sal_uInt16 nId = SID_ATTR_PARA_LINESPACE;
911 			SvxLineSpacingItem aLineSpaceItem = (const SvxLineSpacingItem&)pArgs->Get(
912 																GetPool().GetWhich(nSlot));
913 			SfxItemSet aEditAttr( GetPool(), EE_PARA_SBL, EE_PARA_SBL );
914 			aEditAttr.Put( aLineSpaceItem );
915 //			rReq.Done( aEditAttr );
916 //			pArgs = rReq.GetArgs();
917 //			pView->SetAttributes( *pArgs );
918 			pView->SetAttributes( aEditAttr );
919 //			Invalidate(SID_ATTR_PARA_LINESPACE);
920 		}
921 		else if( nSlot == SID_ATTR_PARA_ULSPACE )
922 		{
923 			sal_uInt16 nId = SID_ATTR_PARA_ULSPACE;
924 			SvxULSpaceItem aULSpaceItem = (const SvxULSpaceItem&)pArgs->Get(
925 																GetPool().GetWhich(nSlot));
926 			SfxItemSet aEditAttr( GetPool(), EE_PARA_ULSPACE, EE_PARA_ULSPACE );
927 			aULSpaceItem.SetWhich(EE_PARA_ULSPACE);
928 			aEditAttr.Put( aULSpaceItem );
929 //			rReq.Done( aEditAttr );
930 //			pArgs = rReq.GetArgs();
931 //			pView->SetAttributes( *pArgs );
932 			pView->SetAttributes( aEditAttr );
933 //			Invalidate(SID_ATTR_PARA_ULSPACE);
934 		}
935 		else if (bArgsInReq &&
936 			(nSlot == SID_ATTR_PARA_ADJUST_LEFT || nSlot == SID_ATTR_PARA_ADJUST_CENTER || nSlot == SID_ATTR_PARA_ADJUST_RIGHT || nSlot == SID_ATTR_PARA_ADJUST_BLOCK ))
937 		{
938 			SfxItemSet aEditAttr(pView->GetModel()->GetItemPool());
939 			SfxItemSet	aNewAttr( *aEditAttr.GetPool(), aEditAttr.GetRanges() );
940 			switch ( nSlot )
941 			{
942 			case SID_ATTR_PARA_ADJUST_LEFT:
943 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
944 				break;
945 			case SID_ATTR_PARA_ADJUST_CENTER:
946 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
947 				break;
948 			case SID_ATTR_PARA_ADJUST_RIGHT:
949 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
950 				break;
951 			case SID_ATTR_PARA_ADJUST_BLOCK:
952 				aNewAttr.Put( SvxAdjustItem( SVX_ADJUST_BLOCK, EE_PARA_JUST ) );
953 				break;
954 			}
955 			pView->SetAttributes(aNewAttr);
956 		}
957 		else
958 		{
959 			// use args directly
960 
961 			pView->SetAttributes( *pArgs );
962 		}
963 		pViewData->GetScDrawView()->InvalidateDrawTextAttrs();
964 	}
965 }
966 
967 void __EXPORT ScDrawTextObjectBar::GetAttrState( SfxItemSet& rDestSet )
968 {
969 	if ( IsNoteEdit() )
970 	{
971 	    // issue 21255 - Notes now support rich text formatting.
972 	}
973 
974 	SvtLanguageOptions	aLangOpt;
975 	sal_Bool bDisableCTLFont = !aLangOpt.IsCTLFontEnabled();
976 	sal_Bool bDisableVerticalText = !aLangOpt.IsVerticalTextEnabled();
977 
978 	SdrView* pView = pViewData->GetScDrawView();
979 	SfxItemSet aAttrSet(pView->GetModel()->GetItemPool());
980 	pView->GetAttributes(aAttrSet);
981 
982 	//	direkte Attribute
983 
984 	rDestSet.Put( aAttrSet );
985 
986 	//	choose font info according to selection script type
987 
988 	sal_uInt16 nScript = pView->GetScriptType();
989 
990     // #i55929# input-language-dependent script type (depends on input language if nothing selected)
991     sal_uInt16 nInputScript = nScript;
992     OutlinerView* pOutView = pView->GetTextEditOutlinerView();
993     if (pOutView && !pOutView->GetSelection().HasRange())
994     {
995         LanguageType nInputLang = pViewData->GetActiveWin()->GetInputLanguage();
996         if (nInputLang != LANGUAGE_DONTKNOW && nInputLang != LANGUAGE_SYSTEM)
997             nInputScript = SvtLanguageOptions::GetScriptTypeOfLanguage( nInputLang );
998     }
999 
1000     // #i55929# according to spec, nInputScript is used for font and font height only
1001 	if ( rDestSet.GetItemState( EE_CHAR_FONTINFO ) != SFX_ITEM_UNKNOWN )
1002 		ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTINFO, nInputScript );
1003 	if ( rDestSet.GetItemState( EE_CHAR_FONTHEIGHT ) != SFX_ITEM_UNKNOWN )
1004 		ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_FONTHEIGHT, nInputScript );
1005 	if ( rDestSet.GetItemState( EE_CHAR_WEIGHT ) != SFX_ITEM_UNKNOWN )
1006 		ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_WEIGHT, nScript );
1007 	if ( rDestSet.GetItemState( EE_CHAR_ITALIC ) != SFX_ITEM_UNKNOWN )
1008 		ScViewUtil::PutItemScript( rDestSet, aAttrSet, EE_CHAR_ITALIC, nScript );
1009 	//	Ausrichtung
1010 
1011 	SvxAdjust eAdj = ((const SvxAdjustItem&)aAttrSet.Get(EE_PARA_JUST)).GetAdjust();
1012 	switch( eAdj )
1013 	{
1014 	case SVX_ADJUST_LEFT:
1015 		{
1016 			rDestSet.Put( SfxBoolItem( SID_ALIGNLEFT, sal_True ) );
1017 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_LEFT, sal_True ) );
1018 		}
1019 		break;
1020 	case SVX_ADJUST_CENTER:
1021 		{
1022 			rDestSet.Put( SfxBoolItem( SID_ALIGNCENTERHOR, sal_True ) );
1023 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_CENTER, sal_True ) );
1024 		}
1025 		break;
1026 	case SVX_ADJUST_RIGHT:
1027 		{
1028 			rDestSet.Put( SfxBoolItem( SID_ALIGNRIGHT, sal_True ) );
1029 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_RIGHT, sal_True ) );
1030 		}
1031 		break;
1032 	case SVX_ADJUST_BLOCK:
1033 		{
1034 			rDestSet.Put( SfxBoolItem( SID_ALIGNBLOCK, sal_True ) );
1035 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_ADJUST_BLOCK, sal_True ) );
1036 		}
1037 		break;
1038         default:
1039         {
1040             // added to avoid warnings
1041         }
1042 	}
1043     // pseudo slots for Format menu
1044     rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_LEFT,      eAdj == SVX_ADJUST_LEFT ) );
1045     rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_HCENTER,   eAdj == SVX_ADJUST_CENTER ) );
1046     rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_RIGHT,     eAdj == SVX_ADJUST_RIGHT ) );
1047     rDestSet.Put( SfxBoolItem( SID_ALIGN_ANY_JUSTIFIED, eAdj == SVX_ADJUST_BLOCK ) );
1048 
1049     	SvxLRSpaceItem aLR = ((const SvxLRSpaceItem&)aAttrSet.Get( EE_PARA_LRSPACE ));
1050 	aLR.SetWhich(SID_ATTR_PARA_LRSPACE);
1051 	rDestSet.Put(aLR);
1052 	Invalidate( SID_ATTR_PARA_LRSPACE );
1053 	SfxItemState eState = aAttrSet.GetItemState( EE_PARA_LRSPACE );
1054 	if ( eState == SFX_ITEM_DONTCARE )
1055 		rDestSet.InvalidateItem(SID_ATTR_PARA_LRSPACE);
1056 	//xuxu for Line Space
1057 	SvxLineSpacingItem aLineSP = ((const SvxLineSpacingItem&)aAttrSet.
1058 						Get( EE_PARA_SBL ));
1059 	aLineSP.SetWhich(SID_ATTR_PARA_LINESPACE);
1060 	rDestSet.Put(aLineSP);
1061 	Invalidate(SID_ATTR_PARA_LINESPACE);
1062 	eState = aAttrSet.GetItemState( EE_PARA_SBL );
1063 	if ( eState == SFX_ITEM_DONTCARE )
1064 		rDestSet.InvalidateItem(SID_ATTR_PARA_LINESPACE);
1065 	//xuxu for UL Space
1066 	SvxULSpaceItem aULSP = ((const SvxULSpaceItem&)aAttrSet.
1067 						Get( EE_PARA_ULSPACE ));
1068 	aULSP.SetWhich(SID_ATTR_PARA_ULSPACE);
1069 	rDestSet.Put(aULSP);
1070 	Invalidate(SID_ATTR_PARA_ULSPACE);
1071 	eState = aAttrSet.GetItemState( EE_PARA_ULSPACE );
1072 	if ( eState == SFX_ITEM_DONTCARE )
1073 		rDestSet.InvalidateItem(SID_ATTR_PARA_ULSPACE);
1074 
1075 	//	Zeilenabstand
1076 
1077 	sal_uInt16 nLineSpace = (sal_uInt16)
1078 				((const SvxLineSpacingItem&)aAttrSet.
1079 						Get( EE_PARA_SBL )).GetPropLineSpace();
1080 	switch( nLineSpace )
1081 	{
1082 		case 100:
1083 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_10, sal_True ) );
1084 			break;
1085 		case 150:
1086 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_15, sal_True ) );
1087 			break;
1088 		case 200:
1089 			rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LINESPACE_20, sal_True ) );
1090 			break;
1091 	}
1092 
1093 	//	hoch-/tiefgestellt
1094 
1095 	SvxEscapement eEsc = (SvxEscapement) ( (const SvxEscapementItem&)
1096 					aAttrSet.Get( EE_CHAR_ESCAPEMENT ) ).GetEnumValue();
1097 	if( eEsc == SVX_ESCAPEMENT_SUPERSCRIPT )
1098 		rDestSet.Put( SfxBoolItem( SID_SET_SUPER_SCRIPT, sal_True ) );
1099 	else if( eEsc == SVX_ESCAPEMENT_SUBSCRIPT )
1100 		rDestSet.Put( SfxBoolItem( SID_SET_SUB_SCRIPT, sal_True ) );
1101 
1102 	//	Unterstreichung
1103 
1104 	eState = aAttrSet.GetItemState( EE_CHAR_UNDERLINE, sal_True );
1105 	if ( eState == SFX_ITEM_DONTCARE )
1106 	{
1107 		rDestSet.InvalidateItem( SID_ULINE_VAL_NONE );
1108 		rDestSet.InvalidateItem( SID_ULINE_VAL_SINGLE );
1109 		rDestSet.InvalidateItem( SID_ULINE_VAL_DOUBLE );
1110 		rDestSet.InvalidateItem( SID_ULINE_VAL_DOTTED );
1111 	}
1112 	else
1113 	{
1114 		FontUnderline eUnderline = ((const SvxUnderlineItem&)
1115 					aAttrSet.Get(EE_CHAR_UNDERLINE)).GetLineStyle();
1116 		sal_uInt16 nId = SID_ULINE_VAL_NONE;
1117 		switch (eUnderline)
1118 		{
1119 			case UNDERLINE_SINGLE:	nId = SID_ULINE_VAL_SINGLE;	break;
1120 			case UNDERLINE_DOUBLE:	nId = SID_ULINE_VAL_DOUBLE;	break;
1121 			case UNDERLINE_DOTTED:	nId = SID_ULINE_VAL_DOTTED;	break;
1122 			default:
1123 				break;
1124 		}
1125 		rDestSet.Put( SfxBoolItem( nId, sal_True ) );
1126 	}
1127 
1128 	//	horizontal / vertical
1129 
1130 	sal_Bool bLeftToRight = sal_True;
1131 
1132 	SdrOutliner* pOutl = pView->GetTextEditOutliner();
1133 	if( pOutl )
1134 	{
1135 		if( pOutl->IsVertical() )
1136 			bLeftToRight = sal_False;
1137 	}
1138 	else
1139 		bLeftToRight = ( (const SvxWritingModeItem&) aAttrSet.Get( SDRATTR_TEXTDIRECTION ) ).GetValue() == com::sun::star::text::WritingMode_LR_TB;
1140 
1141 	if ( bDisableVerticalText )
1142 	{
1143 		rDestSet.DisableItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT );
1144 		rDestSet.DisableItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM );
1145 	}
1146 	else
1147 	{
1148 		rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_LEFT_TO_RIGHT, bLeftToRight ) );
1149 		rDestSet.Put( SfxBoolItem( SID_TEXTDIRECTION_TOP_TO_BOTTOM, !bLeftToRight ) );
1150 	}
1151 
1152 	//	left-to-right or right-to-left
1153 
1154 	if ( !bLeftToRight || bDisableCTLFont )
1155 	{
1156 		//	disabled if vertical
1157 		rDestSet.DisableItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
1158 		rDestSet.DisableItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
1159 	}
1160 	else if ( aAttrSet.GetItemState( EE_PARA_WRITINGDIR ) == SFX_ITEM_DONTCARE )
1161 	{
1162 		rDestSet.InvalidateItem( SID_ATTR_PARA_LEFT_TO_RIGHT );
1163 		rDestSet.InvalidateItem( SID_ATTR_PARA_RIGHT_TO_LEFT );
1164 	}
1165 	else
1166 	{
1167 	    SvxFrameDirection eAttrDir = (SvxFrameDirection)((const SvxFrameDirectionItem&)
1168 	                                    aAttrSet.Get( EE_PARA_WRITINGDIR )).GetValue();
1169 	    if ( eAttrDir == FRMDIR_ENVIRONMENT )
1170 	    {
1171 	    	//	get "environment" direction from page style
1172 	    	if ( pViewData->GetDocument()->GetEditTextDirection( pViewData->GetTabNo() ) == EE_HTEXTDIR_R2L )
1173 		    	eAttrDir = FRMDIR_HORI_RIGHT_TOP;
1174 		    else
1175 		    	eAttrDir = FRMDIR_HORI_LEFT_TOP;
1176 	    }
1177 		rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_LEFT_TO_RIGHT, ( eAttrDir == FRMDIR_HORI_LEFT_TOP ) ) );
1178 		rDestSet.Put( SfxBoolItem( SID_ATTR_PARA_RIGHT_TO_LEFT, ( eAttrDir == FRMDIR_HORI_RIGHT_TOP ) ) );
1179 	}
1180 }
1181 
1182 void ScDrawTextObjectBar::ExecuteTrans( SfxRequest& rReq )
1183 {
1184 	sal_Int32 nType = ScViewUtil::GetTransliterationType( rReq.GetSlot() );
1185 	if ( nType )
1186 	{
1187 		ScDrawView* pView = pViewData->GetScDrawView();
1188 		OutlinerView* pOutView = pView->GetTextEditOutlinerView();
1189 		if ( pOutView )
1190 		{
1191 			//	change selected text in object
1192 			pOutView->TransliterateText( nType );
1193 		}
1194 		else
1195 		{
1196 			//!	apply to whole objects?
1197 		}
1198 	}
1199 }
1200