1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 #ifndef _HELPPOPUPWINDOW_HXX_
25 #define _HELPPOPUPWINDOW_HXX_
26 
27 //------------------------------------------------------------------------
28 // includes
29 //------------------------------------------------------------------------
30 
31 #include <sal/types.h>
32 #include <rtl/ustring.hxx>
33 #include <osl/mutex.hxx>
34 
35 #define WIN32_LEAN_AND_MEAN
36 #if defined _MSC_VER
37 #pragma warning(push, 1)
38 #endif
39 #include <windows.h>
40 #if defined _MSC_VER
41 #pragma warning(pop)
42 #endif
43 
44 //---------------------------------------------
45 // declaration
46 //---------------------------------------------
47 
48 /*
49     A simple popup window similary to the one the
50     windows help (using WinHelp) creates when called
51     with the option HELP_CONTEXTPOPUP.
52 
53     The interface is very simple but necessary for our
54     needs.
55     The window automaticaly calculates the necessary
56     dimensions of the window and a appropriate show
57     position based on the position the client provides.
58     When the user click any mouse button or hits any key
59     the window closes itself and disappears.
60 */
61 
62 class CHelpPopupWindow
63 {
64 public:
65 
66     /*
67         The client may set some parameter of the window.
68         When the client omits to set one or more values
69         a default value will be taken.
70         The values are in pixel.
71     */
72     CHelpPopupWindow(
73         HINSTANCE hInstance,
74         HWND hwndParent );
75 
76     /*
77         dtor
78     */
79     ~CHelpPopupWindow( );
80 
81     /*
82         The client may set the text the window is showing
83         on next activation.
84     */
85     void SAL_CALL setText( const rtl::OUString& aHelpText );
86 
87     /*
88         Shows the window with the text that was last set.
89         The position is the preferred position. The window
90         may itself show at a slightly different position
91         if it fits not at the preferred position.
92     */
93     void SAL_CALL show( sal_Int32 x, sal_Int32 y );
94 
95     HWND SAL_CALL setParent( HWND hwndNewParent );
96 
97 private:
98     void SAL_CALL onPaint( HWND, HDC );
99     void SAL_CALL onNcDestroy();
100     void SAL_CALL onCreate( HWND );
101 
102     POINT SAL_CALL calcUpperLeftCorner( );
103     void  SAL_CALL calcWindowRect( LPRECT lprect );
104 
105     void SAL_CALL adjustWindowSize( sal_Int32*, sal_Int32* );
106     void SAL_CALL adjustWindowPos( sal_Int32 x, sal_Int32 y, sal_Int32 cx, sal_Int32 cy );
107 
108     ATOM SAL_CALL RegisterWindowClass( );
109     void SAL_CALL UnregisterWindowClass( );
110 
111     static LRESULT CALLBACK WndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
112 
113 private:
114     sal_Int32       m_hMargins;
115     sal_Int32       m_vMargins;
116     sal_Int32       m_avCharWidth;
117     sal_Int32       m_avCharHeight;
118     HWND		    m_hwnd;
119     HWND            m_hwndParent;
120 	HINSTANCE	    m_hInstance;
121     sal_Bool        m_bWndClassRegistered;
122     ::rtl::OUString m_HelpText;
123     HBITMAP         m_hBitmapShadow;
124     HBRUSH          m_hBrushShadow;
125 
126     // the window class has to be registered only
127     // once per process, so multiple instance of this class
128     // share the registered window class
129     static ATOM       s_ClassAtom;
130     static osl::Mutex s_Mutex;
131     static sal_Int32  s_RegisterWndClassCount;
132 
133 // prevent copy and assignment
134 private:
135     CHelpPopupWindow( const CHelpPopupWindow& );
136     CHelpPopupWindow& operator=( const CHelpPopupWindow& );
137 };
138 
139 #endif
140