xref: /trunk/main/svx/source/svdraw/svdtext.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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
10cdf0e10cSrcweir  *
11*f6e50924SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
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.
19cdf0e10cSrcweir  *
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