1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: svdsuro.hxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
35 #include <bf_svx/svdtypes.hxx>
40 ////////////////////////////////////////////////////////////////////////////////////////////////////
47 class SdrObjSurrogate
{
49 const SdrObject
* pRefObj
;
51 const SdrObjList
* pList
;
52 const SdrObjList
* pRootList
;
54 const SdrModel
* pModel
;
56 UINT32 nOrdNum
; // Ordnungsnummer des Obj in seiner Liste
57 UINT32
* pGrpOrdNums
; // Ordnungsnummern der Gruppenobjekte auf dem Path zum Zielobj
63 void ImpMakeSurrogate();
65 void ImpRead(SvStream
& rIn
);
66 void ImpWriteValue(SvStream
& rOut
, UINT32 nVal
, unsigned nByteAnz
) const;
67 void ImpReadValue(SvStream
& rIn
, UINT32
& rVal
, unsigned nByteAnz
) const;
72 // Konstruktor zum Schreiben
73 // pObj ist das referenzierte Objekt.
74 // Wird ueber pRefObj ein Referenzobjekt angegeben, so muss dieses
75 // auch beim spaeteren Einlesen wieder angegeben werden (fuer Verweis
76 // von einem Zeichenobjekt auf ein anderes). Diese Verwendung ist platz-
77 // und zeitsparender, wenn sich beide Objekte auf derselben Page oder
78 // noch besser in der selben ObjList befinden.
79 // (pRefObj hat einen Verweis auf pObj).
80 SdrObjSurrogate(SdrObject
* pObj1
, const SdrObject
* pRefObj1
=NULL
);
82 // Konstruktoren zum Lesen
83 // Lesen eines absoluten Surrogats.
84 SdrObjSurrogate(const SdrModel
& rMod
, SvStream
& rIn
);
85 // Lesen eines relativen Surrogats. Muss verwendet werden, wenn das
86 // Surrogat unter Angabe eines Referenzobjektes geschrieben wurde.
87 SdrObjSurrogate(const SdrObject
& rRefObj1
, SvStream
& rIn
);
91 // GetObject() funktioniert nur sicher, wenn das gesamte Model
93 SdrObject
* GetObject();
95 friend SvStream
& operator<<(SvStream
& rOut
, const SdrObjSurrogate
& rSurro
);
99 Ein SdrObjSurrogat ist eine Ersatzdarstellung zur Realisierung einer
100 persistenten Verbindung zu einem Zeichenobjekt. Anwendungsfaelle (Beispiele):
101 - Virtuelles Objekt und Symbolreferenzierung
103 - Texterweiterungsrahmen
105 Beim Rausstreamen eines SdrObjSurrogate wird die Listenart und die
106 Ordnungsnummer des Objekts in dieser Liste geschrieben, sowie ggf.
107 Angaben ueber die Seitennummer und das Grouping-Level (zzgl. der
108 Ordnungszahlen der Objektgruppen).
109 Wichtig ist zu wissen, dass die Verbindungen beim Einlesen erst
110 nach vollstaendigem Einlesen des SdrModel wiederhergestellt werden
111 koennen. Aus diesem Grund gibt es nach dem Einlesen des Models ein
112 Post-Processing (Methode AfterRead() wird noch im Stream-Operator
113 des Models am Model, an allen Pages und allen Objekten gerufen),
114 in dem allen Objekten Gelegenheit gegeben wird, nun die ersehnten
115 SdrObject* zu erlangen.
117 Surrogate koennen nur auf Objekte zeigen, die Member einer dem
118 Model bekannten Listen sind (DrawPages,MasterPages)
120 Internes Datenformat im Stream
121 1 Byte: Bit0-Bit4=Listenkennung. Siehe SdrObjListKind in SdrPage.HXX
122 Bit5 =TRUE bedeutet Objekt ist gruppiert (so.)
123 Bit6-Bit7=Byteanzahl m der Ordnungsnummern
124 00=1Byte, 01=2Byte, 10=reserviert, 11=4Byte
125 wenn Listenkennung!=OBJLIST_UNKNOWN
126 m Bytes: Ordnungsnummer des referenzierten Objekts
127 wenn eine Page angegeben ist (SdrIsPageKind(Listenkennung)=TRUE)
128 2 Byte: USHORT : Seitennummer
130 2 Byte: USHORT : Tiefe n der Objektschachtelung
131 n*m Bytes : Ordnungsnummern der jeweiligen Gruppenobjekte
133 Virtuelle Objekte und Symbolreferenzierungen benoetigen z.B. bei Ordnungszahlen
134 bis 255 (also z.B. die ersten 256 Symbole) 2 Bytes im Stream.
135 Bei Referenzierung eines Objektes das in einem Gruppenobjekt steckt kommen
136 mind. 3 Bytes hinzu. Im unguenstigsten Fall liegt dieses Objekt auf einer
137 anderen Seite (z.B. Texterweiterungsrahmen), was bedeutet, dass weitere 2 Bytes
138 fuer die Seitennummer benoetigt werden.
139 Ein absolutes Surrogat welches ein nichtgruppiertes Objekt auf einer Page
140 repraesentiert benoetigt demzufolge mind. 4 Bytes und maximal 7 Bytes.
141 Ein NULL-Surrogat schreibt stets nur 1 Byte in den Stream, naemlich eine 0.
144 ////////////////////////////////////////////////////////////////////////////////////////////////////
146 }//end of namespace binfilter
147 #endif //_SVDSURO_HXX