xref: /trunk/main/sw/source/core/layout/dbg_lay.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #ifdef DBG_UTIL
28cdf0e10cSrcweir 
29cdf0e10cSrcweir /* -----------------08.01.99 14:55-------------------
30cdf0e10cSrcweir  * Und hier die Beschreibung:
31cdf0e10cSrcweir  *
32cdf0e10cSrcweir  * Durch die PROTOCOL-Makros wird es ermoeglicht, Ereignisse im Frame-Methoden zu protokollieren.
33cdf0e10cSrcweir  * In protokollwuerdigen Stellen in Frame-Methoden muss entweder ein PROTOCOL(...) oder bei Methoden,
34cdf0e10cSrcweir  * bei denen auch das Verlassen der Methode mitprotokolliert werden soll, ein PROTOCOL_ENTER(...)-Makro
35cdf0e10cSrcweir  * stehen.
36cdf0e10cSrcweir  * Die Parameter der PROTOCOL-Makros sind
37cdf0e10cSrcweir  * 1.   Ein Pointer auf einen SwFrm, also meist "this" oder "rThis"
38cdf0e10cSrcweir  * 2.   Die Funktionsgruppe z.B. PROT_MAKEALL, hierueber wird (inline) entschieden, ob dies
39cdf0e10cSrcweir  *      zur Zeit protokolliert werden soll oder nicht.
40cdf0e10cSrcweir  * 3.   Die Aktion, im Normalfall 0, aber z.B. ein ACT_START bewirkt eine Einrueckung in der
41cdf0e10cSrcweir  *      Ausgabedatei, ein ACT_END nimmt dies wieder zurueck. Auf diese Art wird z.B. durch
42cdf0e10cSrcweir  *      PROTOCOL_ENTER am Anfang einer Methode eingerueckt und beim Verlassen wieder zurueck.
43cdf0e10cSrcweir  * 4.   Der vierte Parameter ist ein void-Pointer, damit man irgendetwas uebergeben kann,
44cdf0e10cSrcweir  *      was in das Protokoll einfliessen kann, typesches Beispiel bei PROT_GROW muss man
45cdf0e10cSrcweir  *      einen Pointer auf den Wert, um den gegrowt werden soll, uebergeben.
46cdf0e10cSrcweir  *
47cdf0e10cSrcweir  *
48cdf0e10cSrcweir  * Das Protokoll ist die Datei "dbg_lay.out" im aktuellen (BIN-)Verzeichnis.
49cdf0e10cSrcweir  * Es enthaelt Zeilen mit FrmId, Funktionsgruppe sowie weiteren Infos.
50cdf0e10cSrcweir  *
51cdf0e10cSrcweir  * Was genau protokolliert wird, kann auf folgende Arten eingestellt werden:
52cdf0e10cSrcweir  * 1.   Die statische Variable SwProtokoll::nRecord enthaelt die Funktionsgruppen,
53cdf0e10cSrcweir  *      die aufgezeichnet werden sollen.
54cdf0e10cSrcweir  *      Ein Wert von z.B. PROT_GROW bewirkt, das Aufrufe von SwFrm::Grow dokumentiert werden,
55cdf0e10cSrcweir  *      PROT_MAKEALL protokolliert Aufrufe von xxx::MakeAll.
56cdf0e10cSrcweir  *      Die PROT_XY-Werte koennen oderiert werden.
57cdf0e10cSrcweir  *      Default ist Null, es wird keine Methode aufgezeichnet.
58cdf0e10cSrcweir  * 2.   In der SwImplProtocol-Klasse gibt es einen Filter fuer Frame-Typen,
59cdf0e10cSrcweir  *      nur die Methodenaufrufe von Frame-Typen, die dort gesetzt sind, werden protokolliert.
60cdf0e10cSrcweir  *      Der Member nTypes kann auf Werte wie FRM_PAGE, FRM_SECTION gesetzt und oderiert werden.
61cdf0e10cSrcweir  *      Default ist 0xFFFF, d.h. alle Frame-Typen.
62cdf0e10cSrcweir  * 3.   In der SwImplProtocol-Klasse gibt es einen ArrayPointer auf FrmIds, die zu ueberwachen sind.
63cdf0e10cSrcweir  *      Ist der Pointer Null, so werden alle Frames protokolliert, ansonsten nur Frames,
64cdf0e10cSrcweir  *      die in dem Array vermerkt sind.
65cdf0e10cSrcweir  *
66cdf0e10cSrcweir  * Eine Aufzeichnung in Gang zu setzen, erfordert entweder Codemanipulation, z.B. in
67cdf0e10cSrcweir  * SwProtocol::Init() einen anderen Default fuer nRecord setzen oder Debuggermanipulation.
68cdf0e10cSrcweir  * Im Debugger gibt verschiedene, sich anbietende Stellen:
69cdf0e10cSrcweir  * 1.   In SwProtocol::Init() einen Breakpoint setzen und dort nRecord manipulieren, ggf.
70cdf0e10cSrcweir  *      FrmIds eintragen, dann beginnt die Aufzeichnung bereits beim Programmstart.
71cdf0e10cSrcweir  * 2.   Waehrend des Programmlaufs einen Breakpoint vor irgendein PROTOCOL oder PROTOCOL_ENTER-
72cdf0e10cSrcweir  *      Makro setzen, dann am SwProtocol::nRecord das unterste Bit setzen (PROT_INIT). Dies
73cdf0e10cSrcweir  *      bewirkt, dass die Funktionsgruppe des folgenden Makros aktiviert und in Zukunft
74cdf0e10cSrcweir  *      protokolliert wird.
75cdf0e10cSrcweir  * 3.   Spezialfall von 2.: Wenn man 2. in der Methode SwRootFrm::Paint(..) anwendet, werden
76cdf0e10cSrcweir  *      die Aufzeichnungseinstellung aus der Datei "dbg_lay.ini" ausgelesen!
77cdf0e10cSrcweir  *      In dieser INI-Datei kann es Kommentarzeilen geben, diese beginnen mit '#', dann
78cdf0e10cSrcweir  *      sind die Sektionen "[frmid]", "[frmtype]" und "[record]" relevant.
79cdf0e10cSrcweir  *      Nach [frmid] koennen die FrameIds der zu protokollierenden Frames folgen. Gibt es
80cdf0e10cSrcweir  *      dort keine Eintraege, werden alle Frames aufgezeichnet.
81cdf0e10cSrcweir  *      Nach [frmtype] koennen FrameTypen folgen, die aufgezeichnet werden sollen, da der
82cdf0e10cSrcweir  *      Default hier allerdings USHRT_MAX ist, werden sowieso alle aufgezeichnet. Man kann
83cdf0e10cSrcweir  *      allerdings auch Typen entfernen, in dem man ein '!' vor den Wert setzt, z.B.
84cdf0e10cSrcweir  *      !0xC000 nimmt die SwCntntFrms aus der Aufzeichnung heraus.
85cdf0e10cSrcweir  *      Nach [record] folgen die Funktionsgruppen, die aufgezeichnet werden sollen, Default
86cdf0e10cSrcweir  *      ist hier 0, also keine. Auch hier kann man mit einem vorgestellten '!' Funktionen
87cdf0e10cSrcweir  *      wieder entfernen.
88cdf0e10cSrcweir  *      Hier mal ein Beispiel fuer eine INI-Datei:
89cdf0e10cSrcweir  *      ------------------------------------------
90cdf0e10cSrcweir  *          #Funktionen: Alle, ausser PRTAREA
91cdf0e10cSrcweir  *          [record] 0xFFFFFFE !0x200
92cdf0e10cSrcweir  *          [frmid]
93cdf0e10cSrcweir  *          #folgende FrmIds:
94cdf0e10cSrcweir  *          1 2 12 13 14 15
95cdf0e10cSrcweir  *          #keine Layoutframes ausser ColumnFrms
96cdf0e10cSrcweir  *          [frmtype] !0x3FFF 0x4
97cdf0e10cSrcweir  *      ------------------------------------------
98cdf0e10cSrcweir  *
99cdf0e10cSrcweir  * Wenn die Aufzeichnung erstmal laeuft, kann man in SwImplProtocol::_Record(...) mittels
100cdf0e10cSrcweir  * Debugger vielfaeltige Manipulationen vornehmen, z.B. bezueglich FrameTypen oder FrmIds.
101cdf0e10cSrcweir  *
102cdf0e10cSrcweir  * --------------------------------------------------*/
103cdf0e10cSrcweir 
104cdf0e10cSrcweir #ifndef DBG_UTIL
105cdf0e10cSrcweir #error Wer fummelt denn an den makefiles rum?
106cdf0e10cSrcweir #endif
107cdf0e10cSrcweir 
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 
110cdf0e10cSrcweir #include "dbg_lay.hxx"
111cdf0e10cSrcweir #include <tools/stream.hxx>
112cdf0e10cSrcweir 
113cdf0e10cSrcweir #ifndef _SVSTDARR_HXX
114cdf0e10cSrcweir #define _SVSTDARR_USHORTS
115cdf0e10cSrcweir #define _SVSTDARR_USHORTSSORT
116cdf0e10cSrcweir #define _SVSTDARR_LONGS
117cdf0e10cSrcweir #include <svl/svstdarr.hxx>
118cdf0e10cSrcweir #endif
119cdf0e10cSrcweir 
120cdf0e10cSrcweir #include <stdio.h>
121cdf0e10cSrcweir 
122cdf0e10cSrcweir #include "frame.hxx"
123cdf0e10cSrcweir #include "layfrm.hxx"
124cdf0e10cSrcweir #include "flyfrm.hxx"
125cdf0e10cSrcweir #include "txtfrm.hxx"
126cdf0e10cSrcweir #include "ndtxt.hxx"
127cdf0e10cSrcweir #include "dflyobj.hxx"
128cdf0e10cSrcweir #include <fntcache.hxx>
129cdf0e10cSrcweir // OD 2004-05-24 #i28701#
130cdf0e10cSrcweir #include <sortedobjs.hxx>
131cdf0e10cSrcweir 
132cdf0e10cSrcweir sal_uLong SwProtocol::nRecord = 0;
133cdf0e10cSrcweir SwImplProtocol* SwProtocol::pImpl = NULL;
134cdf0e10cSrcweir 
lcl_GetFrameId(const SwFrm * pFrm)135cdf0e10cSrcweir sal_uLong lcl_GetFrameId( const SwFrm* pFrm )
136cdf0e10cSrcweir {
137cdf0e10cSrcweir #ifdef DBG_UTIL
138cdf0e10cSrcweir     static sal_Bool bFrameId = sal_False;
139cdf0e10cSrcweir     if( bFrameId )
140cdf0e10cSrcweir         return pFrm->GetFrmId();
141cdf0e10cSrcweir #endif
142cdf0e10cSrcweir     if( pFrm && pFrm->IsTxtFrm() )
143cdf0e10cSrcweir         return ((SwTxtFrm*)pFrm)->GetTxtNode()->GetIndex();
144cdf0e10cSrcweir     return 0;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir class SwImplProtocol
148cdf0e10cSrcweir {
149cdf0e10cSrcweir     SvFileStream *pStream;      // Ausgabestream
150cdf0e10cSrcweir     SvUShortsSort *pFrmIds;     // welche FrmIds sollen aufgezeichnet werden ( NULL == alle )
151cdf0e10cSrcweir     SvLongs *pVar;              // Variables
152cdf0e10cSrcweir     ByteString aLayer;          // Einrueckung der Ausgabe ("  " pro Start/End)
153cdf0e10cSrcweir     sal_uInt16 nTypes;              // welche Typen sollen aufgezeichnet werden
154cdf0e10cSrcweir     sal_uInt16 nLineCount;          // Ausgegebene Zeilen
155cdf0e10cSrcweir     sal_uInt16 nMaxLines;           // Maximal auszugebende Zeilen
156cdf0e10cSrcweir     sal_uInt8 nInitFile;                // Bereich (FrmId,FrmType,Record) beim Einlesen der INI-Datei
157cdf0e10cSrcweir     sal_uInt8 nTestMode;                // Special fuer Testformatierung, es wird ggf. nur
158cdf0e10cSrcweir                                 // innerhalb einer Testformatierung aufgezeichnet.
159cdf0e10cSrcweir     void _Record( const SwFrm* pFrm, sal_uLong nFunction, sal_uLong nAct, void* pParam );
160cdf0e10cSrcweir     sal_Bool NewStream();
161cdf0e10cSrcweir     void CheckLine( ByteString& rLine );
162cdf0e10cSrcweir     void SectFunc( ByteString &rOut, const SwFrm* pFrm, sal_uLong nAct, void* pParam );
163cdf0e10cSrcweir public:
164cdf0e10cSrcweir     SwImplProtocol();
165cdf0e10cSrcweir     ~SwImplProtocol();
166cdf0e10cSrcweir     // Aufzeichnen
Record(const SwFrm * pFrm,sal_uLong nFunction,sal_uLong nAct,void * pParam)167cdf0e10cSrcweir     void Record( const SwFrm* pFrm, sal_uLong nFunction, sal_uLong nAct, void* pParam )
168cdf0e10cSrcweir         { if( pStream ) _Record( pFrm, nFunction, nAct, pParam ); }
169cdf0e10cSrcweir     sal_Bool InsertFrm( sal_uInt16 nFrmId );    // FrmId aufnehmen zum Aufzeichnen
170cdf0e10cSrcweir     sal_Bool DeleteFrm( sal_uInt16 nFrmId );    // FrmId entfernen, diesen nicht mehr Aufzeichnen
171cdf0e10cSrcweir     void FileInit();                    // Auslesen der INI-Datei
ChkStream()172cdf0e10cSrcweir     void ChkStream() { if( !pStream ) NewStream(); }
173cdf0e10cSrcweir     void SnapShot( const SwFrm* pFrm, sal_uLong nFlags );
GetVar(const sal_uInt16 nNo,long & rVar)174cdf0e10cSrcweir     void GetVar( const sal_uInt16 nNo, long& rVar )
175cdf0e10cSrcweir         { if( pVar && nNo < pVar->Count() ) rVar = (*pVar)[ nNo ]; }
176cdf0e10cSrcweir };
177cdf0e10cSrcweir 
178cdf0e10cSrcweir /* -----------------11.01.99 10:43-------------------
179cdf0e10cSrcweir  * Durch das PROTOCOL_ENTER-Makro wird ein SwEnterLeave-Objekt erzeugt,
180cdf0e10cSrcweir  * wenn die aktuelle Funktion aufgezeichnet werden soll, wird ein
181cdf0e10cSrcweir  * SwImplEnterLeave-Objekt angelegt. Der Witz dabei ist, das der Ctor
182cdf0e10cSrcweir  * des Impl-Objekt am Anfang der Funktion und automatisch der Dtor beim
183cdf0e10cSrcweir  * Verlassen der Funktion gerufen wird. In der Basis-Implementierung ruft
184cdf0e10cSrcweir  * der Ctor lediglich ein PROTOCOL(..) mit ACT_START und im Dtor ein
185cdf0e10cSrcweir  * PROTOCOL(..) mit ACT_END.
186cdf0e10cSrcweir  * Es lassen sich Ableitungen der Klasse bilden, um z.B. beim Verlassen
187cdf0e10cSrcweir  * einer Funktion Groessenaenderungen des Frames zu dokumentieren u.v.a.m.
188cdf0e10cSrcweir  * Dazu braucht dann nur noch in SwEnterLeave::Ctor(...) die gewuenschte
189cdf0e10cSrcweir  * SwImplEnterLeave-Klasse angelegt zu werden.
190cdf0e10cSrcweir  *
191cdf0e10cSrcweir  * --------------------------------------------------*/
192cdf0e10cSrcweir 
193cdf0e10cSrcweir class SwImplEnterLeave
194cdf0e10cSrcweir {
195cdf0e10cSrcweir protected:
196cdf0e10cSrcweir     const SwFrm* pFrm;              // Der Frame,
197cdf0e10cSrcweir     sal_uLong nFunction, nAction;       // die Funktion, ggf. die Aktion
198cdf0e10cSrcweir     void* pParam;                   // und weitere Parameter
199cdf0e10cSrcweir public:
SwImplEnterLeave(const SwFrm * pF,sal_uLong nFunct,sal_uLong nAct,void * pPar)200cdf0e10cSrcweir     SwImplEnterLeave( const SwFrm* pF, sal_uLong nFunct, sal_uLong nAct, void* pPar )
201cdf0e10cSrcweir         : pFrm( pF ), nFunction( nFunct ), nAction( nAct ), pParam( pPar ) {}
202cdf0e10cSrcweir     virtual void Enter();           // Ausgabe beim Eintritt
203cdf0e10cSrcweir     virtual void Leave();           // Ausgabe beim Verlassen
204cdf0e10cSrcweir };
205cdf0e10cSrcweir 
206cdf0e10cSrcweir class SwSizeEnterLeave : public SwImplEnterLeave
207cdf0e10cSrcweir {
208cdf0e10cSrcweir     long nFrmHeight;
209cdf0e10cSrcweir public:
SwSizeEnterLeave(const SwFrm * pF,sal_uLong nFunct,sal_uLong nAct,void * pPar)210cdf0e10cSrcweir     SwSizeEnterLeave( const SwFrm* pF, sal_uLong nFunct, sal_uLong nAct, void* pPar )
211cdf0e10cSrcweir         : SwImplEnterLeave( pF, nFunct, nAct, pPar ), nFrmHeight( pF->Frm().Height() ) {}
212cdf0e10cSrcweir     virtual void Leave();           // Ausgabe der Groessenaenderung
213cdf0e10cSrcweir };
214cdf0e10cSrcweir 
215cdf0e10cSrcweir class SwUpperEnterLeave : public SwImplEnterLeave
216cdf0e10cSrcweir {
217cdf0e10cSrcweir     sal_uInt16 nFrmId;
218cdf0e10cSrcweir public:
SwUpperEnterLeave(const SwFrm * pF,sal_uLong nFunct,sal_uLong nAct,void * pPar)219cdf0e10cSrcweir     SwUpperEnterLeave( const SwFrm* pF, sal_uLong nFunct, sal_uLong nAct, void* pPar )
220cdf0e10cSrcweir         : SwImplEnterLeave( pF, nFunct, nAct, pPar ), nFrmId( 0 ) {}
221cdf0e10cSrcweir     virtual void Enter();           // Ausgabe
222cdf0e10cSrcweir     virtual void Leave();           // Ausgabe der FrmId des Uppers
223cdf0e10cSrcweir };
224cdf0e10cSrcweir 
225cdf0e10cSrcweir class SwFrmChangesLeave : public SwImplEnterLeave
226cdf0e10cSrcweir {
227cdf0e10cSrcweir     SwRect aFrm;
228cdf0e10cSrcweir public:
SwFrmChangesLeave(const SwFrm * pF,sal_uLong nFunct,sal_uLong nAct,void * pPar)229cdf0e10cSrcweir     SwFrmChangesLeave( const SwFrm* pF, sal_uLong nFunct, sal_uLong nAct, void* pPar )
230cdf0e10cSrcweir         : SwImplEnterLeave( pF, nFunct, nAct, pPar ), aFrm( pF->Frm() ) {}
231cdf0e10cSrcweir     virtual void Enter();           // keine Ausgabe
232cdf0e10cSrcweir     virtual void Leave();           // Ausgabe bei Aenderung der Frm-Area
233cdf0e10cSrcweir };
234cdf0e10cSrcweir 
Record(const SwFrm * pFrm,sal_uLong nFunction,sal_uLong nAct,void * pParam)235cdf0e10cSrcweir void SwProtocol::Record( const SwFrm* pFrm, sal_uLong nFunction, sal_uLong nAct, void* pParam )
236cdf0e10cSrcweir {
237cdf0e10cSrcweir     if( Start() )
238cdf0e10cSrcweir     {   // Hier landen wir, wenn im Debugger SwProtocol::nRecord mit PROT_INIT(0x1) oderiert wurde
239cdf0e10cSrcweir         sal_Bool bFinit = sal_False; // Dies bietet im Debugger die Moeglichkeit,
240cdf0e10cSrcweir         if( bFinit )         // die Aufzeichnung dieser Action zu beenden
241cdf0e10cSrcweir         {
242cdf0e10cSrcweir             nRecord &= ~nFunction;  // Diese Funktion nicht mehr aufzeichnen
243cdf0e10cSrcweir             nRecord &= ~PROT_INIT;  // PROT_INIT stets zuruecksetzen
244cdf0e10cSrcweir             return;
245cdf0e10cSrcweir         }
246cdf0e10cSrcweir         nRecord |= nFunction;       // Aufzeichnung dieser Funktion freischalten
247cdf0e10cSrcweir         nRecord &= ~PROT_INIT;      // PROT_INIT stets zuruecksetzen
248cdf0e10cSrcweir         if( pImpl )
249cdf0e10cSrcweir             pImpl->ChkStream();
250cdf0e10cSrcweir     }
251cdf0e10cSrcweir     if( !pImpl )                        // Impl-Object anlegen, wenn noetig
252cdf0e10cSrcweir         pImpl = new SwImplProtocol();
253cdf0e10cSrcweir     pImpl->Record( pFrm, nFunction, nAct, pParam ); // ...und Aufzeichnen
254cdf0e10cSrcweir }
255cdf0e10cSrcweir 
256cdf0e10cSrcweir // Die folgende Funktion wird beim Anziehen der Writer-DLL durch TxtInit(..) aufgerufen
257cdf0e10cSrcweir // und ermoeglicht dem Debuggenden Funktionen und/oder FrmIds freizuschalten
258cdf0e10cSrcweir 
Init()259cdf0e10cSrcweir void SwProtocol::Init()
260cdf0e10cSrcweir {
261cdf0e10cSrcweir     nRecord = 0;
262cdf0e10cSrcweir     XubString aName( "dbg_lay.go", RTL_TEXTENCODING_MS_1252 );
263cdf0e10cSrcweir     SvFileStream aStream( aName, STREAM_READ );
264cdf0e10cSrcweir     if( aStream.IsOpen() )
265cdf0e10cSrcweir     {
266cdf0e10cSrcweir         pImpl = new SwImplProtocol();
267cdf0e10cSrcweir         pImpl->FileInit();
268cdf0e10cSrcweir     }
269cdf0e10cSrcweir     aStream.Close();
270cdf0e10cSrcweir }
271cdf0e10cSrcweir 
272cdf0e10cSrcweir // Ende der Aufzeichnung
273cdf0e10cSrcweir 
Stop()274cdf0e10cSrcweir void SwProtocol::Stop()
275cdf0e10cSrcweir {
276cdf0e10cSrcweir      if( pImpl )
277cdf0e10cSrcweir      {
278cdf0e10cSrcweir         delete pImpl;
279cdf0e10cSrcweir         pImpl = NULL;
280cdf0e10cSrcweir         if( pFntCache )
281cdf0e10cSrcweir             pFntCache->Flush();
282cdf0e10cSrcweir      }
283cdf0e10cSrcweir      nRecord = 0;
284cdf0e10cSrcweir }
285cdf0e10cSrcweir 
286cdf0e10cSrcweir // Creates a more or less detailed snapshot of the layout structur
287cdf0e10cSrcweir 
SnapShot(const SwFrm * pFrm,sal_uLong nFlags)288cdf0e10cSrcweir void SwProtocol::SnapShot( const SwFrm* pFrm, sal_uLong nFlags )
289cdf0e10cSrcweir {
290cdf0e10cSrcweir     if( pImpl )
291cdf0e10cSrcweir         pImpl->SnapShot( pFrm, nFlags );
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
GetVar(const sal_uInt16 nNo,long & rVar)294cdf0e10cSrcweir void SwProtocol::GetVar( const sal_uInt16 nNo, long& rVar )
295cdf0e10cSrcweir {
296cdf0e10cSrcweir     if( pImpl )
297cdf0e10cSrcweir         pImpl->GetVar( nNo, rVar );
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
SwImplProtocol()300cdf0e10cSrcweir SwImplProtocol::SwImplProtocol()
301cdf0e10cSrcweir     : pStream( NULL ), pFrmIds( NULL ), pVar( NULL ), nTypes( 0xffff ),
302cdf0e10cSrcweir       nLineCount( 0 ), nMaxLines( USHRT_MAX ), nTestMode( 0 )
303cdf0e10cSrcweir {
304cdf0e10cSrcweir     NewStream();
305cdf0e10cSrcweir }
306cdf0e10cSrcweir 
NewStream()307cdf0e10cSrcweir sal_Bool SwImplProtocol::NewStream()
308cdf0e10cSrcweir {
309cdf0e10cSrcweir     XubString aName( "dbg_lay.out", RTL_TEXTENCODING_MS_1252 );
310cdf0e10cSrcweir     nLineCount = 0;
311cdf0e10cSrcweir     pStream = new SvFileStream( aName, STREAM_WRITE | STREAM_TRUNC );
312cdf0e10cSrcweir     if( pStream->GetError() )
313cdf0e10cSrcweir     {
314cdf0e10cSrcweir         delete pStream;
315cdf0e10cSrcweir         pStream = NULL;
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir     return 0 != pStream;
318cdf0e10cSrcweir }
319cdf0e10cSrcweir 
~SwImplProtocol()320cdf0e10cSrcweir SwImplProtocol::~SwImplProtocol()
321cdf0e10cSrcweir {
322cdf0e10cSrcweir     if( pStream )
323cdf0e10cSrcweir     {
324cdf0e10cSrcweir         pStream->Close();
325cdf0e10cSrcweir         delete pStream;
326cdf0e10cSrcweir     }
327cdf0e10cSrcweir     delete pFrmIds;
328cdf0e10cSrcweir     delete pVar;
329cdf0e10cSrcweir }
330cdf0e10cSrcweir 
331cdf0e10cSrcweir /* -----------------11.01.99 11:03-------------------
332cdf0e10cSrcweir  * SwImplProtocol::CheckLine analysiert eine Zeile der INI-Datei
333cdf0e10cSrcweir  * --------------------------------------------------*/
334cdf0e10cSrcweir 
CheckLine(ByteString & rLine)335cdf0e10cSrcweir void SwImplProtocol::CheckLine( ByteString& rLine )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir     rLine = rLine.ToLowerAscii(); // Gross/Kleinschreibung ist einerlei
338cdf0e10cSrcweir     while( STRING_LEN > rLine.SearchAndReplace( '\t', ' ' ) )
339cdf0e10cSrcweir         ; //nothing                 // Tabs werden durch Blanks ersetzt
340cdf0e10cSrcweir     if( '#' == rLine.GetChar(0) )   // Kommentarzeilen beginnen mit '#'
341cdf0e10cSrcweir         return;
342cdf0e10cSrcweir     if( '[' == rLine.GetChar(0) )   // Bereiche: FrmIds, Typen oder Funktionen
343cdf0e10cSrcweir     {
344cdf0e10cSrcweir         ByteString aTmp = rLine.GetToken( 0, ']' );
345cdf0e10cSrcweir         if( "[frmid" == aTmp )      // Bereich FrmIds
346cdf0e10cSrcweir         {
347cdf0e10cSrcweir             nInitFile = 1;
348cdf0e10cSrcweir             delete pFrmIds;
349cdf0e10cSrcweir             pFrmIds = NULL;         // Default: Alle Frames aufzeichnen
350cdf0e10cSrcweir         }
351cdf0e10cSrcweir         else if( "[frmtype" == aTmp )// Bereich Typen
352cdf0e10cSrcweir         {
353cdf0e10cSrcweir             nInitFile = 2;
354cdf0e10cSrcweir             nTypes = USHRT_MAX;     // Default: Alle FrmaeTypen aufzeichnen
355cdf0e10cSrcweir         }
356cdf0e10cSrcweir         else if( "[record" == aTmp )// Bereich Funktionen
357cdf0e10cSrcweir         {
358cdf0e10cSrcweir             nInitFile = 3;
359cdf0e10cSrcweir             SwProtocol::SetRecord( 0 );// Default: Keine Funktion wird aufgezeichnet
360cdf0e10cSrcweir         }
361cdf0e10cSrcweir         else if( "[test" == aTmp )// Bereich Funktionen
362cdf0e10cSrcweir         {
363cdf0e10cSrcweir             nInitFile = 4; // Default:
364cdf0e10cSrcweir             nTestMode = 0; // Ausserhalb der Testformatierung wird aufgezeichnet
365cdf0e10cSrcweir         }
366cdf0e10cSrcweir         else if( "[max" == aTmp )// maximale Zeilenzahl
367cdf0e10cSrcweir         {
368cdf0e10cSrcweir             nInitFile = 5; // Default:
369cdf0e10cSrcweir             nMaxLines = USHRT_MAX;
370cdf0e10cSrcweir         }
371cdf0e10cSrcweir         else if( "[var" == aTmp )// variables
372cdf0e10cSrcweir         {
373cdf0e10cSrcweir             nInitFile = 6;
374cdf0e10cSrcweir             if( !pVar )
375cdf0e10cSrcweir                 pVar = new SvLongs( 5, 5 );
376cdf0e10cSrcweir         }
377cdf0e10cSrcweir         else
378cdf0e10cSrcweir             nInitFile = 0;          // Nanu: Unbekannter Bereich?
379cdf0e10cSrcweir         rLine.Erase( 0, aTmp.Len() + 1 );
380cdf0e10cSrcweir     }
381cdf0e10cSrcweir     sal_uInt16 nToks = rLine.GetTokenCount( ' ' );  // Blanks (oder Tabs) sind die Trenner
382cdf0e10cSrcweir     for( sal_uInt16 i=0; i < nToks; ++i )
383cdf0e10cSrcweir     {
384cdf0e10cSrcweir         ByteString aTok = rLine.GetToken( i, ' ' );
385cdf0e10cSrcweir         sal_Bool bNo = sal_False;
386cdf0e10cSrcweir         if( '!' == aTok.GetChar(0) )
387cdf0e10cSrcweir         {
388cdf0e10cSrcweir             bNo = sal_True;                 // Diese(n) Funktion/Typ entfernen
389cdf0e10cSrcweir             aTok.Erase( 0, 1 );
390cdf0e10cSrcweir         }
391cdf0e10cSrcweir         if( aTok.Len() )
392cdf0e10cSrcweir         {
393cdf0e10cSrcweir             sal_uLong nVal;
394cdf0e10cSrcweir             sscanf( aTok.GetBuffer(), "%li", &nVal );
395cdf0e10cSrcweir             switch ( nInitFile )
396cdf0e10cSrcweir             {
397cdf0e10cSrcweir                 case 1: InsertFrm( sal_uInt16( nVal ) );    // FrmId aufnehmen
398cdf0e10cSrcweir                         break;
399cdf0e10cSrcweir                 case 2: {
400cdf0e10cSrcweir                             sal_uInt16 nNew = (sal_uInt16)nVal;
401cdf0e10cSrcweir                             if( bNo )
402cdf0e10cSrcweir                                 nTypes &= ~nNew;    // Typ entfernen
403cdf0e10cSrcweir                             else
404cdf0e10cSrcweir                                 nTypes |= nNew;     // Typ aufnehmen
405cdf0e10cSrcweir                         }
406cdf0e10cSrcweir                         break;
407cdf0e10cSrcweir                 case 3: {
408cdf0e10cSrcweir                             sal_uLong nOld = SwProtocol::Record();
409cdf0e10cSrcweir                             if( bNo )
410cdf0e10cSrcweir                                 nOld &= ~nVal;      // Funktion entfernen
411cdf0e10cSrcweir                             else
412cdf0e10cSrcweir                                 nOld |= nVal;       // Funktion aufnehmen
413cdf0e10cSrcweir                             SwProtocol::SetRecord( nOld );
414cdf0e10cSrcweir                         }
415cdf0e10cSrcweir                         break;
416cdf0e10cSrcweir                 case 4: {
417cdf0e10cSrcweir                             sal_uInt8 nNew = (sal_uInt8)nVal;
418cdf0e10cSrcweir                             if( bNo )
419cdf0e10cSrcweir                                 nTestMode &= ~nNew; // TestMode zuruecksetzen
420cdf0e10cSrcweir                             else
421cdf0e10cSrcweir                                 nTestMode |= nNew;      // TestMode setzen
422cdf0e10cSrcweir                         }
423cdf0e10cSrcweir                         break;
424cdf0e10cSrcweir                 case 5: nMaxLines = (sal_uInt16)nVal;
425cdf0e10cSrcweir                         break;
426cdf0e10cSrcweir                 case 6: pVar->Insert( (long)nVal, pVar->Count() );
427cdf0e10cSrcweir                         break;
428cdf0e10cSrcweir             }
429cdf0e10cSrcweir         }
430cdf0e10cSrcweir     }
431cdf0e10cSrcweir }
432cdf0e10cSrcweir 
433cdf0e10cSrcweir /* -----------------11.01.99 11:17-------------------
434cdf0e10cSrcweir  * SwImplProtocol::FileInit() liest die Datei "dbg_lay.ini"
435cdf0e10cSrcweir  * im aktuellen Verzeichnis und wertet sie aus.
436cdf0e10cSrcweir  * --------------------------------------------------*/
FileInit()437cdf0e10cSrcweir void SwImplProtocol::FileInit()
438cdf0e10cSrcweir {
439cdf0e10cSrcweir     XubString aName( "dbg_lay.ini", RTL_TEXTENCODING_MS_1252 );
440cdf0e10cSrcweir     SvFileStream aStream( aName, STREAM_READ );
441cdf0e10cSrcweir     if( aStream.IsOpen() )
442cdf0e10cSrcweir     {
443cdf0e10cSrcweir         ByteString aLine;
444cdf0e10cSrcweir         nInitFile = 0;
445cdf0e10cSrcweir         while( !aStream.IsEof() )
446cdf0e10cSrcweir         {
447cdf0e10cSrcweir             sal_Char c;
448cdf0e10cSrcweir             aStream >> c;
449cdf0e10cSrcweir             if( '\n' == c || '\r' == c )    // Zeilenende
450cdf0e10cSrcweir             {
451cdf0e10cSrcweir                 aLine.EraseLeadingChars();
452cdf0e10cSrcweir                 aLine.EraseTrailingChars();
453cdf0e10cSrcweir                 if( aLine.Len() )
454cdf0e10cSrcweir                     CheckLine( aLine );     // Zeile auswerten
455cdf0e10cSrcweir                 aLine.Erase();
456cdf0e10cSrcweir             }
457cdf0e10cSrcweir             else
458cdf0e10cSrcweir                 aLine += c;
459cdf0e10cSrcweir         }
460cdf0e10cSrcweir         if( aLine.Len() )
461cdf0e10cSrcweir             CheckLine( aLine );     // letzte Zeile auswerten
462cdf0e10cSrcweir     }
463cdf0e10cSrcweir     aStream.Close();
464cdf0e10cSrcweir }
465cdf0e10cSrcweir 
466cdf0e10cSrcweir /* -----------------11.01.99 11:20-------------------
467cdf0e10cSrcweir  * lcl_Start sorgt fuer Einrueckung um zwei Blanks bei ACT_START
468cdf0e10cSrcweir  * und nimmt diese bei ACT_END wieder zurueck.
469cdf0e10cSrcweir  * --------------------------------------------------*/
lcl_Start(ByteString & rOut,ByteString & rLay,sal_uLong nAction)470cdf0e10cSrcweir void lcl_Start( ByteString& rOut, ByteString& rLay, sal_uLong nAction )
471cdf0e10cSrcweir {
472cdf0e10cSrcweir     if( nAction == ACT_START )
473cdf0e10cSrcweir     {
474cdf0e10cSrcweir         rLay += "  ";
475cdf0e10cSrcweir         rOut += " On";
476cdf0e10cSrcweir     }
477cdf0e10cSrcweir     else if( nAction == ACT_END )
478cdf0e10cSrcweir     {
479cdf0e10cSrcweir         if( rLay.Len() > 1 )
480cdf0e10cSrcweir         {
481cdf0e10cSrcweir             rLay.Erase( rLay.Len() - 2 );
482cdf0e10cSrcweir             rOut.Erase( 0, 2 );
483cdf0e10cSrcweir         }
484cdf0e10cSrcweir         rOut += " Off";
485cdf0e10cSrcweir     }
486cdf0e10cSrcweir }
487cdf0e10cSrcweir 
488cdf0e10cSrcweir /* -----------------11.01.99 11:21-------------------
489cdf0e10cSrcweir  * lcl_Flags gibt das ValidSize-, ValidPos- und ValidPrtArea-Flag ("Sz","Ps","PA")
490cdf0e10cSrcweir  * des Frames aus, "+" fuer valid, "-" fuer invalid.
491cdf0e10cSrcweir  * --------------------------------------------------*/
492cdf0e10cSrcweir 
lcl_Flags(ByteString & rOut,const SwFrm * pFrm)493cdf0e10cSrcweir void lcl_Flags( ByteString& rOut, const SwFrm* pFrm )
494cdf0e10cSrcweir {
495cdf0e10cSrcweir     rOut += " Sz";
496cdf0e10cSrcweir     rOut += pFrm->GetValidSizeFlag() ? '+' : '-';
497cdf0e10cSrcweir     rOut += " Ps";
498cdf0e10cSrcweir     rOut += pFrm->GetValidPosFlag() ? '+' : '-';
499cdf0e10cSrcweir     rOut += " PA";
500cdf0e10cSrcweir     rOut += pFrm->GetValidPrtAreaFlag() ? '+' : '-';
501cdf0e10cSrcweir }
502cdf0e10cSrcweir 
503cdf0e10cSrcweir /* -----------------11.01.99 11:23-------------------
504cdf0e10cSrcweir  * lcl_FrameType gibt den Typ des Frames in Klartext aus.
505cdf0e10cSrcweir  * --------------------------------------------------*/
506cdf0e10cSrcweir 
lcl_FrameType(ByteString & rOut,const SwFrm * pFrm)507cdf0e10cSrcweir void lcl_FrameType( ByteString& rOut, const SwFrm* pFrm )
508cdf0e10cSrcweir {
509cdf0e10cSrcweir     if( pFrm->IsTxtFrm() )
510cdf0e10cSrcweir         rOut += "Txt ";
511cdf0e10cSrcweir     else if( pFrm->IsLayoutFrm() )
512cdf0e10cSrcweir     {
513cdf0e10cSrcweir         if( pFrm->IsPageFrm() )
514cdf0e10cSrcweir             rOut += "Page ";
515cdf0e10cSrcweir         else if( pFrm->IsColumnFrm() )
516cdf0e10cSrcweir             rOut += "Col ";
517cdf0e10cSrcweir         else if( pFrm->IsBodyFrm() )
518cdf0e10cSrcweir         {
519cdf0e10cSrcweir             if( pFrm->GetUpper() && pFrm->IsColBodyFrm() )
520cdf0e10cSrcweir                 rOut += "(Col)";
521cdf0e10cSrcweir             rOut += "Body ";
522cdf0e10cSrcweir         }
523cdf0e10cSrcweir         else if( pFrm->IsRootFrm() )
524cdf0e10cSrcweir             rOut += "Root ";
525cdf0e10cSrcweir         else if( pFrm->IsCellFrm() )
526cdf0e10cSrcweir             rOut += "Cell ";
527cdf0e10cSrcweir         else if( pFrm->IsTabFrm() )
528cdf0e10cSrcweir             rOut += "Tab ";
529cdf0e10cSrcweir         else if( pFrm->IsRowFrm() )
530cdf0e10cSrcweir             rOut += "Row ";
531cdf0e10cSrcweir         else if( pFrm->IsSctFrm() )
532cdf0e10cSrcweir             rOut += "Sect ";
533cdf0e10cSrcweir         else if( pFrm->IsHeaderFrm() )
534cdf0e10cSrcweir             rOut += "Header ";
535cdf0e10cSrcweir         else if( pFrm->IsFooterFrm() )
536cdf0e10cSrcweir             rOut += "Footer ";
537cdf0e10cSrcweir         else if( pFrm->IsFtnFrm() )
538cdf0e10cSrcweir             rOut += "Ftn ";
539cdf0e10cSrcweir         else if( pFrm->IsFtnContFrm() )
540cdf0e10cSrcweir             rOut += "FtnCont ";
541cdf0e10cSrcweir         else if( pFrm->IsFlyFrm() )
542cdf0e10cSrcweir             rOut += "Fly ";
543cdf0e10cSrcweir         else
544cdf0e10cSrcweir             rOut += "Layout ";
545cdf0e10cSrcweir     }
546cdf0e10cSrcweir     else if( pFrm->IsNoTxtFrm() )
547cdf0e10cSrcweir         rOut += "NoTxt ";
548cdf0e10cSrcweir     else
549cdf0e10cSrcweir         rOut += "Not impl. ";
550cdf0e10cSrcweir }
551cdf0e10cSrcweir 
552cdf0e10cSrcweir /* -----------------11.01.99 11:25-------------------
553cdf0e10cSrcweir  * SwImplProtocol::Record(..) wird nur gerufen, wenn das PROTOCOL-Makro
554cdf0e10cSrcweir  * feststellt, dass die Funktion aufgezeichnet werden soll ( SwProtocol::nRecord ).
555cdf0e10cSrcweir  * In dieser Methode werden noch die beiden weiteren Einschraenkungen ueberprueft,
556cdf0e10cSrcweir  * ob die FrmId und der FrameType zu den aufzuzeichnenden gehoeren.
557cdf0e10cSrcweir  * --------------------------------------------------*/
558cdf0e10cSrcweir 
_Record(const SwFrm * pFrm,sal_uLong nFunction,sal_uLong nAct,void * pParam)559cdf0e10cSrcweir void SwImplProtocol::_Record( const SwFrm* pFrm, sal_uLong nFunction, sal_uLong nAct, void* pParam )
560cdf0e10cSrcweir {
561cdf0e10cSrcweir     sal_uInt16 nSpecial = 0;
562cdf0e10cSrcweir     if( nSpecial )  // Debugger-Manipulationsmoeglichkeit
563cdf0e10cSrcweir     {
564cdf0e10cSrcweir         sal_uInt16 nId = sal_uInt16(lcl_GetFrameId( pFrm ));
565cdf0e10cSrcweir         switch ( nSpecial )
566cdf0e10cSrcweir         {
567cdf0e10cSrcweir             case 1: InsertFrm( nId ); break;
568cdf0e10cSrcweir             case 2: DeleteFrm( nId ); break;
569cdf0e10cSrcweir             case 3: delete pFrmIds; pFrmIds = NULL; break;
570cdf0e10cSrcweir             case 4: delete pStream; pStream = NULL; break;
571cdf0e10cSrcweir         }
572cdf0e10cSrcweir         return;
573cdf0e10cSrcweir     }
574cdf0e10cSrcweir     if( !pStream && !NewStream() )
575cdf0e10cSrcweir         return; // Immer noch kein Stream
576cdf0e10cSrcweir 
577cdf0e10cSrcweir     if( pFrmIds && !pFrmIds->Seek_Entry( sal_uInt16(lcl_GetFrameId( pFrm )) ) )
578cdf0e10cSrcweir         return; // gehoert nicht zu den gewuenschten FrmIds
579cdf0e10cSrcweir 
580cdf0e10cSrcweir     if( !(pFrm->GetType() & nTypes) )
581cdf0e10cSrcweir         return; // Der Typ ist unerwuenscht
582cdf0e10cSrcweir 
583cdf0e10cSrcweir     if( 1 == nTestMode && nFunction != PROT_TESTFORMAT )
584cdf0e10cSrcweir         return; // Wir sollen nur innerhalb einer Testformatierung aufzeichnen
585cdf0e10cSrcweir     sal_Bool bTmp = sal_False;
586cdf0e10cSrcweir     ByteString aOut = aLayer;
587cdf0e10cSrcweir     aOut += ByteString::CreateFromInt64( lcl_GetFrameId( pFrm ) );
588cdf0e10cSrcweir     aOut += ' ';
589cdf0e10cSrcweir     lcl_FrameType( aOut, pFrm );    // dann den FrameType
590cdf0e10cSrcweir     switch ( nFunction )            // und die Funktion
591cdf0e10cSrcweir     {
592cdf0e10cSrcweir         case PROT_SNAPSHOT: lcl_Flags( aOut, pFrm );
593cdf0e10cSrcweir                             break;
594cdf0e10cSrcweir         case PROT_MAKEALL:  aOut += "MakeAll";
595cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
596cdf0e10cSrcweir                             if( nAct == ACT_START )
597cdf0e10cSrcweir                                 lcl_Flags( aOut, pFrm );
598cdf0e10cSrcweir                             break;
599cdf0e10cSrcweir         case PROT_MOVE_FWD: bTmp = sal_True; // NoBreak
600cdf0e10cSrcweir         case PROT_MOVE_BWD: aOut += ( nFunction == bTmp ) ? "Fwd" : "Bwd";
601cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
602cdf0e10cSrcweir                             if( pParam )
603cdf0e10cSrcweir                             {
604cdf0e10cSrcweir                                 aOut += ' ';
605cdf0e10cSrcweir                                 aOut += ByteString::CreateFromInt32( *((sal_uInt16*)pParam) );
606cdf0e10cSrcweir                             }
607cdf0e10cSrcweir                             break;
608cdf0e10cSrcweir         case PROT_GROW_TST: if( ACT_START != nAct )
609cdf0e10cSrcweir                                 return;
610cdf0e10cSrcweir                             aOut += "TestGrow";
611cdf0e10cSrcweir                             break;
612cdf0e10cSrcweir         case PROT_SHRINK_TST: if( ACT_START != nAct )
613cdf0e10cSrcweir                                 return;
614cdf0e10cSrcweir                             aOut += "TestShrink";
615cdf0e10cSrcweir                             break;
616cdf0e10cSrcweir         case PROT_ADJUSTN :
617cdf0e10cSrcweir         case PROT_SHRINK:   bTmp = sal_True; // NoBreak
618cdf0e10cSrcweir         case PROT_GROW:     aOut += !bTmp ? "Grow" :
619cdf0e10cSrcweir                                     ( nFunction == PROT_SHRINK ? "Shrink" : "AdjustNgbhd" );
620cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
621cdf0e10cSrcweir                             if( pParam )
622cdf0e10cSrcweir                             {
623cdf0e10cSrcweir                                 aOut += ' ';
624cdf0e10cSrcweir                                 aOut += ByteString::CreateFromInt64( *((long*)pParam) );
625cdf0e10cSrcweir                             }
626cdf0e10cSrcweir                             break;
627cdf0e10cSrcweir         case PROT_POS:      break;
628cdf0e10cSrcweir         case PROT_PRTAREA:  aOut += "PrtArea";
629cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
630cdf0e10cSrcweir                             break;
631cdf0e10cSrcweir         case PROT_SIZE:     aOut += "Size";
632cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
633cdf0e10cSrcweir                             aOut += ' ';
634cdf0e10cSrcweir                             aOut += ByteString::CreateFromInt64( pFrm->Frm().Height() );
635cdf0e10cSrcweir                             break;
636cdf0e10cSrcweir         case PROT_LEAF:     aOut += "Prev/NextLeaf";
637cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
638cdf0e10cSrcweir                             aOut += ' ';
639cdf0e10cSrcweir                             if( pParam )
640cdf0e10cSrcweir                             {
641cdf0e10cSrcweir                                 aOut += ' ';
642cdf0e10cSrcweir                                 aOut += ByteString::CreateFromInt64( lcl_GetFrameId( (SwFrm*)pParam ) );
643cdf0e10cSrcweir                             }
644cdf0e10cSrcweir                             break;
645cdf0e10cSrcweir         case PROT_FILE_INIT: FileInit();
646cdf0e10cSrcweir                              aOut = "Initialize";
647cdf0e10cSrcweir                             break;
648cdf0e10cSrcweir         case PROT_SECTION:  SectFunc( aOut, pFrm, nAct, pParam );
649cdf0e10cSrcweir                             break;
650cdf0e10cSrcweir         case PROT_CUT:      bTmp = sal_True; // NoBreak
651cdf0e10cSrcweir         case PROT_PASTE:    aOut += bTmp ? "Cut from " : "Paste to ";
652cdf0e10cSrcweir                             aOut += ByteString::CreateFromInt64( lcl_GetFrameId( (SwFrm*)pParam ) );
653cdf0e10cSrcweir                             break;
654cdf0e10cSrcweir         case PROT_TESTFORMAT: aOut += "Test";
655cdf0e10cSrcweir                             lcl_Start( aOut, aLayer, nAct );
656cdf0e10cSrcweir                             if( ACT_START == nAct )
657cdf0e10cSrcweir                                 nTestMode |= 2;
658cdf0e10cSrcweir                             else
659cdf0e10cSrcweir                                 nTestMode &= ~2;
660cdf0e10cSrcweir                             break;
661cdf0e10cSrcweir         case PROT_FRMCHANGES:
662cdf0e10cSrcweir                             {
663cdf0e10cSrcweir                                 SwRect& rFrm = *((SwRect*)pParam);
664cdf0e10cSrcweir                                 if( pFrm->Frm().Pos() != rFrm.Pos() )
665cdf0e10cSrcweir                                 {
666cdf0e10cSrcweir                                     aOut += "PosChg: (";
667cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(rFrm.Left());
668cdf0e10cSrcweir                                     aOut += ", ";
669cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(rFrm.Top());
670cdf0e10cSrcweir                                     aOut += ") (";
671cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(pFrm->Frm().Left());
672cdf0e10cSrcweir                                     aOut += ", ";
673cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(pFrm->Frm().Top());
674cdf0e10cSrcweir                                     aOut += ") ";
675cdf0e10cSrcweir                                 }
676cdf0e10cSrcweir                                 if( pFrm->Frm().Height() != rFrm.Height() )
677cdf0e10cSrcweir                                 {
678cdf0e10cSrcweir                                     aOut += "Height: ";
679cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(rFrm.Height());
680cdf0e10cSrcweir                                     aOut += " -> ";
681cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(pFrm->Frm().Height());
682cdf0e10cSrcweir                                     aOut += " ";
683cdf0e10cSrcweir                                 }
684cdf0e10cSrcweir                                 if( pFrm->Frm().Width() != rFrm.Width() )
685cdf0e10cSrcweir                                 {
686cdf0e10cSrcweir                                     aOut += "Width: ";
687cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(rFrm.Width());
688cdf0e10cSrcweir                                     aOut += " -> ";
689cdf0e10cSrcweir                                     aOut += ByteString::CreateFromInt64(pFrm->Frm().Width());
690cdf0e10cSrcweir                                     aOut += " ";
691cdf0e10cSrcweir                                 }
692cdf0e10cSrcweir                                 break;
693cdf0e10cSrcweir                             }
694cdf0e10cSrcweir     }
695cdf0e10cSrcweir     *pStream << aOut.GetBuffer() << endl;   // Ausgabe
696cdf0e10cSrcweir     pStream->Flush();   // Gleich auf die Platte, damit man mitlesen kann
697cdf0e10cSrcweir     if( ++nLineCount >= nMaxLines )     // Maximale Ausgabe erreicht?
698cdf0e10cSrcweir         SwProtocol::SetRecord( 0 );        // => Ende der Aufzeichnung
699cdf0e10cSrcweir }
700cdf0e10cSrcweir 
701cdf0e10cSrcweir /* -----------------13.01.99 11:39-------------------
702cdf0e10cSrcweir  * SwImplProtocol::SectFunc(...) wird von SwImplProtocol::_Record(..) gerufen,
703cdf0e10cSrcweir  * hier werden die Ausgaben rund um SectionFrms abgehandelt.
704cdf0e10cSrcweir  * --------------------------------------------------*/
705cdf0e10cSrcweir 
SectFunc(ByteString & rOut,const SwFrm *,sal_uLong nAct,void * pParam)706cdf0e10cSrcweir void SwImplProtocol::SectFunc( ByteString &rOut, const SwFrm* , sal_uLong nAct, void* pParam )
707cdf0e10cSrcweir {
708cdf0e10cSrcweir     sal_Bool bTmp = sal_False;
709cdf0e10cSrcweir     switch( nAct )
710cdf0e10cSrcweir     {
711cdf0e10cSrcweir         case ACT_MERGE:         rOut += "Merge Section ";
712cdf0e10cSrcweir                                 rOut += ByteString::CreateFromInt64( lcl_GetFrameId( (SwFrm*)pParam ) );
713cdf0e10cSrcweir                                 break;
714cdf0e10cSrcweir         case ACT_CREATE_MASTER: bTmp = sal_True; // NoBreak
715cdf0e10cSrcweir         case ACT_CREATE_FOLLOW: rOut += "Create Section ";
716cdf0e10cSrcweir                                 rOut += bTmp ? "Master to " : "Follow from ";
717cdf0e10cSrcweir                                 rOut += ByteString::CreateFromInt64( lcl_GetFrameId( (SwFrm*)pParam ) );
718cdf0e10cSrcweir                                 break;
719cdf0e10cSrcweir         case ACT_DEL_MASTER:    bTmp = sal_True; // NoBreak
720cdf0e10cSrcweir         case ACT_DEL_FOLLOW:    rOut += "Delete Section ";
721cdf0e10cSrcweir                                 rOut += bTmp ? "Master to " : "Follow from ";
722cdf0e10cSrcweir                                 rOut += ByteString::CreateFromInt64( lcl_GetFrameId( (SwFrm*)pParam ) );
723cdf0e10cSrcweir                                 break;
724cdf0e10cSrcweir     }
725cdf0e10cSrcweir }
726cdf0e10cSrcweir 
727cdf0e10cSrcweir /* -----------------11.01.99 11:31-------------------
728cdf0e10cSrcweir  * SwImplProtocol::InsertFrm(..) nimmt eine neue FrmId zum Aufzeichnen auf,
729cdf0e10cSrcweir  * wenn pFrmIds==NULL, werden alle aufgezeichnet, sobald durch InsertFrm(..)
730cdf0e10cSrcweir  * pFrmIds angelegt wird, werden nur noch die enthaltenen FrmIds aufgezeichnet.
731cdf0e10cSrcweir  * --------------------------------------------------*/
732cdf0e10cSrcweir 
InsertFrm(sal_uInt16 nId)733cdf0e10cSrcweir sal_Bool SwImplProtocol::InsertFrm( sal_uInt16 nId )
734cdf0e10cSrcweir {
735cdf0e10cSrcweir     if( !pFrmIds )
736cdf0e10cSrcweir         pFrmIds = new SvUShortsSort(5,5);
737cdf0e10cSrcweir     if( pFrmIds->Seek_Entry( nId ) )
738cdf0e10cSrcweir         return sal_False;
739cdf0e10cSrcweir     pFrmIds->Insert( nId );
740cdf0e10cSrcweir     return sal_True;
741cdf0e10cSrcweir }
742cdf0e10cSrcweir 
743cdf0e10cSrcweir /* -----------------11.01.99 11:52-------------------
744cdf0e10cSrcweir  * SwImplProtocol::DeleteFrm(..) entfernt eine FrmId aus dem pFrmIds-Array,
745cdf0e10cSrcweir  * so dass diese Frame nicht mehr aufgezeichnet wird.
746cdf0e10cSrcweir  * --------------------------------------------------*/
DeleteFrm(sal_uInt16 nId)747cdf0e10cSrcweir sal_Bool SwImplProtocol::DeleteFrm( sal_uInt16 nId )
748cdf0e10cSrcweir {
749cdf0e10cSrcweir     sal_uInt16 nPos;
750cdf0e10cSrcweir     if( !pFrmIds || !pFrmIds->Seek_Entry( nId, &nPos ) )
751cdf0e10cSrcweir         return sal_False;
752cdf0e10cSrcweir     pFrmIds->Remove( nPos );
753cdf0e10cSrcweir     return sal_True;
754cdf0e10cSrcweir }
755cdf0e10cSrcweir 
756cdf0e10cSrcweir /*-----------------20.9.2001 10:29------------------
757cdf0e10cSrcweir  * SwProtocol::SnapShot(..)
758cdf0e10cSrcweir  * creates a snapshot of the given frame and its content.
759cdf0e10cSrcweir  * --------------------------------------------------*/
SnapShot(const SwFrm * pFrm,sal_uLong nFlags)760cdf0e10cSrcweir void SwImplProtocol::SnapShot( const SwFrm* pFrm, sal_uLong nFlags )
761cdf0e10cSrcweir {
762cdf0e10cSrcweir     while( pFrm )
763cdf0e10cSrcweir     {
764cdf0e10cSrcweir         _Record( pFrm, PROT_SNAPSHOT, 0, 0);
765cdf0e10cSrcweir         if( pFrm->GetDrawObjs() && nFlags & SNAP_FLYFRAMES )
766cdf0e10cSrcweir         {
767cdf0e10cSrcweir             aLayer += "[ ";
768cdf0e10cSrcweir             const SwSortedObjs &rObjs = *pFrm->GetDrawObjs();
769cdf0e10cSrcweir             for ( sal_uInt16 i = 0; i < rObjs.Count(); ++i )
770cdf0e10cSrcweir             {
771cdf0e10cSrcweir                 SwAnchoredObject* pObj = rObjs[i];
772cdf0e10cSrcweir                 if ( pObj->ISA(SwFlyFrm) )
773cdf0e10cSrcweir                     SnapShot( static_cast<SwFlyFrm*>(pObj), nFlags );
774cdf0e10cSrcweir             }
775cdf0e10cSrcweir             if( aLayer.Len() > 1 )
776cdf0e10cSrcweir                 aLayer.Erase( aLayer.Len() - 2 );
777cdf0e10cSrcweir         }
778cdf0e10cSrcweir         if( pFrm->IsLayoutFrm() && nFlags & SNAP_LOWER &&
779cdf0e10cSrcweir             ( !pFrm->IsTabFrm() || nFlags & SNAP_TABLECONT ) )
780cdf0e10cSrcweir         {
781cdf0e10cSrcweir             aLayer += "  ";
782cdf0e10cSrcweir             SnapShot( ((SwLayoutFrm*)pFrm)->Lower(), nFlags );
783cdf0e10cSrcweir             if( aLayer.Len() > 1 )
784cdf0e10cSrcweir                 aLayer.Erase( aLayer.Len() - 2 );
785cdf0e10cSrcweir         }
786cdf0e10cSrcweir         pFrm = pFrm->GetNext();
787cdf0e10cSrcweir     }
788cdf0e10cSrcweir }
789cdf0e10cSrcweir 
790cdf0e10cSrcweir /* -----------------11.01.99 11:53-------------------
791cdf0e10cSrcweir  * SwEnterLeave::Ctor(..) wird vom eigentlichen (inline-)Kontruktor gerufen,
792cdf0e10cSrcweir  * wenn die Funktion aufgezeichnet werden soll.
793cdf0e10cSrcweir  * Die Aufgabe ist es abhaengig von der Funktion das richtige SwImplEnterLeave-Objekt
794cdf0e10cSrcweir  * zu erzeugen, alles weitere geschieht dann in dessen Ctor/Dtor.
795cdf0e10cSrcweir  * --------------------------------------------------*/
Ctor(const SwFrm * pFrm,sal_uLong nFunc,sal_uLong nAct,void * pPar)796cdf0e10cSrcweir void SwEnterLeave::Ctor( const SwFrm* pFrm, sal_uLong nFunc, sal_uLong nAct, void* pPar )
797cdf0e10cSrcweir {
798cdf0e10cSrcweir     switch( nFunc )
799cdf0e10cSrcweir     {
800cdf0e10cSrcweir         case PROT_ADJUSTN :
801cdf0e10cSrcweir         case PROT_GROW:
802cdf0e10cSrcweir         case PROT_SHRINK : pImpl = new SwSizeEnterLeave( pFrm, nFunc, nAct, pPar ); break;
803cdf0e10cSrcweir         case PROT_MOVE_FWD:
804cdf0e10cSrcweir         case PROT_MOVE_BWD : pImpl = new SwUpperEnterLeave( pFrm, nFunc, nAct, pPar ); break;
805cdf0e10cSrcweir         case PROT_FRMCHANGES : pImpl = new SwFrmChangesLeave( pFrm, nFunc, nAct, pPar ); break;
806cdf0e10cSrcweir         default: pImpl = new SwImplEnterLeave( pFrm, nFunc, nAct, pPar ); break;
807cdf0e10cSrcweir     }
808cdf0e10cSrcweir     pImpl->Enter();
809cdf0e10cSrcweir }
810cdf0e10cSrcweir 
811cdf0e10cSrcweir /* -----------------11.01.99 11:56-------------------
812cdf0e10cSrcweir  * SwEnterLeave::Dtor() ruft lediglich den Destruktor des SwImplEnterLeave-Objekts,
813cdf0e10cSrcweir  * ist nur deshalb nicht inline, damit die SwImplEnterLeave-Definition nicht
814cdf0e10cSrcweir  * im dbg_lay.hxx zu stehen braucht.
815cdf0e10cSrcweir  * --------------------------------------------------*/
816cdf0e10cSrcweir 
Dtor()817cdf0e10cSrcweir void SwEnterLeave::Dtor()
818cdf0e10cSrcweir {
819cdf0e10cSrcweir     if( pImpl )
820cdf0e10cSrcweir     {
821cdf0e10cSrcweir         pImpl->Leave();
822cdf0e10cSrcweir         delete pImpl;
823cdf0e10cSrcweir     }
824cdf0e10cSrcweir }
825cdf0e10cSrcweir 
Enter()826cdf0e10cSrcweir void SwImplEnterLeave::Enter()
827cdf0e10cSrcweir {
828cdf0e10cSrcweir     SwProtocol::Record( pFrm, nFunction, ACT_START, pParam );
829cdf0e10cSrcweir }
830cdf0e10cSrcweir 
Leave()831cdf0e10cSrcweir void SwImplEnterLeave::Leave()
832cdf0e10cSrcweir {
833cdf0e10cSrcweir     SwProtocol::Record( pFrm, nFunction, ACT_END, pParam );
834cdf0e10cSrcweir }
835cdf0e10cSrcweir 
Leave()836cdf0e10cSrcweir void SwSizeEnterLeave::Leave()
837cdf0e10cSrcweir {
838cdf0e10cSrcweir     nFrmHeight = pFrm->Frm().Height() - nFrmHeight;
839cdf0e10cSrcweir     SwProtocol::Record( pFrm, nFunction, ACT_END, &nFrmHeight );
840cdf0e10cSrcweir }
841cdf0e10cSrcweir 
Enter()842cdf0e10cSrcweir void SwUpperEnterLeave::Enter()
843cdf0e10cSrcweir {
844cdf0e10cSrcweir     nFrmId = pFrm->GetUpper() ? sal_uInt16(lcl_GetFrameId( pFrm->GetUpper() )) : 0;
845cdf0e10cSrcweir     SwProtocol::Record( pFrm, nFunction, ACT_START, &nFrmId );
846cdf0e10cSrcweir }
847cdf0e10cSrcweir 
Leave()848cdf0e10cSrcweir void SwUpperEnterLeave::Leave()
849cdf0e10cSrcweir {
850cdf0e10cSrcweir     nFrmId = pFrm->GetUpper() ? sal_uInt16(lcl_GetFrameId( pFrm->GetUpper() )) : 0;
851cdf0e10cSrcweir     SwProtocol::Record( pFrm, nFunction, ACT_END, &nFrmId );
852cdf0e10cSrcweir }
853cdf0e10cSrcweir 
Enter()854cdf0e10cSrcweir void SwFrmChangesLeave::Enter()
855cdf0e10cSrcweir {
856cdf0e10cSrcweir }
857cdf0e10cSrcweir 
Leave()858cdf0e10cSrcweir void SwFrmChangesLeave::Leave()
859cdf0e10cSrcweir {
860cdf0e10cSrcweir     if( pFrm->Frm() != aFrm )
861cdf0e10cSrcweir         SwProtocol::Record( pFrm, PROT_FRMCHANGES, 0, &aFrm );
862cdf0e10cSrcweir }
863cdf0e10cSrcweir 
864cdf0e10cSrcweir #endif // DBG_UTIL
865