1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski #include <vector>
28*b1cdbd2cSJim Jagielski #include <map>
29*b1cdbd2cSJim Jagielski #include <algorithm>
30*b1cdbd2cSJim Jagielski #include <boost/shared_ptr.hpp>
31*b1cdbd2cSJim Jagielski #include <sot/storage.hxx>
32*b1cdbd2cSJim Jagielski #ifndef _SVTOOLS_HRC
33*b1cdbd2cSJim Jagielski #include <svtools/svtools.hrc>
34*b1cdbd2cSJim Jagielski #endif
35*b1cdbd2cSJim Jagielski
36*b1cdbd2cSJim Jagielski #include <sal/main.h>
37*b1cdbd2cSJim Jagielski #include <vcl/event.hxx>
38*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
39*b1cdbd2cSJim Jagielski #include <vcl/wrkwin.hxx>
40*b1cdbd2cSJim Jagielski #include <vcl/msgbox.hxx>
41*b1cdbd2cSJim Jagielski #include <vcl/fixed.hxx>
42*b1cdbd2cSJim Jagielski #include <vcl/edit.hxx>
43*b1cdbd2cSJim Jagielski #include <vcl/button.hxx>
44*b1cdbd2cSJim Jagielski #include <vcl/lstbox.hxx>
45*b1cdbd2cSJim Jagielski #include <svtools/filectrl.hxx>
46*b1cdbd2cSJim Jagielski #include <tools/urlobj.hxx>
47*b1cdbd2cSJim Jagielski #include <osl/file.hxx>
48*b1cdbd2cSJim Jagielski #include <vcl/unohelp2.hxx>
49*b1cdbd2cSJim Jagielski #include <svtools/svtreebx.hxx>
50*b1cdbd2cSJim Jagielski #include <svtools/svmedit.hxx>
51*b1cdbd2cSJim Jagielski #include <sfx2/filedlghelper.hxx>
52*b1cdbd2cSJim Jagielski
53*b1cdbd2cSJim Jagielski #include <toolkit/unohlp.hxx>
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
56*b1cdbd2cSJim Jagielski #include <tools/resmgr.hxx>
57*b1cdbd2cSJim Jagielski
58*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
59*b1cdbd2cSJim Jagielski #include <cppuhelper/servicefactory.hxx>
60*b1cdbd2cSJim Jagielski #include <cppuhelper/bootstrap.hxx>
61*b1cdbd2cSJim Jagielski
62*b1cdbd2cSJim Jagielski #include <ucbhelper/contentbroker.hxx>
63*b1cdbd2cSJim Jagielski #include <ucbhelper/configurationkeys.hxx>
64*b1cdbd2cSJim Jagielski
65*b1cdbd2cSJim Jagielski #include <com/sun/star/lang/XMultiServiceFactory.hpp>
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindowPeer.hpp>
68*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XToolkit.hpp>
69*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/WindowDescriptor.hpp>
70*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/WindowAttribute.hpp>
71*b1cdbd2cSJim Jagielski #include <svx/msdffdef.hxx>
72*b1cdbd2cSJim Jagielski
73*b1cdbd2cSJim Jagielski #include <unotools/localfilehelper.hxx>
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski #include "xmlconfig.hxx"
76*b1cdbd2cSJim Jagielski
77*b1cdbd2cSJim Jagielski using ::rtl::OUString;
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
80*b1cdbd2cSJim Jagielski
81*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
82*b1cdbd2cSJim Jagielski
83*b1cdbd2cSJim Jagielski enum CompareStatus { CMP_NOTYET = 0, CMP_EQUAL = 1, CMP_NOTEQUAL = 2, CMP_NOTAVAILABLE = 3 };
84*b1cdbd2cSJim Jagielski static ColorData gColors[] = { COL_BLACK, COL_GREEN, COL_RED, COL_CYAN };
85*b1cdbd2cSJim Jagielski
86*b1cdbd2cSJim Jagielski class Atom
87*b1cdbd2cSJim Jagielski {
88*b1cdbd2cSJim Jagielski public:
89*b1cdbd2cSJim Jagielski ~Atom();
90*b1cdbd2cSJim Jagielski
91*b1cdbd2cSJim Jagielski /** imports this atom and its child atoms */
92*b1cdbd2cSJim Jagielski static Atom* import( const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl );
93*b1cdbd2cSJim Jagielski static Atom* import( UINT16 nRecType, SvStream& rStCtrl );
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski inline const DffRecordHeader& getHeader() const;
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski /** returns true if at least one atim with the given nRecType is found */
98*b1cdbd2cSJim Jagielski inline bool hasChildAtom( sal_uInt16 nRecType ) const;
99*b1cdbd2cSJim Jagielski
100*b1cdbd2cSJim Jagielski /** returns true if at least one atim with the given nRecType and nRecInstnace is found */
101*b1cdbd2cSJim Jagielski inline bool hasChildAtom( sal_uInt16 nRecType, sal_uInt16 nRecInstance ) const;
102*b1cdbd2cSJim Jagielski
103*b1cdbd2cSJim Jagielski /** returns the first child atom with nRecType or NULL */
104*b1cdbd2cSJim Jagielski inline const Atom* findFirstChildAtom( sal_uInt16 nRecType ) const;
105*b1cdbd2cSJim Jagielski
106*b1cdbd2cSJim Jagielski /** returns the next child atom after pLast with nRecType or NULL */
107*b1cdbd2cSJim Jagielski const Atom* findNextChildAtom( sal_uInt16 nRecType, const Atom* pLast ) const;
108*b1cdbd2cSJim Jagielski
109*b1cdbd2cSJim Jagielski /** returns the first child atom with nRecType and nRecInstance or NULL */
110*b1cdbd2cSJim Jagielski inline const Atom* findFirstChildAtom( sal_uInt16 nRecType, sal_uInt16 nRecInstance ) const;
111*b1cdbd2cSJim Jagielski
112*b1cdbd2cSJim Jagielski /** returns the next child atom after pLast with nRecType and nRecInstance or NULL */
113*b1cdbd2cSJim Jagielski const Atom* findNextChildAtom( sal_uInt16 nRecType, sal_uInt16 nRecInstance, const Atom* pLast ) const;
114*b1cdbd2cSJim Jagielski
115*b1cdbd2cSJim Jagielski /** returns the first child atom or NULL */
116*b1cdbd2cSJim Jagielski inline const Atom* findFirstChildAtom() const;
117*b1cdbd2cSJim Jagielski
118*b1cdbd2cSJim Jagielski /** returns the next child atom after pLast or NULL */
119*b1cdbd2cSJim Jagielski inline const Atom* findNextChildAtom( const Atom* pLast ) const;
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski /** returns true if this atom is a container */
122*b1cdbd2cSJim Jagielski inline bool isContainer() const;
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski /** seeks to the contents of this atom */
125*b1cdbd2cSJim Jagielski inline bool seekToContent() const;
126*b1cdbd2cSJim Jagielski
127*b1cdbd2cSJim Jagielski /** returns the record type */
128*b1cdbd2cSJim Jagielski inline sal_uInt16 getType() const;
129*b1cdbd2cSJim Jagielski
130*b1cdbd2cSJim Jagielski /** returns the record instance */
131*b1cdbd2cSJim Jagielski inline sal_uInt16 getInstance() const;
132*b1cdbd2cSJim Jagielski
133*b1cdbd2cSJim Jagielski /** returns the record length */
134*b1cdbd2cSJim Jagielski inline sal_uInt32 getLength() const;
135*b1cdbd2cSJim Jagielski
getStream() const136*b1cdbd2cSJim Jagielski SvStream& getStream() const { return mrStream; }
137*b1cdbd2cSJim Jagielski
138*b1cdbd2cSJim Jagielski bool operator==( const Atom& rAtom ) const;
139*b1cdbd2cSJim Jagielski
getCompareStatus() const140*b1cdbd2cSJim Jagielski CompareStatus getCompareStatus() const { return meStatus; }
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski void compare( Atom* pAtom );
143*b1cdbd2cSJim Jagielski bool compareContent( Atom& rAtom );
144*b1cdbd2cSJim Jagielski
getCompareAtom() const145*b1cdbd2cSJim Jagielski Atom* getCompareAtom() const { return mpCompareAtom; }
setCompareAtom(Atom * pAtom)146*b1cdbd2cSJim Jagielski void setCompareAtom( Atom* pAtom ) { mpCompareAtom = pAtom; }
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski private:
149*b1cdbd2cSJim Jagielski Atom( const DffRecordHeader& rRecordHeader, SvStream& rStCtrl );
150*b1cdbd2cSJim Jagielski
151*b1cdbd2cSJim Jagielski // statics for compare
152*b1cdbd2cSJim Jagielski static Atom* skipAtoms( Atom* pContainer, Atom* pAtom, Atom* pSkipTo );
153*b1cdbd2cSJim Jagielski static Atom* findFirstEqualAtom( Atom* pCompare, Atom* pContainer, Atom* pSearch, int& nDistance );
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski SvStream& mrStream;
156*b1cdbd2cSJim Jagielski DffRecordHeader maRecordHeader;
157*b1cdbd2cSJim Jagielski Atom* mpFirstChild;
158*b1cdbd2cSJim Jagielski Atom* mpNextAtom;
159*b1cdbd2cSJim Jagielski
160*b1cdbd2cSJim Jagielski CompareStatus meStatus;
161*b1cdbd2cSJim Jagielski Atom* mpCompareAtom;
162*b1cdbd2cSJim Jagielski };
163*b1cdbd2cSJim Jagielski
operator ==(const Atom & rAtom) const164*b1cdbd2cSJim Jagielski bool Atom::operator==( const Atom& rAtom ) const
165*b1cdbd2cSJim Jagielski {
166*b1cdbd2cSJim Jagielski return ( maRecordHeader.nRecType == rAtom.maRecordHeader.nRecType ) &&
167*b1cdbd2cSJim Jagielski ( maRecordHeader.nRecVer == rAtom.maRecordHeader.nRecVer ) &&
168*b1cdbd2cSJim Jagielski ( maRecordHeader.nRecInstance == rAtom.maRecordHeader.nRecInstance );
169*b1cdbd2cSJim Jagielski }
170*b1cdbd2cSJim Jagielski
compareContent(Atom & rAtom)171*b1cdbd2cSJim Jagielski bool Atom::compareContent( Atom& rAtom )
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski if( maRecordHeader.nRecLen == rAtom.maRecordHeader.nRecLen )
174*b1cdbd2cSJim Jagielski {
175*b1cdbd2cSJim Jagielski seekToContent();
176*b1cdbd2cSJim Jagielski rAtom.seekToContent();
177*b1cdbd2cSJim Jagielski
178*b1cdbd2cSJim Jagielski SvStream& rStream1 = getStream();
179*b1cdbd2cSJim Jagielski SvStream& rStream2 = rAtom.getStream();
180*b1cdbd2cSJim Jagielski
181*b1cdbd2cSJim Jagielski const int nBufferSize = 1024;
182*b1cdbd2cSJim Jagielski boost::shared_ptr< char > buffer1( new char[nBufferSize] );
183*b1cdbd2cSJim Jagielski boost::shared_ptr< char > buffer2( new char[nBufferSize] );
184*b1cdbd2cSJim Jagielski
185*b1cdbd2cSJim Jagielski sal_uInt32 nLength = maRecordHeader.nRecLen;
186*b1cdbd2cSJim Jagielski sal_Size nRead = 0;
187*b1cdbd2cSJim Jagielski while( nLength )
188*b1cdbd2cSJim Jagielski {
189*b1cdbd2cSJim Jagielski sal_Size nRead = (nBufferSize < nLength) ? nBufferSize : nLength;
190*b1cdbd2cSJim Jagielski nRead = rStream1.Read( (void*)buffer1.get(), nRead );
191*b1cdbd2cSJim Jagielski if( nRead == 0 )
192*b1cdbd2cSJim Jagielski break;
193*b1cdbd2cSJim Jagielski if( rStream2.Read( (void*)buffer2.get(), nRead ) != nRead )
194*b1cdbd2cSJim Jagielski break;
195*b1cdbd2cSJim Jagielski if( memcmp( (void*)buffer1.get(), (void*)buffer2.get(), nRead ) != 0 )
196*b1cdbd2cSJim Jagielski break;
197*b1cdbd2cSJim Jagielski
198*b1cdbd2cSJim Jagielski nLength -= nRead;
199*b1cdbd2cSJim Jagielski }
200*b1cdbd2cSJim Jagielski
201*b1cdbd2cSJim Jagielski return nLength == 0;
202*b1cdbd2cSJim Jagielski }
203*b1cdbd2cSJim Jagielski
204*b1cdbd2cSJim Jagielski return false;
205*b1cdbd2cSJim Jagielski }
206*b1cdbd2cSJim Jagielski
hasChildAtom(sal_uInt16 nRecType) const207*b1cdbd2cSJim Jagielski inline bool Atom::hasChildAtom( sal_uInt16 nRecType ) const
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski return findFirstChildAtom( nRecType ) != NULL;
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski
hasChildAtom(sal_uInt16 nRecType,sal_uInt16 nRecInstance) const212*b1cdbd2cSJim Jagielski inline bool Atom::hasChildAtom( sal_uInt16 nRecType, sal_uInt16 nRecInstance ) const
213*b1cdbd2cSJim Jagielski {
214*b1cdbd2cSJim Jagielski return findFirstChildAtom( nRecType, nRecInstance ) != NULL;
215*b1cdbd2cSJim Jagielski }
216*b1cdbd2cSJim Jagielski
findFirstChildAtom(sal_uInt16 nRecType) const217*b1cdbd2cSJim Jagielski inline const Atom* Atom::findFirstChildAtom( sal_uInt16 nRecType ) const
218*b1cdbd2cSJim Jagielski {
219*b1cdbd2cSJim Jagielski return findNextChildAtom( nRecType, NULL );
220*b1cdbd2cSJim Jagielski }
221*b1cdbd2cSJim Jagielski
getHeader() const222*b1cdbd2cSJim Jagielski inline const DffRecordHeader& Atom::getHeader() const
223*b1cdbd2cSJim Jagielski {
224*b1cdbd2cSJim Jagielski return maRecordHeader;
225*b1cdbd2cSJim Jagielski }
226*b1cdbd2cSJim Jagielski
findFirstChildAtom(sal_uInt16 nRecType,sal_uInt16 nRecInstance) const227*b1cdbd2cSJim Jagielski inline const Atom* Atom::findFirstChildAtom( sal_uInt16 nRecType, sal_uInt16 nRecInstance ) const
228*b1cdbd2cSJim Jagielski {
229*b1cdbd2cSJim Jagielski return findNextChildAtom( nRecType, nRecInstance, NULL );
230*b1cdbd2cSJim Jagielski }
231*b1cdbd2cSJim Jagielski
findFirstChildAtom() const232*b1cdbd2cSJim Jagielski inline const Atom* Atom::findFirstChildAtom() const
233*b1cdbd2cSJim Jagielski {
234*b1cdbd2cSJim Jagielski return mpFirstChild;
235*b1cdbd2cSJim Jagielski }
236*b1cdbd2cSJim Jagielski
findNextChildAtom(const Atom * pLast) const237*b1cdbd2cSJim Jagielski inline const Atom* Atom::findNextChildAtom( const Atom* pLast ) const
238*b1cdbd2cSJim Jagielski {
239*b1cdbd2cSJim Jagielski return pLast ? pLast->mpNextAtom : pLast;
240*b1cdbd2cSJim Jagielski }
241*b1cdbd2cSJim Jagielski
isContainer() const242*b1cdbd2cSJim Jagielski inline bool Atom::isContainer() const
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski return (bool)maRecordHeader.IsContainer();
245*b1cdbd2cSJim Jagielski }
246*b1cdbd2cSJim Jagielski
seekToContent() const247*b1cdbd2cSJim Jagielski inline bool Atom::seekToContent() const
248*b1cdbd2cSJim Jagielski {
249*b1cdbd2cSJim Jagielski maRecordHeader.SeekToContent( mrStream );
250*b1cdbd2cSJim Jagielski return mrStream.GetError() == 0;
251*b1cdbd2cSJim Jagielski }
252*b1cdbd2cSJim Jagielski
getType() const253*b1cdbd2cSJim Jagielski inline sal_uInt16 Atom::getType() const
254*b1cdbd2cSJim Jagielski {
255*b1cdbd2cSJim Jagielski return maRecordHeader.nRecType;
256*b1cdbd2cSJim Jagielski }
257*b1cdbd2cSJim Jagielski
getInstance() const258*b1cdbd2cSJim Jagielski inline sal_uInt16 Atom::getInstance() const
259*b1cdbd2cSJim Jagielski {
260*b1cdbd2cSJim Jagielski return maRecordHeader.nRecInstance;
261*b1cdbd2cSJim Jagielski }
262*b1cdbd2cSJim Jagielski
getLength() const263*b1cdbd2cSJim Jagielski inline sal_uInt32 Atom::getLength() const
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski return maRecordHeader.nRecLen;
266*b1cdbd2cSJim Jagielski }
267*b1cdbd2cSJim Jagielski
Atom(const DffRecordHeader & rRecordHeader,SvStream & rStream)268*b1cdbd2cSJim Jagielski Atom::Atom( const DffRecordHeader& rRecordHeader, SvStream& rStream )
269*b1cdbd2cSJim Jagielski : maRecordHeader( rRecordHeader ),
270*b1cdbd2cSJim Jagielski mrStream( rStream ),
271*b1cdbd2cSJim Jagielski mpFirstChild( 0 ),
272*b1cdbd2cSJim Jagielski mpNextAtom( 0 ),
273*b1cdbd2cSJim Jagielski meStatus( CMP_NOTYET ),
274*b1cdbd2cSJim Jagielski mpCompareAtom( 0 )
275*b1cdbd2cSJim Jagielski {
276*b1cdbd2cSJim Jagielski // check if we need to force this to a container
277*b1cdbd2cSJim Jagielski if( maRecordHeader.nRecVer != DFF_PSFLAG_CONTAINER )
278*b1cdbd2cSJim Jagielski {
279*b1cdbd2cSJim Jagielski AtomConfig* pAtomConfig = dynamic_cast< AtomConfig* >( gAtomConfigMap[ maRecordHeader.nRecType ].get() );
280*b1cdbd2cSJim Jagielski if( pAtomConfig && pAtomConfig->isContainer() )
281*b1cdbd2cSJim Jagielski {
282*b1cdbd2cSJim Jagielski maRecordHeader.nRecVer = DFF_PSFLAG_CONTAINER;
283*b1cdbd2cSJim Jagielski }
284*b1cdbd2cSJim Jagielski }
285*b1cdbd2cSJim Jagielski
286*b1cdbd2cSJim Jagielski if( isContainer() )
287*b1cdbd2cSJim Jagielski {
288*b1cdbd2cSJim Jagielski if( seekToContent() )
289*b1cdbd2cSJim Jagielski {
290*b1cdbd2cSJim Jagielski DffRecordHeader aChildHeader;
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim Jagielski Atom* pLastAtom = NULL;
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski while( (mrStream.GetError() == 0 ) && ( mrStream.Tell() < maRecordHeader.GetRecEndFilePos() ) )
295*b1cdbd2cSJim Jagielski {
296*b1cdbd2cSJim Jagielski mrStream >> aChildHeader;
297*b1cdbd2cSJim Jagielski
298*b1cdbd2cSJim Jagielski if( mrStream.GetError() == 0 )
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski Atom* pAtom = new Atom( aChildHeader, mrStream );
301*b1cdbd2cSJim Jagielski
302*b1cdbd2cSJim Jagielski if( pLastAtom )
303*b1cdbd2cSJim Jagielski pLastAtom->mpNextAtom = pAtom;
304*b1cdbd2cSJim Jagielski if( mpFirstChild == NULL )
305*b1cdbd2cSJim Jagielski mpFirstChild = pAtom;
306*b1cdbd2cSJim Jagielski
307*b1cdbd2cSJim Jagielski pLastAtom = pAtom;
308*b1cdbd2cSJim Jagielski }
309*b1cdbd2cSJim Jagielski }
310*b1cdbd2cSJim Jagielski }
311*b1cdbd2cSJim Jagielski }
312*b1cdbd2cSJim Jagielski
313*b1cdbd2cSJim Jagielski maRecordHeader.SeekToEndOfRecord( mrStream );
314*b1cdbd2cSJim Jagielski }
315*b1cdbd2cSJim Jagielski
~Atom()316*b1cdbd2cSJim Jagielski Atom::~Atom()
317*b1cdbd2cSJim Jagielski {
318*b1cdbd2cSJim Jagielski Atom* pChild = mpFirstChild;
319*b1cdbd2cSJim Jagielski while( pChild )
320*b1cdbd2cSJim Jagielski {
321*b1cdbd2cSJim Jagielski Atom* pNextChild = pChild->mpNextAtom;
322*b1cdbd2cSJim Jagielski delete pChild;
323*b1cdbd2cSJim Jagielski pChild = pNextChild;
324*b1cdbd2cSJim Jagielski }
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski
327*b1cdbd2cSJim Jagielski /** imports this atom and its child atoms */
import(const DffRecordHeader & rRootRecordHeader,SvStream & rStCtrl)328*b1cdbd2cSJim Jagielski Atom* Atom::import( const DffRecordHeader& rRootRecordHeader, SvStream& rStCtrl )
329*b1cdbd2cSJim Jagielski {
330*b1cdbd2cSJim Jagielski Atom* pRootAtom = new Atom( rRootRecordHeader, rStCtrl );
331*b1cdbd2cSJim Jagielski
332*b1cdbd2cSJim Jagielski if( rStCtrl.GetError() == 0 )
333*b1cdbd2cSJim Jagielski {
334*b1cdbd2cSJim Jagielski return pRootAtom;
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski else
337*b1cdbd2cSJim Jagielski {
338*b1cdbd2cSJim Jagielski delete pRootAtom;
339*b1cdbd2cSJim Jagielski return NULL;
340*b1cdbd2cSJim Jagielski }
341*b1cdbd2cSJim Jagielski }
342*b1cdbd2cSJim Jagielski
343*b1cdbd2cSJim Jagielski /** imports this atom and its child atoms */
import(UINT16 nRecType,SvStream & rStCtrl)344*b1cdbd2cSJim Jagielski Atom* Atom::import( UINT16 nRecType, SvStream& rStCtrl )
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski rStCtrl.Seek( STREAM_SEEK_TO_END );
347*b1cdbd2cSJim Jagielski sal_Size nStreamLength = rStCtrl.Tell();
348*b1cdbd2cSJim Jagielski rStCtrl.Seek( STREAM_SEEK_TO_BEGIN );
349*b1cdbd2cSJim Jagielski
350*b1cdbd2cSJim Jagielski DffRecordHeader aRootRecordHeader;
351*b1cdbd2cSJim Jagielski aRootRecordHeader.nRecVer = DFF_PSFLAG_CONTAINER;
352*b1cdbd2cSJim Jagielski aRootRecordHeader.nRecInstance = 0;
353*b1cdbd2cSJim Jagielski aRootRecordHeader.nImpVerInst = 0;
354*b1cdbd2cSJim Jagielski aRootRecordHeader.nRecType = nRecType;
355*b1cdbd2cSJim Jagielski aRootRecordHeader.nRecLen = nStreamLength;
356*b1cdbd2cSJim Jagielski aRootRecordHeader.nFilePos = 0;
357*b1cdbd2cSJim Jagielski
358*b1cdbd2cSJim Jagielski return import( aRootRecordHeader, rStCtrl );
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski
361*b1cdbd2cSJim Jagielski /** returns the next child atom after pLast with nRecType or NULL */
findNextChildAtom(sal_uInt16 nRecType,const Atom * pLast) const362*b1cdbd2cSJim Jagielski const Atom* Atom::findNextChildAtom( sal_uInt16 nRecType, const Atom* pLast ) const
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski Atom* pChild = pLast != NULL ? pLast->mpNextAtom : mpFirstChild;
365*b1cdbd2cSJim Jagielski while( pChild && pChild->maRecordHeader.nRecType != nRecType )
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski pChild = pChild->mpNextAtom;
368*b1cdbd2cSJim Jagielski }
369*b1cdbd2cSJim Jagielski
370*b1cdbd2cSJim Jagielski return pChild;
371*b1cdbd2cSJim Jagielski }
372*b1cdbd2cSJim Jagielski
373*b1cdbd2cSJim Jagielski /** returns the next child atom after pLast with nRecType and nRecInstance or NULL */
findNextChildAtom(sal_uInt16 nRecType,sal_uInt16 nRecInstance,const Atom * pLast) const374*b1cdbd2cSJim Jagielski const Atom* Atom::findNextChildAtom( sal_uInt16 nRecType, sal_uInt16 nRecInstance, const Atom* pLast ) const
375*b1cdbd2cSJim Jagielski {
376*b1cdbd2cSJim Jagielski const Atom* pChild = pLast != NULL ? pLast->mpNextAtom : mpFirstChild;
377*b1cdbd2cSJim Jagielski while( pChild && (pChild->maRecordHeader.nRecType != nRecType) && (pChild->maRecordHeader.nRecInstance != nRecInstance) )
378*b1cdbd2cSJim Jagielski {
379*b1cdbd2cSJim Jagielski pChild = findNextChildAtom( pChild );
380*b1cdbd2cSJim Jagielski }
381*b1cdbd2cSJim Jagielski
382*b1cdbd2cSJim Jagielski return pChild;
383*b1cdbd2cSJim Jagielski }
384*b1cdbd2cSJim Jagielski
findFirstEqualAtom(Atom * pCompare,Atom * pContainer,Atom * pSearch,int & nDistance)385*b1cdbd2cSJim Jagielski Atom* Atom::findFirstEqualAtom( Atom* pCompare, Atom* pContainer, Atom* pSearch, int& nDistance )
386*b1cdbd2cSJim Jagielski {
387*b1cdbd2cSJim Jagielski nDistance = 0;
388*b1cdbd2cSJim Jagielski Atom* pRet = 0;
389*b1cdbd2cSJim Jagielski
390*b1cdbd2cSJim Jagielski while( pSearch )
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski if( *pSearch == *pCompare )
393*b1cdbd2cSJim Jagielski return pSearch;
394*b1cdbd2cSJim Jagielski
395*b1cdbd2cSJim Jagielski pSearch = const_cast< Atom* >( pContainer->findNextChildAtom( pSearch ) );
396*b1cdbd2cSJim Jagielski nDistance++;
397*b1cdbd2cSJim Jagielski }
398*b1cdbd2cSJim Jagielski
399*b1cdbd2cSJim Jagielski return 0;
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski
skipAtoms(Atom * pContainer,Atom * pAtom,Atom * pSkipTo)402*b1cdbd2cSJim Jagielski Atom* Atom::skipAtoms( Atom* pContainer, Atom* pAtom, Atom* pSkipTo )
403*b1cdbd2cSJim Jagielski {
404*b1cdbd2cSJim Jagielski while( pAtom && (pAtom != pSkipTo) )
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski pAtom->meStatus = CMP_NOTAVAILABLE;
407*b1cdbd2cSJim Jagielski pAtom = const_cast< Atom* >( pContainer->findNextChildAtom( pAtom ) );
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski
410*b1cdbd2cSJim Jagielski return pAtom;
411*b1cdbd2cSJim Jagielski }
412*b1cdbd2cSJim Jagielski
compare(Atom * pAtom)413*b1cdbd2cSJim Jagielski void Atom::compare( Atom* pAtom )
414*b1cdbd2cSJim Jagielski {
415*b1cdbd2cSJim Jagielski if( pAtom )
416*b1cdbd2cSJim Jagielski {
417*b1cdbd2cSJim Jagielski if( meStatus == CMP_NOTYET )
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski mpCompareAtom = pAtom;
420*b1cdbd2cSJim Jagielski pAtom->mpCompareAtom = this;
421*b1cdbd2cSJim Jagielski
422*b1cdbd2cSJim Jagielski mpCompareAtom = pAtom;
423*b1cdbd2cSJim Jagielski pAtom->mpCompareAtom = this;
424*b1cdbd2cSJim Jagielski
425*b1cdbd2cSJim Jagielski meStatus = pAtom->meStatus = ( *this == *pAtom ) ? CMP_EQUAL : CMP_NOTEQUAL;
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski
428*b1cdbd2cSJim Jagielski if(meStatus == CMP_EQUAL)
429*b1cdbd2cSJim Jagielski {
430*b1cdbd2cSJim Jagielski if( isContainer() )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski /** returns the first child atom or NULL */
433*b1cdbd2cSJim Jagielski Atom* pChildAtom1 = const_cast< Atom* >( findFirstChildAtom() );
434*b1cdbd2cSJim Jagielski
435*b1cdbd2cSJim Jagielski if( pChildAtom1 && (pChildAtom1->meStatus == CMP_NOTYET) )
436*b1cdbd2cSJim Jagielski {
437*b1cdbd2cSJim Jagielski Atom* pChildAtom2 = const_cast< Atom* >( pAtom->findFirstChildAtom() );
438*b1cdbd2cSJim Jagielski while( pChildAtom1 && pChildAtom2 )
439*b1cdbd2cSJim Jagielski {
440*b1cdbd2cSJim Jagielski if( !(*pChildAtom1 == *pChildAtom2) )
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski int nDistance1;
443*b1cdbd2cSJim Jagielski int nDistance2;
444*b1cdbd2cSJim Jagielski
445*b1cdbd2cSJim Jagielski Atom* pFind1 = findFirstEqualAtom( pChildAtom1, pAtom, const_cast< Atom* >( pAtom->findNextChildAtom( pChildAtom2 )), nDistance1 );
446*b1cdbd2cSJim Jagielski Atom* pFind2 = findFirstEqualAtom( pChildAtom2, this, const_cast< Atom* >(findNextChildAtom( pChildAtom1 )), nDistance2 );
447*b1cdbd2cSJim Jagielski
448*b1cdbd2cSJim Jagielski if( pFind1 && (!pFind2 || (nDistance1 < nDistance2) ) )
449*b1cdbd2cSJim Jagielski {
450*b1cdbd2cSJim Jagielski pChildAtom2 = skipAtoms( pAtom, pChildAtom2, pFind1 );
451*b1cdbd2cSJim Jagielski }
452*b1cdbd2cSJim Jagielski else if( pFind2 )
453*b1cdbd2cSJim Jagielski {
454*b1cdbd2cSJim Jagielski pChildAtom1 = skipAtoms( this, pChildAtom1, pFind2 );
455*b1cdbd2cSJim Jagielski }
456*b1cdbd2cSJim Jagielski else
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski pChildAtom1 = skipAtoms( this, pChildAtom1, 0 );
459*b1cdbd2cSJim Jagielski pChildAtom2 = skipAtoms( pAtom, pChildAtom2, 0 );
460*b1cdbd2cSJim Jagielski }
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski
463*b1cdbd2cSJim Jagielski if( pChildAtom1 && pChildAtom2 )
464*b1cdbd2cSJim Jagielski {
465*b1cdbd2cSJim Jagielski pChildAtom1->mpCompareAtom = pChildAtom2;
466*b1cdbd2cSJim Jagielski pChildAtom2->mpCompareAtom = pChildAtom1;
467*b1cdbd2cSJim Jagielski
468*b1cdbd2cSJim Jagielski pChildAtom1->meStatus = pChildAtom2->meStatus =
469*b1cdbd2cSJim Jagielski (pChildAtom1->isContainer() || pChildAtom1->compareContent( *pChildAtom2 )) ?
470*b1cdbd2cSJim Jagielski CMP_EQUAL : CMP_NOTEQUAL;
471*b1cdbd2cSJim Jagielski
472*b1cdbd2cSJim Jagielski pChildAtom1 = const_cast< Atom* >( findNextChildAtom( pChildAtom1 ) );
473*b1cdbd2cSJim Jagielski pChildAtom2 = const_cast< Atom* >( pAtom->findNextChildAtom( pChildAtom2 ) );
474*b1cdbd2cSJim Jagielski }
475*b1cdbd2cSJim Jagielski }
476*b1cdbd2cSJim Jagielski }
477*b1cdbd2cSJim Jagielski }
478*b1cdbd2cSJim Jagielski else
479*b1cdbd2cSJim Jagielski {
480*b1cdbd2cSJim Jagielski if( !compareContent( *pAtom ) )
481*b1cdbd2cSJim Jagielski {
482*b1cdbd2cSJim Jagielski meStatus = pAtom->meStatus = CMP_NOTEQUAL;
483*b1cdbd2cSJim Jagielski }
484*b1cdbd2cSJim Jagielski }
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski }
487*b1cdbd2cSJim Jagielski }
488*b1cdbd2cSJim Jagielski
489*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
490*b1cdbd2cSJim Jagielski
491*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
492*b1cdbd2cSJim Jagielski
493*b1cdbd2cSJim Jagielski class AtomBoxString : public SvLBoxString
494*b1cdbd2cSJim Jagielski {
495*b1cdbd2cSJim Jagielski public:
AtomBoxString(SvLBoxEntry * pEntry,const String & rStr)496*b1cdbd2cSJim Jagielski AtomBoxString( SvLBoxEntry* pEntry, const String& rStr )
497*b1cdbd2cSJim Jagielski : SvLBoxString( pEntry, 0, rStr )
498*b1cdbd2cSJim Jagielski { }
499*b1cdbd2cSJim Jagielski
~AtomBoxString()500*b1cdbd2cSJim Jagielski ~AtomBoxString() { }
501*b1cdbd2cSJim Jagielski
Paint(const Point & rPos,SvLBox & rOutDev,USHORT nViewDataEntryFlags,SvLBoxEntry * pEntry)502*b1cdbd2cSJim Jagielski void Paint( const Point& rPos, SvLBox& rOutDev, USHORT nViewDataEntryFlags, SvLBoxEntry* pEntry )
503*b1cdbd2cSJim Jagielski {
504*b1cdbd2cSJim Jagielski Color aOldTextColor = rOutDev.GetTextColor();
505*b1cdbd2cSJim Jagielski
506*b1cdbd2cSJim Jagielski if( pEntry && pEntry->GetUserData() )
507*b1cdbd2cSJim Jagielski {
508*b1cdbd2cSJim Jagielski Atom* pAtom = static_cast<Atom*>( pEntry->GetUserData() );
509*b1cdbd2cSJim Jagielski rOutDev.SetTextColor( Color( gColors[ pAtom->getCompareStatus() ] ) );
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski
512*b1cdbd2cSJim Jagielski SvLBoxString::Paint( rPos, rOutDev, nViewDataEntryFlags, pEntry );
513*b1cdbd2cSJim Jagielski
514*b1cdbd2cSJim Jagielski rOutDev.SetTextColor( aOldTextColor );
515*b1cdbd2cSJim Jagielski
516*b1cdbd2cSJim Jagielski /*
517*b1cdbd2cSJim Jagielski Color aOldFillColor = rOutDev.GetFillColor();
518*b1cdbd2cSJim Jagielski
519*b1cdbd2cSJim Jagielski SvTreeListBox* pTreeBox = static_cast< SvTreeListBox* >( &rOutDev );
520*b1cdbd2cSJim Jagielski long nX = pTreeBox->GetSizePixel().Width();
521*b1cdbd2cSJim Jagielski
522*b1cdbd2cSJim Jagielski ScrollBar* pVScroll = pTreeBox->GetVScroll();
523*b1cdbd2cSJim Jagielski if ( pVScroll->IsVisible() )
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski nX -= pVScroll->GetSizePixel().Width();
526*b1cdbd2cSJim Jagielski }
527*b1cdbd2cSJim Jagielski
528*b1cdbd2cSJim Jagielski SvViewDataItem* pItem = rOutDev.GetViewDataItem( pEntry, this );
529*b1cdbd2cSJim Jagielski nX -= pItem->aSize.Height();
530*b1cdbd2cSJim Jagielski
531*b1cdbd2cSJim Jagielski long nSize = pItem->aSize.Height() / 2;
532*b1cdbd2cSJim Jagielski long nHalfSize = nSize / 2;
533*b1cdbd2cSJim Jagielski long nY = rPos.Y() + nHalfSize;
534*b1cdbd2cSJim Jagielski
535*b1cdbd2cSJim Jagielski if ( aOldFillColor == COL_WHITE )
536*b1cdbd2cSJim Jagielski {
537*b1cdbd2cSJim Jagielski rOutDev.SetFillColor( Color( COL_BLACK ) );
538*b1cdbd2cSJim Jagielski }
539*b1cdbd2cSJim Jagielski else
540*b1cdbd2cSJim Jagielski {
541*b1cdbd2cSJim Jagielski rOutDev.SetFillColor( Color( COL_WHITE ) );
542*b1cdbd2cSJim Jagielski }
543*b1cdbd2cSJim Jagielski
544*b1cdbd2cSJim Jagielski long n = 0;
545*b1cdbd2cSJim Jagielski while ( n <= nHalfSize )
546*b1cdbd2cSJim Jagielski {
547*b1cdbd2cSJim Jagielski rOutDev.DrawRect( Rectangle( nX+n, nY+n, nX+n, nY+nSize-n ) );
548*b1cdbd2cSJim Jagielski n++;
549*b1cdbd2cSJim Jagielski }
550*b1cdbd2cSJim Jagielski
551*b1cdbd2cSJim Jagielski rOutDev.SetFillColor( aOldFillColor );
552*b1cdbd2cSJim Jagielski */
553*b1cdbd2cSJim Jagielski }
554*b1cdbd2cSJim Jagielski
555*b1cdbd2cSJim Jagielski private:
556*b1cdbd2cSJim Jagielski Image* mpImage;
557*b1cdbd2cSJim Jagielski };
558*b1cdbd2cSJim Jagielski
559*b1cdbd2cSJim Jagielski
560*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////
561*b1cdbd2cSJim Jagielski
562*b1cdbd2cSJim Jagielski class AtomContainerTreeListBox : public SvTreeListBox
563*b1cdbd2cSJim Jagielski {
564*b1cdbd2cSJim Jagielski public:
565*b1cdbd2cSJim Jagielski AtomContainerTreeListBox( Window* pParent );
566*b1cdbd2cSJim Jagielski ~AtomContainerTreeListBox();
567*b1cdbd2cSJim Jagielski
568*b1cdbd2cSJim Jagielski void SetRootAtom( const Atom* pAtom );
569*b1cdbd2cSJim Jagielski
570*b1cdbd2cSJim Jagielski
SetCollapsingHdl(const Link & rNewHdl)571*b1cdbd2cSJim Jagielski void SetCollapsingHdl(const Link& rNewHdl){maCollapsingHdl=rNewHdl;}
GetCollapsingHdl() const572*b1cdbd2cSJim Jagielski const Link& GetCollapsingHdl() const { return maCollapsingHdl; }
573*b1cdbd2cSJim Jagielski
SetExpandingHdl(const Link & rNewHdl)574*b1cdbd2cSJim Jagielski void SetExpandingHdl(const Link& rNewHdl){maExpandingHdl=rNewHdl;}
GetExpandingHdl() const575*b1cdbd2cSJim Jagielski const Link& GetExpandingHdl() const { return maExpandingHdl; }
576*b1cdbd2cSJim Jagielski
577*b1cdbd2cSJim Jagielski virtual BOOL Expand( SvLBoxEntry* pParent );
578*b1cdbd2cSJim Jagielski virtual BOOL Collapse( SvLBoxEntry* pParent );
579*b1cdbd2cSJim Jagielski
580*b1cdbd2cSJim Jagielski SvLBoxEntry* findAtom( Atom* pAtom );
581*b1cdbd2cSJim Jagielski
582*b1cdbd2cSJim Jagielski virtual void InitEntry(SvLBoxEntry*,const XubString&,const Image&,const Image&);
583*b1cdbd2cSJim Jagielski virtual void SetTabs();
584*b1cdbd2cSJim Jagielski
585*b1cdbd2cSJim Jagielski private:
586*b1cdbd2cSJim Jagielski void InsertAtom( const Atom* pAtom, SvLBoxEntry* pParent = 0 );
587*b1cdbd2cSJim Jagielski const Atom* mpRootAtom;
588*b1cdbd2cSJim Jagielski ResMgr* mpResMgr;
589*b1cdbd2cSJim Jagielski Image maImgFolder;
590*b1cdbd2cSJim Jagielski Image maImgAtom;
591*b1cdbd2cSJim Jagielski Image maImgExpanded;
592*b1cdbd2cSJim Jagielski Image maImgCollapsed;
593*b1cdbd2cSJim Jagielski bool mbRecursiveGuard;
594*b1cdbd2cSJim Jagielski Link maCollapsingHdl;
595*b1cdbd2cSJim Jagielski Link maExpandingHdl;
596*b1cdbd2cSJim Jagielski };
597*b1cdbd2cSJim Jagielski
598*b1cdbd2cSJim Jagielski typedef std::pair< AtomContainerTreeListBox*, SvLBoxEntry* > AtomContainerEntryPair;
599*b1cdbd2cSJim Jagielski
AtomContainerTreeListBox(Window * pParent)600*b1cdbd2cSJim Jagielski AtomContainerTreeListBox::AtomContainerTreeListBox( Window* pParent )
601*b1cdbd2cSJim Jagielski : SvTreeListBox( pParent, WB_HASBUTTONS|WB_HASLINES|WB_HASBUTTONSATROOT|WB_3DLOOK|WB_BORDER ),
602*b1cdbd2cSJim Jagielski mpRootAtom( 0 ), mbRecursiveGuard( false )
603*b1cdbd2cSJim Jagielski {
604*b1cdbd2cSJim Jagielski mpResMgr = ResMgr::CreateResMgr( "svt" );
605*b1cdbd2cSJim Jagielski maImgCollapsed = Image( ResId( RID_IMG_TREENODE_COLLAPSED, mpResMgr ) );
606*b1cdbd2cSJim Jagielski maImgExpanded = Image( ResId( RID_IMG_TREENODE_EXPANDED, mpResMgr ) );
607*b1cdbd2cSJim Jagielski
608*b1cdbd2cSJim Jagielski // SetDefaultExpandedEntryBmp( aExpanded );
609*b1cdbd2cSJim Jagielski // SetDefaultCollapsedEntryBmp(aCollapsed );
610*b1cdbd2cSJim Jagielski
611*b1cdbd2cSJim Jagielski maImgFolder = Image( ResId( IMG_SVT_FOLDER, mpResMgr ) );
612*b1cdbd2cSJim Jagielski maImgAtom = Image( ResId( IMG_SVT_DOCTEMPLATE_DOCINFO_SMALL, mpResMgr ) );
613*b1cdbd2cSJim Jagielski }
614*b1cdbd2cSJim Jagielski
~AtomContainerTreeListBox()615*b1cdbd2cSJim Jagielski AtomContainerTreeListBox::~AtomContainerTreeListBox()
616*b1cdbd2cSJim Jagielski {
617*b1cdbd2cSJim Jagielski }
618*b1cdbd2cSJim Jagielski
SetTabs()619*b1cdbd2cSJim Jagielski void AtomContainerTreeListBox::SetTabs()
620*b1cdbd2cSJim Jagielski {
621*b1cdbd2cSJim Jagielski if( IsEditingActive() )
622*b1cdbd2cSJim Jagielski EndEditing( TRUE );
623*b1cdbd2cSJim Jagielski
624*b1cdbd2cSJim Jagielski ClearTabList();
625*b1cdbd2cSJim Jagielski
626*b1cdbd2cSJim Jagielski short nIndent = 0; GetIndent();
627*b1cdbd2cSJim Jagielski long nNodeWidthPixel = maImgCollapsed.GetSizePixel().Width();
628*b1cdbd2cSJim Jagielski long nContextWidthDIV2 = nNodeWidthPixel >> 1;
629*b1cdbd2cSJim Jagielski
630*b1cdbd2cSJim Jagielski long nStartPos = 2 + ( nIndent + nContextWidthDIV2 );
631*b1cdbd2cSJim Jagielski AddTab( nStartPos, SV_LBOXTAB_DYNAMIC | SV_LBOXTAB_ADJUST_CENTER );
632*b1cdbd2cSJim Jagielski nStartPos += nNodeWidthPixel + 5;
633*b1cdbd2cSJim Jagielski AddTab( nStartPos, SV_LBOXTAB_DYNAMIC | SV_LBOXTAB_ADJUST_CENTER | SV_LBOXTAB_SHOW_SELECTION );
634*b1cdbd2cSJim Jagielski nStartPos += nContextWidthDIV2 + 5;
635*b1cdbd2cSJim Jagielski AddTab( nStartPos, SV_LBOXTAB_DYNAMIC|SV_LBOXTAB_ADJUST_LEFT | SV_LBOXTAB_SHOW_SELECTION );
636*b1cdbd2cSJim Jagielski }
637*b1cdbd2cSJim Jagielski
InitEntry(SvLBoxEntry * pEntry,const XubString & aStr,const Image & aCollEntryBmp,const Image & aExpEntryBmp)638*b1cdbd2cSJim Jagielski void AtomContainerTreeListBox::InitEntry(SvLBoxEntry* pEntry,const XubString& aStr,const Image& aCollEntryBmp,const Image& aExpEntryBmp)
639*b1cdbd2cSJim Jagielski {
640*b1cdbd2cSJim Jagielski pEntry->AddItem( new SvLBoxContextBmp( pEntry,0, aCollEntryBmp,aExpEntryBmp, SVLISTENTRYFLAG_EXPANDED ) );
641*b1cdbd2cSJim Jagielski pEntry->AddItem( new SvLBoxContextBmp( pEntry,0, maImgAtom, maImgAtom, SVLISTENTRYFLAG_EXPANDED ) );
642*b1cdbd2cSJim Jagielski pEntry->AddItem( new AtomBoxString( pEntry, aStr ) );
643*b1cdbd2cSJim Jagielski }
644*b1cdbd2cSJim Jagielski
findAtom(Atom * pAtom)645*b1cdbd2cSJim Jagielski SvLBoxEntry* AtomContainerTreeListBox::findAtom( Atom* pAtom )
646*b1cdbd2cSJim Jagielski {
647*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = First();
648*b1cdbd2cSJim Jagielski while( pEntry )
649*b1cdbd2cSJim Jagielski {
650*b1cdbd2cSJim Jagielski if( pEntry->GetUserData() == pAtom )
651*b1cdbd2cSJim Jagielski return pEntry;
652*b1cdbd2cSJim Jagielski
653*b1cdbd2cSJim Jagielski pEntry = Next( pEntry );
654*b1cdbd2cSJim Jagielski }
655*b1cdbd2cSJim Jagielski
656*b1cdbd2cSJim Jagielski return 0;
657*b1cdbd2cSJim Jagielski }
658*b1cdbd2cSJim Jagielski
Expand(SvLBoxEntry * pParent)659*b1cdbd2cSJim Jagielski BOOL AtomContainerTreeListBox::Expand( SvLBoxEntry* pParent )
660*b1cdbd2cSJim Jagielski {
661*b1cdbd2cSJim Jagielski BOOL bRet = FALSE;
662*b1cdbd2cSJim Jagielski if( !mbRecursiveGuard )
663*b1cdbd2cSJim Jagielski {
664*b1cdbd2cSJim Jagielski mbRecursiveGuard = true;
665*b1cdbd2cSJim Jagielski AtomContainerEntryPair aPair( this, pParent );
666*b1cdbd2cSJim Jagielski maExpandingHdl.Call( &aPair);
667*b1cdbd2cSJim Jagielski
668*b1cdbd2cSJim Jagielski bRet = SvTreeListBox::Expand( pParent );
669*b1cdbd2cSJim Jagielski mbRecursiveGuard = false;
670*b1cdbd2cSJim Jagielski }
671*b1cdbd2cSJim Jagielski return bRet;
672*b1cdbd2cSJim Jagielski }
673*b1cdbd2cSJim Jagielski
Collapse(SvLBoxEntry * pParent)674*b1cdbd2cSJim Jagielski BOOL AtomContainerTreeListBox::Collapse( SvLBoxEntry* pParent )
675*b1cdbd2cSJim Jagielski {
676*b1cdbd2cSJim Jagielski BOOL bRet = FALSE;
677*b1cdbd2cSJim Jagielski if( !mbRecursiveGuard )
678*b1cdbd2cSJim Jagielski {
679*b1cdbd2cSJim Jagielski mbRecursiveGuard = true;
680*b1cdbd2cSJim Jagielski AtomContainerEntryPair aPair( this, pParent );
681*b1cdbd2cSJim Jagielski maCollapsingHdl.Call( &aPair);
682*b1cdbd2cSJim Jagielski
683*b1cdbd2cSJim Jagielski bRet = SvTreeListBox::Collapse( pParent );
684*b1cdbd2cSJim Jagielski mbRecursiveGuard = false;
685*b1cdbd2cSJim Jagielski }
686*b1cdbd2cSJim Jagielski return bRet;
687*b1cdbd2cSJim Jagielski }
688*b1cdbd2cSJim Jagielski
SetRootAtom(const Atom * pAtom)689*b1cdbd2cSJim Jagielski void AtomContainerTreeListBox::SetRootAtom( const Atom* pAtom )
690*b1cdbd2cSJim Jagielski {
691*b1cdbd2cSJim Jagielski mpRootAtom = pAtom;
692*b1cdbd2cSJim Jagielski InsertAtom( mpRootAtom );
693*b1cdbd2cSJim Jagielski }
694*b1cdbd2cSJim Jagielski
InsertAtom(const Atom * pAtom,SvLBoxEntry * pParent)695*b1cdbd2cSJim Jagielski void AtomContainerTreeListBox::InsertAtom( const Atom* pAtom, SvLBoxEntry* pParent /* = 0 */ )
696*b1cdbd2cSJim Jagielski {
697*b1cdbd2cSJim Jagielski if( pAtom )
698*b1cdbd2cSJim Jagielski {
699*b1cdbd2cSJim Jagielski const DffRecordHeader& rHeader = pAtom->getHeader();
700*b1cdbd2cSJim Jagielski
701*b1cdbd2cSJim Jagielski char buffer[1024];
702*b1cdbd2cSJim Jagielski
703*b1cdbd2cSJim Jagielski rtl::OUString aText;
704*b1cdbd2cSJim Jagielski AtomConfig* pAtomConfig = dynamic_cast< AtomConfig*>( gAtomConfigMap[rHeader.nRecType].get() );
705*b1cdbd2cSJim Jagielski
706*b1cdbd2cSJim Jagielski if( pAtomConfig )
707*b1cdbd2cSJim Jagielski aText = pAtomConfig->getName();
708*b1cdbd2cSJim Jagielski
709*b1cdbd2cSJim Jagielski if( !aText.getLength() )
710*b1cdbd2cSJim Jagielski {
711*b1cdbd2cSJim Jagielski sprintf( buffer, "unknown_0x%04x", rHeader.nRecType );
712*b1cdbd2cSJim Jagielski aText += rtl::OUString::createFromAscii( buffer );
713*b1cdbd2cSJim Jagielski }
714*b1cdbd2cSJim Jagielski
715*b1cdbd2cSJim Jagielski sprintf( buffer, " (I: %lu L: %lu)", (UINT32)rHeader.nRecVer, (UINT32)rHeader.nRecLen );
716*b1cdbd2cSJim Jagielski aText += String( rtl::OUString::createFromAscii( buffer ) );
717*b1cdbd2cSJim Jagielski
718*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = 0;
719*b1cdbd2cSJim Jagielski if( pAtom->isContainer() && pAtom->findFirstChildAtom() )
720*b1cdbd2cSJim Jagielski {
721*b1cdbd2cSJim Jagielski pEntry = InsertEntry( aText, maImgExpanded, maImgCollapsed, pParent );
722*b1cdbd2cSJim Jagielski
723*b1cdbd2cSJim Jagielski /** returns the first child atom or NULL */
724*b1cdbd2cSJim Jagielski const Atom* pChildAtom = pAtom->findFirstChildAtom();
725*b1cdbd2cSJim Jagielski
726*b1cdbd2cSJim Jagielski while( pChildAtom )
727*b1cdbd2cSJim Jagielski {
728*b1cdbd2cSJim Jagielski InsertAtom( pChildAtom, pEntry );
729*b1cdbd2cSJim Jagielski pChildAtom = pAtom->findNextChildAtom( pChildAtom );
730*b1cdbd2cSJim Jagielski }
731*b1cdbd2cSJim Jagielski }
732*b1cdbd2cSJim Jagielski else
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski pEntry = InsertEntry( aText, pParent );
735*b1cdbd2cSJim Jagielski }
736*b1cdbd2cSJim Jagielski
737*b1cdbd2cSJim Jagielski if( pEntry )
738*b1cdbd2cSJim Jagielski {
739*b1cdbd2cSJim Jagielski pEntry->SetUserData( (void*)pAtom );
740*b1cdbd2cSJim Jagielski
741*b1cdbd2cSJim Jagielski if( pAtom->isContainer() )
742*b1cdbd2cSJim Jagielski {
743*b1cdbd2cSJim Jagielski SvLBoxContextBmp* pBoxBmp = dynamic_cast< SvLBoxContextBmp* >( pEntry->GetItem( pEntry->ItemCount() - 2 ) );
744*b1cdbd2cSJim Jagielski if( pBoxBmp )
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski pBoxBmp->SetBitmap1( pEntry, maImgFolder );
747*b1cdbd2cSJim Jagielski pBoxBmp->SetBitmap2( pEntry, maImgFolder );
748*b1cdbd2cSJim Jagielski }
749*b1cdbd2cSJim Jagielski }
750*b1cdbd2cSJim Jagielski
751*b1cdbd2cSJim Jagielski /*
752*b1cdbd2cSJim Jagielski pEntry->ReplaceItem(
753*b1cdbd2cSJim Jagielski new AtomBoxString( pEntry, aText, pImage ),
754*b1cdbd2cSJim Jagielski pEntry->ItemCount() - 1 );
755*b1cdbd2cSJim Jagielski */
756*b1cdbd2cSJim Jagielski }
757*b1cdbd2cSJim Jagielski }
758*b1cdbd2cSJim Jagielski }
759*b1cdbd2cSJim Jagielski
760*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
761*b1cdbd2cSJim Jagielski
762*b1cdbd2cSJim Jagielski extern void load_config( const OUString& rPath );
763*b1cdbd2cSJim Jagielski
764*b1cdbd2cSJim Jagielski class PPTDocument
765*b1cdbd2cSJim Jagielski {
766*b1cdbd2cSJim Jagielski public:
767*b1cdbd2cSJim Jagielski PPTDocument( const rtl::OUString& rFilePath );
768*b1cdbd2cSJim Jagielski ~PPTDocument();
769*b1cdbd2cSJim Jagielski
770*b1cdbd2cSJim Jagielski Atom* getRootAtom() const;
771*b1cdbd2cSJim Jagielski
772*b1cdbd2cSJim Jagielski private:
773*b1cdbd2cSJim Jagielski void Load( const rtl::OUString& rFilePath );
774*b1cdbd2cSJim Jagielski
775*b1cdbd2cSJim Jagielski Atom* mpAtom;
776*b1cdbd2cSJim Jagielski SvStream* mpDocStream;
777*b1cdbd2cSJim Jagielski SotStorageRef maStorage;
778*b1cdbd2cSJim Jagielski };
779*b1cdbd2cSJim Jagielski
780*b1cdbd2cSJim Jagielski typedef boost::shared_ptr< PPTDocument > PPTDocumentPtr;
781*b1cdbd2cSJim Jagielski
PPTDocument(const rtl::OUString & rFilePath)782*b1cdbd2cSJim Jagielski PPTDocument::PPTDocument(const rtl::OUString& rFilePath)
783*b1cdbd2cSJim Jagielski : mpAtom(0), mpDocStream(0)
784*b1cdbd2cSJim Jagielski {
785*b1cdbd2cSJim Jagielski Load( rFilePath );
786*b1cdbd2cSJim Jagielski }
787*b1cdbd2cSJim Jagielski
~PPTDocument()788*b1cdbd2cSJim Jagielski PPTDocument::~PPTDocument()
789*b1cdbd2cSJim Jagielski {
790*b1cdbd2cSJim Jagielski delete mpAtom;
791*b1cdbd2cSJim Jagielski delete mpDocStream;
792*b1cdbd2cSJim Jagielski }
793*b1cdbd2cSJim Jagielski
Load(const rtl::OUString & rFilePath)794*b1cdbd2cSJim Jagielski void PPTDocument::Load( const rtl::OUString& rFilePath )
795*b1cdbd2cSJim Jagielski {
796*b1cdbd2cSJim Jagielski maStorage = new SotStorage( rFilePath, STREAM_STD_READ );
797*b1cdbd2cSJim Jagielski if( !maStorage->GetError() )
798*b1cdbd2cSJim Jagielski {
799*b1cdbd2cSJim Jagielski mpDocStream = maStorage->OpenSotStream( String( RTL_CONSTASCII_USTRINGPARAM("PowerPoint Document") ), STREAM_STD_READ );
800*b1cdbd2cSJim Jagielski if( mpDocStream )
801*b1cdbd2cSJim Jagielski {
802*b1cdbd2cSJim Jagielski DffRecordHeader aRecordHeader;
803*b1cdbd2cSJim Jagielski *mpDocStream >> aRecordHeader;
804*b1cdbd2cSJim Jagielski
805*b1cdbd2cSJim Jagielski mpAtom = Atom::import( 65530, *mpDocStream );
806*b1cdbd2cSJim Jagielski }
807*b1cdbd2cSJim Jagielski }
808*b1cdbd2cSJim Jagielski }
809*b1cdbd2cSJim Jagielski
getRootAtom() const810*b1cdbd2cSJim Jagielski Atom* PPTDocument::getRootAtom() const
811*b1cdbd2cSJim Jagielski {
812*b1cdbd2cSJim Jagielski return mpAtom;
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski
815*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////
816*b1cdbd2cSJim Jagielski
817*b1cdbd2cSJim Jagielski class MSViewerWorkWindow : public WorkWindow
818*b1cdbd2cSJim Jagielski {
819*b1cdbd2cSJim Jagielski public:
820*b1cdbd2cSJim Jagielski MSViewerWorkWindow();
821*b1cdbd2cSJim Jagielski ~MSViewerWorkWindow();
822*b1cdbd2cSJim Jagielski
823*b1cdbd2cSJim Jagielski PPTDocumentPtr Load();
824*b1cdbd2cSJim Jagielski void onView();
825*b1cdbd2cSJim Jagielski void onCompare();
826*b1cdbd2cSJim Jagielski void onClose();
827*b1cdbd2cSJim Jagielski
828*b1cdbd2cSJim Jagielski void View( const PPTDocumentPtr& pDocument, int nPane );
829*b1cdbd2cSJim Jagielski void Compare( const PPTDocumentPtr& pDocument1, const PPTDocumentPtr& pDocument2 );
830*b1cdbd2cSJim Jagielski
831*b1cdbd2cSJim Jagielski virtual void Resize();
832*b1cdbd2cSJim Jagielski
833*b1cdbd2cSJim Jagielski private:
834*b1cdbd2cSJim Jagielski void Sync( AtomContainerEntryPair* pPair, int nAction );
835*b1cdbd2cSJim Jagielski
836*b1cdbd2cSJim Jagielski AtomContainerTreeListBox* mpListBox[2];
837*b1cdbd2cSJim Jagielski MultiLineEdit* mpEdit[2];
838*b1cdbd2cSJim Jagielski PPTDocumentPtr mpDocument[2];
839*b1cdbd2cSJim Jagielski MenuBar* mpMenuBar;
840*b1cdbd2cSJim Jagielski PopupMenu* mpFileMenu;
841*b1cdbd2cSJim Jagielski bool mbSelectHdlGuard;
842*b1cdbd2cSJim Jagielski DECL_LINK( implSelectHdl, AtomContainerTreeListBox* );
843*b1cdbd2cSJim Jagielski DECL_LINK( implExpandingHdl, AtomContainerEntryPair* );
844*b1cdbd2cSJim Jagielski DECL_LINK( implCollapsingHdl, AtomContainerEntryPair* );
845*b1cdbd2cSJim Jagielski DECL_LINK( implMenuHdl, Menu* );
846*b1cdbd2cSJim Jagielski };
847*b1cdbd2cSJim Jagielski
848*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
849*b1cdbd2cSJim Jagielski
onView()850*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::onView()
851*b1cdbd2cSJim Jagielski {
852*b1cdbd2cSJim Jagielski PPTDocumentPtr pDocument( Load() );
853*b1cdbd2cSJim Jagielski if( pDocument.get() )
854*b1cdbd2cSJim Jagielski {
855*b1cdbd2cSJim Jagielski onClose();
856*b1cdbd2cSJim Jagielski View( pDocument, 0 );
857*b1cdbd2cSJim Jagielski }
858*b1cdbd2cSJim Jagielski }
859*b1cdbd2cSJim Jagielski
onClose()860*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::onClose()
861*b1cdbd2cSJim Jagielski {
862*b1cdbd2cSJim Jagielski }
863*b1cdbd2cSJim Jagielski
onCompare()864*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::onCompare()
865*b1cdbd2cSJim Jagielski {
866*b1cdbd2cSJim Jagielski PPTDocumentPtr pDocument1( Load() );
867*b1cdbd2cSJim Jagielski if( pDocument1.get() )
868*b1cdbd2cSJim Jagielski {
869*b1cdbd2cSJim Jagielski PPTDocumentPtr pDocument2( Load() );
870*b1cdbd2cSJim Jagielski if( pDocument2.get() )
871*b1cdbd2cSJim Jagielski {
872*b1cdbd2cSJim Jagielski onClose();
873*b1cdbd2cSJim Jagielski Compare( pDocument1, pDocument2 );
874*b1cdbd2cSJim Jagielski }
875*b1cdbd2cSJim Jagielski }
876*b1cdbd2cSJim Jagielski }
877*b1cdbd2cSJim Jagielski
Compare(const PPTDocumentPtr & pDocument1,const PPTDocumentPtr & pDocument2)878*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::Compare( const PPTDocumentPtr& pDocument1, const PPTDocumentPtr& pDocument2 )
879*b1cdbd2cSJim Jagielski {
880*b1cdbd2cSJim Jagielski if( pDocument1.get() && pDocument2.get() )
881*b1cdbd2cSJim Jagielski {
882*b1cdbd2cSJim Jagielski Atom* pAtom1 = pDocument1->getRootAtom();
883*b1cdbd2cSJim Jagielski Atom* pAtom2 = pDocument2->getRootAtom();
884*b1cdbd2cSJim Jagielski pAtom1->setCompareAtom( pAtom2 );
885*b1cdbd2cSJim Jagielski pAtom2->setCompareAtom( pAtom1 );
886*b1cdbd2cSJim Jagielski }
887*b1cdbd2cSJim Jagielski
888*b1cdbd2cSJim Jagielski View( pDocument1, 0 );
889*b1cdbd2cSJim Jagielski View( pDocument2, 1 );
890*b1cdbd2cSJim Jagielski }
891*b1cdbd2cSJim Jagielski
View(const PPTDocumentPtr & pDocument,int nPane)892*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::View( const PPTDocumentPtr& pDocument, int nPane )
893*b1cdbd2cSJim Jagielski {
894*b1cdbd2cSJim Jagielski if( ((nPane != 0) && (nPane != 1)) || (pDocument.get() == 0) )
895*b1cdbd2cSJim Jagielski return;
896*b1cdbd2cSJim Jagielski
897*b1cdbd2cSJim Jagielski mpDocument[nPane] = pDocument;
898*b1cdbd2cSJim Jagielski
899*b1cdbd2cSJim Jagielski mpListBox[nPane]->SetRootAtom( pDocument->getRootAtom() );
900*b1cdbd2cSJim Jagielski mpListBox[nPane]->Expand( mpListBox[nPane]->GetEntry(0) );
901*b1cdbd2cSJim Jagielski mpListBox[nPane]->Show();
902*b1cdbd2cSJim Jagielski mpEdit[nPane]->Show();
903*b1cdbd2cSJim Jagielski Resize();
904*b1cdbd2cSJim Jagielski }
905*b1cdbd2cSJim Jagielski
906*b1cdbd2cSJim Jagielski
Load()907*b1cdbd2cSJim Jagielski PPTDocumentPtr MSViewerWorkWindow::Load()
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski ::sfx2::FileDialogHelper aDlg( ::sfx2::FILEOPEN_SIMPLE, 0 );
910*b1cdbd2cSJim Jagielski String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.ppt" ) );
911*b1cdbd2cSJim Jagielski aDlg.AddFilter( aStrFilterType, aStrFilterType );
912*b1cdbd2cSJim Jagielski // INetURLObject aFile( SvtPathOptions().GetPalettePath() );
913*b1cdbd2cSJim Jagielski // aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
914*b1cdbd2cSJim Jagielski
915*b1cdbd2cSJim Jagielski PPTDocumentPtr pDocument;
916*b1cdbd2cSJim Jagielski if ( aDlg.Execute() == ERRCODE_NONE )
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski pDocument.reset( new PPTDocument( aDlg.GetPath() ) );
919*b1cdbd2cSJim Jagielski }
920*b1cdbd2cSJim Jagielski
921*b1cdbd2cSJim Jagielski return pDocument;
922*b1cdbd2cSJim Jagielski }
923*b1cdbd2cSJim Jagielski
924*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
925*b1cdbd2cSJim Jagielski
MSViewerWorkWindow()926*b1cdbd2cSJim Jagielski MSViewerWorkWindow::MSViewerWorkWindow() :
927*b1cdbd2cSJim Jagielski WorkWindow( 0, WB_APP | WB_STDWORK | WB_3DLOOK ),mbSelectHdlGuard(false)
928*b1cdbd2cSJim Jagielski {
929*b1cdbd2cSJim Jagielski Size aOutputSize( 400, 600 );
930*b1cdbd2cSJim Jagielski SetOutputSizePixel( aOutputSize );
931*b1cdbd2cSJim Jagielski SetText( String( RTL_CONSTASCII_USTRINGPARAM( "MSViewer" ) ) );
932*b1cdbd2cSJim Jagielski
933*b1cdbd2cSJim Jagielski Size aOutSize( GetOutputSizePixel() );
934*b1cdbd2cSJim Jagielski
935*b1cdbd2cSJim Jagielski Font aFont( String( RTL_CONSTASCII_USTRINGPARAM( "Courier" ) ), GetFont().GetSize() );
936*b1cdbd2cSJim Jagielski
937*b1cdbd2cSJim Jagielski mpMenuBar = new MenuBar();
938*b1cdbd2cSJim Jagielski mpMenuBar->InsertItem( 1, String( RTL_CONSTASCII_USTRINGPARAM("~File" ) ) );
939*b1cdbd2cSJim Jagielski mpFileMenu = new PopupMenu();
940*b1cdbd2cSJim Jagielski mpFileMenu->InsertItem( 2, String( RTL_CONSTASCII_USTRINGPARAM("~View" ) ) );
941*b1cdbd2cSJim Jagielski mpFileMenu->InsertItem( 3, String( RTL_CONSTASCII_USTRINGPARAM("~Compare" ) ) );
942*b1cdbd2cSJim Jagielski mpFileMenu->InsertSeparator();
943*b1cdbd2cSJim Jagielski mpFileMenu->InsertItem( 4, String( RTL_CONSTASCII_USTRINGPARAM("~Quit" ) ) );
944*b1cdbd2cSJim Jagielski mpFileMenu->SetSelectHdl( LINK( this, MSViewerWorkWindow, implMenuHdl ) );
945*b1cdbd2cSJim Jagielski
946*b1cdbd2cSJim Jagielski mpMenuBar->SetPopupMenu( 1, mpFileMenu );
947*b1cdbd2cSJim Jagielski SetMenuBar( mpMenuBar );
948*b1cdbd2cSJim Jagielski int nPane;
949*b1cdbd2cSJim Jagielski for( nPane = 0; nPane < 2; nPane++ )
950*b1cdbd2cSJim Jagielski {
951*b1cdbd2cSJim Jagielski mpListBox[nPane] = new AtomContainerTreeListBox( this );
952*b1cdbd2cSJim Jagielski mpListBox[nPane]->SetSelectHdl( LINK( this, MSViewerWorkWindow, implSelectHdl ) );
953*b1cdbd2cSJim Jagielski mpListBox[nPane]->SetExpandingHdl( LINK( this, MSViewerWorkWindow, implExpandingHdl ) );
954*b1cdbd2cSJim Jagielski mpListBox[nPane]->SetCollapsingHdl( LINK( this, MSViewerWorkWindow, implCollapsingHdl ) );
955*b1cdbd2cSJim Jagielski
956*b1cdbd2cSJim Jagielski mpEdit[nPane] = new MultiLineEdit(this, WB_3DLOOK | WB_BORDER | WB_LEFT | WB_TOP | WB_READONLY | WB_HSCROLL | WB_VSCROLL );
957*b1cdbd2cSJim Jagielski mpEdit[nPane]->SetReadOnly( TRUE );
958*b1cdbd2cSJim Jagielski mpEdit[nPane]->SetReadOnly( TRUE );
959*b1cdbd2cSJim Jagielski mpEdit[nPane]->SetControlFont( aFont );
960*b1cdbd2cSJim Jagielski }
961*b1cdbd2cSJim Jagielski }
962*b1cdbd2cSJim Jagielski
963*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
964*b1cdbd2cSJim Jagielski
GetAtomText(const Atom * pAtom)965*b1cdbd2cSJim Jagielski static String GetAtomText( const Atom* pAtom )
966*b1cdbd2cSJim Jagielski {
967*b1cdbd2cSJim Jagielski String aText;
968*b1cdbd2cSJim Jagielski if( pAtom )
969*b1cdbd2cSJim Jagielski {
970*b1cdbd2cSJim Jagielski const DffRecordHeader& rHeader = pAtom->getHeader();
971*b1cdbd2cSJim Jagielski char buffer[512];
972*b1cdbd2cSJim Jagielski sprintf( buffer, "Version = %lu\n\rInstance = %lu\n\rVersionInstance = %lu\n\rLength = %lu\n\r",
973*b1cdbd2cSJim Jagielski (UINT32)rHeader.nRecVer,
974*b1cdbd2cSJim Jagielski (UINT32)rHeader.nRecInstance,
975*b1cdbd2cSJim Jagielski (UINT32)rHeader.nImpVerInst,
976*b1cdbd2cSJim Jagielski (UINT32)rHeader.nRecLen );
977*b1cdbd2cSJim Jagielski aText = rtl::OUString::createFromAscii( buffer );
978*b1cdbd2cSJim Jagielski if( pAtom->isContainer() )
979*b1cdbd2cSJim Jagielski {
980*b1cdbd2cSJim Jagielski
981*b1cdbd2cSJim Jagielski }
982*b1cdbd2cSJim Jagielski else
983*b1cdbd2cSJim Jagielski {
984*b1cdbd2cSJim Jagielski pAtom->seekToContent();
985*b1cdbd2cSJim Jagielski AtomConfig* pAtomConfig = dynamic_cast< AtomConfig* >( gAtomConfigMap[pAtom->getType()].get() );
986*b1cdbd2cSJim Jagielski if( pAtomConfig )
987*b1cdbd2cSJim Jagielski {
988*b1cdbd2cSJim Jagielski sal_Size nLength = pAtom->getLength();
989*b1cdbd2cSJim Jagielski aText += String( pAtomConfig->format( pAtom->getStream(), nLength ) );
990*b1cdbd2cSJim Jagielski }
991*b1cdbd2cSJim Jagielski else
992*b1cdbd2cSJim Jagielski {
993*b1cdbd2cSJim Jagielski sal_Size nLength = pAtom->getLength();
994*b1cdbd2cSJim Jagielski aText += String( ElementConfig::dump_hex( pAtom->getStream(), nLength ) );
995*b1cdbd2cSJim Jagielski }
996*b1cdbd2cSJim Jagielski }
997*b1cdbd2cSJim Jagielski }
998*b1cdbd2cSJim Jagielski
999*b1cdbd2cSJim Jagielski return aText;
1000*b1cdbd2cSJim Jagielski }
1001*b1cdbd2cSJim Jagielski
IMPL_LINK(MSViewerWorkWindow,implSelectHdl,AtomContainerTreeListBox *,pListBox)1002*b1cdbd2cSJim Jagielski IMPL_LINK(MSViewerWorkWindow,implSelectHdl, AtomContainerTreeListBox*, pListBox )
1003*b1cdbd2cSJim Jagielski {
1004*b1cdbd2cSJim Jagielski int nPane = (pListBox == mpListBox[1]) ? 1 : 0;
1005*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = mpListBox[nPane]->FirstSelected();
1006*b1cdbd2cSJim Jagielski if( pEntry && pEntry->GetUserData() )
1007*b1cdbd2cSJim Jagielski {
1008*b1cdbd2cSJim Jagielski Atom* pAtom = static_cast<Atom*>( pEntry->GetUserData() );
1009*b1cdbd2cSJim Jagielski mpEdit[nPane]->SetText( GetAtomText( pAtom ) );
1010*b1cdbd2cSJim Jagielski
1011*b1cdbd2cSJim Jagielski if(!mbSelectHdlGuard)
1012*b1cdbd2cSJim Jagielski {
1013*b1cdbd2cSJim Jagielski mbSelectHdlGuard = true;
1014*b1cdbd2cSJim Jagielski // select other
1015*b1cdbd2cSJim Jagielski AtomContainerEntryPair aPair( pListBox, pEntry );
1016*b1cdbd2cSJim Jagielski Sync( &aPair, 2 );
1017*b1cdbd2cSJim Jagielski mbSelectHdlGuard = false;
1018*b1cdbd2cSJim Jagielski }
1019*b1cdbd2cSJim Jagielski }
1020*b1cdbd2cSJim Jagielski return 0;
1021*b1cdbd2cSJim Jagielski }
1022*b1cdbd2cSJim Jagielski
Sync(AtomContainerEntryPair * pPair,int nAction)1023*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::Sync( AtomContainerEntryPair* pPair, int nAction )
1024*b1cdbd2cSJim Jagielski {
1025*b1cdbd2cSJim Jagielski if( mpDocument[0].get() && mpDocument[1].get() && pPair->first && pPair->second )
1026*b1cdbd2cSJim Jagielski {
1027*b1cdbd2cSJim Jagielski AtomContainerTreeListBox* pDestinationListBox = (pPair->first == mpListBox[0]) ? mpListBox[1] : mpListBox[0];
1028*b1cdbd2cSJim Jagielski
1029*b1cdbd2cSJim Jagielski Atom* pAtom = static_cast<Atom*>(pPair->second->GetUserData());
1030*b1cdbd2cSJim Jagielski if( pAtom && pAtom->getCompareAtom() )
1031*b1cdbd2cSJim Jagielski {
1032*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pDestinationListBox->findAtom( pAtom->getCompareAtom() );
1033*b1cdbd2cSJim Jagielski
1034*b1cdbd2cSJim Jagielski if(pEntry )
1035*b1cdbd2cSJim Jagielski {
1036*b1cdbd2cSJim Jagielski if( nAction == 0 )
1037*b1cdbd2cSJim Jagielski {
1038*b1cdbd2cSJim Jagielski pDestinationListBox->Expand( pEntry );
1039*b1cdbd2cSJim Jagielski }
1040*b1cdbd2cSJim Jagielski else if( nAction == 1 )
1041*b1cdbd2cSJim Jagielski {
1042*b1cdbd2cSJim Jagielski pDestinationListBox->Collapse( pEntry );
1043*b1cdbd2cSJim Jagielski }
1044*b1cdbd2cSJim Jagielski else
1045*b1cdbd2cSJim Jagielski {
1046*b1cdbd2cSJim Jagielski pDestinationListBox->Select( pEntry );
1047*b1cdbd2cSJim Jagielski }
1048*b1cdbd2cSJim Jagielski }
1049*b1cdbd2cSJim Jagielski }
1050*b1cdbd2cSJim Jagielski }
1051*b1cdbd2cSJim Jagielski }
1052*b1cdbd2cSJim Jagielski
IMPL_LINK(MSViewerWorkWindow,implExpandingHdl,AtomContainerEntryPair *,pPair)1053*b1cdbd2cSJim Jagielski IMPL_LINK(MSViewerWorkWindow, implExpandingHdl, AtomContainerEntryPair*, pPair )
1054*b1cdbd2cSJim Jagielski {
1055*b1cdbd2cSJim Jagielski SvLBoxEntry* pEntry = pPair->second;
1056*b1cdbd2cSJim Jagielski if( pEntry && pEntry->GetUserData() )
1057*b1cdbd2cSJim Jagielski {
1058*b1cdbd2cSJim Jagielski Atom* pAtom = static_cast<Atom*>( pEntry->GetUserData() );
1059*b1cdbd2cSJim Jagielski pAtom->compare( pAtom->getCompareAtom() );
1060*b1cdbd2cSJim Jagielski }
1061*b1cdbd2cSJim Jagielski
1062*b1cdbd2cSJim Jagielski Sync( pPair, 0 );
1063*b1cdbd2cSJim Jagielski
1064*b1cdbd2cSJim Jagielski return 0;
1065*b1cdbd2cSJim Jagielski }
1066*b1cdbd2cSJim Jagielski
IMPL_LINK(MSViewerWorkWindow,implCollapsingHdl,AtomContainerEntryPair *,pPair)1067*b1cdbd2cSJim Jagielski IMPL_LINK(MSViewerWorkWindow, implCollapsingHdl, AtomContainerEntryPair*, pPair )
1068*b1cdbd2cSJim Jagielski {
1069*b1cdbd2cSJim Jagielski Sync( pPair, 1 );
1070*b1cdbd2cSJim Jagielski
1071*b1cdbd2cSJim Jagielski return 0;
1072*b1cdbd2cSJim Jagielski }
1073*b1cdbd2cSJim Jagielski
IMPL_LINK(MSViewerWorkWindow,implMenuHdl,Menu *,pMenu)1074*b1cdbd2cSJim Jagielski IMPL_LINK( MSViewerWorkWindow, implMenuHdl, Menu*, pMenu )
1075*b1cdbd2cSJim Jagielski {
1076*b1cdbd2cSJim Jagielski if( pMenu )
1077*b1cdbd2cSJim Jagielski {
1078*b1cdbd2cSJim Jagielski USHORT nId = pMenu->GetCurItemId();
1079*b1cdbd2cSJim Jagielski switch( nId )
1080*b1cdbd2cSJim Jagielski {
1081*b1cdbd2cSJim Jagielski case 2: onView(); break;
1082*b1cdbd2cSJim Jagielski case 3: onCompare(); break;
1083*b1cdbd2cSJim Jagielski case 4: Application::Quit(); break;
1084*b1cdbd2cSJim Jagielski }
1085*b1cdbd2cSJim Jagielski }
1086*b1cdbd2cSJim Jagielski return 0;
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski
1089*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1090*b1cdbd2cSJim Jagielski
~MSViewerWorkWindow()1091*b1cdbd2cSJim Jagielski MSViewerWorkWindow::~MSViewerWorkWindow()
1092*b1cdbd2cSJim Jagielski {
1093*b1cdbd2cSJim Jagielski int nPane;
1094*b1cdbd2cSJim Jagielski for( nPane = 0; nPane < 2; nPane++ )
1095*b1cdbd2cSJim Jagielski {
1096*b1cdbd2cSJim Jagielski delete mpListBox[nPane];
1097*b1cdbd2cSJim Jagielski delete mpEdit[nPane];
1098*b1cdbd2cSJim Jagielski }
1099*b1cdbd2cSJim Jagielski
1100*b1cdbd2cSJim Jagielski delete mpFileMenu;
1101*b1cdbd2cSJim Jagielski delete mpMenuBar;
1102*b1cdbd2cSJim Jagielski }
1103*b1cdbd2cSJim Jagielski
1104*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1105*b1cdbd2cSJim Jagielski
Resize()1106*b1cdbd2cSJim Jagielski void MSViewerWorkWindow::Resize()
1107*b1cdbd2cSJim Jagielski {
1108*b1cdbd2cSJim Jagielski int nPaneCount = ((mpDocument[0].get() != 0) ? 1 : 0) + ((mpDocument[1].get() != 0) ? 1 : 0);
1109*b1cdbd2cSJim Jagielski
1110*b1cdbd2cSJim Jagielski Size aOutputSize( GetOutputSizePixel() );
1111*b1cdbd2cSJim Jagielski int nHeight = aOutputSize.Height() >> 1;
1112*b1cdbd2cSJim Jagielski if( nPaneCount )
1113*b1cdbd2cSJim Jagielski {
1114*b1cdbd2cSJim Jagielski int nWidth = aOutputSize.Width();
1115*b1cdbd2cSJim Jagielski if( nPaneCount == 2 )
1116*b1cdbd2cSJim Jagielski nWidth >>= 1;
1117*b1cdbd2cSJim Jagielski
1118*b1cdbd2cSJim Jagielski int nPosX = 0;
1119*b1cdbd2cSJim Jagielski
1120*b1cdbd2cSJim Jagielski int nPane;
1121*b1cdbd2cSJim Jagielski for( nPane = 0; nPane < 2; nPane++ )
1122*b1cdbd2cSJim Jagielski {
1123*b1cdbd2cSJim Jagielski mpListBox[nPane]->SetPosSizePixel( nPosX,0, nWidth, nHeight );
1124*b1cdbd2cSJim Jagielski mpEdit[nPane]->SetPosSizePixel( nPosX, nHeight, nWidth, aOutputSize.Height() - nHeight );
1125*b1cdbd2cSJim Jagielski nPosX += nWidth;
1126*b1cdbd2cSJim Jagielski }
1127*b1cdbd2cSJim Jagielski }
1128*b1cdbd2cSJim Jagielski }
1129*b1cdbd2cSJim Jagielski
1130*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1131*b1cdbd2cSJim Jagielski
1132*b1cdbd2cSJim Jagielski // -----------------------------------------------------------------------
1133*b1cdbd2cSJim Jagielski
SAL_IMPLEMENT_MAIN()1134*b1cdbd2cSJim Jagielski SAL_IMPLEMENT_MAIN()
1135*b1cdbd2cSJim Jagielski {
1136*b1cdbd2cSJim Jagielski if( argc > 3 )
1137*b1cdbd2cSJim Jagielski return 0;
1138*b1cdbd2cSJim Jagielski
1139*b1cdbd2cSJim Jagielski uno::Reference< lang::XMultiServiceFactory > xMSF;
1140*b1cdbd2cSJim Jagielski try
1141*b1cdbd2cSJim Jagielski {
1142*b1cdbd2cSJim Jagielski uno::Reference< uno::XComponentContext > xCtx( cppu::defaultBootstrap_InitialComponentContext() );
1143*b1cdbd2cSJim Jagielski if ( !xCtx.is() )
1144*b1cdbd2cSJim Jagielski {
1145*b1cdbd2cSJim Jagielski DBG_ERROR( "Error creating initial component context!" );
1146*b1cdbd2cSJim Jagielski return -1;
1147*b1cdbd2cSJim Jagielski }
1148*b1cdbd2cSJim Jagielski
1149*b1cdbd2cSJim Jagielski xMSF = uno::Reference< lang::XMultiServiceFactory >(xCtx->getServiceManager(), uno::UNO_QUERY );
1150*b1cdbd2cSJim Jagielski
1151*b1cdbd2cSJim Jagielski if ( !xMSF.is() )
1152*b1cdbd2cSJim Jagielski {
1153*b1cdbd2cSJim Jagielski DBG_ERROR( "No service manager!" );
1154*b1cdbd2cSJim Jagielski return -1;
1155*b1cdbd2cSJim Jagielski }
1156*b1cdbd2cSJim Jagielski
1157*b1cdbd2cSJim Jagielski // Init UCB
1158*b1cdbd2cSJim Jagielski uno::Sequence< uno::Any > aArgs( 2 );
1159*b1cdbd2cSJim Jagielski aArgs[ 0 ] <<= rtl::OUString::createFromAscii( UCB_CONFIGURATION_KEY1_LOCAL );
1160*b1cdbd2cSJim Jagielski aArgs[ 1 ] <<= rtl::OUString::createFromAscii( UCB_CONFIGURATION_KEY2_OFFICE );
1161*b1cdbd2cSJim Jagielski sal_Bool bSuccess = ::ucb::ContentBroker::initialize( xMSF, aArgs );
1162*b1cdbd2cSJim Jagielski if ( !bSuccess )
1163*b1cdbd2cSJim Jagielski {
1164*b1cdbd2cSJim Jagielski DBG_ERROR( "Error creating UCB!" );
1165*b1cdbd2cSJim Jagielski return -1;
1166*b1cdbd2cSJim Jagielski }
1167*b1cdbd2cSJim Jagielski
1168*b1cdbd2cSJim Jagielski }
1169*b1cdbd2cSJim Jagielski catch ( uno::Exception const & )
1170*b1cdbd2cSJim Jagielski {
1171*b1cdbd2cSJim Jagielski DBG_ERROR( "Exception during creation of initial component context!" );
1172*b1cdbd2cSJim Jagielski return -1;
1173*b1cdbd2cSJim Jagielski }
1174*b1cdbd2cSJim Jagielski comphelper::setProcessServiceFactory( xMSF );
1175*b1cdbd2cSJim Jagielski
1176*b1cdbd2cSJim Jagielski InitVCL( xMSF );
1177*b1cdbd2cSJim Jagielski
1178*b1cdbd2cSJim Jagielski String aConfigURL;
1179*b1cdbd2cSJim Jagielski if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( Application::GetAppFileName(), aConfigURL ) )
1180*b1cdbd2cSJim Jagielski {
1181*b1cdbd2cSJim Jagielski INetURLObject aURL( aConfigURL );
1182*b1cdbd2cSJim Jagielski
1183*b1cdbd2cSJim Jagielski aURL.removeSegment();
1184*b1cdbd2cSJim Jagielski aURL.removeFinalSlash();
1185*b1cdbd2cSJim Jagielski aURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( "msview.xml" ) ) );
1186*b1cdbd2cSJim Jagielski
1187*b1cdbd2cSJim Jagielski load_config( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
1188*b1cdbd2cSJim Jagielski }
1189*b1cdbd2cSJim Jagielski
1190*b1cdbd2cSJim Jagielski {
1191*b1cdbd2cSJim Jagielski MSViewerWorkWindow aMainWindow;
1192*b1cdbd2cSJim Jagielski
1193*b1cdbd2cSJim Jagielski if( argc >= 2 )
1194*b1cdbd2cSJim Jagielski {
1195*b1cdbd2cSJim Jagielski const rtl::OUString aFile1( rtl::OUString::createFromAscii(argv[1]) );
1196*b1cdbd2cSJim Jagielski PPTDocumentPtr pDocument1( new PPTDocument( aFile1 ) );
1197*b1cdbd2cSJim Jagielski
1198*b1cdbd2cSJim Jagielski if( argc == 3 )
1199*b1cdbd2cSJim Jagielski {
1200*b1cdbd2cSJim Jagielski const rtl::OUString aFile2( rtl::OUString::createFromAscii(argv[2]) );
1201*b1cdbd2cSJim Jagielski
1202*b1cdbd2cSJim Jagielski PPTDocumentPtr pDocument2;
1203*b1cdbd2cSJim Jagielski pDocument2.reset( new PPTDocument( aFile2 ) );
1204*b1cdbd2cSJim Jagielski aMainWindow.Compare( pDocument1, pDocument2 );
1205*b1cdbd2cSJim Jagielski }
1206*b1cdbd2cSJim Jagielski else
1207*b1cdbd2cSJim Jagielski {
1208*b1cdbd2cSJim Jagielski aMainWindow.View( pDocument1, 0 );
1209*b1cdbd2cSJim Jagielski }
1210*b1cdbd2cSJim Jagielski }
1211*b1cdbd2cSJim Jagielski
1212*b1cdbd2cSJim Jagielski aMainWindow.Show();
1213*b1cdbd2cSJim Jagielski
1214*b1cdbd2cSJim Jagielski Application::Execute();
1215*b1cdbd2cSJim Jagielski }
1216*b1cdbd2cSJim Jagielski
1217*b1cdbd2cSJim Jagielski DeInitVCL();
1218*b1cdbd2cSJim Jagielski
1219*b1cdbd2cSJim Jagielski return 0;
1220*b1cdbd2cSJim Jagielski }
1221