Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #ifndef _SVDMODEL_HXX
30 : : #define _SVDMODEL_HXX
31 : :
32 : : #include <com/sun/star/uno/Sequence.hxx>
33 : : #include <cppuhelper/weakref.hxx>
34 : : #include <sot/storage.hxx>
35 : : #include <tools/link.hxx>
36 : : #include <tools/weakbase.hxx>
37 : : #include <vcl/mapmod.hxx>
38 : : #include <svl/brdcst.hxx>
39 : : #include <tools/string.hxx>
40 : : #include <tools/datetime.hxx>
41 : : #include <svl/hint.hxx>
42 : :
43 : : #include <svl/style.hxx>
44 : : #include <svx/xtable.hxx>
45 : : #include <svx/pageitem.hxx>
46 : : #include <vcl/field.hxx>
47 : :
48 : : #include <boost/shared_ptr.hpp>
49 : :
50 : : class OutputDevice;
51 : : #include <svx/svdtypes.hxx> // fuer enum RepeatFuncts
52 : : #include "svx/svxdllapi.h"
53 : :
54 : : #include <rtl/ref.hxx>
55 : : #include <deque>
56 : :
57 : : #if defined(UNX) || defined(WNT)
58 : : #define DEGREE_CHAR ((sal_Unicode)176) /* 0xB0 = Ansi */
59 : : #endif
60 : :
61 : : #ifndef DEGREE_CHAR
62 : : #error unbekannte Plattrorm
63 : : #endif
64 : :
65 : : class SdrOutliner;
66 : : class SdrLayerAdmin;
67 : : class SdrObjList;
68 : : class SdrObject;
69 : : class SdrPage;
70 : : class SdrPageView;
71 : : class SdrTextObj;
72 : : class SdrUndoAction;
73 : : class SdrUndoGroup;
74 : : class AutoTimer;
75 : : class SfxItemPool;
76 : : class SfxItemSet;
77 : : class SfxRepeatTarget;
78 : : class SfxStyleSheet;
79 : : class SfxUndoAction;
80 : : class SfxUndoManager;
81 : : class XBitmapList;
82 : : class XColorList;
83 : : class XDashList;
84 : : class XGradientList;
85 : : class XHatchList;
86 : : class XLineEndList;
87 : : class SvxForbiddenCharactersTable;
88 : : class SvNumberFormatter;
89 : : class SotStorage;
90 : : class SdrOutlinerCache;
91 : : class SotStorageRef;
92 : : class SdrUndoFactory;
93 : : namespace comphelper
94 : : {
95 : : class IEmbeddedHelper;
96 : : class LifecycleProxy;
97 : : }
98 : : namespace sfx2
99 : : {
100 : : class LinkManager;
101 : : }
102 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
103 : :
104 : : #define SDR_SWAPGRAPHICSMODE_NONE 0x00000000
105 : : #define SDR_SWAPGRAPHICSMODE_TEMP 0x00000001
106 : : #define SDR_SWAPGRAPHICSMODE_DOC 0x00000002
107 : : #define SDR_SWAPGRAPHICSMODE_PURGE 0x00000100
108 : : #define SDR_SWAPGRAPHICSMODE_DEFAULT (SDR_SWAPGRAPHICSMODE_TEMP|SDR_SWAPGRAPHICSMODE_DOC|SDR_SWAPGRAPHICSMODE_PURGE)
109 : :
110 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
111 : :
112 : : enum SdrHintKind
113 : : {
114 : : HINT_UNKNOWN, // Unbekannt
115 : : HINT_LAYERCHG, // Layerdefinition geaendert
116 : : HINT_LAYERORDERCHG, // Layerreihenfolge geaendert (Insert/Remove/ChangePos)
117 : : HINT_PAGEORDERCHG, // Reihenfolge der Seiten (Zeichenseiten oder Masterpages) geaendert (Insert/Remove/ChangePos)
118 : : HINT_OBJCHG, // Objekt geaendert
119 : : HINT_OBJINSERTED, // Neues Zeichenobjekt eingefuegt
120 : : HINT_OBJREMOVED, // Zeichenobjekt aus Liste entfernt
121 : : HINT_MODELCLEARED, // gesamtes Model geloescht (keine Pages mehr da). not impl.
122 : : HINT_REFDEVICECHG, // RefDevice geaendert
123 : : HINT_DEFAULTTABCHG, // Default Tabulatorweite geaendert
124 : : HINT_DEFFONTHGTCHG, // Default FontHeight geaendert
125 : : HINT_MODELSAVED, // Dokument wurde gesichert
126 : : HINT_SWITCHTOPAGE, // #94278# UNDO/REDO at an object evtl. on another page
127 : : HINT_BEGEDIT, // Is called after the object has entered text edit mode
128 : : HINT_ENDEDIT // Is called after the object has left text edit mode
129 : : };
130 : :
131 [ - + ]: 1781 : class SVX_DLLPUBLIC SdrHint: public SfxHint
132 : : {
133 : : public:
134 : : Rectangle maRectangle;
135 : : const SdrPage* mpPage;
136 : : const SdrObject* mpObj;
137 : : const SdrObjList* mpObjList;
138 : : SdrHintKind meHint;
139 : :
140 : : public:
141 : : TYPEINFO();
142 : :
143 : : explicit SdrHint(SdrHintKind eNewHint);
144 : : explicit SdrHint(const SdrObject& rNewObj);
145 : :
146 : : void SetPage(const SdrPage* pNewPage);
147 : : void SetObject(const SdrObject* pNewObj);
148 : : void SetKind(SdrHintKind eNewKind);
149 : :
150 : : const SdrPage* GetPage() const;
151 : : const SdrObject* GetObject() const;
152 : : SdrHintKind GetKind() const;
153 : : };
154 : :
155 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
156 : :
157 : : // Flag um nach dem Laden des Pools Aufzuraeumen (d.h. die RefCounts
158 : : // neu zu bestimmen und unbenutztes wegzuwerfen). sal_False == aktiv
159 : : #define LOADREFCOUNTS (false)
160 : :
161 : : struct SdrModelImpl;
162 : :
163 : : class SVX_DLLPUBLIC SdrModel : public SfxBroadcaster, public tools::WeakBase< SdrModel >
164 : : {
165 : : protected:
166 : : DateTime aReadDate; // Datum des Einstreamens
167 : : std::vector<SdrPage*> maMaPag; // StammSeiten (Masterpages)
168 : : std::vector<SdrPage*> maPages;
169 : : Link aUndoLink; // Link fuer einen NotifyUndo-Handler
170 : : Link aIOProgressLink;
171 : : String aTablePath;
172 : : Size aMaxObjSize; // z.B. fuer Autogrowing Text
173 : : Fraction aObjUnit; // Beschreibung der Koordinateneinheiten fuer ClipBoard, Drag&Drop, ...
174 : : MapUnit eObjUnit; // see above
175 : : FieldUnit eUIUnit; // Masseinheit, Masstab (z.B. 1/1000) fuer die UI (Statuszeile) wird von ImpSetUIUnit() gesetzt
176 : : Fraction aUIScale; // see above
177 : : String aUIUnitStr; // see above
178 : : Fraction aUIUnitFact; // see above
179 : : int nUIUnitKomma; // see above
180 : :
181 : : SdrLayerAdmin* pLayerAdmin;
182 : : SfxItemPool* pItemPool;
183 : : comphelper::IEmbeddedHelper*
184 : : m_pEmbeddedHelper; // helper for embedded objects to get rid of the SfxObjectShell
185 : : SdrOutliner* pDrawOutliner; // ein Outliner zur Textausgabe
186 : : SdrOutliner* pHitTestOutliner;// ein Outliner fuer den HitTest
187 : : sal_uIntPtr nDefTextHgt; // Default Texthoehe in logischen Einheiten
188 : : OutputDevice* pRefOutDev; // ReferenzDevice fuer die EditEngine
189 : : sal_uIntPtr nProgressAkt; // fuer den
190 : : sal_uIntPtr nProgressMax; // ProgressBar-
191 : : sal_uIntPtr nProgressOfs; // -Handler
192 : : rtl::Reference< SfxStyleSheetBasePool > mxStyleSheetPool;
193 : : SfxStyleSheet* pDefaultStyleSheet;
194 : : sfx2::LinkManager* pLinkManager; // LinkManager
195 : : std::deque<SfxUndoAction*>* pUndoStack;
196 : : std::deque<SfxUndoAction*>* pRedoStack;
197 : : SdrUndoGroup* pAktUndoGroup; // Fuer mehrstufige
198 : : sal_uInt16 nUndoLevel; // Undo-Klammerung
199 : : sal_uInt16 nProgressPercent; // fuer den ProgressBar-Handler
200 : : sal_uInt16 nLoadVersion; // Versionsnummer der geladenen Datei
201 : : bool bMyPool:1; // zum Aufraeumen von pMyPool ab 303a
202 : : bool bUIOnlyKomma:1; // see eUIUnit
203 : : bool mbUndoEnabled:1; // If false no undo is recorded or we are during the execution of an undo action
204 : : bool bExtColorTable:1; // Keinen eigenen ColorTable
205 : : bool mbChanged:1;
206 : : bool bInfoChanged:1;
207 : : bool bPagNumsDirty:1;
208 : : bool bMPgNumsDirty:1;
209 : : bool bPageNotValid:1; // TRUE=Doc ist nur ObjektTraeger. Page ist nicht gueltig.
210 : : bool bSavePortable:1; // Metafiles portabel speichern
211 : : bool bNoBitmapCaching:1; // Bitmaps fuer Screenoutput cachen
212 : : bool bReadOnly:1;
213 : : bool bTransparentTextFrames:1;
214 : : bool bSaveCompressed:1;
215 : : bool bSwapGraphics:1;
216 : : bool bPasteResize:1; // Objekte werden gerade resized wegen Paste mit anderem MapMode
217 : : bool bSaveOLEPreview:1; // save preview metafile of OLE objects
218 : : bool bSaveNative:1;
219 : : bool bStarDrawPreviewMode:1;
220 : : sal_uInt16 nStreamCompressMode; // Komprimiert schreiben?
221 : : sal_uInt16 nStreamNumberFormat;
222 : : sal_uInt16 nDefaultTabulator;
223 : : sal_uInt32 nMaxUndoCount;
224 : :
225 : :
226 : : //////////////////////////////////////////////////////////////////////////////
227 : : // sdr::Comment interface
228 : : private:
229 : : // the next unique comment ID, used for counting added comments. Initialized
230 : : // to 0. UI shows one more due to the fact that 0 is a no-no for users.
231 : : sal_uInt32 mnUniqueCommentID;
232 : :
233 : : public:
234 : : // create a new, unique comment ID
235 : : sal_uInt32 GetNextUniqueCommentID();
236 : :
237 : : // get the author name
238 : : ::rtl::OUString GetDocumentAuthorName() const;
239 : :
240 : : // for export
241 : : sal_uInt32 GetUniqueCommentID() const { return mnUniqueCommentID; }
242 : :
243 : : // for import
244 : : void SetUniqueCommentID(sal_uInt32 nNewID) { if(nNewID != mnUniqueCommentID) { mnUniqueCommentID = nNewID; } }
245 : : /** cl: added this for OJ to complete his reporting engine, does not work
246 : : correctly so only enable it for his model */
247 : : void SetAllowShapePropertyChangeListener( bool bAllow );
248 : :
249 : : sal_uInt16 nStarDrawPreviewMasterPageNum;
250 : : SvxForbiddenCharactersTable* mpForbiddenCharactersTable;
251 : : sal_uIntPtr nSwapGraphicsMode;
252 : :
253 : : SdrOutlinerCache* mpOutlinerCache;
254 : : SdrModelImpl* mpImpl;
255 : : sal_uInt16 mnCharCompressType;
256 : : sal_uInt16 mnHandoutPageCount;
257 : : sal_uInt16 nReserveUInt6;
258 : : sal_uInt16 nReserveUInt7;
259 : : bool mbModelLocked;
260 : : bool mbKernAsianPunctuation;
261 : : bool mbAddExtLeading;
262 : : bool mbInDestruction;
263 : :
264 : : // Color, Dash, Line-End, Hatch, Gradient, Bitmap property lists ...
265 : : XPropertyListRef maProperties[XPROPERTY_LIST_COUNT];
266 : :
267 : : // New src638: NumberFormatter for drawing layer and
268 : : // method for getting it. It is constructed on demand
269 : : // and destroyed when destroying the SdrModel.
270 : : SvNumberFormatter* mpNumberFormatter;
271 : : public:
272 : : sal_uInt16 getHandoutPageCount() const { return mnHandoutPageCount; }
273 : 0 : void setHandoutPageCount( sal_uInt16 nHandoutPageCount ) { mnHandoutPageCount = nHandoutPageCount; }
274 : :
275 : : protected:
276 : :
277 : : virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > createUnoModel();
278 : :
279 : : private:
280 : : // Nicht implementiert:
281 : : SVX_DLLPRIVATE SdrModel(const SdrModel& rSrcModel);
282 : : SVX_DLLPRIVATE void operator=(const SdrModel& rSrcModel);
283 : : SVX_DLLPRIVATE bool operator==(const SdrModel& rCmpModel) const;
284 : : SVX_DLLPRIVATE void ImpPostUndoAction(SdrUndoAction* pUndo);
285 : : SVX_DLLPRIVATE void ImpSetUIUnit();
286 : : SVX_DLLPRIVATE void ImpSetOutlinerDefaults( SdrOutliner* pOutliner, sal_Bool bInit = sal_False );
287 : : SVX_DLLPRIVATE void ImpReformatAllTextObjects();
288 : : SVX_DLLPRIVATE void ImpReformatAllEdgeObjects(); // #103122#
289 : : SVX_DLLPRIVATE void ImpCreateTables();
290 : : SVX_DLLPRIVATE void ImpCtor(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, bool bUseExtColorTable,
291 : : bool bLoadRefCounts = true);
292 : :
293 : :
294 : : // this is a weak reference to a possible living api wrapper for this model
295 : : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > mxUnoModel;
296 : :
297 : : public:
298 : : bool IsPasteResize() const { return bPasteResize; }
299 : : void SetPasteResize(bool bOn) { bPasteResize=bOn; }
300 : : TYPEINFO();
301 : : // Steckt man hier seinen eigenen Pool rein, so wird die Klasse auch
302 : : // Aktionen an ihm vornehmen (Put(),Remove()). Bei Zerstoerung von
303 : : // SdrModel wird dieser Pool ver delete geloescht!
304 : : // Gibt man den Konstruktor stattdessen eine NULL mit, so macht sich
305 : : // die Klasse einen eigenen Pool (SdrItemPool), den sie dann auch im
306 : : // Destruktor zerstoert.
307 : : // Bei Verwendung eines eigenen Pools ist darauf zu achten, dass dieser
308 : : // von SdrItemPool abgeleitet ist, falls man von SdrAttrObj abgeleitete
309 : : // Zeichenobjekte verwenden moechte. Setzt man degegen nur vom abstrakten
310 : : // Basisobjekt SdrObject abgeleitete Objekte ein, so ist man frei in der
311 : : // Wahl des Pools.
312 : : explicit SdrModel(SfxItemPool* pPool=NULL, ::comphelper::IEmbeddedHelper* pPers=NULL, sal_Bool bLoadRefCounts = LOADREFCOUNTS);
313 : : explicit SdrModel(const String& rPath, SfxItemPool* pPool=NULL, ::comphelper::IEmbeddedHelper* pPers=NULL, sal_Bool bLoadRefCounts = LOADREFCOUNTS);
314 : : SdrModel(SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, bool bUseExtColorTable, sal_Bool bLoadRefCounts = LOADREFCOUNTS);
315 : : SdrModel(const String& rPath, SfxItemPool* pPool, ::comphelper::IEmbeddedHelper* pPers, bool bUseExtColorTable, sal_Bool bLoadRefCounts = LOADREFCOUNTS);
316 : : virtual ~SdrModel();
317 : : void ClearModel(sal_Bool bCalledFromDestructor);
318 : :
319 : : // Hier kann man erfragen, ob das Model gerade eingrstreamt wird
320 : : bool IsLoading() const { return sal_False /*BFS01 bLoading */; }
321 : : // Muss z.B. ueberladen werden, um das Swappen/LoadOnDemand von Grafiken
322 : : // zu ermoeglichen. Wird rbDeleteAfterUse auf sal_True gesetzt, so wird
323 : : // die SvStream-Instanz vom Aufrufer nach Gebrauch destruiert.
324 : : // Wenn diese Methode NULL liefert, wird zum Swappen eine temporaere
325 : : // Datei angelegt.
326 : : // Geliefert werden muss der Stream, aus dem das Model geladen wurde
327 : : // bzw. in den es zuletzt gespeichert wurde.
328 : : virtual ::com::sun::star::uno::Reference<
329 : : ::com::sun::star::embed::XStorage> GetDocumentStorage() const;
330 : : ::com::sun::star::uno::Reference<
331 : : ::com::sun::star::io::XInputStream >
332 : : GetDocumentStream(::rtl::OUString const& rURL,
333 : : ::comphelper::LifecycleProxy & rProxy) const;
334 : : // Die Vorlagenattribute der Zeichenobjekte in harte Attribute verwandeln.
335 : : void BurnInStyleSheetAttributes();
336 : : // Wer sich von SdrPage ableitet muss sich auch von SdrModel ableiten
337 : : // und diese beiden VM AllocPage() und AllocModel() ueberladen...
338 : : virtual SdrPage* AllocPage(bool bMasterPage);
339 : : virtual SdrModel* AllocModel() const;
340 : :
341 : : // Aenderungen an den Layern setzen das Modified-Flag und broadcasten am Model!
342 : : const SdrLayerAdmin& GetLayerAdmin() const { return *pLayerAdmin; }
343 : 11185 : SdrLayerAdmin& GetLayerAdmin() { return *pLayerAdmin; }
344 : :
345 : 0 : const SfxItemPool& GetItemPool() const { return *pItemPool; }
346 : 4750 : SfxItemPool& GetItemPool() { return *pItemPool; }
347 : :
348 : : SdrOutliner& GetDrawOutliner(const SdrTextObj* pObj=NULL) const;
349 : :
350 : 1909 : SdrOutliner& GetHitTestOutliner() const { return *pHitTestOutliner; }
351 : : const SdrTextObj* GetFormattingTextObj() const;
352 : : // Die TextDefaults (Font,Hoehe,Farbe) in ein Set putten
353 : : void SetTextDefaults() const;
354 : : static void SetTextDefaults( SfxItemPool* pItemPool, sal_uIntPtr nDefTextHgt );
355 : :
356 : : // ReferenzDevice fuer die EditEngine
357 : : void SetRefDevice(OutputDevice* pDev);
358 : 9 : OutputDevice* GetRefDevice() const { return pRefOutDev; }
359 : : // Wenn ein neuer MapMode am RefDevice gesetzt wird o.ae.
360 : : void RefDeviceChanged(); // noch nicht implementiert
361 : : // Default-Schrifthoehe in logischen Einheiten
362 : : void SetDefaultFontHeight(sal_uIntPtr nVal);
363 : : sal_uIntPtr GetDefaultFontHeight() const { return nDefTextHgt; }
364 : : // Default-Tabulatorweite fuer die EditEngine
365 : : void SetDefaultTabulator(sal_uInt16 nVal);
366 : 116 : sal_uInt16 GetDefaultTabulator() const { return nDefaultTabulator; }
367 : :
368 : : // Der DefaultStyleSheet wird jedem Zeichenobjekt verbraten das in diesem
369 : : // Model eingefuegt wird und kein StyleSheet gesetzt hat.
370 : 359 : SfxStyleSheet* GetDefaultStyleSheet() const { return pDefaultStyleSheet; }
371 : 157 : void SetDefaultStyleSheet(SfxStyleSheet* pDefSS) { pDefaultStyleSheet = pDefSS; }
372 : :
373 : 4151 : sfx2::LinkManager* GetLinkManager() { return pLinkManager; }
374 : 1880 : void SetLinkManager( sfx2::LinkManager* pLinkMgr ) { pLinkManager = pLinkMgr; }
375 : :
376 : 32 : ::comphelper::IEmbeddedHelper* GetPersist() const { return m_pEmbeddedHelper; }
377 : : void ClearPersist() { m_pEmbeddedHelper = 0; }
378 : 1585 : void SetPersist( ::comphelper::IEmbeddedHelper *p ) { m_pEmbeddedHelper = p; }
379 : :
380 : : // Masseinheit fuer die Zeichenkoordinaten.
381 : : // Default ist 1 logische Einheit = 1/100mm (Unit=MAP_100TH_MM, Fract=(1,1)).
382 : : // Beispiele:
383 : : // MAP_POINT, Fraction(72,1) : 1 log Einh = 72 Point = 1 Inch
384 : : // MAP_POINT, Fraction(1,20) : 1 log Einh = 1/20 Point = 1 Twip
385 : : // MAP_TWIP, Fraction(1,1) : 1 log Einh = 1 Twip
386 : : // MAP_100TH_MM, Fraction(1,10) : 1 log Einh = 1/1000mm
387 : : // MAP_MM, Fraction(1000,1) : 1 log Einh = 1000mm = 1m
388 : : // MAP_CM, Fraction(100,1) : 1 log Einh = 100cm = 1m
389 : : // MAP_CM, Fraction(100,1) : 1 log Einh = 100cm = 1m
390 : : // MAP_CM, Fraction(100000,1): 1 log Einh = 100000cm = 1km
391 : : // (PS: Lichtjahre sind somit also nicht darstellbar).
392 : : // Die Skalierungseinheit wird benoetigt, damit die Engine das Clipboard
393 : : // mit den richtigen Groessen beliefern kann.
394 : 553 : MapUnit GetScaleUnit() const { return eObjUnit; }
395 : : void SetScaleUnit(MapUnit eMap);
396 : 0 : const Fraction& GetScaleFraction() const { return aObjUnit; }
397 : : void SetScaleFraction(const Fraction& rFrac);
398 : : // Beides gleichzeitig setzen ist etwas performanter
399 : : void SetScaleUnit(MapUnit eMap, const Fraction& rFrac);
400 : :
401 : : // Maximale Groesse z.B. fuer Autogrowing-Texte
402 : 0 : const Size& GetMaxObjSize() const { return aMaxObjSize; }
403 : 166 : void SetMaxObjSize(const Size& rSiz) { aMaxObjSize=rSiz; }
404 : :
405 : : // Damit die View! in der Statuszeile vernuenftige Zahlen anzeigen kann:
406 : : // Default ist mm.
407 : : void SetUIUnit(FieldUnit eUnit);
408 : 216 : FieldUnit GetUIUnit() const { return eUIUnit; }
409 : : // Der Masstab der Zeichnung. Default 1/1.
410 : : void SetUIScale(const Fraction& rScale);
411 : 1579 : const Fraction& GetUIScale() const { return aUIScale; }
412 : : // Beides gleichzeitig setzen ist etwas performanter
413 : : void SetUIUnit(FieldUnit eUnit, const Fraction& rScale);
414 : :
415 : : const Fraction& GetUIUnitFact() const { return aUIUnitFact; }
416 : : const String& GetUIUnitStr() const { return aUIUnitStr; }
417 : : int GetUIUnitKomma() const { return nUIUnitKomma; }
418 : : bool IsUIOnlyKomma() const { return bUIOnlyKomma; }
419 : :
420 : : static void TakeUnitStr(FieldUnit eUnit, String& rStr);
421 : : void TakeMetricStr(long nVal, rtl::OUString& rStr, bool bNoUnitChars = false, sal_Int32 nNumDigits = -1) const;
422 : : void TakeWinkStr(long nWink, rtl::OUString& rStr, bool bNoDegChar = false) const;
423 : : void TakePercentStr(const Fraction& rVal, String& rStr, bool bNoPercentChar = false) const;
424 : :
425 : : // RecalcPageNums wird idR. nur von der Page gerufen.
426 : : bool IsPagNumsDirty() const { return bPagNumsDirty; };
427 : : bool IsMPgNumsDirty() const { return bMPgNumsDirty; };
428 : : void RecalcPageNums(bool bMaster);
429 : : // Nach dem Insert gehoert die Page dem SdrModel.
430 : : virtual void InsertPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF);
431 : : virtual void DeletePage(sal_uInt16 nPgNum);
432 : : // Remove bedeutet Eigentumsuebereignung an den Aufrufer (Gegenteil von Insert)
433 : : virtual SdrPage* RemovePage(sal_uInt16 nPgNum);
434 : : virtual void MovePage(sal_uInt16 nPgNum, sal_uInt16 nNewPos);
435 : : const SdrPage* GetPage(sal_uInt16 nPgNum) const;
436 : : SdrPage* GetPage(sal_uInt16 nPgNum);
437 : : sal_uInt16 GetPageCount() const;
438 : : // #109538#
439 : : virtual void PageListChanged();
440 : :
441 : : // Masterpages
442 : : virtual void InsertMasterPage(SdrPage* pPage, sal_uInt16 nPos=0xFFFF);
443 : : virtual void DeleteMasterPage(sal_uInt16 nPgNum);
444 : : // Remove bedeutet Eigentumsuebereignung an den Aufrufer (Gegenteil von Insert)
445 : : virtual SdrPage* RemoveMasterPage(sal_uInt16 nPgNum);
446 : : virtual void MoveMasterPage(sal_uInt16 nPgNum, sal_uInt16 nNewPos);
447 : : const SdrPage* GetMasterPage(sal_uInt16 nPgNum) const;
448 : : SdrPage* GetMasterPage(sal_uInt16 nPgNum);
449 : : sal_uInt16 GetMasterPageCount() const;
450 : : // #109538#
451 : : virtual void MasterPageListChanged();
452 : :
453 : : // Modified-Flag. Wird automatisch gesetzt, wenn an den Pages oder
454 : : // Zeichenobjekten was geaendert wird. Zuruecksetzen muss man es
455 : : // jedoch selbst (z.B. bei Save() ...).
456 : 3161 : sal_Bool IsChanged() const { return mbChanged; }
457 : : virtual void SetChanged(sal_Bool bFlg = sal_True);
458 : :
459 : : // PageNotValid bedeutet, dass das Model lediglich Objekte traegt die zwar
460 : : // auf einer Page verankert sind, die Page aber nicht gueltig ist. Diese
461 : : // Kennzeichnung wird fuers Clipboard/Drag&Drop benoetigt.
462 : : bool IsPageNotValid() const { return bPageNotValid; }
463 : : void SetPageNotValid(bool bJa = true) { bPageNotValid=bJa; }
464 : :
465 : : // Schaltet man dieses Flag auf sal_True, so werden Grafikobjekte
466 : : // portabel gespeichert. Es findet dann beim Speichern ggf.
467 : : // eine implizite Wandlung von Metafiles statt.
468 : : // Default=FALSE. Flag ist nicht persistent.
469 : : bool IsSavePortable() const { return bSavePortable; }
470 : : void SetSavePortable(bool bJa = true) { bSavePortable=bJa; }
471 : :
472 : : // Schaltet man dieses Flag auf sal_True, so werden
473 : : // Pixelobjekte (stark) komprimiert gespeichert.
474 : : // Default=FALSE. Flag ist nicht persistent.
475 : : bool IsSaveCompressed() const { return bSaveCompressed; }
476 : : void SetSaveCompressed(bool bJa = true) { bSaveCompressed=bJa; }
477 : :
478 : : // Schaltet man dieses Flag auf sal_True, so werden
479 : : // Grafikobjekte mit gesetztem Native-Link
480 : : // native gespeichert.
481 : : // Default=FALSE. Flag ist nicht persistent.
482 : : bool IsSaveNative() const { return bSaveNative; }
483 : : void SetSaveNative(bool bJa = true) { bSaveNative=bJa; }
484 : :
485 : : // Schaltet man dieses Flag auf sal_True, so werden die Grafiken
486 : : // von Grafikobjekten:
487 : : // - beim Laden eines Dokuments nicht sofort mitgeladen,
488 : : // sondern erst wenn sie gebraucht (z.B. angezeigt) werden.
489 : : // - ggf. wieder aus dem Speicher geworfen, falls Sie gerade
490 : : // nicht benoetigt werden.
491 : : // Damit das funktioniert, muss die virtuelle Methode
492 : : // GetDocumentStream() ueberladen werden.
493 : : // Default=FALSE. Flag ist nicht persistent.
494 : : bool IsSwapGraphics() const { return bSwapGraphics; }
495 : : void SetSwapGraphics(bool bJa = true);
496 : 0 : void SetSwapGraphicsMode(sal_uIntPtr nMode) { nSwapGraphicsMode = nMode; }
497 : 0 : sal_uIntPtr GetSwapGraphicsMode() const { return nSwapGraphicsMode; }
498 : :
499 : : bool IsSaveOLEPreview() const { return bSaveOLEPreview; }
500 : : void SetSaveOLEPreview( bool bSet) { bSaveOLEPreview = bSet; }
501 : :
502 : : // Damit die Bildschirmausgabe von Bitmaps (insbesondere bei gedrehten)
503 : : // etwas schneller wird, werden sie gecachet. Diesen Cache kann man mit
504 : : // diesem Flag ein-/ausschalten. Beim naechsten Paint wird an den Objekten
505 : : // dann ggf. ein Image gemerkt bzw. freigegeben. Wandert ein Bitmapobjekt
506 : : // in's Undo, so wird der Cache fuer dieses Objekt sofort ausgeschaltet
507 : : // (Speicher sparen).
508 : : // Default=Cache eingeschaltet. Flag ist nicht persistent.
509 : : bool IsBitmapCaching() const { return !bNoBitmapCaching; }
510 : : void SetBitmapCaching(bool bJa = true) { bNoBitmapCaching=!bJa; }
511 : :
512 : : // Defaultmaessig (sal_False) kann man Textrahmen ohne Fuellung durch
513 : : // Mausklick selektieren. Nach Aktivierung dieses Flags trifft man sie
514 : : // nur noch in dem Bereich, wo sich auch tatsaechlich Text befindet.
515 : 36 : bool IsPickThroughTransparentTextFrames() const { return bTransparentTextFrames; }
516 : 836 : void SetPickThroughTransparentTextFrames(bool bOn) { bTransparentTextFrames=bOn; }
517 : :
518 : : // Darf denn das Model ueberhaupt veraendert werden?
519 : : // Wird nur von den Possibility-Methoden der View ausgewerdet.
520 : : // Direkte Manipulationen am Model, ... berueksichtigen dieses Flag nicht.
521 : : // Sollte ueberladen werden und entsprechend des ReadOnly-Status des Files
522 : : // sal_True oder sal_False liefern (Methode wird oeffters gerufen, also ein Flag
523 : : // verwenden!).
524 : : virtual bool IsReadOnly() const;
525 : : virtual void SetReadOnly(bool bYes);
526 : :
527 : : // Vermischen zweier SdrModel. Zu beachten sei, dass rSourceModel nicht
528 : : // const ist. Die Pages werden beim einfuegen nicht kopiert, sondern gemoved.
529 : : // rSourceModel ist anschliessend u.U. weitgehend leer.
530 : : // nFirstPageNum,nLastPageNum: Die aus rSourceModel zu uebernehmenden Seiten
531 : : // nDestPos..................: Einfuegeposition
532 : : // bMergeMasterPages.........: sal_True =benoetigte MasterPages werden aus
533 : : // rSourceModel ebenfalls uebernommen
534 : : // sal_False=Die MasterPageDescriptoren der Seiten
535 : : // aus rSourceModel werden auf die
536 : : // vorhandenen MasterPages gemappt.
537 : : // bUndo.....................: Fuer das Merging wird eine UndoAction generiert.
538 : : // Undo ist nur fuer das ZielModel, nicht fuer
539 : : // rSourceModel.
540 : : // bTreadSourceAsConst.......: sal_True=Das SourceModel wird nicht veraendert,.
541 : : // d.h die Seiten werden kopiert.
542 : : virtual void Merge(SdrModel& rSourceModel,
543 : : sal_uInt16 nFirstPageNum=0, sal_uInt16 nLastPageNum=0xFFFF,
544 : : sal_uInt16 nDestPos=0xFFFF,
545 : : bool bMergeMasterPages = false, bool bAllMasterPages = false,
546 : : bool bUndo = true, bool bTreadSourceAsConst = false);
547 : :
548 : : // Ist wie Merge(SourceModel=DestModel,nFirst,nLast,nDest,sal_False,sal_False,bUndo,!bMoveNoCopy);
549 : : void CopyPages(sal_uInt16 nFirstPageNum, sal_uInt16 nLastPageNum,
550 : : sal_uInt16 nDestPos,
551 : : bool bUndo = true, bool bMoveNoCopy = false);
552 : :
553 : : // Mit BegUndo() / EndUndo() ist es moeglich beliebig viele UndoActions
554 : : // beliebig tief zu klammern. Als Kommentar der
555 : : // UndoAction wird der des ersten BegUndo(String) aller Klammerungen
556 : : // verwendet. Der NotifyUndoActionHdl wird in diesem Fall erst beim letzten
557 : : // EndUndo() gerufen. Bei einer leeren Klammerung wird keine UndoAction
558 : : // generiert.
559 : : // Alle direkten Aktionen am SdrModel erzeugen keine UndoActions, die
560 : : // Aktionen an der SdrView dagegen generieren solche.
561 : : void BegUndo(); // Undo-Klammerung auf
562 : : void BegUndo(const String& rComment); // Undo-Klammerung auf
563 : : void BegUndo(const String& rComment, const String& rObjDescr, SdrRepeatFunc eFunc=SDRREPFUNC_OBJ_NONE); // Undo-Klammerung auf
564 : : void EndUndo(); // Undo-Klammerung zu
565 : : void AddUndo(SdrUndoAction* pUndo);
566 : : sal_uInt16 GetUndoBracketLevel() const { return nUndoLevel; }
567 : : const SdrUndoGroup* GetAktUndoGroup() const { return pAktUndoGroup; }
568 : : // nur nach dem 1. BegUndo oder vor dem letzten EndUndo:
569 : : void SetUndoComment(const String& rComment);
570 : : void SetUndoComment(const String& rComment, const String& rObjDescr);
571 : :
572 : : // Das Undo-Managment findet nur statt, wenn kein NotifyUndoAction-Handler
573 : : // gesetzt ist.
574 : : // Default ist 16. Minimaler MaxUndoActionCount ist 1!
575 : : void SetMaxUndoActionCount(sal_uIntPtr nAnz);
576 : : sal_uIntPtr GetMaxUndoActionCount() const { return nMaxUndoCount; }
577 : : void ClearUndoBuffer();
578 : : // UndoAction(0) ist die aktuelle (also die zuletzt eingegangene)
579 : : sal_uIntPtr GetUndoActionCount() const { return pUndoStack!=NULL ? pUndoStack->size() : 0; }
580 : : const SfxUndoAction* GetUndoAction(sal_uIntPtr nNum) const { return (SfxUndoAction*)(pUndoStack!=NULL ? (*pUndoStack)[nNum] : NULL); }
581 : : // RedoAction(0) ist die aktuelle (also die des letzten Undo)
582 : : sal_uIntPtr GetRedoActionCount() const { return pRedoStack!=NULL ? pRedoStack->size() : 0; }
583 : : const SfxUndoAction* GetRedoAction(sal_uIntPtr nNum) const { return (SfxUndoAction*)(pRedoStack!=NULL ? (*pRedoStack)[nNum] : NULL); }
584 : :
585 : : bool Undo();
586 : : bool Redo();
587 : : bool Repeat(SfxRepeatTarget&);
588 : :
589 : : // Hier kann die Applikation einen Handler setzen, der die auflaufenden
590 : : // UndoActions einsammelt. Der Handler hat folgendes Aussehen:
591 : : // void NotifyUndoActionHdl(SfxUndoAction* pUndoAction);
592 : : // Beim Aufruf des Handlers findet eine Eigentumsuebereignung statt; die
593 : : // UndoAction gehoert somit dem Handler, nicht mehr dem SdrModel.
594 : 3115 : void SetNotifyUndoActionHdl(const Link& rLink) { aUndoLink=rLink; }
595 : 0 : const Link& GetNotifyUndoActionHdl() const { return aUndoLink; }
596 : :
597 : : /** application can set it's own undo manager, BegUndo, EndUndo and AddUndoAction
598 : : calls are routet to this interface if given */
599 : : void SetSdrUndoManager( SfxUndoManager* pUndoManager );
600 : : SfxUndoManager* GetSdrUndoManager() const;
601 : :
602 : : /** applications can set their own undo factory to overide creation of
603 : : undo actions. The SdrModel will become owner of the given SdrUndoFactory
604 : : and delete it upon its destruction. */
605 : : void SetSdrUndoFactory( SdrUndoFactory* pUndoFactory );
606 : :
607 : : /** returns the models undo factory. This must be used to create
608 : : undo actions for this model. */
609 : : SdrUndoFactory& GetSdrUndoFactory() const;
610 : :
611 : : // Hier kann man einen Handler setzen der beim Streamen mehrfach gerufen
612 : : // wird und ungefaehre Auskunft ueber den Fortschreitungszustand der
613 : : // Funktion gibt. Der Handler muss folgendes Aussehen haben:
614 : : // void class::IOProgressHdl(const USHORT& nPercent);
615 : : // Der erste Aufruf des Handlers erfolgt grundsaetzlich mit 0, der letzte
616 : : // mit 100. Dazwischen erfolgen maximal 99 Aufrufe mit Werten 1...99.
617 : : // Man kann also durchaus bei 0 den Progressbar Initiallisieren und bei
618 : : // 100 wieder schliessen. Zu beachten sei, dass der Handler auch gerufen
619 : : // wird, wenn die App Draw-Daten im officeweiten Draw-Exchange-Format
620 : : // bereitstellt, denn dies geschieht durch streamen in einen MemoryStream.
621 : : void SetIOProgressHdl(const Link& rLink) { aIOProgressLink=rLink; }
622 : : const Link& GetIOProgressHdl() const { return aIOProgressLink; }
623 : :
624 : : // Accessor methods for Palettes, Lists and Tabeles
625 : : // FIXME: this badly needs re-factoring ...
626 : 11385 : XPropertyListRef GetPropertyList( XPropertyListType t ) const { return maProperties[ t ]; }
627 : 1756 : void SetPropertyList( XPropertyListRef p ) { maProperties[ p->Type() ] = p; }
628 : :
629 : : // friendlier helpers
630 [ + - ]: 2132 : XDashListRef GetDashList() const { return GetPropertyList( XDASH_LIST )->AsDashList(); }
631 [ + - ]: 2132 : XHatchListRef GetHatchList() const { return GetPropertyList( XHATCH_LIST )->AsHatchList(); }
632 [ + - ]: 581 : XColorListRef GetColorList() const { return GetPropertyList( XCOLOR_LIST )->AsColorList(); }
633 [ + - ]: 2132 : XBitmapListRef GetBitmapList() const { return GetPropertyList( XBITMAP_LIST )->AsBitmapList(); }
634 [ + - ]: 2132 : XLineEndListRef GetLineEndList() const { return GetPropertyList( XLINE_END_LIST )->AsLineEndList(); }
635 [ + - ]: 2132 : XGradientListRef GetGradientList() const { return GetPropertyList( XGRADIENT_LIST )->AsGradientList(); }
636 : :
637 : : // Der StyleSheetPool wird der DrawingEngine nur bekanntgemacht.
638 : : // Zu loeschen hat ihn schliesslich der, der ihn auch konstruiert hat.
639 : 5444 : SfxStyleSheetBasePool* GetStyleSheetPool() const { return mxStyleSheetPool.get(); }
640 : 178 : void SetStyleSheetPool(SfxStyleSheetBasePool* pPool) { mxStyleSheetPool=pPool; }
641 : :
642 : : void SetStarDrawPreviewMode(sal_Bool bPreview);
643 : 11 : sal_Bool IsStarDrawPreviewMode() { return bStarDrawPreviewMode; }
644 : :
645 : : ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > getUnoModel();
646 : : void setUnoModel( ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xModel );
647 : :
648 : : // these functions are used by the api to disable repaints during a
649 : : // set of api calls.
650 : 76105 : bool isLocked() const { return mbModelLocked; }
651 : : void setLock( bool bLock );
652 : :
653 : : void SetForbiddenCharsTable( rtl::Reference<SvxForbiddenCharactersTable> xForbiddenChars );
654 : : rtl::Reference<SvxForbiddenCharactersTable> GetForbiddenCharsTable() const;
655 : :
656 : : void SetCharCompressType( sal_uInt16 nType );
657 : 12 : sal_uInt16 GetCharCompressType() const { return mnCharCompressType; }
658 : :
659 : : void SetKernAsianPunctuation( sal_Bool bEnabled );
660 : 12 : sal_Bool IsKernAsianPunctuation() const { return (sal_Bool)mbKernAsianPunctuation; }
661 : :
662 : : void SetAddExtLeading( sal_Bool bEnabled );
663 : 9 : sal_Bool IsAddExtLeading() const { return (sal_Bool)mbAddExtLeading; }
664 : :
665 : : void ReformatAllTextObjects();
666 : :
667 : : SdrOutliner* createOutliner( sal_uInt16 nOutlinerMode );
668 : : void disposeOutliner( SdrOutliner* pOutliner );
669 : :
670 : : sal_Bool IsWriter() const { return !bMyPool; }
671 : :
672 : : /** returns the numbering type that is used to format page fields in drawing shapes */
673 : : virtual SvxNumType GetPageNumType() const;
674 : :
675 : : /** copies the items from the source set to the destination set. Both sets must have
676 : : same ranges but can have different pools. If pNewModel is optional. If it is null,
677 : : this model is used. */
678 : :
679 : : void MigrateItemSet( const SfxItemSet* pSourceSet, SfxItemSet* pDestSet, SdrModel* pNewModel );
680 : :
681 : : bool IsInDestruction() const;
682 : :
683 : : static const ::com::sun::star::uno::Sequence< sal_Int8 >& getUnoTunnelImplementationId();
684 : :
685 : : /** enables (true) or disables (false) recording of undo actions
686 : : If undo actions are added while undo is disabled, they are deleted.
687 : : Disabling undo does not clear the current undo buffer! */
688 : : void EnableUndo( bool bEnable );
689 : :
690 : : /** returns true if undo is currently enabled
691 : : This returns false if undo was disabled using EnableUndo( false ) and
692 : : also during the runtime of the Undo() and Redo() methods. */
693 : : bool IsUndoEnabled() const;
694 : :
695 : : void SetDrawingLayerPoolDefaults();
696 : : };
697 : :
698 : : typedef tools::WeakReference< SdrModel > SdrModelWeakRef;
699 : :
700 : : ////////////////////////////////////////////////////////////////////////////////////////////////////
701 : :
702 : : #endif //_SVDMODEL_HXX
703 : :
704 : : /* /////////////////////////////////////////////////////////////////////////////////////////////////
705 : : +-----------+
706 : : | SdrModel |
707 : : +--+------+-+
708 : : | +-----------+
709 : : +----+-----+ |
710 : : | ... | |
711 : : +----+---+ +----+---+ +-----+--------+
712 : : |SdrPage | |SdrPage | |SdrLayerAdmin |
713 : : +---+----+ +-+--+--++ +---+-------+--+
714 : : | | | | | +-------------------+
715 : : +----+----+ +-----+-----+ +-------+-------+
716 : : | ... | | ... | | ... |
717 : : +---+---+ +---+---+ +----+----+ +----+----+ +-----+------+ +------+-----+
718 : : |SdrObj | |SdrObj | |SdrLayer | |SdrLayer | |SdrLayerSet | |SdrLayerSet |
719 : : +-------+ +-------+ +---------+ +---------+ +------------+ +------------+
720 : : This class: SdrModel is the head of the data modells for the StarView Drawing Engine.
721 : :
722 : : ///////////////////////////////////////////////////////////////////////////////////////////////// */
723 : :
724 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|