xref: /AOO41X/main/fpicker/source/win32/filepicker/PreviewCtrl.hxx (revision 10ce801889b00990ebdbcb412f4f91e2a9e6f21d)
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     // occured (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