xref: /aoo4110/main/svx/workben/msview/msview.cxx (revision b1cdbd2c)
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