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