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