xref: /trunk/main/vcl/source/window/msgbox.cxx (revision 9f62ea84a806e17e6f2bbff75724a7257a0eb5d9)
1*9f62ea84SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*9f62ea84SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*9f62ea84SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*9f62ea84SAndrew Rist  * distributed with this work for additional information
6*9f62ea84SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*9f62ea84SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*9f62ea84SAndrew Rist  * "License"); you may not use this file except in compliance
9*9f62ea84SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*9f62ea84SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*9f62ea84SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*9f62ea84SAndrew Rist  * software distributed under the License is distributed on an
15*9f62ea84SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*9f62ea84SAndrew Rist  * KIND, either express or implied.  See the License for the
17*9f62ea84SAndrew Rist  * specific language governing permissions and limitations
18*9f62ea84SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*9f62ea84SAndrew Rist  *************************************************************/
21*9f62ea84SAndrew Rist 
22*9f62ea84SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_vcl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <tools/rc.h>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <svids.hrc>
30cdf0e10cSrcweir #include <svdata.hxx>
31cdf0e10cSrcweir #include <brdwin.hxx>
32cdf0e10cSrcweir #include <window.h>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <vcl/metric.hxx>
35cdf0e10cSrcweir #include <vcl/svapp.hxx>
36cdf0e10cSrcweir #include <vcl/wrkwin.hxx>
37cdf0e10cSrcweir #include <vcl/fixed.hxx>
38cdf0e10cSrcweir #include <vcl/sound.hxx>
39cdf0e10cSrcweir #include <vcl/msgbox.hxx>
40cdf0e10cSrcweir #include <vcl/button.hxx>
41cdf0e10cSrcweir #include <vcl/mnemonic.hxx>
42cdf0e10cSrcweir 
43cdf0e10cSrcweir 
44cdf0e10cSrcweir 
45cdf0e10cSrcweir // =======================================================================
46cdf0e10cSrcweir 
47cdf0e10cSrcweir static void ImplInitMsgBoxImageList()
48cdf0e10cSrcweir {
49cdf0e10cSrcweir     ImplSVData* pSVData = ImplGetSVData();
50cdf0e10cSrcweir     if ( !pSVData->maWinData.mpMsgBoxImgList )
51cdf0e10cSrcweir     {
52cdf0e10cSrcweir         ResMgr* pResMgr = ImplGetResMgr();
53cdf0e10cSrcweir         pSVData->maWinData.mpMsgBoxImgList = new ImageList(4);
54cdf0e10cSrcweir         pSVData->maWinData.mpMsgBoxHCImgList = new ImageList(4);
55cdf0e10cSrcweir         if( pResMgr )
56cdf0e10cSrcweir         {
57cdf0e10cSrcweir             Color aNonAlphaMask( 0xC0, 0xC0, 0xC0 );
58cdf0e10cSrcweir             pSVData->maWinData.mpMsgBoxImgList->InsertFromHorizontalBitmap
59cdf0e10cSrcweir                 ( ResId( SV_RESID_BITMAP_MSGBOX, *pResMgr ), 4, &aNonAlphaMask );
60cdf0e10cSrcweir             pSVData->maWinData.mpMsgBoxHCImgList->InsertFromHorizontalBitmap
61cdf0e10cSrcweir                 ( ResId( SV_RESID_BITMAP_MSGBOX_HC, *pResMgr ), 4, &aNonAlphaMask );
62cdf0e10cSrcweir         }
63cdf0e10cSrcweir     }
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
66cdf0e10cSrcweir // =======================================================================
67cdf0e10cSrcweir 
68cdf0e10cSrcweir void MessBox::ImplInitMessBoxData()
69cdf0e10cSrcweir {
70cdf0e10cSrcweir     mpFixedText         = NULL;
71cdf0e10cSrcweir     mpFixedImage        = NULL;
72cdf0e10cSrcweir     mnSoundType         = 0;
73cdf0e10cSrcweir     mbHelpBtn           = sal_False;
74cdf0e10cSrcweir     mbSound             = sal_True;
75cdf0e10cSrcweir     mpCheckBox          = NULL;
76cdf0e10cSrcweir     mbCheck             = sal_False;
77cdf0e10cSrcweir }
78cdf0e10cSrcweir 
79cdf0e10cSrcweir // -----------------------------------------------------------------------
80cdf0e10cSrcweir 
81cdf0e10cSrcweir void MessBox::ImplInitButtons()
82cdf0e10cSrcweir {
83cdf0e10cSrcweir     WinBits nStyle = GetStyle();
84cdf0e10cSrcweir     sal_uInt16  nOKFlags = BUTTONDIALOG_OKBUTTON;
85cdf0e10cSrcweir     sal_uInt16  nCancelFlags = BUTTONDIALOG_CANCELBUTTON;
86cdf0e10cSrcweir     sal_uInt16  nRetryFlags = 0;
87cdf0e10cSrcweir     sal_uInt16  nYesFlags = 0;
88cdf0e10cSrcweir     sal_uInt16  nNoFlags = 0;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir     if ( nStyle & WB_OK_CANCEL )
91cdf0e10cSrcweir     {
92cdf0e10cSrcweir         if ( nStyle & WB_DEF_CANCEL )
93cdf0e10cSrcweir             nCancelFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
94cdf0e10cSrcweir         else // WB_DEF_OK
95cdf0e10cSrcweir             nOKFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
96cdf0e10cSrcweir 
97cdf0e10cSrcweir         AddButton( BUTTON_OK, BUTTONID_OK, nOKFlags );
98cdf0e10cSrcweir         AddButton( BUTTON_CANCEL, BUTTONID_CANCEL, nCancelFlags );
99cdf0e10cSrcweir     }
100cdf0e10cSrcweir     else if ( nStyle & WB_YES_NO )
101cdf0e10cSrcweir     {
102cdf0e10cSrcweir         if ( nStyle & WB_DEF_YES )
103cdf0e10cSrcweir             nYesFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
104cdf0e10cSrcweir         else // WB_DEF_NO
105cdf0e10cSrcweir             nNoFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
106cdf0e10cSrcweir         nNoFlags |= BUTTONDIALOG_CANCELBUTTON;
107cdf0e10cSrcweir 
108cdf0e10cSrcweir         AddButton( BUTTON_YES, BUTTONID_YES, nYesFlags );
109cdf0e10cSrcweir         AddButton( BUTTON_NO, BUTTONID_NO, nNoFlags );
110cdf0e10cSrcweir     }
111cdf0e10cSrcweir     else if ( nStyle & WB_YES_NO_CANCEL )
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         if ( nStyle & WB_DEF_YES )
114cdf0e10cSrcweir             nYesFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
115cdf0e10cSrcweir         else if ( nStyle & WB_DEF_NO )
116cdf0e10cSrcweir             nNoFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
117cdf0e10cSrcweir         else
118cdf0e10cSrcweir             nCancelFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
119cdf0e10cSrcweir 
120cdf0e10cSrcweir         AddButton( BUTTON_YES, BUTTONID_YES, nYesFlags );
121cdf0e10cSrcweir         AddButton( BUTTON_NO, BUTTONID_NO, nNoFlags );
122cdf0e10cSrcweir         AddButton( BUTTON_CANCEL, BUTTONID_CANCEL, nCancelFlags );
123cdf0e10cSrcweir     }
124cdf0e10cSrcweir     else if ( nStyle & WB_RETRY_CANCEL )
125cdf0e10cSrcweir     {
126cdf0e10cSrcweir         if ( nStyle & WB_DEF_CANCEL )
127cdf0e10cSrcweir             nCancelFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
128cdf0e10cSrcweir         else // WB_DEF_RETRY
129cdf0e10cSrcweir             nRetryFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
130cdf0e10cSrcweir 
131cdf0e10cSrcweir         AddButton( BUTTON_RETRY, BUTTONID_RETRY, nRetryFlags );
132cdf0e10cSrcweir         AddButton( BUTTON_CANCEL, BUTTONID_CANCEL, nCancelFlags );
133cdf0e10cSrcweir     }
134cdf0e10cSrcweir     else if ( nStyle & WB_ABORT_RETRY_IGNORE )
135cdf0e10cSrcweir     {
136cdf0e10cSrcweir         sal_uInt16 nAbortFlags = 0;
137cdf0e10cSrcweir         sal_uInt16 nIgnoreFlags = 0;
138cdf0e10cSrcweir 
139cdf0e10cSrcweir         if ( nStyle & WB_DEF_CANCEL )
140cdf0e10cSrcweir             nAbortFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
141cdf0e10cSrcweir         else if ( nStyle & WB_DEF_RETRY )
142cdf0e10cSrcweir             nRetryFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
143cdf0e10cSrcweir         else if ( nStyle & WB_DEF_IGNORE )
144cdf0e10cSrcweir             nIgnoreFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
145cdf0e10cSrcweir 
146cdf0e10cSrcweir         AddButton( BUTTON_ABORT, BUTTONID_CANCEL, nAbortFlags );
147cdf0e10cSrcweir         AddButton( BUTTON_RETRY, BUTTONID_RETRY, nRetryFlags );
148cdf0e10cSrcweir         AddButton( BUTTON_IGNORE, BUTTONID_IGNORE, nIgnoreFlags );
149cdf0e10cSrcweir     }
150cdf0e10cSrcweir     else if ( nStyle & WB_OK )
151cdf0e10cSrcweir     {
152cdf0e10cSrcweir         nOKFlags |= BUTTONDIALOG_DEFBUTTON | BUTTONDIALOG_FOCUSBUTTON;
153cdf0e10cSrcweir 
154cdf0e10cSrcweir         AddButton( BUTTON_OK, BUTTONID_OK, nOKFlags );
155cdf0e10cSrcweir     }
156cdf0e10cSrcweir }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir // -----------------------------------------------------------------------
159cdf0e10cSrcweir 
160cdf0e10cSrcweir MessBox::MessBox( WindowType ) :
161cdf0e10cSrcweir     ButtonDialog( WINDOW_MESSBOX )
162cdf0e10cSrcweir {
163cdf0e10cSrcweir     ImplInitMessBoxData();
164cdf0e10cSrcweir }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir // -----------------------------------------------------------------------
167cdf0e10cSrcweir 
168cdf0e10cSrcweir MessBox::MessBox( Window* pParent, WinBits nStyle,
169cdf0e10cSrcweir                   const XubString& rTitle, const XubString& rMessage ) :
170cdf0e10cSrcweir     ButtonDialog( WINDOW_MESSBOX ),
171cdf0e10cSrcweir     maMessText( rMessage )
172cdf0e10cSrcweir {
173cdf0e10cSrcweir     ImplInitMessBoxData();
174cdf0e10cSrcweir     ImplInit( pParent, nStyle | WB_MOVEABLE | WB_HORZ | WB_CENTER );
175cdf0e10cSrcweir     ImplInitButtons();
176cdf0e10cSrcweir 
177cdf0e10cSrcweir     if ( rTitle.Len() )
178cdf0e10cSrcweir         SetText( rTitle );
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir // -----------------------------------------------------------------------
182cdf0e10cSrcweir 
183cdf0e10cSrcweir MessBox::MessBox( Window* pParent, const ResId& rResId ) :
184cdf0e10cSrcweir     ButtonDialog( WINDOW_MESSBOX )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir     ImplInitMessBoxData();
187cdf0e10cSrcweir 
188cdf0e10cSrcweir     GetRes( rResId.SetRT( RSC_MESSBOX ) );
189cdf0e10cSrcweir     sal_uInt16 nHiButtons   = ReadShortRes();
190cdf0e10cSrcweir     sal_uInt16 nLoButtons   = ReadShortRes();
191cdf0e10cSrcweir     sal_uInt16 nHiDefButton = ReadShortRes();
192cdf0e10cSrcweir     sal_uInt16 nLoDefButton = ReadShortRes();
193cdf0e10cSrcweir     rtl::OString aHelpId( ReadByteStringRes() );
194cdf0e10cSrcweir     /* sal_uInt16 bSysModal = */ ReadShortRes();
195cdf0e10cSrcweir     SetHelpId( aHelpId );
196cdf0e10cSrcweir     WinBits nBits = (((sal_uLong)nHiButtons << 16) + nLoButtons) |
197cdf0e10cSrcweir                     (((sal_uLong)nHiDefButton << 16) + nLoDefButton);
198cdf0e10cSrcweir     ImplInit( pParent, nBits | WB_MOVEABLE | WB_HORZ | WB_CENTER );
199cdf0e10cSrcweir 
200cdf0e10cSrcweir     ImplLoadRes( rResId );
201cdf0e10cSrcweir     ImplInitButtons();
202cdf0e10cSrcweir }
203cdf0e10cSrcweir 
204cdf0e10cSrcweir // -----------------------------------------------------------------------
205cdf0e10cSrcweir 
206cdf0e10cSrcweir void MessBox::ImplLoadRes( const ResId& )
207cdf0e10cSrcweir {
208cdf0e10cSrcweir     SetText( ReadStringRes() );
209cdf0e10cSrcweir     SetMessText( ReadStringRes() );
210cdf0e10cSrcweir     SetHelpText( ReadStringRes() );
211cdf0e10cSrcweir }
212cdf0e10cSrcweir 
213cdf0e10cSrcweir // -----------------------------------------------------------------------
214cdf0e10cSrcweir 
215cdf0e10cSrcweir MessBox::~MessBox()
216cdf0e10cSrcweir {
217cdf0e10cSrcweir     if ( mpFixedText )
218cdf0e10cSrcweir         delete mpFixedText;
219cdf0e10cSrcweir     if ( mpFixedImage )
220cdf0e10cSrcweir         delete mpFixedImage;
221cdf0e10cSrcweir     if ( mpCheckBox )
222cdf0e10cSrcweir         delete mpCheckBox;
223cdf0e10cSrcweir }
224cdf0e10cSrcweir 
225cdf0e10cSrcweir // -----------------------------------------------------------------------
226cdf0e10cSrcweir 
227cdf0e10cSrcweir void MessBox::ImplPosControls()
228cdf0e10cSrcweir {
229cdf0e10cSrcweir     if ( GetHelpId().getLength() )
230cdf0e10cSrcweir     {
231cdf0e10cSrcweir         if ( !mbHelpBtn )
232cdf0e10cSrcweir         {
233cdf0e10cSrcweir             AddButton( BUTTON_HELP, BUTTONID_HELP, BUTTONDIALOG_HELPBUTTON, 3 );
234cdf0e10cSrcweir             mbHelpBtn = sal_True;
235cdf0e10cSrcweir         }
236cdf0e10cSrcweir     }
237cdf0e10cSrcweir     else
238cdf0e10cSrcweir     {
239cdf0e10cSrcweir         if ( mbHelpBtn )
240cdf0e10cSrcweir         {
241cdf0e10cSrcweir             RemoveButton( BUTTONID_HELP );
242cdf0e10cSrcweir             mbHelpBtn = sal_False;
243cdf0e10cSrcweir         }
244cdf0e10cSrcweir     }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     XubString       aMessText( maMessText );
247cdf0e10cSrcweir     TextRectInfo    aTextInfo;
248cdf0e10cSrcweir     Rectangle       aRect( 0, 0, 30000, 30000 );
249cdf0e10cSrcweir     Rectangle       aFormatRect;
250cdf0e10cSrcweir     Point           aTextPos( IMPL_DIALOG_OFFSET, IMPL_DIALOG_OFFSET+IMPL_MSGBOX_OFFSET_EXTRA_Y );
251cdf0e10cSrcweir     Size            aImageSize;
252cdf0e10cSrcweir     Size            aPageSize;
253cdf0e10cSrcweir     Size            aFixedSize;
254cdf0e10cSrcweir     long            nTitleWidth;
255cdf0e10cSrcweir     long            nButtonSize = ImplGetButtonSize();
256cdf0e10cSrcweir     long            nMaxWidth = GetDesktopRectPixel().GetWidth()-8;
257cdf0e10cSrcweir     long            nMaxLineWidth;
258cdf0e10cSrcweir     long            nWidth;
259cdf0e10cSrcweir     WinBits         nWinStyle = WB_LEFT | WB_WORDBREAK | WB_NOLABEL | WB_INFO;
260cdf0e10cSrcweir     sal_uInt16          nTextStyle = TEXT_DRAW_MULTILINE | TEXT_DRAW_TOP | TEXT_DRAW_LEFT;
261cdf0e10cSrcweir 
262cdf0e10cSrcweir     if ( mpFixedText )
263cdf0e10cSrcweir         delete mpFixedText;
264cdf0e10cSrcweir     if ( mpFixedImage )
265cdf0e10cSrcweir     {
266cdf0e10cSrcweir         delete mpFixedImage;
267cdf0e10cSrcweir         mpFixedImage = NULL;
268cdf0e10cSrcweir     }
269cdf0e10cSrcweir     if ( mpCheckBox )
270cdf0e10cSrcweir     {
271cdf0e10cSrcweir         mbCheck = mpCheckBox->IsChecked();
272cdf0e10cSrcweir         delete mpCheckBox;
273cdf0e10cSrcweir         mpCheckBox = NULL;
274cdf0e10cSrcweir     }
275cdf0e10cSrcweir 
276cdf0e10cSrcweir 
277cdf0e10cSrcweir     // Message-Text um Tabs bereinigen
278cdf0e10cSrcweir     XubString   aTabStr( RTL_CONSTASCII_USTRINGPARAM( "    " ) );
279cdf0e10cSrcweir     sal_uInt16      nIndex = 0;
280cdf0e10cSrcweir     while ( nIndex != STRING_NOTFOUND )
281cdf0e10cSrcweir         nIndex = aMessText.SearchAndReplace( '\t', aTabStr, nIndex );
282cdf0e10cSrcweir 
283cdf0e10cSrcweir     // Wenn Fenster zu schmall, machen wir Dialog auch breiter
284cdf0e10cSrcweir     if ( mpWindowImpl->mbFrame )
285cdf0e10cSrcweir         nMaxWidth = 630;
286cdf0e10cSrcweir     else if ( nMaxWidth < 120 )
287cdf0e10cSrcweir         nMaxWidth = 120;
288cdf0e10cSrcweir 
289cdf0e10cSrcweir     nMaxWidth -= mpWindowImpl->mnLeftBorder+mpWindowImpl->mnRightBorder+4;
290cdf0e10cSrcweir 
291cdf0e10cSrcweir     // MessageBox sollte min. so breit sein, das auch Title sichtbar ist
292cdf0e10cSrcweir     // Extra-Width for Closer, because Closer is set after this call
293cdf0e10cSrcweir     nTitleWidth = CalcTitleWidth();
294cdf0e10cSrcweir     nTitleWidth += mpWindowImpl->mnTopBorder;
295cdf0e10cSrcweir 
296cdf0e10cSrcweir     nMaxWidth -= (IMPL_DIALOG_OFFSET*2)+(IMPL_MSGBOX_OFFSET_EXTRA_X*2);
297cdf0e10cSrcweir 
298cdf0e10cSrcweir     // Wenn wir ein Image haben, dann deren Groesse ermitteln und das
299cdf0e10cSrcweir     // entsprechende Control anlegen und positionieren
300cdf0e10cSrcweir     aImageSize = maImage.GetSizePixel();
301cdf0e10cSrcweir     if ( aImageSize.Width() )
302cdf0e10cSrcweir     {
303cdf0e10cSrcweir         aImageSize.Width()  += 4;
304cdf0e10cSrcweir         aImageSize.Height() += 4;
305cdf0e10cSrcweir         aTextPos.X() += aImageSize.Width()+IMPL_SEP_MSGBOX_IMAGE;
306cdf0e10cSrcweir         mpFixedImage = new FixedImage( this );
307cdf0e10cSrcweir         mpFixedImage->SetPosSizePixel( Point( IMPL_DIALOG_OFFSET-2+IMPL_MSGBOX_OFFSET_EXTRA_X,
308cdf0e10cSrcweir                                               IMPL_DIALOG_OFFSET-2+IMPL_MSGBOX_OFFSET_EXTRA_Y ),
309cdf0e10cSrcweir                                        aImageSize );
310cdf0e10cSrcweir         mpFixedImage->SetImage( maImage );
311cdf0e10cSrcweir         // forward the HC image
312cdf0e10cSrcweir         if( !!maImageHC )
313cdf0e10cSrcweir             mpFixedImage->SetModeImage( maImageHC, BMP_COLOR_HIGHCONTRAST );
314cdf0e10cSrcweir         mpFixedImage->Show();
315cdf0e10cSrcweir         nMaxWidth -= aImageSize.Width()+IMPL_SEP_MSGBOX_IMAGE;
316cdf0e10cSrcweir     }
317cdf0e10cSrcweir     else
318cdf0e10cSrcweir         aTextPos.X() += IMPL_MSGBOX_OFFSET_EXTRA_X;
319cdf0e10cSrcweir 
320cdf0e10cSrcweir     // Maximale Zeilenlaenge ohne Wordbreak ermitteln
321cdf0e10cSrcweir     aFormatRect = GetTextRect( aRect, aMessText, nTextStyle, &aTextInfo );
322cdf0e10cSrcweir     nMaxLineWidth = aFormatRect.GetWidth();
323cdf0e10cSrcweir     nTextStyle |= TEXT_DRAW_WORDBREAK;
324cdf0e10cSrcweir 
325cdf0e10cSrcweir     // Breite fuer Textformatierung ermitteln
326cdf0e10cSrcweir     if ( nMaxLineWidth > 450 )
327cdf0e10cSrcweir         nWidth = 450;
328cdf0e10cSrcweir     else if ( nMaxLineWidth > 300 )
329cdf0e10cSrcweir         nWidth = nMaxLineWidth+5;
330cdf0e10cSrcweir     else
331cdf0e10cSrcweir         nWidth = 300;
332cdf0e10cSrcweir     if ( nButtonSize > nWidth )
333cdf0e10cSrcweir         nWidth = nButtonSize-(aTextPos.X()-IMPL_DIALOG_OFFSET);
334cdf0e10cSrcweir     if ( nWidth > nMaxWidth )
335cdf0e10cSrcweir         nWidth = nMaxWidth;
336cdf0e10cSrcweir 
337cdf0e10cSrcweir     aRect.Right() = nWidth;
338cdf0e10cSrcweir     aFormatRect = GetTextRect( aRect, aMessText, nTextStyle, &aTextInfo );
339cdf0e10cSrcweir     if ( aTextInfo.GetMaxLineWidth() > nWidth )
340cdf0e10cSrcweir     {
341cdf0e10cSrcweir         nWidth = aTextInfo.GetMaxLineWidth()+8;
342cdf0e10cSrcweir         aRect.Right() = nWidth;
343cdf0e10cSrcweir         aFormatRect = GetTextRect( aRect, aMessText, nTextStyle, &aTextInfo );
344cdf0e10cSrcweir     }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir     // Style fuer FixedText ermitteln
347cdf0e10cSrcweir     aPageSize.Width()   = aImageSize.Width();
348cdf0e10cSrcweir     aFixedSize.Width()  = aTextInfo.GetMaxLineWidth()+1;
349cdf0e10cSrcweir     aFixedSize.Height() = aFormatRect.GetHeight();
350cdf0e10cSrcweir     if ( aFixedSize.Height() < aImageSize.Height() )
351cdf0e10cSrcweir     {
352cdf0e10cSrcweir         nWinStyle |= WB_VCENTER;
353cdf0e10cSrcweir         aPageSize.Height()  = aImageSize.Height();
354cdf0e10cSrcweir         aFixedSize.Height() = aImageSize.Height();
355cdf0e10cSrcweir     }
356cdf0e10cSrcweir     else
357cdf0e10cSrcweir     {
358cdf0e10cSrcweir         nWinStyle |= WB_TOP;
359cdf0e10cSrcweir         aPageSize.Height()  = aFixedSize.Height();
360cdf0e10cSrcweir     }
361cdf0e10cSrcweir     if ( aImageSize.Width() )
362cdf0e10cSrcweir         aPageSize.Width() += IMPL_SEP_MSGBOX_IMAGE;
363cdf0e10cSrcweir     aPageSize.Width()  += (IMPL_DIALOG_OFFSET*2)+(IMPL_MSGBOX_OFFSET_EXTRA_X*2);
364cdf0e10cSrcweir     aPageSize.Width()  += aFixedSize.Width()+1;
365cdf0e10cSrcweir     aPageSize.Height() += (IMPL_DIALOG_OFFSET*2)+(IMPL_MSGBOX_OFFSET_EXTRA_Y*2);
366cdf0e10cSrcweir 
367cdf0e10cSrcweir     if ( aPageSize.Width() < IMPL_MINSIZE_MSGBOX_WIDTH )
368cdf0e10cSrcweir         aPageSize.Width() = IMPL_MINSIZE_MSGBOX_WIDTH;
369cdf0e10cSrcweir     if ( aPageSize.Width() < nTitleWidth )
370cdf0e10cSrcweir         aPageSize.Width() = nTitleWidth;
371cdf0e10cSrcweir 
372cdf0e10cSrcweir     if ( maCheckBoxText.Len() )
373cdf0e10cSrcweir     {
374cdf0e10cSrcweir         Size aMinCheckboxSize ( aFixedSize );
375cdf0e10cSrcweir         if ( aPageSize.Width() < IMPL_MINSIZE_MSGBOX_WIDTH+80 )
376cdf0e10cSrcweir         {
377cdf0e10cSrcweir             aPageSize.Width() = IMPL_MINSIZE_MSGBOX_WIDTH+80;
378cdf0e10cSrcweir             aMinCheckboxSize.Width() += 80;
379cdf0e10cSrcweir         }
380cdf0e10cSrcweir 
381cdf0e10cSrcweir         // #104492# auto mnemonics for CJK strings may increase the length, so measure the
382cdf0e10cSrcweir         // checkbox length including a temporary mnemonic, the correct auto mnemonic will be
383cdf0e10cSrcweir         // generated later in the dialog (see init_show)
384cdf0e10cSrcweir 
385cdf0e10cSrcweir         String aMnemonicString( maCheckBoxText );
386cdf0e10cSrcweir         if( GetSettings().GetStyleSettings().GetAutoMnemonic() )
387cdf0e10cSrcweir         {
388cdf0e10cSrcweir             if( aMnemonicString == GetNonMnemonicString( maCheckBoxText ) )
389cdf0e10cSrcweir             {
390cdf0e10cSrcweir                 // no mnemonic found -> create one
391cdf0e10cSrcweir                 MnemonicGenerator aMnemonicGenerator;
392cdf0e10cSrcweir                 aMnemonicGenerator.CreateMnemonic( aMnemonicString );
393cdf0e10cSrcweir             }
394cdf0e10cSrcweir         }
395cdf0e10cSrcweir 
396cdf0e10cSrcweir         mpCheckBox = new CheckBox( this );
397cdf0e10cSrcweir         mpCheckBox->Check( mbCheck );
398cdf0e10cSrcweir         mpCheckBox->SetText( aMnemonicString );
399cdf0e10cSrcweir         mpCheckBox->SetStyle( mpCheckBox->GetStyle() | WB_WORDBREAK );
400cdf0e10cSrcweir         mpCheckBox->SetHelpId( GetHelpId() );   // DR: Check box and dialog have same HID
401cdf0e10cSrcweir 
402cdf0e10cSrcweir         // align checkbox with message text
403cdf0e10cSrcweir         Size aSize = mpCheckBox->CalcMinimumSize( aMinCheckboxSize.Width() );
404cdf0e10cSrcweir 
405cdf0e10cSrcweir         // now set the original non-mnemonic string
406cdf0e10cSrcweir         mpCheckBox->SetText( maCheckBoxText );
407cdf0e10cSrcweir 
408cdf0e10cSrcweir         Point aPos( aTextPos );
409cdf0e10cSrcweir         aPos.Y() += aFixedSize.Height() + (IMPL_DIALOG_OFFSET)+(IMPL_MSGBOX_OFFSET_EXTRA_Y*2);
410cdf0e10cSrcweir 
411cdf0e10cSrcweir         // increase messagebox
412cdf0e10cSrcweir         aPageSize.Height() += aSize.Height() + (IMPL_DIALOG_OFFSET*2)+(IMPL_MSGBOX_OFFSET_EXTRA_Y*2);
413cdf0e10cSrcweir 
414cdf0e10cSrcweir         mpCheckBox->SetPosSizePixel( aPos, aSize );
415cdf0e10cSrcweir         mpCheckBox->Show();
416cdf0e10cSrcweir     }
417cdf0e10cSrcweir 
418cdf0e10cSrcweir     mpFixedText = new FixedText( this, nWinStyle );
419cdf0e10cSrcweir     if( mpFixedText->GetStyle() & WB_EXTRAOFFSET ) // TODO: use CalcMinimumSize() instead
420cdf0e10cSrcweir         aFixedSize.Width() += 2;
421cdf0e10cSrcweir     mpFixedText->SetPosSizePixel( aTextPos, aFixedSize );
422cdf0e10cSrcweir     mpFixedText->SetText( aMessText );
423cdf0e10cSrcweir     mpFixedText->Show();
424cdf0e10cSrcweir     SetPageSizePixel( aPageSize );
425cdf0e10cSrcweir }
426cdf0e10cSrcweir 
427cdf0e10cSrcweir // -----------------------------------------------------------------------
428cdf0e10cSrcweir 
429cdf0e10cSrcweir void MessBox::StateChanged( StateChangedType nType )
430cdf0e10cSrcweir {
431cdf0e10cSrcweir     if ( nType == STATE_CHANGE_INITSHOW )
432cdf0e10cSrcweir     {
433cdf0e10cSrcweir         ImplPosControls();
434cdf0e10cSrcweir         if ( mbSound && mnSoundType )
435cdf0e10cSrcweir             Sound::Beep( (SoundType)(mnSoundType-1), this );
436cdf0e10cSrcweir     }
437cdf0e10cSrcweir     ButtonDialog::StateChanged( nType );
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
440cdf0e10cSrcweir // -----------------------------------------------------------------------
441cdf0e10cSrcweir 
442cdf0e10cSrcweir sal_Bool MessBox::GetCheckBoxState() const
443cdf0e10cSrcweir {
444cdf0e10cSrcweir     return mpCheckBox ? mpCheckBox->IsChecked() : mbCheck;
445cdf0e10cSrcweir }
446cdf0e10cSrcweir 
447cdf0e10cSrcweir // -----------------------------------------------------------------------
448cdf0e10cSrcweir 
449cdf0e10cSrcweir void MessBox::SetCheckBoxState( sal_Bool bCheck )
450cdf0e10cSrcweir {
451cdf0e10cSrcweir     if( mpCheckBox ) mpCheckBox->Check( bCheck );
452cdf0e10cSrcweir     mbCheck = bCheck;
453cdf0e10cSrcweir }
454cdf0e10cSrcweir 
455cdf0e10cSrcweir // -----------------------------------------------------------------------
456cdf0e10cSrcweir 
457cdf0e10cSrcweir void MessBox::SetDefaultCheckBoxText()
458cdf0e10cSrcweir {
459cdf0e10cSrcweir     ResMgr* pResMgr = ImplGetResMgr();
460cdf0e10cSrcweir     if( pResMgr )
461cdf0e10cSrcweir         maCheckBoxText = XubString( ResId( SV_STDTEXT_DONTHINTAGAIN, *pResMgr ) );
462cdf0e10cSrcweir }
463cdf0e10cSrcweir 
464cdf0e10cSrcweir // -----------------------------------------------------------------------
465cdf0e10cSrcweir 
466cdf0e10cSrcweir sal_Bool MessBox::SetModeImage( const Image& rImage, BmpColorMode eMode )
467cdf0e10cSrcweir {
468cdf0e10cSrcweir     if( eMode == BMP_COLOR_NORMAL )
469cdf0e10cSrcweir         SetImage( rImage );
470cdf0e10cSrcweir     else if( eMode == BMP_COLOR_HIGHCONTRAST )
471cdf0e10cSrcweir         maImageHC = rImage;
472cdf0e10cSrcweir     else
473cdf0e10cSrcweir         return sal_False;
474cdf0e10cSrcweir     return sal_True;
475cdf0e10cSrcweir }
476cdf0e10cSrcweir 
477cdf0e10cSrcweir // -----------------------------------------------------------------------
478cdf0e10cSrcweir 
479cdf0e10cSrcweir const Image& MessBox::GetModeImage( BmpColorMode eMode ) const
480cdf0e10cSrcweir {
481cdf0e10cSrcweir     if( eMode == BMP_COLOR_HIGHCONTRAST )
482cdf0e10cSrcweir         return maImageHC;
483cdf0e10cSrcweir     else
484cdf0e10cSrcweir         return maImage;
485cdf0e10cSrcweir }
486cdf0e10cSrcweir 
487cdf0e10cSrcweir // -----------------------------------------------------------------------
488cdf0e10cSrcweir 
489cdf0e10cSrcweir void InfoBox::ImplInitInfoBoxData()
490cdf0e10cSrcweir {
491cdf0e10cSrcweir     // Default Text is the display title from the application
492cdf0e10cSrcweir     if ( !GetText().Len() )
493cdf0e10cSrcweir         SetText( Application::GetDisplayName() );
494cdf0e10cSrcweir 
495cdf0e10cSrcweir     SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ?
496cdf0e10cSrcweir                 InfoBox::GetStandardImageHC() : InfoBox::GetStandardImage() );
497cdf0e10cSrcweir     mnSoundType = ((sal_uInt16)SOUND_INFO)+1;
498cdf0e10cSrcweir }
499cdf0e10cSrcweir 
500cdf0e10cSrcweir // -----------------------------------------------------------------------
501cdf0e10cSrcweir 
502cdf0e10cSrcweir InfoBox::InfoBox( Window* pParent, const XubString& rMessage ) :
503cdf0e10cSrcweir     MessBox( pParent, WB_OK | WB_DEF_OK, ImplGetSVEmptyStr(), rMessage )
504cdf0e10cSrcweir {
505cdf0e10cSrcweir     ImplInitInfoBoxData();
506cdf0e10cSrcweir }
507cdf0e10cSrcweir 
508cdf0e10cSrcweir // -----------------------------------------------------------------------
509cdf0e10cSrcweir 
510cdf0e10cSrcweir InfoBox::InfoBox( Window* pParent, const ResId & rResId ) :
511cdf0e10cSrcweir     MessBox( pParent, rResId.SetRT( RSC_INFOBOX ) )
512cdf0e10cSrcweir {
513cdf0e10cSrcweir     ImplInitInfoBoxData();
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir // -----------------------------------------------------------------------
517cdf0e10cSrcweir 
518cdf0e10cSrcweir Image InfoBox::GetStandardImage()
519cdf0e10cSrcweir {
520cdf0e10cSrcweir     ImplInitMsgBoxImageList();
521cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxImgList->GetImage( 4 );
522cdf0e10cSrcweir }
523cdf0e10cSrcweir 
524cdf0e10cSrcweir // -----------------------------------------------------------------------
525cdf0e10cSrcweir 
526cdf0e10cSrcweir Image InfoBox::GetStandardImageHC()
527cdf0e10cSrcweir {
528cdf0e10cSrcweir     ImplInitMsgBoxImageList();
529cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxHCImgList->GetImage( 4 );
530cdf0e10cSrcweir }
531cdf0e10cSrcweir 
532cdf0e10cSrcweir // -----------------------------------------------------------------------
533cdf0e10cSrcweir 
534cdf0e10cSrcweir void WarningBox::ImplInitWarningBoxData()
535cdf0e10cSrcweir {
536cdf0e10cSrcweir     // Default Text is the display title from the application
537cdf0e10cSrcweir     if ( !GetText().Len() )
538cdf0e10cSrcweir         SetText( Application::GetDisplayName() );
539cdf0e10cSrcweir 
540cdf0e10cSrcweir     SetImage( WarningBox::GetStandardImage() );
541cdf0e10cSrcweir     mnSoundType = ((sal_uInt16)SOUND_WARNING)+1;
542cdf0e10cSrcweir }
543cdf0e10cSrcweir 
544cdf0e10cSrcweir // -----------------------------------------------------------------------
545cdf0e10cSrcweir 
546cdf0e10cSrcweir WarningBox::WarningBox( Window* pParent, WinBits nStyle,
547cdf0e10cSrcweir                         const XubString& rMessage ) :
548cdf0e10cSrcweir     MessBox( pParent, nStyle, ImplGetSVEmptyStr(), rMessage )
549cdf0e10cSrcweir {
550cdf0e10cSrcweir     ImplInitWarningBoxData();
551cdf0e10cSrcweir }
552cdf0e10cSrcweir 
553cdf0e10cSrcweir // -----------------------------------------------------------------------
554cdf0e10cSrcweir 
555cdf0e10cSrcweir WarningBox::WarningBox( Window* pParent, const ResId& rResId ) :
556cdf0e10cSrcweir     MessBox( pParent, rResId.SetRT( RSC_WARNINGBOX ) )
557cdf0e10cSrcweir {
558cdf0e10cSrcweir     ImplInitWarningBoxData();
559cdf0e10cSrcweir }
560cdf0e10cSrcweir 
561cdf0e10cSrcweir // -----------------------------------------------------------------------
562cdf0e10cSrcweir 
563cdf0e10cSrcweir void WarningBox::SetDefaultCheckBoxText()
564cdf0e10cSrcweir {
565cdf0e10cSrcweir     ResMgr* pResMgr = ImplGetResMgr();
566cdf0e10cSrcweir     if( pResMgr )
567cdf0e10cSrcweir         maCheckBoxText = XubString( ResId( SV_STDTEXT_DONTWARNAGAIN, *pResMgr ) );
568cdf0e10cSrcweir }
569cdf0e10cSrcweir 
570cdf0e10cSrcweir // -----------------------------------------------------------------------
571cdf0e10cSrcweir 
572cdf0e10cSrcweir Image WarningBox::GetStandardImage()
573cdf0e10cSrcweir {
574cdf0e10cSrcweir     ImplInitMsgBoxImageList();
575cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxImgList->GetImage( 3 );
576cdf0e10cSrcweir }
577cdf0e10cSrcweir 
578cdf0e10cSrcweir // -----------------------------------------------------------------------
579cdf0e10cSrcweir 
580cdf0e10cSrcweir void ErrorBox::ImplInitErrorBoxData()
581cdf0e10cSrcweir {
582cdf0e10cSrcweir     // Default Text is the display title from the application
583cdf0e10cSrcweir     if ( !GetText().Len() )
584cdf0e10cSrcweir         SetText( Application::GetDisplayName() );
585cdf0e10cSrcweir 
586cdf0e10cSrcweir     SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ?
587cdf0e10cSrcweir         ErrorBox::GetStandardImageHC() : ErrorBox::GetStandardImage() );
588cdf0e10cSrcweir     mnSoundType = ((sal_uInt16)SOUND_ERROR)+1;
589cdf0e10cSrcweir }
590cdf0e10cSrcweir 
591cdf0e10cSrcweir // -----------------------------------------------------------------------
592cdf0e10cSrcweir 
593cdf0e10cSrcweir ErrorBox::ErrorBox( Window* pParent, WinBits nStyle,
594cdf0e10cSrcweir                     const XubString& rMessage ) :
595cdf0e10cSrcweir     MessBox( pParent, nStyle, ImplGetSVEmptyStr(), rMessage )
596cdf0e10cSrcweir {
597cdf0e10cSrcweir     ImplInitErrorBoxData();
598cdf0e10cSrcweir }
599cdf0e10cSrcweir 
600cdf0e10cSrcweir // -----------------------------------------------------------------------
601cdf0e10cSrcweir 
602cdf0e10cSrcweir ErrorBox::ErrorBox( Window* pParent, const ResId& rResId ) :
603cdf0e10cSrcweir     MessBox( pParent, rResId.SetRT( RSC_ERRORBOX ) )
604cdf0e10cSrcweir {
605cdf0e10cSrcweir     ImplInitErrorBoxData();
606cdf0e10cSrcweir }
607cdf0e10cSrcweir 
608cdf0e10cSrcweir // -----------------------------------------------------------------------
609cdf0e10cSrcweir 
610cdf0e10cSrcweir Image ErrorBox::GetStandardImage()
611cdf0e10cSrcweir {
612cdf0e10cSrcweir     ImplInitMsgBoxImageList();
613cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxImgList->GetImage( 1 );
614cdf0e10cSrcweir }
615cdf0e10cSrcweir 
616cdf0e10cSrcweir // -----------------------------------------------------------------------
617cdf0e10cSrcweir 
618cdf0e10cSrcweir Image ErrorBox::GetStandardImageHC()
619cdf0e10cSrcweir {
620cdf0e10cSrcweir     ImplInitMsgBoxImageList();
621cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxHCImgList->GetImage( 1 );
622cdf0e10cSrcweir }
623cdf0e10cSrcweir 
624cdf0e10cSrcweir // -----------------------------------------------------------------------
625cdf0e10cSrcweir 
626cdf0e10cSrcweir void QueryBox::ImplInitQueryBoxData()
627cdf0e10cSrcweir {
628cdf0e10cSrcweir     // Default Text is the display title from the application
629cdf0e10cSrcweir     if ( !GetText().Len() )
630cdf0e10cSrcweir         SetText( Application::GetDisplayName() );
631cdf0e10cSrcweir 
632cdf0e10cSrcweir     SetImage( GetSettings().GetStyleSettings().GetHighContrastMode() ?
633cdf0e10cSrcweir         QueryBox::GetStandardImageHC() : QueryBox::GetStandardImage() );
634cdf0e10cSrcweir     mnSoundType = ((sal_uInt16)SOUND_QUERY)+1;
635cdf0e10cSrcweir }
636cdf0e10cSrcweir 
637cdf0e10cSrcweir // -----------------------------------------------------------------------
638cdf0e10cSrcweir 
639cdf0e10cSrcweir QueryBox::QueryBox( Window* pParent, WinBits nStyle, const XubString& rMessage ) :
640cdf0e10cSrcweir     MessBox( pParent, nStyle, ImplGetSVEmptyStr(), rMessage )
641cdf0e10cSrcweir {
642cdf0e10cSrcweir     ImplInitQueryBoxData();
643cdf0e10cSrcweir }
644cdf0e10cSrcweir 
645cdf0e10cSrcweir // -----------------------------------------------------------------------
646cdf0e10cSrcweir 
647cdf0e10cSrcweir QueryBox::QueryBox( Window* pParent, const ResId& rResId ) :
648cdf0e10cSrcweir     MessBox( pParent, rResId.SetRT( RSC_QUERYBOX ) )
649cdf0e10cSrcweir {
650cdf0e10cSrcweir     ImplInitQueryBoxData();
651cdf0e10cSrcweir }
652cdf0e10cSrcweir 
653cdf0e10cSrcweir // -----------------------------------------------------------------------
654cdf0e10cSrcweir 
655cdf0e10cSrcweir void QueryBox::SetDefaultCheckBoxText()
656cdf0e10cSrcweir {
657cdf0e10cSrcweir     ResMgr* pResMgr = ImplGetResMgr();
658cdf0e10cSrcweir     if( pResMgr )
659cdf0e10cSrcweir         maCheckBoxText = XubString( ResId( SV_STDTEXT_DONTASKAGAIN, *pResMgr ) );
660cdf0e10cSrcweir }
661cdf0e10cSrcweir 
662cdf0e10cSrcweir // -----------------------------------------------------------------------
663cdf0e10cSrcweir 
664cdf0e10cSrcweir Image QueryBox::GetStandardImage()
665cdf0e10cSrcweir {
666cdf0e10cSrcweir     ImplInitMsgBoxImageList();
667cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxImgList->GetImage( 2 );
668cdf0e10cSrcweir }
669cdf0e10cSrcweir 
670cdf0e10cSrcweir // -----------------------------------------------------------------------
671cdf0e10cSrcweir 
672cdf0e10cSrcweir Image QueryBox::GetStandardImageHC()
673cdf0e10cSrcweir {
674cdf0e10cSrcweir     ImplInitMsgBoxImageList();
675cdf0e10cSrcweir     return ImplGetSVData()->maWinData.mpMsgBoxHCImgList->GetImage( 2 );
676cdf0e10cSrcweir }
677cdf0e10cSrcweir 
678cdf0e10cSrcweir // -----------------------------------------------------------------------
679cdf0e10cSrcweir 
680cdf0e10cSrcweir Size MessBox::GetOptimalSize(WindowSizeType eType) const
681cdf0e10cSrcweir {
682cdf0e10cSrcweir     switch( eType ) {
683cdf0e10cSrcweir     case WINDOWSIZE_MINIMUM:
684cdf0e10cSrcweir         // FIXME: base me on the font size ?
685cdf0e10cSrcweir         return Size( 250, 100 );
686cdf0e10cSrcweir     default:
687cdf0e10cSrcweir         return Window::GetOptimalSize( eType );
688cdf0e10cSrcweir     }
689cdf0e10cSrcweir }
690