1*b557fc96SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*b557fc96SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*b557fc96SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*b557fc96SAndrew Rist * distributed with this work for additional information 6*b557fc96SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*b557fc96SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*b557fc96SAndrew Rist * "License"); you may not use this file except in compliance 9*b557fc96SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*b557fc96SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*b557fc96SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*b557fc96SAndrew Rist * software distributed under the License is distributed on an 15*b557fc96SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b557fc96SAndrew Rist * KIND, either express or implied. See the License for the 17*b557fc96SAndrew Rist * specific language governing permissions and limitations 18*b557fc96SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*b557fc96SAndrew Rist *************************************************************/ 21*b557fc96SAndrew Rist 22*b557fc96SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_fpicker.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir //------------------------------------------------------------------------ 28cdf0e10cSrcweir // includes 29cdf0e10cSrcweir //------------------------------------------------------------------------ 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <tchar.h> 32cdf0e10cSrcweir #include "dibpreview.hxx" 33cdf0e10cSrcweir #include <osl/diagnose.h> 34cdf0e10cSrcweir 35cdf0e10cSrcweir #ifndef _COM_SUN_STAR_UI_DIALOG_FILEPREVIEWIMAGEFORMATS_HPP_ 36cdf0e10cSrcweir #include <com/sun/star/ui/dialogs/FilePreviewImageFormats.hpp> 37cdf0e10cSrcweir #endif 38cdf0e10cSrcweir 39cdf0e10cSrcweir #ifndef _USTRING_HXX_ 40cdf0e10cSrcweir #include <rtl/ustring.hxx> 41cdf0e10cSrcweir #endif 42cdf0e10cSrcweir 43cdf0e10cSrcweir #include <stdexcept> 44cdf0e10cSrcweir #include <string> 45cdf0e10cSrcweir 46cdf0e10cSrcweir //------------------------------------------------------------------------ 47cdf0e10cSrcweir // 48cdf0e10cSrcweir //------------------------------------------------------------------------ 49cdf0e10cSrcweir 50cdf0e10cSrcweir using ::com::sun::star::uno::Sequence; 51cdf0e10cSrcweir using ::com::sun::star::uno::RuntimeException; 52cdf0e10cSrcweir using ::com::sun::star::uno::Any; 53cdf0e10cSrcweir using ::com::sun::star::lang::IllegalArgumentException; 54cdf0e10cSrcweir using rtl::OUString; 55cdf0e10cSrcweir 56cdf0e10cSrcweir //------------------------------------------------------------------------ 57cdf0e10cSrcweir // 58cdf0e10cSrcweir //------------------------------------------------------------------------ 59cdf0e10cSrcweir 60cdf0e10cSrcweir namespace /* private */ 61cdf0e10cSrcweir { 62cdf0e10cSrcweir const LPTSTR CURRENT_INSTANCE = TEXT("CurrInst"); 63cdf0e10cSrcweir }; 64cdf0e10cSrcweir 65cdf0e10cSrcweir //------------------------------------------------------------------------ 66cdf0e10cSrcweir // defines 67cdf0e10cSrcweir //------------------------------------------------------------------------ 68cdf0e10cSrcweir 69cdf0e10cSrcweir #define PREVIEWWND_CLASS_NAME TEXT("DIBPreviewWnd###") 70cdf0e10cSrcweir 71cdf0e10cSrcweir // means 3 pixel left and 3 pixel right 72cdf0e10cSrcweir #define HORZ_BODER_SPACE 6 73cdf0e10cSrcweir 74cdf0e10cSrcweir // means 3 pixel top and 3 pixel bottom 75cdf0e10cSrcweir #define VERT_BORDER_SPACE 6 76cdf0e10cSrcweir 77cdf0e10cSrcweir //--------------------------------------------------- 78cdf0e10cSrcweir // static member initialization 79cdf0e10cSrcweir //--------------------------------------------------- 80cdf0e10cSrcweir 81cdf0e10cSrcweir osl::Mutex CDIBPreview::s_Mutex; 82cdf0e10cSrcweir ATOM CDIBPreview::s_ClassAtom = 0; 83cdf0e10cSrcweir sal_Int32 CDIBPreview::s_RegisterDibPreviewWndCount = 0; 84cdf0e10cSrcweir 85cdf0e10cSrcweir //--------------------------------------------------- 86cdf0e10cSrcweir // 87cdf0e10cSrcweir //--------------------------------------------------- 88cdf0e10cSrcweir 89cdf0e10cSrcweir CDIBPreview::CDIBPreview(HINSTANCE instance,HWND parent,sal_Bool bShowWindow) : 90cdf0e10cSrcweir m_Instance(instance) 91cdf0e10cSrcweir { 92cdf0e10cSrcweir RegisterDibPreviewWindowClass(); 93cdf0e10cSrcweir 94cdf0e10cSrcweir DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; 95cdf0e10cSrcweir 96cdf0e10cSrcweir if (bShowWindow) 97cdf0e10cSrcweir dwStyle |= WS_VISIBLE; 98cdf0e10cSrcweir 99cdf0e10cSrcweir m_Hwnd = CreateWindowEx( 100cdf0e10cSrcweir WS_EX_CLIENTEDGE, 101cdf0e10cSrcweir PREVIEWWND_CLASS_NAME, 102cdf0e10cSrcweir TEXT(""), 103cdf0e10cSrcweir dwStyle, 104cdf0e10cSrcweir 0, 0, 0, 0, 105cdf0e10cSrcweir parent, 106cdf0e10cSrcweir (HMENU)0x0, // for child windows this will 107cdf0e10cSrcweir // be used as child window identifier 108cdf0e10cSrcweir m_Instance, 109cdf0e10cSrcweir (LPVOID)this // pass a pointer to the current 110cdf0e10cSrcweir // instance of this class 111cdf0e10cSrcweir ); 112cdf0e10cSrcweir 113cdf0e10cSrcweir bool bSuccess = IsWindow(m_Hwnd); 114cdf0e10cSrcweir 115cdf0e10cSrcweir OSL_POSTCOND(bSuccess,"Coud not create preview window"); 116cdf0e10cSrcweir 117cdf0e10cSrcweir if (!bSuccess) 118cdf0e10cSrcweir { 119cdf0e10cSrcweir UnregisterDibPreviewWindowClass(); 120cdf0e10cSrcweir throw std::runtime_error("Could not create preview window"); 121cdf0e10cSrcweir } 122cdf0e10cSrcweir } 123cdf0e10cSrcweir 124cdf0e10cSrcweir //--------------------------------------------------- 125cdf0e10cSrcweir // 126cdf0e10cSrcweir //--------------------------------------------------- 127cdf0e10cSrcweir 128cdf0e10cSrcweir CDIBPreview::~CDIBPreview( ) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir // remember: we don't have to destroy the 131cdf0e10cSrcweir // preview window because it will be destroyed 132cdf0e10cSrcweir // by it's parent window (the FileOpen dialog) 133cdf0e10cSrcweir // but we have to unregister the window class 134cdf0e10cSrcweir //if ( m_bWndClassRegistered ) 135cdf0e10cSrcweir UnregisterDibPreviewWindowClass(); 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir //------------------------------- 139cdf0e10cSrcweir // 140cdf0e10cSrcweir //------------------------------- 141cdf0e10cSrcweir 142cdf0e10cSrcweir sal_Int32 SAL_CALL CDIBPreview::getTargetColorDepth() throw (RuntimeException) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir HDC hdc = GetDC(m_Hwnd); 145cdf0e10cSrcweir int clrRes = 0; 146cdf0e10cSrcweir 147cdf0e10cSrcweir if (hdc) 148cdf0e10cSrcweir clrRes = GetDeviceCaps(hdc, COLORRES); 149cdf0e10cSrcweir 150cdf0e10cSrcweir return clrRes; 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir //------------------------------- 154cdf0e10cSrcweir // 155cdf0e10cSrcweir //------------------------------- 156cdf0e10cSrcweir 157cdf0e10cSrcweir sal_Int32 SAL_CALL CDIBPreview::getAvailableWidth() throw (RuntimeException) 158cdf0e10cSrcweir { 159cdf0e10cSrcweir RECT rect; 160cdf0e10cSrcweir bool bRet = GetClientRect(m_Hwnd,&rect); 161cdf0e10cSrcweir 162cdf0e10cSrcweir sal_Int32 cx = 0; 163cdf0e10cSrcweir 164cdf0e10cSrcweir if ( bRet ) 165cdf0e10cSrcweir cx = rect.right; 166cdf0e10cSrcweir 167cdf0e10cSrcweir return cx; 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir //------------------------------- 171cdf0e10cSrcweir // 172cdf0e10cSrcweir //------------------------------- 173cdf0e10cSrcweir 174cdf0e10cSrcweir sal_Int32 SAL_CALL CDIBPreview::getAvailableHeight() throw (RuntimeException) 175cdf0e10cSrcweir { 176cdf0e10cSrcweir RECT rect; 177cdf0e10cSrcweir bool bRet = GetClientRect(m_Hwnd,&rect); 178cdf0e10cSrcweir 179cdf0e10cSrcweir sal_Int32 cy = 0; 180cdf0e10cSrcweir 181cdf0e10cSrcweir if ( bRet ) 182cdf0e10cSrcweir cy = rect.bottom; 183cdf0e10cSrcweir 184cdf0e10cSrcweir return cy; 185cdf0e10cSrcweir } 186cdf0e10cSrcweir 187cdf0e10cSrcweir //------------------------------- 188cdf0e10cSrcweir // 189cdf0e10cSrcweir //------------------------------- 190cdf0e10cSrcweir 191cdf0e10cSrcweir void SAL_CALL CDIBPreview::setImage(sal_Int16 aImageFormat, const Any& aImage) 192cdf0e10cSrcweir throw (IllegalArgumentException, RuntimeException) 193cdf0e10cSrcweir { 194cdf0e10cSrcweir PreviewBase::setImage(aImageFormat,aImage); 195cdf0e10cSrcweir 196cdf0e10cSrcweir // if the any has no value we have an 197cdf0e10cSrcweir // empty Sequence which clears the 198cdf0e10cSrcweir // preview window 199cdf0e10cSrcweir osl::ClearableMutexGuard aGuard(m_PaintLock); 200cdf0e10cSrcweir 201cdf0e10cSrcweir m_Image.realloc(0); 202cdf0e10cSrcweir m_ImageData >>= m_Image; 203cdf0e10cSrcweir 204cdf0e10cSrcweir aGuard.clear(); 205cdf0e10cSrcweir 206cdf0e10cSrcweir InvalidateRect(m_Hwnd,NULL,sal_False); 207cdf0e10cSrcweir UpdateWindow(m_Hwnd); 208cdf0e10cSrcweir } 209cdf0e10cSrcweir 210cdf0e10cSrcweir //------------------------------- 211cdf0e10cSrcweir // 212cdf0e10cSrcweir //------------------------------- 213cdf0e10cSrcweir 214cdf0e10cSrcweir sal_Bool SAL_CALL CDIBPreview::setShowState(sal_Bool bShowState) throw (RuntimeException) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir PreviewBase::setShowState(bShowState); 217cdf0e10cSrcweir ShowWindow(m_Hwnd, m_bShowState ? SW_SHOW : SW_HIDE); 218cdf0e10cSrcweir return sal_True; 219cdf0e10cSrcweir } 220cdf0e10cSrcweir 221cdf0e10cSrcweir //------------------------------- 222cdf0e10cSrcweir // 223cdf0e10cSrcweir //------------------------------- 224cdf0e10cSrcweir 225cdf0e10cSrcweir sal_Bool SAL_CALL CDIBPreview::getShowState() throw (RuntimeException) 226cdf0e10cSrcweir { 227cdf0e10cSrcweir return (sal_Bool)IsWindowVisible(m_Hwnd); 228cdf0e10cSrcweir } 229cdf0e10cSrcweir 230cdf0e10cSrcweir //------------------------------- 231cdf0e10cSrcweir // 232cdf0e10cSrcweir //------------------------------- 233cdf0e10cSrcweir 234cdf0e10cSrcweir HWND SAL_CALL CDIBPreview::getWindowHandle() const 235cdf0e10cSrcweir { 236cdf0e10cSrcweir return m_Hwnd; 237cdf0e10cSrcweir } 238cdf0e10cSrcweir 239cdf0e10cSrcweir //--------------------------------------------------- 240cdf0e10cSrcweir // 241cdf0e10cSrcweir //--------------------------------------------------- 242cdf0e10cSrcweir 243cdf0e10cSrcweir void SAL_CALL CDIBPreview::onPaint(HWND hWnd, HDC hDC) 244cdf0e10cSrcweir { 245cdf0e10cSrcweir BITMAPFILEHEADER* pbmfh; 246cdf0e10cSrcweir BITMAPINFO * pbmi; 247cdf0e10cSrcweir sal_uInt8 * pBits; 248cdf0e10cSrcweir int cxDib; 249cdf0e10cSrcweir int cyDib; 250cdf0e10cSrcweir 251cdf0e10cSrcweir osl::MutexGuard aGuard(m_PaintLock); 252cdf0e10cSrcweir 253cdf0e10cSrcweir try 254cdf0e10cSrcweir { 255cdf0e10cSrcweir pbmfh = reinterpret_cast<BITMAPFILEHEADER*>(m_Image.getArray()); 256cdf0e10cSrcweir 257cdf0e10cSrcweir if ( !IsBadReadPtr( pbmfh, sizeof(BITMAPFILEHEADER)) && 258cdf0e10cSrcweir (pbmfh->bfType == ('B' | ('M' << 8))) ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir pbmi = reinterpret_cast<BITMAPINFO*>((pbmfh + 1)); 261cdf0e10cSrcweir pBits = reinterpret_cast<sal_uInt8*>(((DWORD)pbmfh) + pbmfh->bfOffBits); 262cdf0e10cSrcweir 263cdf0e10cSrcweir cxDib = pbmi->bmiHeader.biWidth; 264cdf0e10cSrcweir cyDib = abs (pbmi->bmiHeader.biHeight); 265cdf0e10cSrcweir 266cdf0e10cSrcweir SetStretchBltMode(hDC, COLORONCOLOR); 267cdf0e10cSrcweir 268cdf0e10cSrcweir int nWidth = getAvailableWidth(); 269cdf0e10cSrcweir int nHeight = getAvailableHeight(); 270cdf0e10cSrcweir 271cdf0e10cSrcweir int nX = abs(nWidth - cxDib) / 2; 272cdf0e10cSrcweir int nY = abs(nHeight - cyDib) / 2; 273cdf0e10cSrcweir 274cdf0e10cSrcweir int GDIError = GDI_ERROR; 275cdf0e10cSrcweir GDIError = StretchDIBits( 276cdf0e10cSrcweir hDC, nX, nY, cxDib, cyDib, 277cdf0e10cSrcweir 0, 0, cxDib, cyDib, pBits, pbmi, 278cdf0e10cSrcweir DIB_RGB_COLORS, SRCCOPY); 279cdf0e10cSrcweir 280cdf0e10cSrcweir OSL_ASSERT(GDI_ERROR != GDIError); 281cdf0e10cSrcweir 282cdf0e10cSrcweir // paint the border 283cdf0e10cSrcweir RECT rc; 284cdf0e10cSrcweir 285cdf0e10cSrcweir if (nY > 0) 286cdf0e10cSrcweir { 287cdf0e10cSrcweir // top 288cdf0e10cSrcweir rc.left = 0; 289cdf0e10cSrcweir rc.top = 0; 290cdf0e10cSrcweir rc.right = nWidth; 291cdf0e10cSrcweir rc.bottom = nY; 292cdf0e10cSrcweir FillRect(hDC,&rc,(HBRUSH)(COLOR_INACTIVEBORDER + 1)); 293cdf0e10cSrcweir 294cdf0e10cSrcweir // bottom 295cdf0e10cSrcweir rc.left = 0; 296cdf0e10cSrcweir rc.top = nHeight - nY - 1; 297cdf0e10cSrcweir rc.right = nWidth; 298cdf0e10cSrcweir rc.bottom = nHeight; 299cdf0e10cSrcweir FillRect(hDC,&rc,(HBRUSH)(COLOR_INACTIVEBORDER + 1)); 300cdf0e10cSrcweir } 301cdf0e10cSrcweir 302cdf0e10cSrcweir if (nX > 0) 303cdf0e10cSrcweir { 304cdf0e10cSrcweir // left 305cdf0e10cSrcweir rc.left = 0; 306cdf0e10cSrcweir rc.top = nY; 307cdf0e10cSrcweir rc.right = nX; 308cdf0e10cSrcweir rc.bottom = nHeight - nY; 309cdf0e10cSrcweir FillRect(hDC,&rc,(HBRUSH)(COLOR_INACTIVEBORDER + 1)); 310cdf0e10cSrcweir 311cdf0e10cSrcweir // right 312cdf0e10cSrcweir rc.left = nWidth - nX - 1; 313cdf0e10cSrcweir rc.top = nY; 314cdf0e10cSrcweir rc.right = nWidth; 315cdf0e10cSrcweir rc.bottom = nHeight - nY; 316cdf0e10cSrcweir FillRect(hDC,&rc,(HBRUSH)(COLOR_INACTIVEBORDER + 1)); 317cdf0e10cSrcweir } 318cdf0e10cSrcweir } 319cdf0e10cSrcweir else // clear background 320cdf0e10cSrcweir { 321cdf0e10cSrcweir RECT rc; 322cdf0e10cSrcweir GetClientRect(hWnd,&rc); 323cdf0e10cSrcweir FillRect(hDC,&rc,(HBRUSH)(COLOR_INACTIVEBORDER + 1)); 324cdf0e10cSrcweir } 325cdf0e10cSrcweir } 326cdf0e10cSrcweir catch(...) 327cdf0e10cSrcweir { 328cdf0e10cSrcweir OSL_ASSERT(sal_False); 329cdf0e10cSrcweir } 330cdf0e10cSrcweir } 331cdf0e10cSrcweir 332cdf0e10cSrcweir //--------------------------------------------------- 333cdf0e10cSrcweir // 334cdf0e10cSrcweir //--------------------------------------------------- 335cdf0e10cSrcweir 336cdf0e10cSrcweir LRESULT CALLBACK CDIBPreview::WndProc( 337cdf0e10cSrcweir HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 338cdf0e10cSrcweir { 339cdf0e10cSrcweir LRESULT lResult = 0; 340cdf0e10cSrcweir 341cdf0e10cSrcweir switch(uMsg) 342cdf0e10cSrcweir { 343cdf0e10cSrcweir 344cdf0e10cSrcweir // we connect a pointer to the current instance 345cdf0e10cSrcweir // with a window instance via SetProp 346cdf0e10cSrcweir case WM_CREATE: 347cdf0e10cSrcweir { 348cdf0e10cSrcweir LPCREATESTRUCT lpcs = 349cdf0e10cSrcweir reinterpret_cast< LPCREATESTRUCT >(lParam); 350cdf0e10cSrcweir 351cdf0e10cSrcweir OSL_ASSERT(lpcs->lpCreateParams); 352cdf0e10cSrcweir 353cdf0e10cSrcweir // connect the instance handle to the window 354cdf0e10cSrcweir SetProp(hWnd, CURRENT_INSTANCE, lpcs->lpCreateParams); 355cdf0e10cSrcweir } 356cdf0e10cSrcweir break; 357cdf0e10cSrcweir 358cdf0e10cSrcweir // we remove the window property which connects 359cdf0e10cSrcweir // a class instance with a window class 360cdf0e10cSrcweir case WM_NCDESTROY: 361cdf0e10cSrcweir { 362cdf0e10cSrcweir // RemoveProp returns the saved value on success 363cdf0e10cSrcweir if (reinterpret_cast<CDIBPreview*>( 364cdf0e10cSrcweir RemoveProp(hWnd, CURRENT_INSTANCE)) == NULL) 365cdf0e10cSrcweir { 366cdf0e10cSrcweir OSL_ASSERT(false); 367cdf0e10cSrcweir } 368cdf0e10cSrcweir } 369cdf0e10cSrcweir break; 370cdf0e10cSrcweir 371cdf0e10cSrcweir case WM_PAINT: 372cdf0e10cSrcweir { 373cdf0e10cSrcweir CDIBPreview* pImpl = reinterpret_cast<CDIBPreview*>( 374cdf0e10cSrcweir GetProp(hWnd, CURRENT_INSTANCE)); 375cdf0e10cSrcweir 376cdf0e10cSrcweir OSL_ASSERT(pImpl); 377cdf0e10cSrcweir 378cdf0e10cSrcweir HDC hDC; 379cdf0e10cSrcweir PAINTSTRUCT ps; 380cdf0e10cSrcweir 381cdf0e10cSrcweir hDC = BeginPaint(hWnd,&ps); 382cdf0e10cSrcweir pImpl->onPaint(hWnd,hDC); 383cdf0e10cSrcweir EndPaint(hWnd,&ps); 384cdf0e10cSrcweir } 385cdf0e10cSrcweir break; 386cdf0e10cSrcweir 387cdf0e10cSrcweir // ignore this message in order to 388cdf0e10cSrcweir // avoid flickering during paint 389cdf0e10cSrcweir case WM_ERASEBKGND: 390cdf0e10cSrcweir lResult = 1; 391cdf0e10cSrcweir break; 392cdf0e10cSrcweir 393cdf0e10cSrcweir default: 394cdf0e10cSrcweir return DefWindowProc(hWnd, uMsg, wParam, lParam); 395cdf0e10cSrcweir } 396cdf0e10cSrcweir 397cdf0e10cSrcweir return lResult; 398cdf0e10cSrcweir } 399cdf0e10cSrcweir 400cdf0e10cSrcweir //--------------------------------------------------- 401cdf0e10cSrcweir // 402cdf0e10cSrcweir //--------------------------------------------------- 403cdf0e10cSrcweir 404cdf0e10cSrcweir ATOM SAL_CALL CDIBPreview::RegisterDibPreviewWindowClass() 405cdf0e10cSrcweir { 406cdf0e10cSrcweir osl::MutexGuard aGuard( s_Mutex ); 407cdf0e10cSrcweir 408cdf0e10cSrcweir if (0 == s_ClassAtom) 409cdf0e10cSrcweir { 410cdf0e10cSrcweir // register the preview window class 411cdf0e10cSrcweir WNDCLASSEX wndClsEx; 412cdf0e10cSrcweir ZeroMemory(&wndClsEx, sizeof(wndClsEx)); 413cdf0e10cSrcweir 414cdf0e10cSrcweir wndClsEx.cbSize = sizeof(wndClsEx); 415cdf0e10cSrcweir wndClsEx.style = CS_HREDRAW | CS_VREDRAW; 416cdf0e10cSrcweir wndClsEx.lpfnWndProc = CDIBPreview::WndProc; 417cdf0e10cSrcweir wndClsEx.hInstance = m_Instance; 418cdf0e10cSrcweir wndClsEx.hbrBackground = (HBRUSH)(COLOR_INACTIVEBORDER + 1); 419cdf0e10cSrcweir wndClsEx.lpszClassName = PREVIEWWND_CLASS_NAME; 420cdf0e10cSrcweir 421cdf0e10cSrcweir // register the preview window class 422cdf0e10cSrcweir // !!! Win95 - the window class will be unregistered automaticly 423cdf0e10cSrcweir // if the dll is unloaded 424cdf0e10cSrcweir // Win2000 - the window class must be unregistered manually 425cdf0e10cSrcweir // if the dll is unloaded 426cdf0e10cSrcweir s_ClassAtom = RegisterClassEx(&wndClsEx); 427cdf0e10cSrcweir 428cdf0e10cSrcweir OSL_POSTCOND(s_ClassAtom,"Could not register preview window class"); 429cdf0e10cSrcweir 430cdf0e10cSrcweir if (0 == s_ClassAtom) 431cdf0e10cSrcweir throw std::runtime_error("Preview window class could not be registered"); 432cdf0e10cSrcweir } 433cdf0e10cSrcweir 434cdf0e10cSrcweir // increment the register class counter 435cdf0e10cSrcweir // so that we keep track of the number 436cdf0e10cSrcweir // of class registrations 437cdf0e10cSrcweir //if ( 0 != s_ClassAtom ) 438cdf0e10cSrcweir s_RegisterDibPreviewWndCount++; 439cdf0e10cSrcweir 440cdf0e10cSrcweir return s_ClassAtom; 441cdf0e10cSrcweir } 442cdf0e10cSrcweir 443cdf0e10cSrcweir //--------------------------------------------------- 444cdf0e10cSrcweir // 445cdf0e10cSrcweir //--------------------------------------------------- 446cdf0e10cSrcweir 447cdf0e10cSrcweir void SAL_CALL CDIBPreview::UnregisterDibPreviewWindowClass() 448cdf0e10cSrcweir { 449cdf0e10cSrcweir osl::MutexGuard aGuard( s_Mutex ); 450cdf0e10cSrcweir 451cdf0e10cSrcweir OSL_ASSERT( ( (0 != s_ClassAtom) && (s_RegisterDibPreviewWndCount > 0)) || 452cdf0e10cSrcweir ( (0 == s_ClassAtom) && (0 == s_RegisterDibPreviewWndCount) ) ); 453cdf0e10cSrcweir 454cdf0e10cSrcweir // update the register class counter 455cdf0e10cSrcweir // and unregister the window class if 456cdf0e10cSrcweir // counter drops to zero 457cdf0e10cSrcweir if (0 != s_ClassAtom) 458cdf0e10cSrcweir { 459cdf0e10cSrcweir s_RegisterDibPreviewWndCount--; 460cdf0e10cSrcweir OSL_ASSERT(s_RegisterDibPreviewWndCount >= 0); 461cdf0e10cSrcweir } 462cdf0e10cSrcweir 463cdf0e10cSrcweir if (0 == s_RegisterDibPreviewWndCount) 464cdf0e10cSrcweir { 465cdf0e10cSrcweir UnregisterClass((LPCTSTR)MAKELONG(s_ClassAtom,0),m_Instance); 466cdf0e10cSrcweir s_ClassAtom = 0; 467cdf0e10cSrcweir } 468cdf0e10cSrcweir } 469