1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sd.hxx"
26
27 #include <com/sun/star/text/XTextField.hpp>
28 #include <com/sun/star/container/XNameContainer.hpp>
29 #include <com/sun/star/beans/PropertyAttribute.hpp>
30
31 #include <textapi.hxx>
32 #include <drawdoc.hxx>
33 #include <editeng/eeitem.hxx>
34 #include <editeng/editeng.hxx>
35 #include <editeng/outlobj.hxx>
36 #include "Outliner.hxx"
37 #include <svx/svdpool.hxx>
38
39 using ::rtl::OUString;
40
41 using namespace ::com::sun::star::uno;
42 using namespace ::com::sun::star::text;
43 using namespace ::com::sun::star::beans;
44 using namespace ::com::sun::star::container;
45
46 namespace sd {
47
48 class UndoTextAPIChanged : public SdrUndoAction
49 {
50 public:
51 UndoTextAPIChanged( SdrModel& rModel, TextApiObject* pTextObj );
52 ~UndoTextAPIChanged();
53
54 virtual void Undo();
55 virtual void Redo();
56
57 protected:
58 OutlinerParaObject* mpOldText;
59 OutlinerParaObject* mpNewText;
60 rtl::Reference< TextApiObject > mxTextObj;
61 };
62
UndoTextAPIChanged(SdrModel & rModel,TextApiObject * pTextObj)63 UndoTextAPIChanged::UndoTextAPIChanged(SdrModel& rModel, TextApiObject* pTextObj )
64 : SdrUndoAction( rModel )
65 , mpOldText( pTextObj->CreateText() )
66 , mpNewText( 0 )
67 , mxTextObj( pTextObj )
68 {
69 }
70
~UndoTextAPIChanged()71 UndoTextAPIChanged::~UndoTextAPIChanged()
72 {
73 delete mpOldText;
74 delete mpNewText;
75 }
76
Undo()77 void UndoTextAPIChanged::Undo()
78 {
79 if( !mpNewText )
80 mpNewText = mxTextObj->CreateText();
81
82 mxTextObj->SetText( *mpOldText );
83 }
84
Redo()85 void UndoTextAPIChanged::Redo()
86 {
87 if( mpNewText )
88 {
89 mxTextObj->SetText( *mpNewText );
90 }
91 }
92
93 struct TextAPIEditSource_Impl
94 {
95 // needed for "internal" refcounting
96 SdDrawDocument* mpDoc;
97 Outliner* mpOutliner;
98 SvxOutlinerForwarder* mpTextForwarder;
99 sal_Int32 mnRef;
100 };
101
102 class TextAPIEditSource : public SvxEditSource
103 {
104 TextAPIEditSource_Impl* pImpl;
105
106 virtual SvxEditSource* Clone() const;
107 virtual SvxTextForwarder* GetTextForwarder();
108 virtual void UpdateData();
109 explicit TextAPIEditSource( const TextAPIEditSource& rSource );
110
111 public:
112 TextAPIEditSource(SdDrawDocument* pDoc);
113 virtual ~TextAPIEditSource();
114
115 void Dispose();
116 void SetText( OutlinerParaObject& rText );
117 OutlinerParaObject* CreateText();
118 String GetText();
GetDoc()119 SdDrawDocument* GetDoc() { return pImpl->mpDoc; }
120 };
121
ImplGetSdTextPortionPropertyMap()122 const SvxItemPropertySet* ImplGetSdTextPortionPropertyMap()
123 {
124 static const SfxItemPropertyMapEntry aSdTextPortionPropertyEntries[] =
125 {
126 SVX_UNOEDIT_CHAR_PROPERTIES,
127 SVX_UNOEDIT_FONT_PROPERTIES,
128 SVX_UNOEDIT_OUTLINER_PROPERTIES,
129 SVX_UNOEDIT_PARA_PROPERTIES,
130 {MAP_CHAR_LEN("TextField"), EE_FEATURE_FIELD, &::getCppuType((const Reference< XTextField >*)0), PropertyAttribute::READONLY, 0 },
131 {MAP_CHAR_LEN("TextPortionType"), WID_PORTIONTYPE, &::getCppuType((const OUString*)0), PropertyAttribute::READONLY, 0 },
132 {MAP_CHAR_LEN("TextUserDefinedAttributes"), EE_CHAR_XMLATTRIBS, &::getCppuType((const Reference< XNameContainer >*)0) , 0, 0},
133 {MAP_CHAR_LEN("ParaUserDefinedAttributes"), EE_PARA_XMLATTRIBS, &::getCppuType((const Reference< XNameContainer >*)0) , 0, 0},
134 {0,0,0,0,0,0}
135 };
136 static SvxItemPropertySet aSdTextPortionPropertyMap( aSdTextPortionPropertyEntries, SdrObject::GetGlobalDrawObjectItemPool() );
137
138 return &aSdTextPortionPropertyMap;
139 }
140
TextApiObject(TextAPIEditSource * pEditSource)141 TextApiObject::TextApiObject( TextAPIEditSource* pEditSource )
142 : SvxUnoText( pEditSource, ImplGetSdTextPortionPropertyMap(), Reference < XText >() )
143 , mpSource(pEditSource)
144 {
145 }
146
~TextApiObject()147 TextApiObject::~TextApiObject() throw()
148 {
149 dispose();
150 }
151
create(SdDrawDocument * pDoc)152 rtl::Reference< TextApiObject > TextApiObject::create( SdDrawDocument* pDoc )
153 {
154 rtl::Reference< TextApiObject > xRet( new TextApiObject( new TextAPIEditSource( pDoc ) ) );
155 return xRet;
156 }
157
dispose()158 void SAL_CALL TextApiObject::dispose() throw(RuntimeException)
159 {
160 if( mpSource )
161 {
162 mpSource->Dispose();
163 delete mpSource;
164 mpSource = 0;
165 }
166
167 // SvxUnoText::dispose();
168 }
169
CreateText()170 OutlinerParaObject* TextApiObject::CreateText()
171 {
172 return mpSource->CreateText();
173 }
174
SetText(OutlinerParaObject & rText)175 void TextApiObject::SetText( OutlinerParaObject& rText )
176 {
177 SdrModel* pModel = mpSource->GetDoc();
178 if( pModel && pModel->IsUndoEnabled() )
179 pModel->AddUndo( new UndoTextAPIChanged( *pModel, this ) );
180
181 mpSource->SetText( rText );
182 maSelection.nStartPara = 0xffff;
183 }
184
GetText()185 String TextApiObject::GetText()
186 {
187 return mpSource->GetText();
188 }
189
getImplementation(const::com::sun::star::uno::Reference<::com::sun::star::text::XText> & xText)190 TextApiObject* TextApiObject::getImplementation( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XText >& xText )
191 {
192 TextApiObject* pImpl = dynamic_cast< TextApiObject* >( xText.get() );
193
194 if( !pImpl )
195 pImpl = dynamic_cast< TextApiObject* >( SvxUnoTextBase::getImplementation( xText ) );
196
197 return pImpl;
198 }
199
TextAPIEditSource(const TextAPIEditSource & rSource)200 TextAPIEditSource::TextAPIEditSource( const TextAPIEditSource& rSource )
201 : SvxEditSource( *this )
202 {
203 // shallow copy; uses internal refcounting
204 pImpl = rSource.pImpl;
205 pImpl->mnRef++;
206 }
207
Clone() const208 SvxEditSource* TextAPIEditSource::Clone() const
209 {
210 return new TextAPIEditSource( *this );
211 }
212
UpdateData()213 void TextAPIEditSource::UpdateData()
214 {
215 // data is kept in outliner all the time
216 }
217
TextAPIEditSource(SdDrawDocument * pDoc)218 TextAPIEditSource::TextAPIEditSource(SdDrawDocument* pDoc)
219 : pImpl(new TextAPIEditSource_Impl)
220 {
221 pImpl->mpDoc = pDoc;
222 pImpl->mpOutliner = 0;
223 pImpl->mpTextForwarder = 0;
224 pImpl->mnRef = 1;
225 }
226
~TextAPIEditSource()227 TextAPIEditSource::~TextAPIEditSource()
228 {
229 if (!--pImpl->mnRef)
230 delete pImpl;
231 }
232
Dispose()233 void TextAPIEditSource::Dispose()
234 {
235 pImpl->mpDoc=0;
236 delete pImpl->mpTextForwarder;
237 pImpl->mpTextForwarder = 0;
238
239 delete pImpl->mpOutliner;
240 pImpl->mpOutliner = 0;
241 }
242
GetTextForwarder()243 SvxTextForwarder* TextAPIEditSource::GetTextForwarder()
244 {
245 if( !pImpl->mpDoc )
246 return 0; // mpDoc == 0 can be used to flag this as disposed
247
248 if( !pImpl->mpOutliner )
249 {
250 //init draw model first
251 pImpl->mpOutliner = new Outliner( pImpl->mpDoc, OUTLINERMODE_TEXTOBJECT );
252 pImpl->mpDoc->SetCalcFieldValueHdl( pImpl->mpOutliner );
253 }
254
255 if( !pImpl->mpTextForwarder )
256 pImpl->mpTextForwarder = new SvxOutlinerForwarder( *pImpl->mpOutliner, 0 );
257
258 return pImpl->mpTextForwarder;
259 }
260
SetText(OutlinerParaObject & rText)261 void TextAPIEditSource::SetText( OutlinerParaObject& rText )
262 {
263 if ( pImpl->mpDoc )
264 {
265 if( !pImpl->mpOutliner )
266 {
267 //init draw model first
268 pImpl->mpOutliner = new Outliner( pImpl->mpDoc, OUTLINERMODE_TEXTOBJECT );
269 pImpl->mpDoc->SetCalcFieldValueHdl( pImpl->mpOutliner );
270 }
271
272 pImpl->mpOutliner->SetText( rText );
273 }
274 }
275
CreateText()276 OutlinerParaObject* TextAPIEditSource::CreateText()
277 {
278 if ( pImpl->mpDoc && pImpl->mpOutliner )
279 return pImpl->mpOutliner->CreateParaObject();
280 else
281 return 0;
282 }
283
GetText()284 String TextAPIEditSource::GetText()
285 {
286 if ( pImpl->mpDoc && pImpl->mpOutliner )
287 return pImpl->mpOutliner->GetEditEngine().GetText();
288 else
289 return String();
290 }
291
292 } // namespace sd
293