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