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