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