xref: /trunk/main/fpicker/source/win32/filepicker/previewadapter.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_fpicker.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include <tchar.h>
32*cdf0e10cSrcweir #include "previewadapter.hxx"
33*cdf0e10cSrcweir 
34*cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UI_DIALOG_FILEPREVIEWIMAGEFORMATS_HPP_
35*cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/FilePreviewImageFormats.hpp>
36*cdf0e10cSrcweir #endif
37*cdf0e10cSrcweir #include "dibpreview.hxx"
38*cdf0e10cSrcweir #include "../misc/WinImplHelper.hxx"
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #include <memory>
41*cdf0e10cSrcweir #include <stdexcept>
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir //---------------------------------------------
44*cdf0e10cSrcweir //
45*cdf0e10cSrcweir //---------------------------------------------
46*cdf0e10cSrcweir 
47*cdf0e10cSrcweir using namespace ::com::sun::star::uno;
48*cdf0e10cSrcweir using namespace ::com::sun::star::lang;
49*cdf0e10cSrcweir 
50*cdf0e10cSrcweir //---------------------------------------------
51*cdf0e10cSrcweir // An impl class to hide implementation details
52*cdf0e10cSrcweir // from clients
53*cdf0e10cSrcweir //---------------------------------------------
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir class CPreviewAdapterImpl
56*cdf0e10cSrcweir {
57*cdf0e10cSrcweir public:
58*cdf0e10cSrcweir     CPreviewAdapterImpl(HINSTANCE instance);
59*cdf0e10cSrcweir 
60*cdf0e10cSrcweir     virtual ~CPreviewAdapterImpl();
61*cdf0e10cSrcweir 
62*cdf0e10cSrcweir     virtual sal_Int32 SAL_CALL getTargetColorDepth();
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir     virtual sal_Int32 SAL_CALL getAvailableWidth();
65*cdf0e10cSrcweir 
66*cdf0e10cSrcweir     virtual sal_Int32 SAL_CALL getAvailableHeight();
67*cdf0e10cSrcweir 
68*cdf0e10cSrcweir     virtual void SAL_CALL setImage( sal_Int16 aImageFormat, const Any& aImage )
69*cdf0e10cSrcweir         throw (IllegalArgumentException,RuntimeException);
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir     virtual sal_Bool SAL_CALL setShowState(sal_Bool bShowState);
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir     virtual sal_Bool SAL_CALL getShowState();
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir     virtual void SAL_CALL setParent(HWND parent);
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir     virtual HWND SAL_CALL getParent();
78*cdf0e10cSrcweir 
79*cdf0e10cSrcweir     //-------------------------------------
80*cdf0e10cSrcweir     // parent notification handler
81*cdf0e10cSrcweir     //-------------------------------------
82*cdf0e10cSrcweir 
83*cdf0e10cSrcweir     virtual void SAL_CALL notifyParentShow(sal_Bool bShow);
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir     virtual void SAL_CALL notifyParentSizeChanged();
86*cdf0e10cSrcweir 
87*cdf0e10cSrcweir     virtual void SAL_CALL notifyParentWindowPosChanged();
88*cdf0e10cSrcweir 
89*cdf0e10cSrcweir protected:
90*cdf0e10cSrcweir     virtual void SAL_CALL calcRightMargin();
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir     virtual void SAL_CALL rearrangeLayout();
93*cdf0e10cSrcweir 
94*cdf0e10cSrcweir     void SAL_CALL initializeActivePreview() throw(std::runtime_error);
95*cdf0e10cSrcweir 
96*cdf0e10cSrcweir     HWND SAL_CALL findFileListbox() const;
97*cdf0e10cSrcweir 
98*cdf0e10cSrcweir // member
99*cdf0e10cSrcweir protected:
100*cdf0e10cSrcweir     HINSTANCE                   m_Instance;
101*cdf0e10cSrcweir     std::auto_ptr<PreviewBase>  m_Preview;
102*cdf0e10cSrcweir     HWND                        m_FileDialog;
103*cdf0e10cSrcweir     int                         m_RightMargin;
104*cdf0e10cSrcweir 
105*cdf0e10cSrcweir //prevent copy/assignment
106*cdf0e10cSrcweir private:
107*cdf0e10cSrcweir     CPreviewAdapterImpl(const CPreviewAdapterImpl&);
108*cdf0e10cSrcweir     CPreviewAdapterImpl& operator=(const CPreviewAdapterImpl&);
109*cdf0e10cSrcweir };
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir //-----------------------------------------
112*cdf0e10cSrcweir //
113*cdf0e10cSrcweir //-----------------------------------------
114*cdf0e10cSrcweir 
115*cdf0e10cSrcweir CPreviewAdapterImpl::CPreviewAdapterImpl(HINSTANCE instance) :
116*cdf0e10cSrcweir     m_Instance(instance),
117*cdf0e10cSrcweir     m_Preview(new PreviewBase()), // create dummy preview (NULL-Object pattern)
118*cdf0e10cSrcweir     m_FileDialog(0),
119*cdf0e10cSrcweir     m_RightMargin(0)
120*cdf0e10cSrcweir {
121*cdf0e10cSrcweir }
122*cdf0e10cSrcweir 
123*cdf0e10cSrcweir //-----------------------------------------
124*cdf0e10cSrcweir //
125*cdf0e10cSrcweir //-----------------------------------------
126*cdf0e10cSrcweir 
127*cdf0e10cSrcweir CPreviewAdapterImpl::~CPreviewAdapterImpl()
128*cdf0e10cSrcweir {
129*cdf0e10cSrcweir }
130*cdf0e10cSrcweir 
131*cdf0e10cSrcweir //-----------------------------------------
132*cdf0e10cSrcweir //
133*cdf0e10cSrcweir //-----------------------------------------
134*cdf0e10cSrcweir 
135*cdf0e10cSrcweir sal_Int32 SAL_CALL CPreviewAdapterImpl::getTargetColorDepth()
136*cdf0e10cSrcweir {
137*cdf0e10cSrcweir     return m_Preview->getTargetColorDepth();
138*cdf0e10cSrcweir }
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir //-----------------------------------------
141*cdf0e10cSrcweir //
142*cdf0e10cSrcweir //-----------------------------------------
143*cdf0e10cSrcweir 
144*cdf0e10cSrcweir sal_Int32 SAL_CALL CPreviewAdapterImpl::getAvailableWidth()
145*cdf0e10cSrcweir {
146*cdf0e10cSrcweir     return m_Preview->getAvailableWidth();
147*cdf0e10cSrcweir }
148*cdf0e10cSrcweir 
149*cdf0e10cSrcweir //-----------------------------------------
150*cdf0e10cSrcweir //
151*cdf0e10cSrcweir //-----------------------------------------
152*cdf0e10cSrcweir 
153*cdf0e10cSrcweir sal_Int32 SAL_CALL CPreviewAdapterImpl::getAvailableHeight()
154*cdf0e10cSrcweir {
155*cdf0e10cSrcweir     return m_Preview->getAvailableHeight();
156*cdf0e10cSrcweir }
157*cdf0e10cSrcweir 
158*cdf0e10cSrcweir //-----------------------------------------
159*cdf0e10cSrcweir //
160*cdf0e10cSrcweir //-----------------------------------------
161*cdf0e10cSrcweir 
162*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::setImage( sal_Int16 aImageFormat, const Any& aImage )
163*cdf0e10cSrcweir     throw (IllegalArgumentException,RuntimeException)
164*cdf0e10cSrcweir {
165*cdf0e10cSrcweir     m_Preview->setImage(aImageFormat,aImage);
166*cdf0e10cSrcweir }
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir //-----------------------------------------
169*cdf0e10cSrcweir //
170*cdf0e10cSrcweir //-----------------------------------------
171*cdf0e10cSrcweir 
172*cdf0e10cSrcweir sal_Bool SAL_CALL CPreviewAdapterImpl::setShowState( sal_Bool bShowState )
173*cdf0e10cSrcweir {
174*cdf0e10cSrcweir     sal_Bool bRet = m_Preview->setShowState(bShowState);
175*cdf0e10cSrcweir     rearrangeLayout();
176*cdf0e10cSrcweir     return bRet;
177*cdf0e10cSrcweir }
178*cdf0e10cSrcweir 
179*cdf0e10cSrcweir //-----------------------------------------
180*cdf0e10cSrcweir //
181*cdf0e10cSrcweir //-----------------------------------------
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir sal_Bool SAL_CALL CPreviewAdapterImpl::getShowState()
184*cdf0e10cSrcweir {
185*cdf0e10cSrcweir     return m_Preview->getShowState();
186*cdf0e10cSrcweir }
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir //-----------------------------------------
189*cdf0e10cSrcweir //
190*cdf0e10cSrcweir //-----------------------------------------
191*cdf0e10cSrcweir 
192*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::setParent(HWND parent)
193*cdf0e10cSrcweir {
194*cdf0e10cSrcweir     OSL_PRECOND(IsWindow(parent),"Invalid FileDialog handle");
195*cdf0e10cSrcweir 
196*cdf0e10cSrcweir     m_FileDialog = parent;
197*cdf0e10cSrcweir     calcRightMargin();
198*cdf0e10cSrcweir }
199*cdf0e10cSrcweir 
200*cdf0e10cSrcweir //-----------------------------------------
201*cdf0e10cSrcweir //
202*cdf0e10cSrcweir //-----------------------------------------
203*cdf0e10cSrcweir 
204*cdf0e10cSrcweir HWND SAL_CALL CPreviewAdapterImpl::getParent()
205*cdf0e10cSrcweir {
206*cdf0e10cSrcweir     return m_FileDialog;
207*cdf0e10cSrcweir }
208*cdf0e10cSrcweir 
209*cdf0e10cSrcweir //-----------------------------------------
210*cdf0e10cSrcweir //
211*cdf0e10cSrcweir //-----------------------------------------
212*cdf0e10cSrcweir 
213*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::calcRightMargin()
214*cdf0e10cSrcweir {
215*cdf0e10cSrcweir     // Calculate the right reference margin
216*cdf0e10cSrcweir     //
217*cdf0e10cSrcweir     // Assumtions:
218*cdf0e10cSrcweir     // 1. This method will be called before the dialog becomes
219*cdf0e10cSrcweir     //    visible
220*cdf0e10cSrcweir     // 2. There exist a FileListbox with the id lst1 even
221*cdf0e10cSrcweir     //    if it is not visible like under Win2000/XP
222*cdf0e10cSrcweir     // 3. Initially this FileListbox has the appropriate size
223*cdf0e10cSrcweir     //    to fit within the FileListbox
224*cdf0e10cSrcweir     // 4. The margin between the right edge of the FileListbox
225*cdf0e10cSrcweir     //    and the right edge of the FileDialog will be constant
226*cdf0e10cSrcweir     //    even if the size of the dialog changes
227*cdf0e10cSrcweir 
228*cdf0e10cSrcweir     HWND flb = GetDlgItem(m_FileDialog,lst1);
229*cdf0e10cSrcweir 
230*cdf0e10cSrcweir     OSL_ENSURE(IsWindow(flb),"Filelistbox not found");
231*cdf0e10cSrcweir 
232*cdf0e10cSrcweir     RECT rcFlb;
233*cdf0e10cSrcweir     GetWindowRect(flb,&rcFlb);
234*cdf0e10cSrcweir 
235*cdf0e10cSrcweir     RECT rcFileDlg;
236*cdf0e10cSrcweir     GetWindowRect(m_FileDialog,&rcFileDlg);
237*cdf0e10cSrcweir 
238*cdf0e10cSrcweir     m_RightMargin = rcFileDlg.right - rcFlb.right;
239*cdf0e10cSrcweir }
240*cdf0e10cSrcweir 
241*cdf0e10cSrcweir //-----------------------------------------
242*cdf0e10cSrcweir //
243*cdf0e10cSrcweir //-----------------------------------------
244*cdf0e10cSrcweir 
245*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::notifyParentShow(sal_Bool)
246*cdf0e10cSrcweir {
247*cdf0e10cSrcweir }
248*cdf0e10cSrcweir 
249*cdf0e10cSrcweir //-----------------------------------------
250*cdf0e10cSrcweir //
251*cdf0e10cSrcweir //-----------------------------------------
252*cdf0e10cSrcweir 
253*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::notifyParentSizeChanged()
254*cdf0e10cSrcweir {
255*cdf0e10cSrcweir     rearrangeLayout();
256*cdf0e10cSrcweir }
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir //-----------------------------------------
259*cdf0e10cSrcweir //
260*cdf0e10cSrcweir //-----------------------------------------
261*cdf0e10cSrcweir 
262*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::notifyParentWindowPosChanged()
263*cdf0e10cSrcweir {
264*cdf0e10cSrcweir }
265*cdf0e10cSrcweir 
266*cdf0e10cSrcweir //-----------------------------------------
267*cdf0e10cSrcweir //
268*cdf0e10cSrcweir //-----------------------------------------
269*cdf0e10cSrcweir 
270*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::rearrangeLayout()
271*cdf0e10cSrcweir {
272*cdf0e10cSrcweir     // try to get a handle to the filelistbox
273*cdf0e10cSrcweir     // if there is no new-style filelistbox like
274*cdf0e10cSrcweir     // in Win2000/XP there should be at least the
275*cdf0e10cSrcweir     // old listbox, so we take this one
276*cdf0e10cSrcweir     // lst1 - identifies the old-style filelistbox
277*cdf0e10cSrcweir     // lst2 - identifies the new-style filelistbox
278*cdf0e10cSrcweir     // see dlgs.h
279*cdf0e10cSrcweir     HWND flb_new = findFileListbox();
280*cdf0e10cSrcweir 
281*cdf0e10cSrcweir     // under Windows NT 4.0 the size of the old
282*cdf0e10cSrcweir     // filelistbox will be used as reference for
283*cdf0e10cSrcweir     // sizing the new filelistbox, so we have
284*cdf0e10cSrcweir     // to change the size of it too
285*cdf0e10cSrcweir     HWND flb_old = GetDlgItem(m_FileDialog,lst1);
286*cdf0e10cSrcweir 
287*cdf0e10cSrcweir     RECT rcFlbNew;
288*cdf0e10cSrcweir     GetWindowRect(flb_new,&rcFlbNew);
289*cdf0e10cSrcweir 
290*cdf0e10cSrcweir     RECT rcFileDlg;
291*cdf0e10cSrcweir     GetWindowRect(m_FileDialog,&rcFileDlg);
292*cdf0e10cSrcweir     rcFileDlg.right -= m_RightMargin;
293*cdf0e10cSrcweir 
294*cdf0e10cSrcweir     // the available area for the filelistbox should be
295*cdf0e10cSrcweir     // the left edge of the filelistbox and the right
296*cdf0e10cSrcweir     // edge of the OK button, we take this as reference
297*cdf0e10cSrcweir     int height = rcFlbNew.bottom - rcFlbNew.top;
298*cdf0e10cSrcweir     int width  = rcFileDlg.right - rcFlbNew.left;
299*cdf0e10cSrcweir 
300*cdf0e10cSrcweir     HWND prvwnd = m_Preview->getWindowHandle();
301*cdf0e10cSrcweir 
302*cdf0e10cSrcweir     // we use GetWindowLong to ask for the visibility
303*cdf0e10cSrcweir     // of the preview window because IsWindowVisible
304*cdf0e10cSrcweir     // only returns true the specified window including
305*cdf0e10cSrcweir     // its parent windows are visible
306*cdf0e10cSrcweir     // this is not the case when we are called in response
307*cdf0e10cSrcweir     // to the WM_SHOWWINDOW message, somehow the WS_VISIBLE
308*cdf0e10cSrcweir     // style bit of the FileOpen dialog must be set after that
309*cdf0e10cSrcweir     // message
310*cdf0e10cSrcweir     LONG lStyle = GetWindowLong(prvwnd,GWL_STYLE);
311*cdf0e10cSrcweir     bool bIsVisible = ((lStyle & WS_VISIBLE) != 0);
312*cdf0e10cSrcweir 
313*cdf0e10cSrcweir     int cx = 0;
314*cdf0e10cSrcweir 
315*cdf0e10cSrcweir     if (IsWindow(prvwnd) && bIsVisible)
316*cdf0e10cSrcweir     {
317*cdf0e10cSrcweir         cx = width/2;
318*cdf0e10cSrcweir 
319*cdf0e10cSrcweir         // resize the filelistbox to the half of the
320*cdf0e10cSrcweir         // available space
321*cdf0e10cSrcweir         bool bRet = SetWindowPos(flb_new,
322*cdf0e10cSrcweir             NULL, 0, 0, cx, height,
323*cdf0e10cSrcweir             SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
324*cdf0e10cSrcweir 
325*cdf0e10cSrcweir         bRet = SetWindowPos(flb_old,
326*cdf0e10cSrcweir             NULL, 0, 0, cx, height,
327*cdf0e10cSrcweir             SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
328*cdf0e10cSrcweir 
329*cdf0e10cSrcweir         // get the new dimensions of the filelistbox after
330*cdf0e10cSrcweir         // resizing and take the right,top corner as starting
331*cdf0e10cSrcweir         // point for the preview window
332*cdf0e10cSrcweir         GetWindowRect(flb_new,&rcFlbNew);
333*cdf0e10cSrcweir         POINT pt = { rcFlbNew.right, rcFlbNew.top };
334*cdf0e10cSrcweir         ScreenToClient(m_FileDialog,&pt);
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir         // resize the preview window to fit within
337*cdf0e10cSrcweir         // the available space and set the window
338*cdf0e10cSrcweir         // to the top of the z-order else it will
339*cdf0e10cSrcweir         // be invisible
340*cdf0e10cSrcweir         SetWindowPos(prvwnd,
341*cdf0e10cSrcweir             HWND_TOP, pt.x, pt.y, cx, height, SWP_NOACTIVATE);
342*cdf0e10cSrcweir     }
343*cdf0e10cSrcweir     else
344*cdf0e10cSrcweir     {
345*cdf0e10cSrcweir         // resize the filelistbox to the maximum available
346*cdf0e10cSrcweir         // space
347*cdf0e10cSrcweir         cx = rcFileDlg.right - rcFlbNew.left;
348*cdf0e10cSrcweir 
349*cdf0e10cSrcweir         // resize the old filelistbox
350*cdf0e10cSrcweir         SetWindowPos(flb_old,
351*cdf0e10cSrcweir             NULL, 0, 0, cx, height,
352*cdf0e10cSrcweir             SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
353*cdf0e10cSrcweir 
354*cdf0e10cSrcweir         // resize the new filelistbox
355*cdf0e10cSrcweir         SetWindowPos(flb_new,
356*cdf0e10cSrcweir             NULL, 0, 0, cx, height,
357*cdf0e10cSrcweir             SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE );
358*cdf0e10cSrcweir     }
359*cdf0e10cSrcweir }
360*cdf0e10cSrcweir 
361*cdf0e10cSrcweir //-----------------------------------------
362*cdf0e10cSrcweir //
363*cdf0e10cSrcweir //-----------------------------------------
364*cdf0e10cSrcweir 
365*cdf0e10cSrcweir void SAL_CALL CPreviewAdapterImpl::initializeActivePreview() throw(std::runtime_error)
366*cdf0e10cSrcweir {
367*cdf0e10cSrcweir     sal_Bool bShowState = m_Preview->getImaginaryShowState();
368*cdf0e10cSrcweir 
369*cdf0e10cSrcweir     sal_Int16 aImgFrmt;
370*cdf0e10cSrcweir     Any aImg;
371*cdf0e10cSrcweir     m_Preview->getImage(aImgFrmt,aImg);
372*cdf0e10cSrcweir 
373*cdf0e10cSrcweir     HWND flb = findFileListbox();
374*cdf0e10cSrcweir 
375*cdf0e10cSrcweir     PreviewBase* prv = new CDIBPreview(
376*cdf0e10cSrcweir         m_Instance, GetParent(flb), bShowState);
377*cdf0e10cSrcweir 
378*cdf0e10cSrcweir     m_Preview.reset(prv);
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir     m_Preview->setImage(aImgFrmt,aImg);
381*cdf0e10cSrcweir }
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir //-----------------------------------------
384*cdf0e10cSrcweir //
385*cdf0e10cSrcweir //-----------------------------------------
386*cdf0e10cSrcweir 
387*cdf0e10cSrcweir HWND SAL_CALL CPreviewAdapterImpl::findFileListbox() const
388*cdf0e10cSrcweir {
389*cdf0e10cSrcweir     // try to get a handle to the filelistbox
390*cdf0e10cSrcweir     // if there is no new-style filelistbox like
391*cdf0e10cSrcweir     // in Win2000/XP there should be at least the
392*cdf0e10cSrcweir     // old listbox, so we take this one
393*cdf0e10cSrcweir     // lst1 - identifies the old-style filelistbox
394*cdf0e10cSrcweir     // lst2 - identifies the new-style filelistbox
395*cdf0e10cSrcweir     // see dlgs.h
396*cdf0e10cSrcweir     HWND flb = GetDlgItem(m_FileDialog,lst2);
397*cdf0e10cSrcweir     if (!IsWindow(flb))
398*cdf0e10cSrcweir         flb = GetDlgItem(m_FileDialog,lst1);
399*cdf0e10cSrcweir 
400*cdf0e10cSrcweir     return flb;
401*cdf0e10cSrcweir }
402*cdf0e10cSrcweir 
403*cdf0e10cSrcweir 
404*cdf0e10cSrcweir //##############################################################
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir 
407*cdf0e10cSrcweir //-----------------------------------------
408*cdf0e10cSrcweir // Special implementation for Win98
409*cdf0e10cSrcweir // because:
410*cdf0e10cSrcweir //
411*cdf0e10cSrcweir //-----------------------------------------
412*cdf0e10cSrcweir 
413*cdf0e10cSrcweir class CWin98PreviewAdapterImpl : public CPreviewAdapterImpl
414*cdf0e10cSrcweir {
415*cdf0e10cSrcweir public:
416*cdf0e10cSrcweir     CWin98PreviewAdapterImpl(HINSTANCE instance);
417*cdf0e10cSrcweir 
418*cdf0e10cSrcweir     virtual void SAL_CALL notifyParentWindowPosChanged();
419*cdf0e10cSrcweir 
420*cdf0e10cSrcweir protected:
421*cdf0e10cSrcweir     virtual void SAL_CALL rearrangeLayout();
422*cdf0e10cSrcweir 
423*cdf0e10cSrcweir     bool isValidToolbarDimension() const;
424*cdf0e10cSrcweir 
425*cdf0e10cSrcweir private:
426*cdf0e10cSrcweir     sal_Bool    m_PreviewActive;
427*cdf0e10cSrcweir     int         m_ToolbarPosX;
428*cdf0e10cSrcweir     int         m_ToolbarPosY;
429*cdf0e10cSrcweir     int         m_ToolbarWidth;
430*cdf0e10cSrcweir     int         m_ToolbarHeight;
431*cdf0e10cSrcweir };
432*cdf0e10cSrcweir 
433*cdf0e10cSrcweir //--------------------------------------------
434*cdf0e10cSrcweir //
435*cdf0e10cSrcweir //--------------------------------------------
436*cdf0e10cSrcweir 
437*cdf0e10cSrcweir CWin98PreviewAdapterImpl::CWin98PreviewAdapterImpl(HINSTANCE instance) :
438*cdf0e10cSrcweir     CPreviewAdapterImpl(instance),
439*cdf0e10cSrcweir     m_PreviewActive(sal_False),
440*cdf0e10cSrcweir     m_ToolbarPosX(0),
441*cdf0e10cSrcweir     m_ToolbarPosY(0),
442*cdf0e10cSrcweir     m_ToolbarWidth(0),
443*cdf0e10cSrcweir     m_ToolbarHeight(0)
444*cdf0e10cSrcweir {
445*cdf0e10cSrcweir }
446*cdf0e10cSrcweir 
447*cdf0e10cSrcweir //--------------------------------------------
448*cdf0e10cSrcweir //
449*cdf0e10cSrcweir //--------------------------------------------
450*cdf0e10cSrcweir 
451*cdf0e10cSrcweir void SAL_CALL CWin98PreviewAdapterImpl::notifyParentWindowPosChanged()
452*cdf0e10cSrcweir {
453*cdf0e10cSrcweir     try
454*cdf0e10cSrcweir     {
455*cdf0e10cSrcweir         // the reason for this condition is
456*cdf0e10cSrcweir         // Windows 98
457*cdf0e10cSrcweir         // Under Windows 98 the message WM_SHOWWINDOW
458*cdf0e10cSrcweir         // will be sent only the first time the
459*cdf0e10cSrcweir         // GetOpenFileName function is called within
460*cdf0e10cSrcweir         // the same process
461*cdf0e10cSrcweir         // so we must use another message to initialize
462*cdf0e10cSrcweir         // the preview window
463*cdf0e10cSrcweir         if (IsWindow(m_FileDialog) && !m_PreviewActive)
464*cdf0e10cSrcweir         {
465*cdf0e10cSrcweir             initializeActivePreview();
466*cdf0e10cSrcweir             m_PreviewActive = sal_True;
467*cdf0e10cSrcweir             rearrangeLayout();
468*cdf0e10cSrcweir         }
469*cdf0e10cSrcweir 
470*cdf0e10cSrcweir         if (IsWindow(m_FileDialog) && !isValidToolbarDimension())
471*cdf0e10cSrcweir         {
472*cdf0e10cSrcweir             RECT rcStc1;
473*cdf0e10cSrcweir             GetWindowRect(GetDlgItem(m_FileDialog,stc1),&rcStc1);
474*cdf0e10cSrcweir 
475*cdf0e10cSrcweir             RECT rcCmb2;
476*cdf0e10cSrcweir             GetWindowRect(GetDlgItem(m_FileDialog,cmb2),&rcCmb2);
477*cdf0e10cSrcweir 
478*cdf0e10cSrcweir             // Assumption:
479*cdf0e10cSrcweir             // the toolbar position is only valid
480*cdf0e10cSrcweir             // if the left edge is greater or equal
481*cdf0e10cSrcweir             // than the right edge of the drives listbox
482*cdf0e10cSrcweir             // the stc1 static text is invisible at runtime
483*cdf0e10cSrcweir             // but will be used as reference for the position
484*cdf0e10cSrcweir             // and dimension of the toolbar
485*cdf0e10cSrcweir             if (rcStc1.left >= rcCmb2.right)
486*cdf0e10cSrcweir             {
487*cdf0e10cSrcweir                 // important: save the upper left corner in
488*cdf0e10cSrcweir                 // client coordinates
489*cdf0e10cSrcweir                 POINT pt = {rcStc1.left,rcStc1.top};
490*cdf0e10cSrcweir                 ScreenToClient(m_FileDialog,&pt);
491*cdf0e10cSrcweir 
492*cdf0e10cSrcweir                 m_ToolbarPosX   = pt.x;
493*cdf0e10cSrcweir                 m_ToolbarPosY   = pt.y;
494*cdf0e10cSrcweir                 m_ToolbarWidth  = rcStc1.right - rcStc1.left;
495*cdf0e10cSrcweir                 m_ToolbarHeight = rcStc1.bottom - rcStc1.top;
496*cdf0e10cSrcweir             }
497*cdf0e10cSrcweir         }
498*cdf0e10cSrcweir     }
499*cdf0e10cSrcweir     catch(std::runtime_error&)
500*cdf0e10cSrcweir     {
501*cdf0e10cSrcweir     }
502*cdf0e10cSrcweir }
503*cdf0e10cSrcweir 
504*cdf0e10cSrcweir //--------------------------------------------
505*cdf0e10cSrcweir //
506*cdf0e10cSrcweir //--------------------------------------------
507*cdf0e10cSrcweir 
508*cdf0e10cSrcweir void SAL_CALL CWin98PreviewAdapterImpl::rearrangeLayout()
509*cdf0e10cSrcweir {
510*cdf0e10cSrcweir     CPreviewAdapterImpl::rearrangeLayout();
511*cdf0e10cSrcweir 
512*cdf0e10cSrcweir     // fix the position of the upper toolbar
513*cdf0e10cSrcweir     // because the FileDialog moves all windows
514*cdf0e10cSrcweir     // that are to the right of the FileListbox
515*cdf0e10cSrcweir     // so if we have changed the size of the
516*cdf0e10cSrcweir     // FileListbox we would run into trouble else
517*cdf0e10cSrcweir     if (isValidToolbarDimension())
518*cdf0e10cSrcweir     {
519*cdf0e10cSrcweir         HWND hwndTlb = FindWindowEx(
520*cdf0e10cSrcweir             m_FileDialog,NULL,TEXT("ToolbarWindow32"),NULL);
521*cdf0e10cSrcweir 
522*cdf0e10cSrcweir         SetWindowPos(hwndTlb,
523*cdf0e10cSrcweir             HWND_TOP,
524*cdf0e10cSrcweir             m_ToolbarPosX,
525*cdf0e10cSrcweir             m_ToolbarPosY,
526*cdf0e10cSrcweir             m_ToolbarWidth,
527*cdf0e10cSrcweir             m_ToolbarHeight,
528*cdf0e10cSrcweir             SWP_NOACTIVATE);
529*cdf0e10cSrcweir     }
530*cdf0e10cSrcweir }
531*cdf0e10cSrcweir 
532*cdf0e10cSrcweir //--------------------------------------------
533*cdf0e10cSrcweir //
534*cdf0e10cSrcweir //--------------------------------------------
535*cdf0e10cSrcweir 
536*cdf0e10cSrcweir bool CWin98PreviewAdapterImpl::isValidToolbarDimension() const
537*cdf0e10cSrcweir {
538*cdf0e10cSrcweir     return (m_ToolbarPosX   > 0 &&
539*cdf0e10cSrcweir             m_ToolbarPosY   > 0 &&
540*cdf0e10cSrcweir             m_ToolbarWidth  > 0 &&
541*cdf0e10cSrcweir             m_ToolbarHeight > 0);
542*cdf0e10cSrcweir }
543*cdf0e10cSrcweir 
544*cdf0e10cSrcweir //##############################################################
545*cdf0e10cSrcweir 
546*cdf0e10cSrcweir 
547*cdf0e10cSrcweir //--------------------------------------------
548*cdf0e10cSrcweir // Implementation for Windows 95/NT/ME/2000/XP
549*cdf0e10cSrcweir // because:
550*cdf0e10cSrcweir //
551*cdf0e10cSrcweir //--------------------------------------------
552*cdf0e10cSrcweir 
553*cdf0e10cSrcweir class CWin95NTPreviewAdapterImpl : public CPreviewAdapterImpl
554*cdf0e10cSrcweir {
555*cdf0e10cSrcweir public:
556*cdf0e10cSrcweir     CWin95NTPreviewAdapterImpl(HINSTANCE instance);
557*cdf0e10cSrcweir 
558*cdf0e10cSrcweir     virtual void SAL_CALL notifyParentShow(sal_Bool bShow);
559*cdf0e10cSrcweir };
560*cdf0e10cSrcweir 
561*cdf0e10cSrcweir //--------------------------------------------
562*cdf0e10cSrcweir //
563*cdf0e10cSrcweir //--------------------------------------------
564*cdf0e10cSrcweir 
565*cdf0e10cSrcweir CWin95NTPreviewAdapterImpl::CWin95NTPreviewAdapterImpl(HINSTANCE instance) :
566*cdf0e10cSrcweir     CPreviewAdapterImpl(instance)
567*cdf0e10cSrcweir {
568*cdf0e10cSrcweir }
569*cdf0e10cSrcweir 
570*cdf0e10cSrcweir //--------------------------------------------
571*cdf0e10cSrcweir //
572*cdf0e10cSrcweir //--------------------------------------------
573*cdf0e10cSrcweir 
574*cdf0e10cSrcweir void SAL_CALL CWin95NTPreviewAdapterImpl::notifyParentShow(sal_Bool bShow)
575*cdf0e10cSrcweir {
576*cdf0e10cSrcweir     try
577*cdf0e10cSrcweir     {
578*cdf0e10cSrcweir         if (bShow)
579*cdf0e10cSrcweir         {
580*cdf0e10cSrcweir             initializeActivePreview();
581*cdf0e10cSrcweir             rearrangeLayout();
582*cdf0e10cSrcweir         }
583*cdf0e10cSrcweir     }
584*cdf0e10cSrcweir     catch(std::runtime_error&)
585*cdf0e10cSrcweir     {
586*cdf0e10cSrcweir     }
587*cdf0e10cSrcweir }
588*cdf0e10cSrcweir 
589*cdf0e10cSrcweir 
590*cdf0e10cSrcweir //##############################################################
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir 
593*cdf0e10cSrcweir //-------------------------------
594*cdf0e10cSrcweir // ctor
595*cdf0e10cSrcweir //-------------------------------
596*cdf0e10cSrcweir 
597*cdf0e10cSrcweir CPreviewAdapter::CPreviewAdapter(HINSTANCE instance)
598*cdf0e10cSrcweir {
599*cdf0e10cSrcweir     if (!IsWindows98())
600*cdf0e10cSrcweir         m_pImpl.reset(new CWin95NTPreviewAdapterImpl(instance));
601*cdf0e10cSrcweir     else
602*cdf0e10cSrcweir         m_pImpl.reset(new CWin98PreviewAdapterImpl(instance));
603*cdf0e10cSrcweir }
604*cdf0e10cSrcweir 
605*cdf0e10cSrcweir //-------------------------------
606*cdf0e10cSrcweir //
607*cdf0e10cSrcweir //-------------------------------
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir CPreviewAdapter::~CPreviewAdapter()
610*cdf0e10cSrcweir {
611*cdf0e10cSrcweir }
612*cdf0e10cSrcweir 
613*cdf0e10cSrcweir //-------------------------------
614*cdf0e10cSrcweir //
615*cdf0e10cSrcweir //-------------------------------
616*cdf0e10cSrcweir 
617*cdf0e10cSrcweir Sequence<sal_Int16> SAL_CALL CPreviewAdapter::getSupportedImageFormats()
618*cdf0e10cSrcweir {
619*cdf0e10cSrcweir     com::sun::star::uno::Sequence<sal_Int16> imgFormats(1);
620*cdf0e10cSrcweir     imgFormats[0] = ::com::sun::star::ui::dialogs::FilePreviewImageFormats::BITMAP;
621*cdf0e10cSrcweir     return imgFormats;
622*cdf0e10cSrcweir }
623*cdf0e10cSrcweir 
624*cdf0e10cSrcweir //-------------------------------
625*cdf0e10cSrcweir //
626*cdf0e10cSrcweir //-------------------------------
627*cdf0e10cSrcweir 
628*cdf0e10cSrcweir sal_Int32 SAL_CALL CPreviewAdapter::getTargetColorDepth()
629*cdf0e10cSrcweir {
630*cdf0e10cSrcweir     return m_pImpl->getTargetColorDepth();
631*cdf0e10cSrcweir }
632*cdf0e10cSrcweir 
633*cdf0e10cSrcweir //-------------------------------
634*cdf0e10cSrcweir //
635*cdf0e10cSrcweir //-------------------------------
636*cdf0e10cSrcweir 
637*cdf0e10cSrcweir sal_Int32 SAL_CALL CPreviewAdapter::getAvailableWidth()
638*cdf0e10cSrcweir {
639*cdf0e10cSrcweir     return m_pImpl->getAvailableWidth();
640*cdf0e10cSrcweir }
641*cdf0e10cSrcweir 
642*cdf0e10cSrcweir //-------------------------------
643*cdf0e10cSrcweir //
644*cdf0e10cSrcweir //-------------------------------
645*cdf0e10cSrcweir 
646*cdf0e10cSrcweir sal_Int32 SAL_CALL CPreviewAdapter::getAvailableHeight()
647*cdf0e10cSrcweir {
648*cdf0e10cSrcweir     return m_pImpl->getAvailableHeight();
649*cdf0e10cSrcweir }
650*cdf0e10cSrcweir 
651*cdf0e10cSrcweir //-------------------------------
652*cdf0e10cSrcweir //
653*cdf0e10cSrcweir //-------------------------------
654*cdf0e10cSrcweir 
655*cdf0e10cSrcweir void SAL_CALL CPreviewAdapter::setImage( sal_Int16 aImageFormat, const Any& aImage )
656*cdf0e10cSrcweir     throw (IllegalArgumentException, RuntimeException)
657*cdf0e10cSrcweir {
658*cdf0e10cSrcweir     m_pImpl->setImage(aImageFormat,aImage);
659*cdf0e10cSrcweir }
660*cdf0e10cSrcweir 
661*cdf0e10cSrcweir //-------------------------------
662*cdf0e10cSrcweir //
663*cdf0e10cSrcweir //-------------------------------
664*cdf0e10cSrcweir 
665*cdf0e10cSrcweir sal_Bool SAL_CALL CPreviewAdapter::setShowState( sal_Bool bShowState )
666*cdf0e10cSrcweir {
667*cdf0e10cSrcweir     return m_pImpl->setShowState(bShowState);
668*cdf0e10cSrcweir }
669*cdf0e10cSrcweir 
670*cdf0e10cSrcweir //-------------------------------
671*cdf0e10cSrcweir //
672*cdf0e10cSrcweir //-------------------------------
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir sal_Bool SAL_CALL CPreviewAdapter::getShowState()
675*cdf0e10cSrcweir {
676*cdf0e10cSrcweir     return m_pImpl->getShowState();
677*cdf0e10cSrcweir }
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir //-------------------------------
680*cdf0e10cSrcweir //
681*cdf0e10cSrcweir //-------------------------------
682*cdf0e10cSrcweir 
683*cdf0e10cSrcweir void SAL_CALL CPreviewAdapter::setParent(HWND parent)
684*cdf0e10cSrcweir {
685*cdf0e10cSrcweir     m_pImpl->setParent(parent);
686*cdf0e10cSrcweir }
687*cdf0e10cSrcweir 
688*cdf0e10cSrcweir //-------------------------------
689*cdf0e10cSrcweir //
690*cdf0e10cSrcweir //-------------------------------
691*cdf0e10cSrcweir 
692*cdf0e10cSrcweir void SAL_CALL CPreviewAdapter::notifyParentShow(bool bShow)
693*cdf0e10cSrcweir {
694*cdf0e10cSrcweir     m_pImpl->notifyParentShow(bShow);
695*cdf0e10cSrcweir }
696*cdf0e10cSrcweir 
697*cdf0e10cSrcweir //-------------------------------
698*cdf0e10cSrcweir //
699*cdf0e10cSrcweir //-------------------------------
700*cdf0e10cSrcweir 
701*cdf0e10cSrcweir void SAL_CALL CPreviewAdapter::notifyParentSizeChanged()
702*cdf0e10cSrcweir {
703*cdf0e10cSrcweir     m_pImpl->notifyParentSizeChanged();
704*cdf0e10cSrcweir }
705*cdf0e10cSrcweir 
706*cdf0e10cSrcweir //-------------------------------
707*cdf0e10cSrcweir //
708*cdf0e10cSrcweir //-------------------------------
709*cdf0e10cSrcweir 
710*cdf0e10cSrcweir void SAL_CALL CPreviewAdapter::notifyParentWindowPosChanged()
711*cdf0e10cSrcweir {
712*cdf0e10cSrcweir     m_pImpl->notifyParentWindowPosChanged();
713*cdf0e10cSrcweir }
714