xref: /aoo42x/main/svx/source/svdraw/svdtext.cxx (revision f6e50924)
1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*f6e50924SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*f6e50924SAndrew Rist  * distributed with this work for additional information
6*f6e50924SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*f6e50924SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist  * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist  * with the License.  You may obtain a copy of the License at
10*f6e50924SAndrew Rist  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist  *
13*f6e50924SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist  * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist  * KIND, either express or implied.  See the License for the
17*f6e50924SAndrew Rist  * specific language governing permissions and limitations
18*f6e50924SAndrew Rist  * under the License.
19*f6e50924SAndrew Rist  *
20*f6e50924SAndrew Rist  *************************************************************/
21*f6e50924SAndrew Rist 
22*f6e50924SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #define ITEMID_FONTHEIGHT   EE_CHAR_FONTHEIGHT
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "svx/svdotext.hxx"
30cdf0e10cSrcweir #include "svx/svdetc.hxx"
31cdf0e10cSrcweir #include "editeng/outlobj.hxx"
32cdf0e10cSrcweir #include "svx/svdoutl.hxx"
33cdf0e10cSrcweir #include "svx/svdmodel.hxx"
34cdf0e10cSrcweir #include "editeng/fhgtitem.hxx"
35cdf0e10cSrcweir #include <editeng/eeitem.hxx>
36cdf0e10cSrcweir #include <svl/itemset.hxx>
37cdf0e10cSrcweir 
SdrText(SdrTextObj & rObject,OutlinerParaObject * pOutlinerParaObject)38cdf0e10cSrcweir SdrText::SdrText( SdrTextObj& rObject, OutlinerParaObject* pOutlinerParaObject /* = 0 */ )
39cdf0e10cSrcweir : mpOutlinerParaObject( pOutlinerParaObject )
40cdf0e10cSrcweir , mrObject( rObject )
41cdf0e10cSrcweir , mpModel( rObject.GetModel() )
42cdf0e10cSrcweir , mbPortionInfoChecked( false )
43cdf0e10cSrcweir {
44cdf0e10cSrcweir 	OSL_ENSURE(&mrObject, "SdrText created without SdrTextObj (!)");
45cdf0e10cSrcweir }
46cdf0e10cSrcweir 
~SdrText()47cdf0e10cSrcweir SdrText::~SdrText()
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     clearWeak();
50cdf0e10cSrcweir     delete mpOutlinerParaObject;
51cdf0e10cSrcweir }
52cdf0e10cSrcweir 
CheckPortionInfo(SdrOutliner & rOutliner)53cdf0e10cSrcweir void SdrText::CheckPortionInfo( SdrOutliner& rOutliner )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir 	if(!mbPortionInfoChecked)
56cdf0e10cSrcweir 	{
57cdf0e10cSrcweir         // #i102062# no action when the Outliner is the HitTestOutliner,
58cdf0e10cSrcweir         // this will remove WrongList info at the OPO
59cdf0e10cSrcweir         if(mpModel && &rOutliner == &mpModel->GetHitTestOutliner())
60cdf0e10cSrcweir             return;
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 		// Optimierung: ggf. BigTextObject erzeugen
63cdf0e10cSrcweir 		mbPortionInfoChecked=true;
64cdf0e10cSrcweir 		if(mpOutlinerParaObject!=NULL && rOutliner.ShouldCreateBigTextObject())
65cdf0e10cSrcweir         {
66cdf0e10cSrcweir             // #i102062# MemoryLeak closed
67cdf0e10cSrcweir             delete mpOutlinerParaObject;
68cdf0e10cSrcweir 			mpOutlinerParaObject = rOutliner.CreateParaObject();
69cdf0e10cSrcweir         }
70cdf0e10cSrcweir 	}
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
ReformatText()73cdf0e10cSrcweir void SdrText::ReformatText()
74cdf0e10cSrcweir {
75cdf0e10cSrcweir 	mbPortionInfoChecked=sal_False;
76cdf0e10cSrcweir 	mpOutlinerParaObject->ClearPortionInfo();
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
GetItemSet() const79cdf0e10cSrcweir const SfxItemSet& SdrText::GetItemSet() const
80cdf0e10cSrcweir {
81cdf0e10cSrcweir 	return const_cast< SdrText* >(this)->GetObjectItemSet();
82cdf0e10cSrcweir }
83cdf0e10cSrcweir 
SetOutlinerParaObject(OutlinerParaObject * pTextObject)84cdf0e10cSrcweir void SdrText::SetOutlinerParaObject( OutlinerParaObject* pTextObject )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir 	if( mpOutlinerParaObject != pTextObject )
87cdf0e10cSrcweir 	{
88cdf0e10cSrcweir 		if( mpModel )
89cdf0e10cSrcweir 		{
90cdf0e10cSrcweir 			// Update HitTestOutliner
91cdf0e10cSrcweir 			const SdrTextObj* pTestObj = mpModel->GetHitTestOutliner().GetTextObj();
92cdf0e10cSrcweir 			if( pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject )
93cdf0e10cSrcweir 				mpModel->GetHitTestOutliner().SetTextObj( 0 );
94cdf0e10cSrcweir 		}
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 		if( mpOutlinerParaObject )
97cdf0e10cSrcweir 			delete mpOutlinerParaObject;
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 		mpOutlinerParaObject = pTextObject;
100cdf0e10cSrcweir 
101cdf0e10cSrcweir 		mbPortionInfoChecked = false;
102cdf0e10cSrcweir 	}
103cdf0e10cSrcweir }
104cdf0e10cSrcweir 
GetOutlinerParaObject() const105cdf0e10cSrcweir OutlinerParaObject* SdrText::GetOutlinerParaObject() const
106cdf0e10cSrcweir {
107cdf0e10cSrcweir 	return mpOutlinerParaObject;
108cdf0e10cSrcweir }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir /** returns the current OutlinerParaObject and removes it from this instance */
RemoveOutlinerParaObject()111cdf0e10cSrcweir OutlinerParaObject* SdrText::RemoveOutlinerParaObject()
112cdf0e10cSrcweir {
113cdf0e10cSrcweir 	if( mpModel )
114cdf0e10cSrcweir 	{
115cdf0e10cSrcweir 		// Update HitTestOutliner
116cdf0e10cSrcweir 		const SdrTextObj* pTestObj = mpModel->GetHitTestOutliner().GetTextObj();
117cdf0e10cSrcweir 		if( pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject )
118cdf0e10cSrcweir 			mpModel->GetHitTestOutliner().SetTextObj( 0 );
119cdf0e10cSrcweir 	}
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 	OutlinerParaObject* pOPO = mpOutlinerParaObject;
122cdf0e10cSrcweir 
123cdf0e10cSrcweir 	mpOutlinerParaObject = 0;
124cdf0e10cSrcweir 	mbPortionInfoChecked = false;
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 	return pOPO;
127cdf0e10cSrcweir }
128cdf0e10cSrcweir 
SetModel(SdrModel * pNewModel)129cdf0e10cSrcweir void SdrText::SetModel( SdrModel* pNewModel )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir 	if( pNewModel == mpModel )
132cdf0e10cSrcweir 		return;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	SdrModel* pOldModel = mpModel;
135cdf0e10cSrcweir 	mpModel = pNewModel;
136cdf0e10cSrcweir 
137cdf0e10cSrcweir 	if( mpOutlinerParaObject && pOldModel!=NULL && pNewModel!=NULL)
138cdf0e10cSrcweir 	{
139cdf0e10cSrcweir 		bool bHgtSet = GetObjectItemSet().GetItemState(EE_CHAR_FONTHEIGHT, sal_True) == SFX_ITEM_SET;
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 		MapUnit aOldUnit(pOldModel->GetScaleUnit());
142cdf0e10cSrcweir 		MapUnit aNewUnit(pNewModel->GetScaleUnit());
143cdf0e10cSrcweir 		FASTBOOL bScaleUnitChanged=aNewUnit!=aOldUnit;
144cdf0e10cSrcweir 		// und nun dem OutlinerParaObject einen neuen Pool verpassen
145cdf0e10cSrcweir 		// !!! Hier muss noch DefTab und RefDevice der beiden Models
146cdf0e10cSrcweir 		// !!! verglichen werden und dann ggf. AutoGrow zuschlagen !!!
147cdf0e10cSrcweir 		// !!! fehlende Implementation !!!
148cdf0e10cSrcweir 		sal_uIntPtr nOldFontHgt=pOldModel->GetDefaultFontHeight();
149cdf0e10cSrcweir 		sal_uIntPtr nNewFontHgt=pNewModel->GetDefaultFontHeight();
150cdf0e10cSrcweir 		sal_Bool bDefHgtChanged=nNewFontHgt!=nOldFontHgt;
151cdf0e10cSrcweir 		sal_Bool bSetHgtItem=bDefHgtChanged && !bHgtSet;
152cdf0e10cSrcweir 		if (bSetHgtItem)
153cdf0e10cSrcweir 		{ // #32665#
154cdf0e10cSrcweir 			// zunaechst das HeightItem festklopfen, damit
155cdf0e10cSrcweir 			// 1. Es eben bestehen bleibt und
156cdf0e10cSrcweir 			// 2. DoStretchChars vom richtigen Wert ausgeht
157cdf0e10cSrcweir 			SetObjectItem(SvxFontHeightItem(nOldFontHgt, 100, EE_CHAR_FONTHEIGHT));
158cdf0e10cSrcweir 		}
159cdf0e10cSrcweir 		// erst jetzt den Outliner holen, etc. damit obiges SetAttr auch wirkt
160cdf0e10cSrcweir 		SdrOutliner& rOutliner = mrObject.ImpGetDrawOutliner();
161cdf0e10cSrcweir 		rOutliner.SetText(*mpOutlinerParaObject);
162cdf0e10cSrcweir 		delete mpOutlinerParaObject;
163cdf0e10cSrcweir 		mpOutlinerParaObject=0;
164cdf0e10cSrcweir 		if (bScaleUnitChanged)
165cdf0e10cSrcweir 		{
166cdf0e10cSrcweir 			Fraction aMetricFactor=GetMapFactor(aOldUnit,aNewUnit).X();
167cdf0e10cSrcweir 
168cdf0e10cSrcweir 			// Funktioniert nicht richtig:
169cdf0e10cSrcweir 			// Geht am Outliner leider nur in %
170cdf0e10cSrcweir 			// double nPercFloat=double(aMetricFactor)*100+0.5;
171cdf0e10cSrcweir 			// sal_uInt16 nPerc=(sal_uInt16)nPercFloat;
172cdf0e10cSrcweir 			// rOutliner.DoStretchChars(100,nPerc);
173cdf0e10cSrcweir 
174cdf0e10cSrcweir 			if (bSetHgtItem)
175cdf0e10cSrcweir 			{
176cdf0e10cSrcweir 				// Und nun noch das Rahmenattribut korregieren
177cdf0e10cSrcweir 				nOldFontHgt=BigMulDiv(nOldFontHgt,aMetricFactor.GetNumerator(),aMetricFactor.GetDenominator());
178cdf0e10cSrcweir 				SetObjectItem(SvxFontHeightItem(nOldFontHgt, 100, EE_CHAR_FONTHEIGHT));
179cdf0e10cSrcweir 			}
180cdf0e10cSrcweir 		}
181cdf0e10cSrcweir 		SetOutlinerParaObject(rOutliner.CreateParaObject()); // #34494#
182cdf0e10cSrcweir 		mpOutlinerParaObject->ClearPortionInfo();
183cdf0e10cSrcweir 		mbPortionInfoChecked=sal_False;
184cdf0e10cSrcweir 		rOutliner.Clear();
185cdf0e10cSrcweir 	}
186cdf0e10cSrcweir }
187cdf0e10cSrcweir 
ForceOutlinerParaObject(sal_uInt16 nOutlMode)188cdf0e10cSrcweir void SdrText::ForceOutlinerParaObject( sal_uInt16 nOutlMode )
189cdf0e10cSrcweir {
190cdf0e10cSrcweir 	if( mpModel && !mpOutlinerParaObject )
191cdf0e10cSrcweir 	{
192cdf0e10cSrcweir 		Outliner* pOutliner = SdrMakeOutliner( nOutlMode, mpModel );
193cdf0e10cSrcweir 		if( pOutliner )
194cdf0e10cSrcweir 		{
195cdf0e10cSrcweir 			Outliner& aDrawOutliner = mpModel->GetDrawOutliner();
196cdf0e10cSrcweir 			pOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() );
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 			pOutliner->SetStyleSheet( 0, GetStyleSheet());
199cdf0e10cSrcweir 			OutlinerParaObject* pOutlinerParaObject = pOutliner->CreateParaObject();
200cdf0e10cSrcweir 			SetOutlinerParaObject( pOutlinerParaObject );
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 			delete pOutliner;
203cdf0e10cSrcweir 		}
204cdf0e10cSrcweir 	}
205cdf0e10cSrcweir }
206cdf0e10cSrcweir 
GetObjectItemSet()207cdf0e10cSrcweir const SfxItemSet& SdrText::GetObjectItemSet()
208cdf0e10cSrcweir {
209cdf0e10cSrcweir 	return mrObject.GetObjectItemSet();
210cdf0e10cSrcweir }
211cdf0e10cSrcweir 
SetObjectItem(const SfxPoolItem & rItem)212cdf0e10cSrcweir void SdrText::SetObjectItem(const SfxPoolItem& rItem)
213cdf0e10cSrcweir {
214cdf0e10cSrcweir 	mrObject.SetObjectItem( rItem );
215cdf0e10cSrcweir }
216cdf0e10cSrcweir 
GetStyleSheet() const217cdf0e10cSrcweir SfxStyleSheet* SdrText::GetStyleSheet() const
218cdf0e10cSrcweir {
219cdf0e10cSrcweir 	return mrObject.GetStyleSheet();
220cdf0e10cSrcweir }
221