xref: /trunk/main/svx/source/svdraw/svdtext.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_svx.hxx"
30 
31 #define ITEMID_FONTHEIGHT   EE_CHAR_FONTHEIGHT
32 
33 #include "svx/svdotext.hxx"
34 #include "svx/svdetc.hxx"
35 #include "editeng/outlobj.hxx"
36 #include "svx/svdoutl.hxx"
37 #include "svx/svdmodel.hxx"
38 #include "editeng/fhgtitem.hxx"
39 #include <editeng/eeitem.hxx>
40 #include <svl/itemset.hxx>
41 
42 SdrText::SdrText( SdrTextObj& rObject, OutlinerParaObject* pOutlinerParaObject /* = 0 */ )
43 : mpOutlinerParaObject( pOutlinerParaObject )
44 , mrObject( rObject )
45 , mpModel( rObject.GetModel() )
46 , mbPortionInfoChecked( false )
47 {
48     OSL_ENSURE(&mrObject, "SdrText created without SdrTextObj (!)");
49 }
50 
51 SdrText::~SdrText()
52 {
53     clearWeak();
54     delete mpOutlinerParaObject;
55 }
56 
57 void SdrText::CheckPortionInfo( SdrOutliner& rOutliner )
58 {
59     if(!mbPortionInfoChecked)
60     {
61         // #i102062# no action when the Outliner is the HitTestOutliner,
62         // this will remove WrongList info at the OPO
63         if(mpModel && &rOutliner == &mpModel->GetHitTestOutliner())
64             return;
65 
66         // Optimierung: ggf. BigTextObject erzeugen
67         mbPortionInfoChecked=true;
68         if(mpOutlinerParaObject!=NULL && rOutliner.ShouldCreateBigTextObject())
69         {
70             // #i102062# MemoryLeak closed
71             delete mpOutlinerParaObject;
72             mpOutlinerParaObject = rOutliner.CreateParaObject();
73         }
74     }
75 }
76 
77 void SdrText::ReformatText()
78 {
79     mbPortionInfoChecked=sal_False;
80     mpOutlinerParaObject->ClearPortionInfo();
81 }
82 
83 const SfxItemSet& SdrText::GetItemSet() const
84 {
85     return const_cast< SdrText* >(this)->GetObjectItemSet();
86 }
87 
88 void SdrText::SetOutlinerParaObject( OutlinerParaObject* pTextObject )
89 {
90     if( mpOutlinerParaObject != pTextObject )
91     {
92         if( mpModel )
93         {
94             // Update HitTestOutliner
95             const SdrTextObj* pTestObj = mpModel->GetHitTestOutliner().GetTextObj();
96             if( pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject )
97                 mpModel->GetHitTestOutliner().SetTextObj( 0 );
98         }
99 
100         if( mpOutlinerParaObject )
101             delete mpOutlinerParaObject;
102 
103         mpOutlinerParaObject = pTextObject;
104 
105         mbPortionInfoChecked = false;
106     }
107 }
108 
109 OutlinerParaObject* SdrText::GetOutlinerParaObject() const
110 {
111     return mpOutlinerParaObject;
112 }
113 
114 /** returns the current OutlinerParaObject and removes it from this instance */
115 OutlinerParaObject* SdrText::RemoveOutlinerParaObject()
116 {
117     if( mpModel )
118     {
119         // Update HitTestOutliner
120         const SdrTextObj* pTestObj = mpModel->GetHitTestOutliner().GetTextObj();
121         if( pTestObj && pTestObj->GetOutlinerParaObject() == mpOutlinerParaObject )
122             mpModel->GetHitTestOutliner().SetTextObj( 0 );
123     }
124 
125     OutlinerParaObject* pOPO = mpOutlinerParaObject;
126 
127     mpOutlinerParaObject = 0;
128     mbPortionInfoChecked = false;
129 
130     return pOPO;
131 }
132 
133 void SdrText::SetModel( SdrModel* pNewModel )
134 {
135     if( pNewModel == mpModel )
136         return;
137 
138     SdrModel* pOldModel = mpModel;
139     mpModel = pNewModel;
140 
141     if( mpOutlinerParaObject && pOldModel!=NULL && pNewModel!=NULL)
142     {
143         bool bHgtSet = GetObjectItemSet().GetItemState(EE_CHAR_FONTHEIGHT, sal_True) == SFX_ITEM_SET;
144 
145         MapUnit aOldUnit(pOldModel->GetScaleUnit());
146         MapUnit aNewUnit(pNewModel->GetScaleUnit());
147         FASTBOOL bScaleUnitChanged=aNewUnit!=aOldUnit;
148         // und nun dem OutlinerParaObject einen neuen Pool verpassen
149         // !!! Hier muss noch DefTab und RefDevice der beiden Models
150         // !!! verglichen werden und dann ggf. AutoGrow zuschlagen !!!
151         // !!! fehlende Implementation !!!
152         sal_uIntPtr nOldFontHgt=pOldModel->GetDefaultFontHeight();
153         sal_uIntPtr nNewFontHgt=pNewModel->GetDefaultFontHeight();
154         sal_Bool bDefHgtChanged=nNewFontHgt!=nOldFontHgt;
155         sal_Bool bSetHgtItem=bDefHgtChanged && !bHgtSet;
156         if (bSetHgtItem)
157         { // #32665#
158             // zunaechst das HeightItem festklopfen, damit
159             // 1. Es eben bestehen bleibt und
160             // 2. DoStretchChars vom richtigen Wert ausgeht
161             SetObjectItem(SvxFontHeightItem(nOldFontHgt, 100, EE_CHAR_FONTHEIGHT));
162         }
163         // erst jetzt den Outliner holen, etc. damit obiges SetAttr auch wirkt
164         SdrOutliner& rOutliner = mrObject.ImpGetDrawOutliner();
165         rOutliner.SetText(*mpOutlinerParaObject);
166         delete mpOutlinerParaObject;
167         mpOutlinerParaObject=0;
168         if (bScaleUnitChanged)
169         {
170             Fraction aMetricFactor=GetMapFactor(aOldUnit,aNewUnit).X();
171 
172             // Funktioniert nicht richtig:
173             // Geht am Outliner leider nur in %
174             // double nPercFloat=double(aMetricFactor)*100+0.5;
175             // sal_uInt16 nPerc=(sal_uInt16)nPercFloat;
176             // rOutliner.DoStretchChars(100,nPerc);
177 
178             if (bSetHgtItem)
179             {
180                 // Und nun noch das Rahmenattribut korregieren
181                 nOldFontHgt=BigMulDiv(nOldFontHgt,aMetricFactor.GetNumerator(),aMetricFactor.GetDenominator());
182                 SetObjectItem(SvxFontHeightItem(nOldFontHgt, 100, EE_CHAR_FONTHEIGHT));
183             }
184         }
185         SetOutlinerParaObject(rOutliner.CreateParaObject()); // #34494#
186         mpOutlinerParaObject->ClearPortionInfo();
187         mbPortionInfoChecked=sal_False;
188         rOutliner.Clear();
189     }
190 }
191 
192 void SdrText::ForceOutlinerParaObject( sal_uInt16 nOutlMode )
193 {
194     if( mpModel && !mpOutlinerParaObject )
195     {
196         Outliner* pOutliner = SdrMakeOutliner( nOutlMode, mpModel );
197         if( pOutliner )
198         {
199             Outliner& aDrawOutliner = mpModel->GetDrawOutliner();
200             pOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() );
201 
202             pOutliner->SetStyleSheet( 0, GetStyleSheet());
203             OutlinerParaObject* pOutlinerParaObject = pOutliner->CreateParaObject();
204             SetOutlinerParaObject( pOutlinerParaObject );
205 
206             delete pOutliner;
207         }
208     }
209 }
210 
211 const SfxItemSet& SdrText::GetObjectItemSet()
212 {
213     return mrObject.GetObjectItemSet();
214 }
215 
216 void SdrText::SetObjectItem(const SfxPoolItem& rItem)
217 {
218     mrObject.SetObjectItem( rItem );
219 }
220 
221 SfxStyleSheet* SdrText::GetStyleSheet() const
222 {
223     return mrObject.GetStyleSheet();
224 }
225