xref: /AOO41X/main/sd/source/ui/func/fubullet.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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_sd.hxx"
30 
31 
32 #include "fubullet.hxx"
33 
34 #ifndef _BINDING_HXX //autogen
35 #include <sfx2/bindings.hxx>
36 #endif
37 #include <editeng/eeitem.hxx>
38 #include <svl/poolitem.hxx>
39 #include <editeng/fontitem.hxx>
40 #include "OutlineViewShell.hxx"
41 #include "DrawViewShell.hxx"
42 #include "Window.hxx"
43 #include "drawdoc.hxx"
44 #include "strings.hrc"
45 #include "sdresid.hxx"
46 #include <svx/svdoutl.hxx>
47 #include <vcl/msgbox.hxx>
48 #include <sfx2/request.hxx>
49 #include <svl/ctloptions.hxx>
50 #include <svl/itempool.hxx>
51 
52 #include <svx/svxdlg.hxx>
53 #include <svx/dialogs.hrc>
54 #include "drawview.hxx"
55 
56 #include "app.hrc"
57 
58 namespace sd {
59 
60 const sal_Unicode CHAR_HARDBLANK	=	((sal_Unicode)0x00A0);
61 const sal_Unicode CHAR_HARDHYPHEN	=	((sal_Unicode)0x2011);
62 const sal_Unicode CHAR_SOFTHYPHEN	=	((sal_Unicode)0x00AD);
63 const sal_Unicode CHAR_RLM          =	((sal_Unicode)0x200F);
64 const sal_Unicode CHAR_LRM          =	((sal_Unicode)0x200E);
65 const sal_Unicode CHAR_ZWSP			=	((sal_Unicode)0x200B);
66 const sal_Unicode CHAR_ZWNBSP		=	((sal_Unicode)0x2060);
67 
68 TYPEINIT1( FuBullet, FuPoor );
69 
70 /*************************************************************************
71 |*
72 |* Konstruktor
73 |*
74 \************************************************************************/
75 
76 FuBullet::FuBullet (
77     ViewShell* pViewSh,
78     ::sd::Window* pWin,
79     ::sd::View* _pView,
80     SdDrawDocument* pDoc,
81     SfxRequest& rReq)
82     : FuPoor(pViewSh, pWin, _pView, pDoc, rReq)
83 {
84 }
85 
86 FunctionReference FuBullet::Create( ViewShell* pViewSh, ::sd::Window* pWin, ::sd::View* pView, SdDrawDocument* pDoc, SfxRequest& rReq )
87 {
88 	FunctionReference xFunc( new FuBullet( pViewSh, pWin, pView, pDoc, rReq ) );
89 	xFunc->DoExecute(rReq);
90 	return xFunc;
91 }
92 
93 void FuBullet::DoExecute( SfxRequest& rReq )
94 {
95 	if( rReq.GetSlot() == SID_CHARMAP )
96 		InsertSpecialCharacter(rReq);
97 	else
98 	{
99 		sal_Unicode cMark = 0;
100 		switch( rReq.GetSlot() )
101 		{
102 			case FN_INSERT_SOFT_HYPHEN: cMark = CHAR_SOFTHYPHEN ; break;
103 			case FN_INSERT_HARDHYPHEN:	cMark = CHAR_HARDHYPHEN ; break;
104 			case FN_INSERT_HARD_SPACE:	cMark = CHAR_HARDBLANK ; break;
105 			case SID_INSERT_RLM : cMark = CHAR_RLM ; break;
106 			case SID_INSERT_LRM : cMark = CHAR_LRM ; break;
107 			case SID_INSERT_ZWSP : cMark = CHAR_ZWSP ; break;
108 			case SID_INSERT_ZWNBSP: cMark = CHAR_ZWNBSP; break;
109 		}
110 
111 		DBG_ASSERT( cMark != 0, "FuBullet::FuBullet(), illegal slot used!" );
112 
113 		if( cMark )
114 			InsertFormattingMark( cMark );
115 	}
116 
117 }
118 
119 void FuBullet::InsertFormattingMark( sal_Unicode cMark )
120 {
121 	OutlinerView* pOV = NULL;
122 	::Outliner*	  pOL = NULL;
123 
124 	// depending on ViewShell set Outliner and OutlinerView
125 	if (mpViewShell->ISA(DrawViewShell))
126 	{
127 		pOV = mpView->GetTextEditOutlinerView();
128 		if (pOV)
129 			pOL = mpView->GetTextEditOutliner();
130 	}
131 	else if (mpViewShell->ISA(OutlineViewShell))
132 	{
133 		pOL = static_cast<OutlineView*>(mpView)->GetOutliner();
134 		pOV = static_cast<OutlineView*>(mpView)->GetViewByWindow(
135             mpViewShell->GetActiveWindow());
136 	}
137 
138 	// insert string
139 	if(pOV && pOL)
140 	{
141 		// prevent flickering
142 		pOV->HideCursor();
143 		pOL->SetUpdateMode(sal_False);
144 
145 		// remove old selected text
146 		pOV->InsertText( aEmptyStr );
147 
148 		// prepare undo
149 		::svl::IUndoManager& rUndoMgr =  pOL->GetUndoManager();
150 		rUndoMgr.EnterListAction(String(SdResId(STR_UNDO_INSERT_SPECCHAR)),
151 									aEmptyStr );
152 
153 		// insert given text
154 		String aStr( cMark );
155 		pOV->InsertText( cMark, sal_True);
156 
157 		ESelection aSel = pOV->GetSelection();
158 		aSel.nStartPara = aSel.nEndPara;
159 		aSel.nStartPos = aSel.nEndPos;
160 		pOV->SetSelection(aSel);
161 
162 		rUndoMgr.LeaveListAction();
163 
164 		// restart repainting
165 		pOL->SetUpdateMode(sal_True);
166 		pOV->ShowCursor();
167 	}
168 }
169 
170 void FuBullet::InsertSpecialCharacter( SfxRequest& rReq )
171 {
172 	const SfxItemSet *pArgs = rReq.GetArgs();
173 	const SfxPoolItem* pItem = 0;
174     if( pArgs )
175         pArgs->GetItemState(mpDoc->GetPool().GetWhich(SID_CHARMAP), sal_False, &pItem);
176 
177     String aChars, aFontName;
178 	Font aFont;
179     if ( pItem )
180     {
181         aChars = ((const SfxStringItem*)pItem)->GetValue();
182         const SfxPoolItem* pFtItem = NULL;
183         pArgs->GetItemState( mpDoc->GetPool().GetWhich(SID_ATTR_SPECIALCHAR), sal_False, &pFtItem);
184         const SfxStringItem* pFontItem = PTR_CAST( SfxStringItem, pFtItem );
185         if ( pFontItem )
186 		{
187             aFontName = pFontItem->GetValue();
188 			aFont = Font( aFontName, Size(1,1) );
189 		}
190 		else
191 		{
192 			SfxItemSet aFontAttr( mpDoc->GetPool() );
193 			mpView->GetAttributes( aFontAttr );
194             const SvxFontItem* pFItem = (const SvxFontItem*)aFontAttr.GetItem( SID_ATTR_CHAR_FONT );
195             if( pFItem )
196                 aFont = Font( pFItem->GetFamilyName(), pFItem->GetStyleName(), Size( 1, 1 ) );
197 		}
198     }
199 
200 	if (!aChars.Len() )
201 	{
202 		SfxAllItemSet aSet( mpDoc->GetPool() );
203 		aSet.Put( SfxBoolItem( FN_PARAM_1, sal_False ) );
204 
205 		SfxItemSet aFontAttr( mpDoc->GetPool() );
206 		mpView->GetAttributes( aFontAttr );
207 		const SvxFontItem* pFontItem = (const SvxFontItem*)aFontAttr.GetItem( SID_ATTR_CHAR_FONT );
208 		if( pFontItem )
209 			aSet.Put( *pFontItem );
210 
211 		SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
212 		SfxAbstractDialog* pDlg = pFact ? pFact->CreateSfxDialog( &mpView->GetViewShell()->GetViewFrame()->GetWindow(), aSet,
213 			mpView->GetViewShell()->GetViewFrame()->GetFrame().GetFrameInterface(),
214 			RID_SVXDLG_CHARMAP ) : 0;
215 		if( !pDlg )
216 			return;
217 
218 		// Wenn Zeichen selektiert ist kann es angezeigt werden
219 		// pDLg->SetFont( );
220 		// pDlg->SetChar( );
221 		sal_uInt16 nResult = pDlg->Execute();
222 		if( nResult == RET_OK )
223 		{
224             SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pCItem, SfxStringItem, SID_CHARMAP, sal_False );
225             SFX_ITEMSET_ARG( pDlg->GetOutputItemSet(), pFItem, SvxFontItem, SID_ATTR_CHAR_FONT, sal_False );
226             if ( pFItem )
227 			{
228                 aFont.SetName( pFItem->GetFamilyName() );
229                 aFont.SetStyleName( pFItem->GetStyleName() );
230                 aFont.SetCharSet( pFItem->GetCharSet() );
231                 aFont.SetPitch( pFItem->GetPitch() );
232 			}
233 
234             if ( pCItem )
235                 aChars  = pCItem->GetValue();
236 		}
237 
238 		delete( pDlg );
239 	}
240 
241 	if( aChars.Len() )
242 	{
243 		OutlinerView* pOV = NULL;
244 		::Outliner*	  pOL = NULL;
245 
246 		// je nach ViewShell Outliner und OutlinerView bestimmen
247 		if(mpViewShell && mpViewShell->ISA(DrawViewShell))
248 		{
249 			pOV = mpView->GetTextEditOutlinerView();
250 			if (pOV)
251 			{
252 				pOL = mpView->GetTextEditOutliner();
253 			}
254 		}
255 		else if(mpViewShell && mpViewShell->ISA(OutlineViewShell))
256 		{
257 			pOL = static_cast<OutlineView*>(mpView)->GetOutliner();
258 			pOV = static_cast<OutlineView*>(mpView)->GetViewByWindow(
259                 mpViewShell->GetActiveWindow());
260 		}
261 
262 		// Sonderzeichen einfuegen
263 		if (pOV)
264 		{
265 			// nicht flackern
266 			pOV->HideCursor();
267 			pOL->SetUpdateMode(sal_False);
268 
269 			// alte Attributierung merken;
270 			// dazu vorher selektierten Bereich loeschen, denn der muss eh weg
271 			// und so gibt es immer eine eindeutige Attributierung (und da es
272 			// kein DeleteSelected() an der OutlinerView gibt, wird durch
273 			// Einfuegen eines Leerstrings geloescht)
274 			pOV->InsertText( aEmptyStr );
275 
276             SfxItemSet aOldSet( mpDoc->GetPool(), EE_CHAR_FONTINFO, EE_CHAR_FONTINFO, 0 );
277 			aOldSet.Put( pOV->GetAttribs() );
278 
279 			::svl::IUndoManager& rUndoMgr =  pOL->GetUndoManager();
280 			rUndoMgr.EnterListAction(String(SdResId(STR_UNDO_INSERT_SPECCHAR)),
281 									 aEmptyStr );
282 			pOV->InsertText(aChars, sal_True);
283 
284 			// attributieren (Font setzen)
285 			SfxItemSet aSet(pOL->GetEmptyItemSet());
286 			SvxFontItem aFontItem (aFont.GetFamily(),	 aFont.GetName(),
287 								   aFont.GetStyleName(), aFont.GetPitch(),
288                                    aFont.GetCharSet(),
289                                    EE_CHAR_FONTINFO);
290 			aSet.Put(aFontItem);
291 			aSet.Put(aFontItem, EE_CHAR_FONTINFO_CJK);
292 			aSet.Put(aFontItem, EE_CHAR_FONTINFO_CTL);
293 			pOV->SetAttribs(aSet);
294 
295 			ESelection aSel = pOV->GetSelection();
296 			aSel.nStartPara = aSel.nEndPara;
297 			aSel.nStartPos = aSel.nEndPos;
298 			pOV->SetSelection(aSel);
299 
300 			// nicht mit Sonderzeichenattributierung weiterschreiben
301 			pOV->GetOutliner()->QuickSetAttribs(aOldSet, aSel);
302 
303 			rUndoMgr.LeaveListAction();
304 
305 			// ab jetzt wieder anzeigen
306 			pOL->SetUpdateMode(sal_True);
307 			pOV->ShowCursor();
308 		}
309 	}
310 }
311 
312 void FuBullet::GetSlotState( SfxItemSet& rSet, ViewShell* pViewShell, SfxViewFrame* pViewFrame )
313 {
314 	if( SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_CHARMAP ) ||
315 		SFX_ITEM_AVAILABLE == rSet.GetItemState( FN_INSERT_SOFT_HYPHEN ) ||
316 		SFX_ITEM_AVAILABLE == rSet.GetItemState( FN_INSERT_HARDHYPHEN ) ||
317 		SFX_ITEM_AVAILABLE == rSet.GetItemState( FN_INSERT_HARD_SPACE ) ||
318 		SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_INSERT_RLM ) ||
319 		SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_INSERT_LRM ) ||
320 		SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_INSERT_ZWNBSP ) ||
321 		SFX_ITEM_AVAILABLE == rSet.GetItemState( SID_INSERT_ZWSP ))
322 	{
323 		::sd::View* pView = pViewShell ? pViewShell->GetView() : 0;
324 		OutlinerView* pOLV = pView ? pView->GetTextEditOutlinerView() : 0;
325 
326 		const bool bTextEdit = pOLV;
327 
328 		SvtCTLOptions aCTLOptions;
329 		const sal_Bool bCtlEnabled = aCTLOptions.IsCTLFontEnabled();
330 
331 		if(!bTextEdit )
332 		{
333 			rSet.DisableItem(FN_INSERT_SOFT_HYPHEN);
334 			rSet.DisableItem(FN_INSERT_HARDHYPHEN);
335 			rSet.DisableItem(FN_INSERT_HARD_SPACE);
336 		}
337 
338 		if( !bTextEdit && (dynamic_cast<OutlineViewShell*>( pViewShell ) == 0) )
339 			rSet.DisableItem(SID_CHARMAP);
340 
341 		if(!bTextEdit || !bCtlEnabled )
342 		{
343 			rSet.DisableItem(SID_INSERT_RLM);
344 			rSet.DisableItem(SID_INSERT_LRM);
345 			rSet.DisableItem(SID_INSERT_ZWNBSP);
346 			rSet.DisableItem(SID_INSERT_ZWSP);
347 		}
348 
349 		if( pViewFrame )
350 		{
351 			SfxBindings& rBindings = pViewFrame->GetBindings();
352 
353 			rBindings.SetVisibleState( SID_INSERT_RLM, bCtlEnabled );
354 			rBindings.SetVisibleState( SID_INSERT_LRM, bCtlEnabled );
355 			rBindings.SetVisibleState( SID_INSERT_ZWNBSP, bCtlEnabled );
356 			rBindings.SetVisibleState( SID_INSERT_ZWSP, bCtlEnabled );
357 		}
358 	}
359 }
360 } // end of namespace sd
361