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 #ifndef _PREVIEWCTRL_HXX_
25*b1cdbd2cSJim Jagielski #define _PREVIEWCTRL_HXX_
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
28*b1cdbd2cSJim Jagielski // includes
29*b1cdbd2cSJim Jagielski //------------------------------------------------------------------------
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <sal/types.h>
32*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include <comdef.h>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <memory>
37*b1cdbd2cSJim Jagielski 
38*b1cdbd2cSJim Jagielski //---------------------------------------------
39*b1cdbd2cSJim Jagielski // declaration
40*b1cdbd2cSJim Jagielski //---------------------------------------------
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski class CDimension
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski public:
CDimension()45*b1cdbd2cSJim Jagielski     CDimension( ) :
46*b1cdbd2cSJim Jagielski         m_cx( 0 ),
47*b1cdbd2cSJim Jagielski         m_cy( 0 )
48*b1cdbd2cSJim Jagielski 	{
49*b1cdbd2cSJim Jagielski 	}
50*b1cdbd2cSJim Jagielski 
CDimension(sal_Int32 cx,sal_Int32 cy)51*b1cdbd2cSJim Jagielski     CDimension( sal_Int32 cx, sal_Int32 cy ) :
52*b1cdbd2cSJim Jagielski         m_cx( cx ),
53*b1cdbd2cSJim Jagielski         m_cy( cy )
54*b1cdbd2cSJim Jagielski 	{
55*b1cdbd2cSJim Jagielski 	}
56*b1cdbd2cSJim Jagielski 
57*b1cdbd2cSJim Jagielski 	sal_Int32 m_cx;
58*b1cdbd2cSJim Jagielski 	sal_Int32 m_cy;
59*b1cdbd2cSJim Jagielski };
60*b1cdbd2cSJim Jagielski 
61*b1cdbd2cSJim Jagielski //--------------------------------------------------
62*b1cdbd2cSJim Jagielski // we use OleInitialize here because we are calling
63*b1cdbd2cSJim Jagielski // some Ole functions to realize the picture preview
64*b1cdbd2cSJim Jagielski // and we expect to be called from the main thread
65*b1cdbd2cSJim Jagielski // so that there will be no problem calling
66*b1cdbd2cSJim Jagielski // OleInitialize (the main thread should be an STA)
67*b1cdbd2cSJim Jagielski // When OleInitialize should fail at worst the
68*b1cdbd2cSJim Jagielski // preview doesn't work
69*b1cdbd2cSJim Jagielski //--------------------------------------------------
70*b1cdbd2cSJim Jagielski 
71*b1cdbd2cSJim Jagielski class CAutoOleInit
72*b1cdbd2cSJim Jagielski {
73*b1cdbd2cSJim Jagielski public:
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski     // used to communicate ole
76*b1cdbd2cSJim Jagielski     // initialzation failures
77*b1cdbd2cSJim Jagielski     class COleInitException { };
78*b1cdbd2cSJim Jagielski 
CAutoOleInit()79*b1cdbd2cSJim Jagielski     CAutoOleInit( )
80*b1cdbd2cSJim Jagielski     {
81*b1cdbd2cSJim Jagielski         HRESULT hr = OleInitialize( NULL );
82*b1cdbd2cSJim Jagielski         if ( FAILED( hr ) )
83*b1cdbd2cSJim Jagielski             throw COleInitException( );
84*b1cdbd2cSJim Jagielski     }
85*b1cdbd2cSJim Jagielski 
~CAutoOleInit()86*b1cdbd2cSJim Jagielski     ~CAutoOleInit( )
87*b1cdbd2cSJim Jagielski     {
88*b1cdbd2cSJim Jagielski         OleUninitialize( );
89*b1cdbd2cSJim Jagielski     }
90*b1cdbd2cSJim Jagielski };
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski //---------------------------------------------
93*b1cdbd2cSJim Jagielski // A simple file preview class to preview some
94*b1cdbd2cSJim Jagielski // common picture formats like *.gif, *jpg, etc.
95*b1cdbd2cSJim Jagielski // This class is not thread-safe and is
96*b1cdbd2cSJim Jagielski // implmented as singleton, because the class
97*b1cdbd2cSJim Jagielski // has only one static member to reconnect
98*b1cdbd2cSJim Jagielski // from callback functions
99*b1cdbd2cSJim Jagielski // we use a singleton-destroyer to get rid off
100*b1cdbd2cSJim Jagielski // the singleton instance, but this happens
101*b1cdbd2cSJim Jagielski // only on shutdown (unloading of the dll) -
102*b1cdbd2cSJim Jagielski // it's a question of taste (other solutions
103*b1cdbd2cSJim Jagielski // are possible)
104*b1cdbd2cSJim Jagielski //---------------------------------------------
105*b1cdbd2cSJim Jagielski 
106*b1cdbd2cSJim Jagielski class CFilePreview
107*b1cdbd2cSJim Jagielski {
108*b1cdbd2cSJim Jagielski public:
109*b1cdbd2cSJim Jagielski 	// to ensure only one instance (singleton)
110*b1cdbd2cSJim Jagielski 	static CFilePreview* createInstance(
111*b1cdbd2cSJim Jagielski 		HWND aParent,
112*b1cdbd2cSJim Jagielski 		POINT ulCorner,
113*b1cdbd2cSJim Jagielski 		const CDimension& aSize,
114*b1cdbd2cSJim Jagielski 		HINSTANCE hInstance,
115*b1cdbd2cSJim Jagielski 		sal_Bool bShow = sal_True,
116*b1cdbd2cSJim Jagielski 		sal_Bool bEnabled = sal_True );
117*b1cdbd2cSJim Jagielski 
118*b1cdbd2cSJim Jagielski 	// sets the size of the preview window
119*b1cdbd2cSJim Jagielski 	sal_Bool SAL_CALL setSize( const CDimension& aSize );
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	// returns the CDimension of the preview
122*b1cdbd2cSJim Jagielski 	sal_Bool SAL_CALL getSize( CDimension& theSize ) const;
123*b1cdbd2cSJim Jagielski 
124*b1cdbd2cSJim Jagielski 	// sets the position of the upper left corner
125*b1cdbd2cSJim Jagielski 	// of the preview window relative to the
126*b1cdbd2cSJim Jagielski 	// upper left corner of the parent window
127*b1cdbd2cSJim Jagielski 	sal_Bool SAL_CALL setPos( POINT ulCorner );
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski 	// returns the current position of the preview
130*b1cdbd2cSJim Jagielski 	// relative to the upper left corner of the
131*b1cdbd2cSJim Jagielski 	// parent window
132*b1cdbd2cSJim Jagielski 	sal_Bool SAL_CALL getPos( POINT& ulCorner ) const;
133*b1cdbd2cSJim Jagielski 
134*b1cdbd2cSJim Jagielski 	// enables or disables the preview window
135*b1cdbd2cSJim Jagielski 	// bEnable - true the window is enabled and updates its
136*b1cdbd2cSJim Jagielski 	// view when update is called
137*b1cdbd2cSJim Jagielski 	// bEnable - false the window shows itself in disabled
138*b1cdbd2cSJim Jagielski 	// mode and does not update its view when update is
139*b1cdbd2cSJim Jagielski 	// called
140*b1cdbd2cSJim Jagielski 	void SAL_CALL enable( sal_Bool bEnable );
141*b1cdbd2cSJim Jagielski 
142*b1cdbd2cSJim Jagielski 	// shows the preview window
143*b1cdbd2cSJim Jagielski 	// possible values see SHOW_STATE
144*b1cdbd2cSJim Jagielski 	sal_Bool SAL_CALL show( sal_Bool bShow );
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski 
147*b1cdbd2cSJim Jagielski 	// if the preview is shown and enabled
148*b1cdbd2cSJim Jagielski 	// preview of the given file will be shown
149*b1cdbd2cSJim Jagielski 	// returns true on success or false if an error
150*b1cdbd2cSJim Jagielski 	// occured (the file in not there or not accessible etc.)
151*b1cdbd2cSJim Jagielski 	virtual sal_Bool SAL_CALL update( const rtl::OUString& aFileName );
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski protected:
154*b1cdbd2cSJim Jagielski 	// clients can create instances only through the static create method
155*b1cdbd2cSJim Jagielski 	CFilePreview(
156*b1cdbd2cSJim Jagielski 		HWND aParent,
157*b1cdbd2cSJim Jagielski 		POINT ulCorner,
158*b1cdbd2cSJim Jagielski 		const CDimension& aSize,
159*b1cdbd2cSJim Jagielski 		HINSTANCE hInstance,
160*b1cdbd2cSJim Jagielski 		sal_Bool bShow = sal_True,
161*b1cdbd2cSJim Jagielski 		sal_Bool bEnabled = sal_True );
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 	// only the singleton destroyer class is allowed to delete the
164*b1cdbd2cSJim Jagielski 	// singleton instance of this class
165*b1cdbd2cSJim Jagielski 	virtual ~CFilePreview( );
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski 	// we use the stl auto_ptr class as singleton destroyer
168*b1cdbd2cSJim Jagielski 	typedef std::auto_ptr< CFilePreview > FILEPREVIEW_SINGLETON_DESTROYER_T;
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski protected:
171*b1cdbd2cSJim Jagielski 	virtual void SAL_CALL onPaint( HWND hWnd, HDC hDC );
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	sal_Bool loadFile( const rtl::OUString& aFileName );
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski private:
176*b1cdbd2cSJim Jagielski     CAutoOleInit m_autoOleInit;
177*b1cdbd2cSJim Jagielski 	POINT		 m_pt;
178*b1cdbd2cSJim Jagielski 	CDimension	 m_dim;
179*b1cdbd2cSJim Jagielski 	HWND		 m_hwnd;
180*b1cdbd2cSJim Jagielski 	sal_Bool	 m_bEnabled;
181*b1cdbd2cSJim Jagielski 	IPicturePtr  m_IPicture;
182*b1cdbd2cSJim Jagielski 	ATOM		 m_atomPrevWndClass;
183*b1cdbd2cSJim Jagielski 	HINSTANCE	 m_hInstance;
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 	static LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 	static CFilePreview* s_FilePreviewInst;
188*b1cdbd2cSJim Jagielski 	static FILEPREVIEW_SINGLETON_DESTROYER_T s_SingletonDestroyer;
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski private:
191*b1cdbd2cSJim Jagielski 	friend FILEPREVIEW_SINGLETON_DESTROYER_T;
192*b1cdbd2cSJim Jagielski };
193*b1cdbd2cSJim Jagielski 
194*b1cdbd2cSJim Jagielski 
195*b1cdbd2cSJim Jagielski #endif
196