/************************************************************** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. * *************************************************************/ #ifndef _PREVIEWCTRL_HXX_ #define _PREVIEWCTRL_HXX_ //------------------------------------------------------------------------ // includes //------------------------------------------------------------------------ #include #include #include #include //--------------------------------------------- // declaration //--------------------------------------------- class CDimension { public: CDimension( ) : m_cx( 0 ), m_cy( 0 ) { } CDimension( sal_Int32 cx, sal_Int32 cy ) : m_cx( cx ), m_cy( cy ) { } sal_Int32 m_cx; sal_Int32 m_cy; }; //-------------------------------------------------- // we use OleInitialize here because we are calling // some Ole functions to realize the picture preview // and we expect to be called from the main thread // so that there will be no problem calling // OleInitialize (the main thread should be an STA) // When OleInitialize should fail at worst the // preview doesn't work //-------------------------------------------------- class CAutoOleInit { public: // used to communicate ole // initialzation failures class COleInitException { }; CAutoOleInit( ) { HRESULT hr = OleInitialize( NULL ); if ( FAILED( hr ) ) throw COleInitException( ); } ~CAutoOleInit( ) { OleUninitialize( ); } }; //--------------------------------------------- // A simple file preview class to preview some // common picture formats like *.gif, *jpg, etc. // This class is not thread-safe and is // implmented as singleton, because the class // has only one static member to reconnect // from callback functions // we use a singleton-destroyer to get rid off // the singleton instance, but this happens // only on shutdown (unloading of the dll) - // it's a question of taste (other solutions // are possible) //--------------------------------------------- class CFilePreview { public: // to ensure only one instance (singleton) static CFilePreview* createInstance( HWND aParent, POINT ulCorner, const CDimension& aSize, HINSTANCE hInstance, sal_Bool bShow = sal_True, sal_Bool bEnabled = sal_True ); // sets the size of the preview window sal_Bool SAL_CALL setSize( const CDimension& aSize ); // returns the CDimension of the preview sal_Bool SAL_CALL getSize( CDimension& theSize ) const; // sets the position of the upper left corner // of the preview window relative to the // upper left corner of the parent window sal_Bool SAL_CALL setPos( POINT ulCorner ); // returns the current position of the preview // relative to the upper left corner of the // parent window sal_Bool SAL_CALL getPos( POINT& ulCorner ) const; // enables or disables the preview window // bEnable - true the window is enabled and updates its // view when update is called // bEnable - false the window shows itself in disabled // mode and does not update its view when update is // called void SAL_CALL enable( sal_Bool bEnable ); // shows the preview window // possible values see SHOW_STATE sal_Bool SAL_CALL show( sal_Bool bShow ); // if the preview is shown and enabled // preview of the given file will be shown // returns true on success or false if an error // occured (the file in not there or not accessible etc.) virtual sal_Bool SAL_CALL update( const rtl::OUString& aFileName ); protected: // clients can create instances only through the static create method CFilePreview( HWND aParent, POINT ulCorner, const CDimension& aSize, HINSTANCE hInstance, sal_Bool bShow = sal_True, sal_Bool bEnabled = sal_True ); // only the singleton destroyer class is allowed to delete the // singleton instance of this class virtual ~CFilePreview( ); // we use the stl auto_ptr class as singleton destroyer typedef std::auto_ptr< CFilePreview > FILEPREVIEW_SINGLETON_DESTROYER_T; protected: virtual void SAL_CALL onPaint( HWND hWnd, HDC hDC ); sal_Bool loadFile( const rtl::OUString& aFileName ); private: CAutoOleInit m_autoOleInit; POINT m_pt; CDimension m_dim; HWND m_hwnd; sal_Bool m_bEnabled; IPicturePtr m_IPicture; ATOM m_atomPrevWndClass; HINSTANCE m_hInstance; static LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); static CFilePreview* s_FilePreviewInst; static FILEPREVIEW_SINGLETON_DESTROYER_T s_SingletonDestroyer; private: friend FILEPREVIEW_SINGLETON_DESTROYER_T; }; #endif