Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/beans/XPropertySet.hpp>
21 : #include <comphelper/processfactory.hxx>
22 : #include <osl/file.hxx>
23 :
24 : #include <tools/debug.hxx>
25 :
26 : #include <tools/rc.h>
27 : #include <svdata.hxx>
28 : #include <window.h>
29 : #include <brdwin.hxx>
30 :
31 : #include <rtl/strbuf.hxx>
32 : #include <sal/log.hxx>
33 :
34 : #include <vcl/builder.hxx>
35 : #include <vcl/layout.hxx>
36 : #include <vcl/svapp.hxx>
37 : #include <vcl/event.hxx>
38 : #include <vcl/wrkwin.hxx>
39 : #include <vcl/button.hxx>
40 : #include <vcl/mnemonic.hxx>
41 : #include <vcl/dialog.hxx>
42 : #include <vcl/decoview.hxx>
43 : #include <vcl/msgbox.hxx>
44 : #include <vcl/unowrap.hxx>
45 : #include <iostream>
46 :
47 : #ifdef ANDROID
48 : #include <osl/detail/android-bootstrap.h>
49 : #endif
50 :
51 : // =======================================================================
52 :
53 : #ifndef ANDROID
54 :
55 0 : static rtl::OString ImplGetDialogText( Dialog* pDialog )
56 : {
57 : rtl::OStringBuffer aErrorStr(rtl::OUStringToOString(
58 0 : pDialog->GetText(), RTL_TEXTENCODING_UTF8));
59 0 : if ( (pDialog->GetType() == WINDOW_MESSBOX) ||
60 0 : (pDialog->GetType() == WINDOW_INFOBOX) ||
61 0 : (pDialog->GetType() == WINDOW_WARNINGBOX) ||
62 0 : (pDialog->GetType() == WINDOW_ERRORBOX) ||
63 0 : (pDialog->GetType() == WINDOW_QUERYBOX) )
64 : {
65 0 : aErrorStr.append(", ");
66 : aErrorStr.append(rtl::OUStringToOString(
67 0 : ((MessBox*)pDialog)->GetMessText(), RTL_TEXTENCODING_UTF8));
68 : }
69 0 : return aErrorStr.makeStringAndClear();
70 : }
71 :
72 : #endif
73 :
74 : // =======================================================================
75 :
76 0 : static sal_Bool ImplIsMnemonicCtrl( Window* pWindow )
77 : {
78 0 : if( ! pWindow->GetSettings().GetStyleSettings().GetAutoMnemonic() )
79 0 : return sal_False;
80 :
81 0 : if ( (pWindow->GetType() == WINDOW_RADIOBUTTON) ||
82 0 : (pWindow->GetType() == WINDOW_CHECKBOX) ||
83 0 : (pWindow->GetType() == WINDOW_TRISTATEBOX) ||
84 0 : (pWindow->GetType() == WINDOW_PUSHBUTTON) )
85 0 : return sal_True;
86 :
87 0 : if ( pWindow->GetType() == WINDOW_FIXEDTEXT )
88 : {
89 0 : if ( pWindow->GetStyle() & (WB_INFO | WB_NOLABEL) )
90 0 : return sal_False;
91 0 : Window* pNextWindow = pWindow->GetWindow( WINDOW_NEXT );
92 0 : if ( !pNextWindow )
93 0 : return sal_False;
94 0 : pNextWindow = pNextWindow->GetWindow( WINDOW_CLIENT );
95 0 : if ( !(pNextWindow->GetStyle() & WB_TABSTOP) ||
96 0 : (pNextWindow->GetType() == WINDOW_FIXEDTEXT) ||
97 0 : (pNextWindow->GetType() == WINDOW_GROUPBOX) ||
98 0 : (pNextWindow->GetType() == WINDOW_RADIOBUTTON) ||
99 0 : (pNextWindow->GetType() == WINDOW_CHECKBOX) ||
100 0 : (pNextWindow->GetType() == WINDOW_TRISTATEBOX) ||
101 0 : (pNextWindow->GetType() == WINDOW_PUSHBUTTON) )
102 0 : return sal_False;
103 :
104 0 : return sal_True;
105 : }
106 :
107 0 : return sal_False;
108 : }
109 :
110 : // -----------------------------------------------------------------------
111 :
112 : // Called by native error dialog popup implementations
113 0 : void ImplHideSplash()
114 : {
115 0 : ImplSVData* pSVData = ImplGetSVData();
116 0 : if( pSVData->mpIntroWindow )
117 0 : pSVData->mpIntroWindow->Hide();
118 0 : }
119 :
120 : //Get next window after pChild of a pTopLevel window as
121 : //if any intermediate layout widgets didn't exist
122 248 : Window * nextLogicalChildOfParent(Window *pTopLevel, Window *pChild)
123 : {
124 248 : Window *pLastChild = pChild;
125 :
126 248 : if (isContainerWindow(*pChild))
127 0 : pChild = pChild->GetWindow(WINDOW_FIRSTCHILD);
128 : else
129 248 : pChild = pChild->GetWindow(WINDOW_NEXT);
130 :
131 496 : while (!pChild)
132 : {
133 48 : Window *pParent = pLastChild->GetParent();
134 48 : if (!pParent)
135 0 : return NULL;
136 48 : if (pParent == pTopLevel)
137 48 : return NULL;
138 0 : pLastChild = pParent;
139 0 : pChild = pParent->GetWindow(WINDOW_NEXT);
140 : }
141 :
142 200 : if (pChild && isContainerWindow(*pChild))
143 0 : pChild = nextLogicalChildOfParent(pTopLevel, pChild);
144 :
145 200 : return pChild;
146 : }
147 :
148 0 : Window * prevLogicalChildOfParent(Window *pTopLevel, Window *pChild)
149 : {
150 0 : Window *pLastChild = pChild;
151 :
152 0 : if (isContainerWindow(*pChild))
153 0 : pChild = pChild->GetWindow(WINDOW_LASTCHILD);
154 : else
155 0 : pChild = pChild->GetWindow(WINDOW_PREV);
156 :
157 0 : while (!pChild)
158 : {
159 0 : Window *pParent = pLastChild->GetParent();
160 0 : if (!pParent)
161 0 : return NULL;
162 0 : if (pParent == pTopLevel)
163 0 : return NULL;
164 0 : pLastChild = pParent;
165 0 : pChild = pParent->GetWindow(WINDOW_PREV);
166 : }
167 :
168 0 : if (pChild && isContainerWindow(*pChild))
169 0 : pChild = prevLogicalChildOfParent(pTopLevel, pChild);
170 :
171 0 : return pChild;
172 : }
173 :
174 : //Get first window of a pTopLevel window as
175 : //if any intermediate layout widgets didn't exist
176 764 : Window * firstLogicalChildOfParent(Window *pTopLevel)
177 : {
178 764 : Window *pChild = pTopLevel->GetWindow(WINDOW_FIRSTCHILD);
179 764 : if (pChild && isContainerWindow(*pChild))
180 0 : pChild = nextLogicalChildOfParent(pTopLevel, pChild);
181 764 : return pChild;
182 : }
183 :
184 : // -----------------------------------------------------------------------
185 :
186 0 : void ImplWindowAutoMnemonic( Window* pWindow )
187 : {
188 0 : MnemonicGenerator aMnemonicGenerator;
189 : Window* pGetChild;
190 : Window* pChild;
191 :
192 : // Die schon vergebenen Mnemonics registieren
193 0 : pGetChild = pWindow->GetWindow( WINDOW_FIRSTCHILD );
194 0 : while ( pGetChild )
195 : {
196 0 : pChild = pGetChild->ImplGetWindow();
197 0 : aMnemonicGenerator.RegisterMnemonic( pChild->GetText() );
198 0 : pGetChild = nextLogicalChildOfParent(pWindow, pGetChild);
199 : }
200 :
201 : // Bei TabPages auch noch die Controls vom Dialog beruecksichtigen
202 0 : if ( pWindow->GetType() == WINDOW_TABPAGE )
203 : {
204 0 : Window* pParent = pWindow->GetParent();
205 0 : if ( pParent->GetType() == WINDOW_TABCONTROL )
206 0 : pParent = pParent->GetParent();
207 :
208 0 : if ( (pParent->GetStyle() & (WB_DIALOGCONTROL | WB_NODIALOGCONTROL)) == WB_DIALOGCONTROL )
209 : {
210 0 : pGetChild = pParent->GetWindow( WINDOW_FIRSTCHILD );
211 0 : while ( pGetChild )
212 : {
213 0 : pChild = pGetChild->ImplGetWindow();
214 0 : aMnemonicGenerator.RegisterMnemonic( pChild->GetText() );
215 0 : pGetChild = nextLogicalChildOfParent(pWindow, pGetChild);
216 : }
217 : }
218 : }
219 :
220 : // Die Mnemonics an die Controls vergeben, die noch keinen haben
221 0 : pGetChild = pWindow->GetWindow( WINDOW_FIRSTCHILD );
222 0 : while ( pGetChild )
223 : {
224 0 : pChild = pGetChild->ImplGetWindow();
225 0 : if ( ImplIsMnemonicCtrl( pChild ) )
226 : {
227 0 : XubString aText = pChild->GetText();
228 0 : if ( aMnemonicGenerator.CreateMnemonic( aText ) )
229 0 : pChild->SetText( aText );
230 : }
231 :
232 0 : pGetChild = nextLogicalChildOfParent(pWindow, pGetChild);
233 0 : }
234 0 : }
235 :
236 0 : static VclButtonBox* getActionArea(Dialog *pDialog)
237 : {
238 0 : VclButtonBox *pButtonBox = NULL;
239 0 : if (pDialog->isLayoutEnabled())
240 : {
241 0 : Window *pBox = pDialog->GetWindow(WINDOW_FIRSTCHILD);
242 0 : Window *pChild = pBox->GetWindow(WINDOW_LASTCHILD);
243 0 : while (pChild)
244 : {
245 0 : pButtonBox = dynamic_cast<VclButtonBox*>(pChild);
246 0 : if (pButtonBox)
247 0 : break;
248 0 : pChild = pChild->GetWindow(WINDOW_PREV);
249 : }
250 : }
251 0 : return pButtonBox;
252 : }
253 :
254 0 : static Window* getActionAreaButtonList(Dialog *pDialog)
255 : {
256 0 : VclButtonBox* pButtonBox = getActionArea(pDialog);
257 0 : if (pButtonBox)
258 0 : return pButtonBox->GetWindow(WINDOW_FIRSTCHILD);
259 0 : return pDialog->GetWindow(WINDOW_FIRSTCHILD);
260 : }
261 :
262 : // =======================================================================
263 :
264 0 : static PushButton* ImplGetDefaultButton( Dialog* pDialog )
265 : {
266 0 : Window* pChild = getActionAreaButtonList(pDialog);
267 0 : while ( pChild )
268 : {
269 0 : if ( pChild->ImplIsPushButton() )
270 : {
271 0 : PushButton* pPushButton = (PushButton*)pChild;
272 0 : if ( pPushButton->ImplIsDefButton() )
273 0 : return pPushButton;
274 : }
275 :
276 0 : pChild = pChild->GetWindow( WINDOW_NEXT );
277 : }
278 :
279 0 : return NULL;
280 : }
281 :
282 : // -----------------------------------------------------------------------
283 :
284 0 : static PushButton* ImplGetOKButton( Dialog* pDialog )
285 : {
286 0 : Window* pChild = getActionAreaButtonList(pDialog);
287 0 : while ( pChild )
288 : {
289 0 : if ( pChild->GetType() == WINDOW_OKBUTTON )
290 0 : return (PushButton*)pChild;
291 :
292 0 : pChild = pChild->GetWindow( WINDOW_NEXT );
293 : }
294 :
295 0 : return NULL;
296 : }
297 :
298 : // -----------------------------------------------------------------------
299 :
300 0 : static PushButton* ImplGetCancelButton( Dialog* pDialog )
301 : {
302 0 : Window* pChild = getActionAreaButtonList(pDialog);
303 :
304 0 : while ( pChild )
305 : {
306 0 : if ( pChild->GetType() == WINDOW_CANCELBUTTON )
307 0 : return (PushButton*)pChild;
308 :
309 0 : pChild = pChild->GetWindow( WINDOW_NEXT );
310 : }
311 :
312 0 : return NULL;
313 : }
314 :
315 : // -----------------------------------------------------------------------
316 :
317 0 : static void ImplMouseAutoPos( Dialog* pDialog )
318 : {
319 0 : sal_uLong nMouseOptions = pDialog->GetSettings().GetMouseSettings().GetOptions();
320 0 : if ( nMouseOptions & MOUSE_OPTION_AUTOCENTERPOS )
321 : {
322 0 : Size aSize = pDialog->GetOutputSizePixel();
323 0 : pDialog->SetPointerPosPixel( Point( aSize.Width()/2, aSize.Height()/2 ) );
324 : }
325 0 : else if ( nMouseOptions & MOUSE_OPTION_AUTODEFBTNPOS )
326 : {
327 0 : Window* pWindow = ImplGetDefaultButton( pDialog );
328 0 : if ( !pWindow )
329 0 : pWindow = ImplGetOKButton( pDialog );
330 0 : if ( !pWindow )
331 0 : pWindow = ImplGetCancelButton( pDialog );
332 0 : if ( !pWindow )
333 0 : pWindow = pDialog;
334 0 : Size aSize = pWindow->GetOutputSizePixel();
335 0 : pWindow->SetPointerPosPixel( Point( aSize.Width()/2, aSize.Height()/2 ) );
336 : }
337 0 : }
338 :
339 : // =======================================================================
340 :
341 : struct DialogImpl
342 : {
343 : long mnResult;
344 : bool mbStartedModal;
345 : Link maEndDialogHdl;
346 :
347 0 : DialogImpl() : mnResult( -1 ), mbStartedModal( false ) {}
348 : };
349 :
350 : // =======================================================================
351 :
352 0 : void Dialog::ImplInitDialogData()
353 : {
354 0 : mpWindowImpl->mbDialog = sal_True;
355 0 : mpDialogParent = NULL;
356 0 : mpPrevExecuteDlg = NULL;
357 0 : mbInExecute = sal_False;
358 0 : mbOldSaveBack = sal_False;
359 0 : mbInClose = sal_False;
360 0 : mbModalMode = sal_False;
361 0 : mnMousePositioned = 0;
362 0 : mpDialogImpl = new DialogImpl;
363 :
364 : //To-Do, reuse maResizeTimer
365 0 : maLayoutTimer.SetTimeout(50);
366 0 : maLayoutTimer.SetTimeoutHdl( LINK( this, Dialog, ImplHandleLayoutTimerHdl ) );
367 0 : }
368 :
369 : // -----------------------------------------------------------------------
370 :
371 0 : void Dialog::ImplInit( Window* pParent, WinBits nStyle )
372 : {
373 0 : sal_uInt16 nSysWinMode = Application::GetSystemWindowMode();
374 :
375 0 : if ( !(nStyle & WB_NODIALOGCONTROL) )
376 0 : nStyle |= WB_DIALOGCONTROL;
377 0 : nStyle |= WB_ROLLABLE;
378 :
379 : // Now, all Dialogs are per default system windows !!!
380 0 : nStyle |= WB_SYSTEMWINDOW;
381 :
382 :
383 : // parent is NULL: get the default Dialog parent
384 0 : if ( !pParent )
385 : {
386 0 : pParent = Application::GetDefDialogParent();
387 0 : if ( !pParent && !(nStyle & WB_SYSTEMWINDOW) )
388 0 : pParent = ImplGetSVData()->maWinData.mpAppWin;
389 :
390 : // If Parent is disabled, then we search for a modal dialog
391 : // in this frame
392 0 : if ( pParent && (!pParent->IsInputEnabled() || pParent->IsInModalMode()) )
393 : {
394 0 : ImplSVData* pSVData = ImplGetSVData();
395 0 : Dialog* pExeDlg = pSVData->maWinData.mpLastExecuteDlg;
396 0 : while ( pExeDlg )
397 : {
398 : // Nur wenn er sichtbar und enabled ist
399 0 : if ( pParent->ImplGetFirstOverlapWindow()->IsWindowOrChild( pExeDlg, sal_True ) &&
400 0 : pExeDlg->IsReallyVisible() &&
401 0 : pExeDlg->IsEnabled() && pExeDlg->IsInputEnabled() && !pExeDlg->IsInModalMode() )
402 : {
403 0 : pParent = pExeDlg;
404 0 : break;
405 : }
406 :
407 0 : pExeDlg = pExeDlg->mpPrevExecuteDlg;
408 : }
409 : }
410 : }
411 : // DIALOG_NO_PARENT: explicitly don't have a parent for this Dialog
412 0 : else if( pParent == DIALOG_NO_PARENT )
413 0 : pParent = NULL;
414 :
415 :
416 0 : if ( !pParent || (nStyle & WB_SYSTEMWINDOW) ||
417 0 : (pParent->mpWindowImpl->mpFrameData->mbNeedSysWindow && !(nSysWinMode & SYSTEMWINDOW_MODE_NOAUTOMODE)) ||
418 : (nSysWinMode & SYSTEMWINDOW_MODE_DIALOG) )
419 : {
420 : // create window with a small border ?
421 0 : if ( (nStyle & (WB_BORDER | WB_NOBORDER | WB_MOVEABLE | WB_SIZEABLE | WB_CLOSEABLE)) == WB_BORDER )
422 : {
423 0 : ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle, BORDERWINDOW_STYLE_FRAME );
424 0 : SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL );
425 0 : pBorderWin->mpWindowImpl->mpClientWindow = this;
426 0 : pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder );
427 0 : mpWindowImpl->mpBorderWindow = pBorderWin;
428 0 : mpWindowImpl->mpRealParent = pParent;
429 : }
430 : else
431 : {
432 0 : mpWindowImpl->mbFrame = sal_True;
433 0 : mpWindowImpl->mbOverlapWin = sal_True;
434 0 : SystemWindow::ImplInit( pParent, (nStyle & (WB_MOVEABLE | WB_SIZEABLE | WB_ROLLABLE | WB_CLOSEABLE | WB_STANDALONE)) | WB_CLOSEABLE, NULL );
435 : // Now set all style bits
436 0 : mpWindowImpl->mnStyle = nStyle;
437 0 : }
438 : }
439 : else
440 : {
441 0 : ImplBorderWindow* pBorderWin = new ImplBorderWindow( pParent, nStyle, BORDERWINDOW_STYLE_OVERLAP | BORDERWINDOW_STYLE_BORDER );
442 0 : SystemWindow::ImplInit( pBorderWin, nStyle & ~WB_BORDER, NULL );
443 0 : pBorderWin->mpWindowImpl->mpClientWindow = this;
444 0 : pBorderWin->GetBorder( mpWindowImpl->mnLeftBorder, mpWindowImpl->mnTopBorder, mpWindowImpl->mnRightBorder, mpWindowImpl->mnBottomBorder );
445 0 : mpWindowImpl->mpBorderWindow = pBorderWin;
446 0 : mpWindowImpl->mpRealParent = pParent;
447 : }
448 :
449 0 : SetActivateMode( ACTIVATE_MODE_GRABFOCUS );
450 :
451 0 : ImplInitSettings();
452 0 : }
453 :
454 : // -----------------------------------------------------------------------
455 :
456 0 : void Dialog::ImplInitSettings()
457 : {
458 : // user override
459 0 : if ( IsControlBackground() )
460 0 : SetBackground( GetControlBackground() );
461 : // NWF background
462 0 : else if( IsNativeControlSupported( CTRL_WINDOW_BACKGROUND, PART_BACKGROUND_DIALOG ) )
463 : {
464 0 : mpWindowImpl->mnNativeBackground = PART_BACKGROUND_DIALOG;
465 0 : EnableChildTransparentMode( sal_True );
466 : }
467 : // fallback to settings color
468 : else
469 0 : SetBackground( GetSettings().GetStyleSettings().GetDialogColor() );
470 0 : }
471 :
472 : // -----------------------------------------------------------------------
473 :
474 0 : Dialog::Dialog( WindowType nType )
475 : : SystemWindow( nType )
476 0 : , mbIsDefferedInit(false)
477 : {
478 0 : ImplInitDialogData();
479 0 : }
480 :
481 : #define BASEPATH_SHARE_LAYER rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("UIConfig"))
482 : #define RELPATH_SHARE_LAYER rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("soffice.cfg"))
483 : #define SERVICENAME_PATHSETTINGS rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.util.PathSettings"))
484 :
485 0 : rtl::OUString VclBuilderContainer::getUIRootDir()
486 : {
487 : /*to-do, check if user config has an override before using shared one, etc*/
488 : css::uno::Reference< css::beans::XPropertySet > xPathSettings(
489 0 : ::comphelper::getProcessServiceFactory()->createInstance(SERVICENAME_PATHSETTINGS),
490 0 : css::uno::UNO_QUERY_THROW);
491 :
492 0 : ::rtl::OUString sShareLayer;
493 0 : xPathSettings->getPropertyValue(BASEPATH_SHARE_LAYER) >>= sShareLayer;
494 :
495 : // "UIConfig" is a "multi path" ... use first part only here!
496 0 : sal_Int32 nPos = sShareLayer.indexOf(';');
497 0 : if (nPos > 0)
498 0 : sShareLayer = sShareLayer.copy(0, nPos);
499 :
500 : // Note: May be an user uses URLs without a final slash! Check it ...
501 0 : nPos = sShareLayer.lastIndexOf('/');
502 0 : if (nPos != sShareLayer.getLength()-1)
503 0 : sShareLayer += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
504 :
505 0 : sShareLayer += RELPATH_SHARE_LAYER; // folder
506 0 : sShareLayer += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/"));
507 : /*to-do, can we merge all this foo with existing soffice.cfg finding code, etc*/
508 0 : return sShareLayer;
509 : }
510 :
511 : //we can't change sizeable after the fact, so need to defer until we know and then
512 : //do the init. Find the real parent stashed in mpDialogParent.
513 0 : void Dialog::doDeferredInit(bool bResizable)
514 : {
515 0 : WinBits nBits = WB_3DLOOK|WB_CLOSEABLE|WB_MOVEABLE;
516 0 : if (bResizable)
517 0 : nBits |= WB_SIZEABLE;
518 0 : Window *pParent = mpDialogParent;
519 0 : mpDialogParent = NULL;
520 0 : ImplInit(pParent, nBits);
521 0 : mbIsDefferedInit = false;
522 0 : }
523 :
524 0 : Dialog::Dialog(Window* pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription)
525 : : SystemWindow( WINDOW_DIALOG )
526 0 : , mbIsDefferedInit(true)
527 : {
528 0 : ImplInitDialogData();
529 0 : mpDialogParent = pParent; //will be unset in doDeferredInit
530 0 : m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID);
531 0 : }
532 :
533 0 : Dialog::Dialog(Window* pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription, WindowType nType)
534 : : SystemWindow( nType )
535 0 : , mbIsDefferedInit(true)
536 : {
537 0 : ImplInitDialogData();
538 0 : mpDialogParent = pParent; //will be unset in doDeferredInit
539 0 : m_pUIBuilder = new VclBuilder(this, getUIRootDir(), rUIXMLDescription, rID);
540 0 : }
541 :
542 :
543 : // -----------------------------------------------------------------------
544 :
545 0 : Dialog::Dialog( Window* pParent, WinBits nStyle )
546 : : SystemWindow( WINDOW_DIALOG )
547 0 : , mbIsDefferedInit(false)
548 : {
549 0 : ImplInitDialogData();
550 0 : ImplInit( pParent, nStyle );
551 0 : }
552 :
553 0 : WinBits Dialog::init(Window *pParent, const ResId& rResId)
554 : {
555 0 : WinBits nStyle = ImplInitRes( rResId );
556 :
557 0 : ImplInit( pParent, nStyle );
558 0 : ImplLoadRes( rResId );
559 :
560 0 : return nStyle;
561 : }
562 :
563 0 : VclButtonBox* Dialog::get_action_area()
564 : {
565 0 : return m_pUIBuilder ? m_pUIBuilder->get<VclButtonBox>("dialog-action_area1") : NULL;
566 : }
567 :
568 0 : VclBox* Dialog::get_content_area()
569 : {
570 0 : return m_pUIBuilder ? m_pUIBuilder->get<VclBox>("dialog-vbox1") : NULL;
571 : }
572 :
573 : // -----------------------------------------------------------------------
574 :
575 0 : Dialog::~Dialog()
576 : {
577 0 : maLayoutTimer.Stop();
578 0 : delete mpDialogImpl;
579 0 : mpDialogImpl = NULL;
580 0 : }
581 :
582 : // -----------------------------------------------------------------------
583 :
584 0 : IMPL_LINK_NOARG(Dialog, ImplAsyncCloseHdl)
585 : {
586 0 : Close();
587 0 : return 0;
588 : }
589 :
590 : // -----------------------------------------------------------------------
591 :
592 0 : long Dialog::Notify( NotifyEvent& rNEvt )
593 : {
594 : // Zuerst Basisklasse rufen wegen TabSteuerung
595 0 : long nRet = SystemWindow::Notify( rNEvt );
596 0 : if ( !nRet )
597 : {
598 0 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
599 : {
600 0 : const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
601 0 : KeyCode aKeyCode = pKEvt->GetKeyCode();
602 0 : sal_uInt16 nKeyCode = aKeyCode.GetCode();
603 :
604 0 : if ( (nKeyCode == KEY_ESCAPE) &&
605 0 : ((GetStyle() & WB_CLOSEABLE) || ImplGetCancelButton( this ) || ImplGetOKButton( this )) )
606 : {
607 : // #i89505# for the benefit of slightly mentally challenged implementations
608 : // like e.g. SfxModelessDialog which destroy themselves inside Close()
609 : // post this Close asynchronous so we can leave our key handler before
610 : // we get destroyed
611 0 : PostUserEvent( LINK( this, Dialog, ImplAsyncCloseHdl ), this );
612 0 : return sal_True;
613 : }
614 : }
615 0 : else if ( rNEvt.GetType() == EVENT_GETFOCUS )
616 : {
617 : // make sure the dialog is still modal
618 : // changing focus between application frames may
619 : // have re-enabled input for our parent
620 0 : if( mbInExecute && mbModalMode )
621 : {
622 : // do not change modal counter (pSVData->maAppData.mnModalDialog)
623 0 : SetModalInputMode( sal_False );
624 0 : SetModalInputMode( sal_True );
625 :
626 : // #93022# def-button might have changed after show
627 0 : if( !mnMousePositioned )
628 : {
629 0 : mnMousePositioned = 1;
630 0 : ImplMouseAutoPos( this );
631 : }
632 :
633 : }
634 : }
635 : }
636 :
637 0 : return nRet;
638 : }
639 :
640 0 : void Dialog::setInitialLayoutSize()
641 : {
642 0 : maLayoutTimer.Stop();
643 :
644 : //resize dialog to fit requisition on initial show
645 0 : VclBox *pBox = static_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD));
646 :
647 : const DialogStyle& rDialogStyle =
648 0 : GetSettings().GetStyleSettings().GetDialogStyle();
649 0 : pBox->set_border_width(rDialogStyle.content_area_border);
650 0 : pBox->set_spacing(rDialogStyle.content_area_spacing);
651 :
652 0 : VclButtonBox *pActionArea = getActionArea(this);
653 0 : if (pActionArea)
654 : {
655 0 : pActionArea->set_border_width(rDialogStyle.action_area_border);
656 0 : pActionArea->set_spacing(rDialogStyle.button_spacing);
657 : }
658 :
659 0 : Size aSize = get_preferred_size();
660 :
661 0 : Size aMax = GetOptimalSize(WINDOWSIZE_MAXIMUM);
662 0 : aSize.Width() = std::min(aMax.Width(), aSize.Width());
663 0 : aSize.Height() = std::min(aMax.Height(), aSize.Height());
664 :
665 0 : SetMinOutputSizePixel(aSize);
666 0 : SetSizePixel(aSize);
667 0 : setPosSizeOnContainee(aSize, *pBox);
668 0 : }
669 :
670 : // -----------------------------------------------------------------------
671 :
672 0 : void Dialog::StateChanged( StateChangedType nType )
673 : {
674 0 : SystemWindow::StateChanged( nType );
675 :
676 0 : if ( nType == STATE_CHANGE_INITSHOW )
677 : {
678 0 : if (isLayoutEnabled())
679 0 : setInitialLayoutSize();
680 :
681 0 : if ( GetSettings().GetStyleSettings().GetAutoMnemonic() )
682 0 : ImplWindowAutoMnemonic( this );
683 :
684 0 : if ( !HasChildPathFocus() || HasFocus() )
685 0 : GrabFocusToFirstControl();
686 0 : if ( !(GetStyle() & WB_CLOSEABLE) )
687 : {
688 0 : if ( ImplGetCancelButton( this ) || ImplGetOKButton( this ) )
689 : {
690 0 : if ( ImplGetBorderWindow() )
691 0 : ((ImplBorderWindow*)ImplGetBorderWindow())->SetCloser();
692 : }
693 : }
694 :
695 0 : ImplMouseAutoPos( this );
696 : }
697 0 : else if ( nType == STATE_CHANGE_CONTROLBACKGROUND )
698 : {
699 0 : ImplInitSettings();
700 0 : Invalidate();
701 : }
702 0 : }
703 :
704 : // -----------------------------------------------------------------------
705 :
706 0 : void Dialog::DataChanged( const DataChangedEvent& rDCEvt )
707 : {
708 0 : SystemWindow::DataChanged( rDCEvt );
709 :
710 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
711 0 : (rDCEvt.GetFlags() & SETTINGS_STYLE) )
712 : {
713 0 : ImplInitSettings();
714 0 : Invalidate();
715 : }
716 0 : }
717 :
718 : // -----------------------------------------------------------------------
719 :
720 0 : sal_Bool Dialog::Close()
721 : {
722 0 : ImplDelData aDelData;
723 0 : ImplAddDel( &aDelData );
724 0 : ImplCallEventListeners( VCLEVENT_WINDOW_CLOSE );
725 0 : if ( aDelData.IsDead() )
726 0 : return sal_False;
727 0 : ImplRemoveDel( &aDelData );
728 :
729 0 : if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() && !IsInExecute() )
730 0 : return sal_False;
731 :
732 0 : mbInClose = sal_True;
733 :
734 0 : if ( !(GetStyle() & WB_CLOSEABLE) )
735 : {
736 0 : sal_Bool bRet = sal_True;
737 0 : ImplAddDel( &aDelData );
738 0 : PushButton* pButton = ImplGetCancelButton( this );
739 0 : if ( pButton )
740 0 : pButton->Click();
741 : else
742 : {
743 0 : pButton = ImplGetOKButton( this );
744 0 : if ( pButton )
745 0 : pButton->Click();
746 : else
747 0 : bRet = sal_False;
748 : }
749 0 : if ( aDelData.IsDead() )
750 0 : return sal_True;
751 0 : ImplRemoveDel( &aDelData );
752 0 : return bRet;
753 : }
754 :
755 0 : if ( IsInExecute() )
756 : {
757 0 : EndDialog( sal_False );
758 0 : mbInClose = sal_False;
759 0 : return sal_True;
760 : }
761 : else
762 : {
763 0 : mbInClose = sal_False;
764 0 : return SystemWindow::Close();
765 0 : }
766 : }
767 :
768 : // -----------------------------------------------------------------------
769 :
770 0 : sal_Bool Dialog::ImplStartExecuteModal()
771 : {
772 : #ifdef ANDROID
773 : // If a non-NativeActivity app, we shouldn't be showing any dialogs
774 : fprintf(stderr, "%s: Should not do anything, returning false\n", __FUNCTION__);
775 : return sal_False;
776 : #else
777 :
778 0 : if ( mbInExecute )
779 : {
780 : #ifdef DBG_UTIL
781 : rtl::OStringBuffer aErrorStr;
782 : aErrorStr.append(RTL_CONSTASCII_STRINGPARAM("Dialog::StartExecuteModal() is called in Dialog::StartExecuteModal(): "));
783 : aErrorStr.append(ImplGetDialogText(this));
784 : OSL_FAIL(aErrorStr.getStr());
785 : #endif
786 0 : return sal_False;
787 : }
788 :
789 0 : switch ( Application::GetDialogCancelMode() )
790 : {
791 : case Application::DIALOG_CANCEL_OFF:
792 0 : break;
793 : case Application::DIALOG_CANCEL_SILENT:
794 : SAL_INFO(
795 : "vcl",
796 : "Dialog \"" << ImplGetDialogText(this).getStr()
797 : << "\"cancelled in silent mode");
798 0 : return sal_False;
799 : default:
800 : assert(false); // this cannot happen
801 : // fall through
802 : case Application::DIALOG_CANCEL_FATAL:
803 : throw Application::DialogCancelledException(
804 0 : ImplGetDialogText(this).getStr());
805 : }
806 :
807 : #ifdef DBG_UTIL
808 : Window* pParent = GetParent();
809 : if ( pParent )
810 : {
811 : pParent = pParent->ImplGetFirstOverlapWindow();
812 : DBG_ASSERT( pParent->IsReallyVisible(),
813 : "Dialog::StartExecuteModal() - Parent not visible" );
814 : DBG_ASSERT( pParent->IsInputEnabled(),
815 : "Dialog::StartExecuteModal() - Parent input disabled, use another parent to ensure modality!" );
816 : DBG_ASSERT( ! pParent->IsInModalMode(),
817 : "Dialog::StartExecuteModal() - Parent already modally disabled, use another parent to ensure modality!" );
818 :
819 : }
820 : #endif
821 :
822 0 : ImplSVData* pSVData = ImplGetSVData();
823 :
824 : // Dialoge, die sich in Execute befinden, miteinander verketten
825 0 : mpPrevExecuteDlg = pSVData->maWinData.mpLastExecuteDlg;
826 0 : pSVData->maWinData.mpLastExecuteDlg = this;
827 :
828 : // Capture beenden, damit der Dialog bedient werden kann
829 0 : if ( pSVData->maWinData.mpTrackWin )
830 0 : pSVData->maWinData.mpTrackWin->EndTracking( ENDTRACK_CANCEL );
831 0 : if ( pSVData->maWinData.mpCaptureWin )
832 0 : pSVData->maWinData.mpCaptureWin->ReleaseMouse();
833 0 : EnableInput( sal_True, sal_True );
834 :
835 0 : if ( GetParent() )
836 : {
837 0 : NotifyEvent aNEvt( EVENT_EXECUTEDIALOG, this );
838 0 : GetParent()->Notify( aNEvt );
839 : }
840 0 : mbInExecute = sal_True;
841 0 : SetModalInputMode( sal_True );
842 0 : mbOldSaveBack = IsSaveBackgroundEnabled();
843 0 : EnableSaveBackground();
844 :
845 : // FIXME: no layouting, workaround some clipping issues
846 0 : ImplAdjustNWFSizes();
847 :
848 0 : Show();
849 :
850 0 : pSVData->maAppData.mnModalMode++;
851 0 : return sal_True;
852 : #endif
853 : }
854 :
855 : // -----------------------------------------------------------------------
856 :
857 0 : void Dialog::ImplEndExecuteModal()
858 : {
859 0 : ImplSVData* pSVData = ImplGetSVData();
860 0 : pSVData->maAppData.mnModalMode--;
861 0 : }
862 :
863 : // -----------------------------------------------------------------------
864 :
865 0 : short Dialog::Execute()
866 : {
867 0 : if ( !ImplStartExecuteModal() )
868 0 : return 0;
869 :
870 0 : ImplDelData aDelData;
871 0 : ImplAddDel( &aDelData );
872 :
873 : #ifdef DBG_UTIL
874 : ImplDelData aParentDelData;
875 : Window* pDialogParent = mpDialogParent;
876 : if( pDialogParent )
877 : pDialogParent->ImplAddDel( &aParentDelData );
878 : #endif
879 :
880 : // Yield util EndDialog is called or dialog gets destroyed
881 : // (the latter should not happen, but better safe than sorry
882 0 : while ( !aDelData.IsDead() && mbInExecute )
883 0 : Application::Yield();
884 :
885 0 : ImplEndExecuteModal();
886 :
887 : #ifdef DBG_UTIL
888 : if( pDialogParent )
889 : {
890 : if( ! aParentDelData.IsDead() )
891 : pDialogParent->ImplRemoveDel( &aParentDelData );
892 : else
893 : OSL_FAIL( "Dialog::Execute() - Parent of dialog destroyed in Execute()" );
894 : }
895 : #endif
896 0 : if ( !aDelData.IsDead() )
897 0 : ImplRemoveDel( &aDelData );
898 : #ifdef DBG_UTIL
899 : else
900 : {
901 : OSL_FAIL( "Dialog::Execute() - Dialog destroyed in Execute()" );
902 : }
903 : #endif
904 :
905 0 : long nRet = mpDialogImpl->mnResult;
906 0 : mpDialogImpl->mnResult = -1;
907 0 : return (short)nRet;
908 : }
909 :
910 : // -----------------------------------------------------------------------
911 :
912 : // virtual
913 0 : void Dialog::StartExecuteModal( const Link& rEndDialogHdl )
914 : {
915 0 : if ( !ImplStartExecuteModal() )
916 0 : return;
917 :
918 0 : mpDialogImpl->maEndDialogHdl = rEndDialogHdl;
919 0 : mpDialogImpl->mbStartedModal = true;
920 : }
921 :
922 : // -----------------------------------------------------------------------
923 :
924 0 : void Dialog::EndDialog( long nResult )
925 : {
926 0 : if ( mbInExecute )
927 : {
928 0 : SetModalInputMode( sal_False );
929 :
930 : // Dialog aus der Kette der Dialoge die in Execute stehen entfernen
931 0 : ImplSVData* pSVData = ImplGetSVData();
932 0 : Dialog* pExeDlg = pSVData->maWinData.mpLastExecuteDlg;
933 0 : while ( pExeDlg )
934 : {
935 0 : if ( pExeDlg == this )
936 : {
937 0 : pSVData->maWinData.mpLastExecuteDlg = mpPrevExecuteDlg;
938 0 : break;
939 : }
940 0 : pExeDlg = pExeDlg->mpPrevExecuteDlg;
941 : }
942 : // set focus to previous modal dialogue if it is modal for
943 : // the same frame parent (or NULL)
944 0 : if( mpPrevExecuteDlg )
945 : {
946 0 : Window* pFrameParent = ImplGetFrameWindow()->ImplGetParent();
947 0 : Window* pPrevFrameParent = mpPrevExecuteDlg->ImplGetFrameWindow()->ImplGetParent();
948 0 : if( ( !pFrameParent && !pPrevFrameParent ) ||
949 0 : ( pFrameParent && pPrevFrameParent && pFrameParent->ImplGetFrame() == pPrevFrameParent->ImplGetFrame() )
950 : )
951 : {
952 0 : mpPrevExecuteDlg->GrabFocus();
953 : }
954 : }
955 0 : mpPrevExecuteDlg = NULL;
956 :
957 0 : Hide();
958 0 : EnableSaveBackground( mbOldSaveBack );
959 0 : if ( GetParent() )
960 : {
961 0 : NotifyEvent aNEvt( EVENT_ENDEXECUTEDIALOG, this );
962 0 : GetParent()->Notify( aNEvt );
963 : }
964 :
965 0 : mpDialogImpl->mnResult = nResult;
966 :
967 0 : if ( mpDialogImpl->mbStartedModal )
968 : {
969 0 : ImplEndExecuteModal();
970 0 : mpDialogImpl->maEndDialogHdl.Call( this );
971 :
972 0 : mpDialogImpl->maEndDialogHdl = Link();
973 0 : mpDialogImpl->mbStartedModal = false;
974 0 : mpDialogImpl->mnResult = -1;
975 : }
976 0 : mbInExecute = sal_False;
977 : }
978 0 : }
979 :
980 : // -----------------------------------------------------------------------
981 :
982 0 : long Dialog::GetResult() const
983 : {
984 0 : return mpDialogImpl->mnResult;
985 : }
986 :
987 : // -----------------------------------------------------------------------
988 :
989 0 : void Dialog::EndAllDialogs( Window* pParent )
990 : {
991 0 : ImplSVData* pSVData = ImplGetSVData();
992 : Dialog* pTempModDialog;
993 0 : Dialog* pModDialog = pSVData->maWinData.mpLastExecuteDlg;
994 0 : while ( pModDialog )
995 : {
996 0 : pTempModDialog = pModDialog->mpPrevExecuteDlg;
997 0 : if( !pParent || ( pParent && pParent->IsWindowOrChild( pModDialog, sal_True ) ) )
998 : {
999 0 : pModDialog->EndDialog( sal_False );
1000 0 : pModDialog->PostUserEvent( Link() );
1001 : }
1002 0 : pModDialog = pTempModDialog;
1003 : }
1004 0 : }
1005 :
1006 : // -----------------------------------------------------------------------
1007 :
1008 0 : void Dialog::SetModalInputMode( sal_Bool bModal )
1009 : {
1010 0 : if ( bModal == mbModalMode )
1011 0 : return;
1012 :
1013 0 : ImplSVData* pSVData = ImplGetSVData();
1014 0 : mbModalMode = bModal;
1015 0 : if ( bModal )
1016 : {
1017 0 : pSVData->maAppData.mnModalDialog++;
1018 :
1019 : // Diable the prev Modal Dialog, because our dialog must close at first,
1020 : // before the other dialog can be closed (because the other dialog
1021 : // is on stack since our dialog returns)
1022 0 : if ( mpPrevExecuteDlg && !mpPrevExecuteDlg->IsWindowOrChild( this, sal_True ) )
1023 0 : mpPrevExecuteDlg->EnableInput( sal_False, sal_True, sal_True, this );
1024 :
1025 : // determine next overlap dialog parent
1026 0 : Window* pParent = GetParent();
1027 0 : if ( pParent )
1028 : {
1029 : // #103716# dialogs should always be modal to the whole frame window
1030 : // #115933# disable the whole frame hierarchie, useful if our parent
1031 : // is a modeless dialog
1032 0 : mpDialogParent = pParent->mpWindowImpl->mpFrameWindow;
1033 0 : mpDialogParent->ImplIncModalCount();
1034 : }
1035 :
1036 : }
1037 : else
1038 : {
1039 0 : pSVData->maAppData.mnModalDialog--;
1040 :
1041 0 : if ( mpDialogParent )
1042 : {
1043 : // #115933# re-enable the whole frame hierarchie again (see above)
1044 : // note that code in getfocus assures that we do not accidentally enable
1045 : // windows that were disabled before
1046 0 : mpDialogParent->ImplDecModalCount();
1047 : }
1048 :
1049 : // Enable the prev Modal Dialog
1050 0 : if ( mpPrevExecuteDlg && !mpPrevExecuteDlg->IsWindowOrChild( this, sal_True ) )
1051 : {
1052 0 : mpPrevExecuteDlg->EnableInput( sal_True, sal_True, sal_True, this );
1053 : // ensure continued modality of prev dialog
1054 : // do not change modality counter
1055 0 : mpPrevExecuteDlg->SetModalInputMode( sal_False );
1056 0 : mpPrevExecuteDlg->SetModalInputMode( sal_True );
1057 : }
1058 : }
1059 : }
1060 :
1061 : // -----------------------------------------------------------------------
1062 :
1063 0 : void Dialog::SetModalInputMode( sal_Bool bModal, sal_Bool bSubModalDialogs )
1064 : {
1065 0 : if ( bSubModalDialogs )
1066 : {
1067 0 : Window* pOverlap = ImplGetFirstOverlapWindow();
1068 0 : pOverlap = pOverlap->mpWindowImpl->mpFirstOverlap;
1069 0 : while ( pOverlap )
1070 : {
1071 0 : if ( pOverlap->IsDialog() )
1072 0 : ((Dialog*)pOverlap)->SetModalInputMode( bModal, sal_True );
1073 0 : pOverlap = pOverlap->mpWindowImpl->mpNext;
1074 : }
1075 : }
1076 :
1077 0 : SetModalInputMode( bModal );
1078 0 : }
1079 :
1080 : // -----------------------------------------------------------------------
1081 :
1082 0 : void Dialog::GrabFocusToFirstControl()
1083 : {
1084 : Window* pFocusControl;
1085 :
1086 : // Wenn Dialog den Focus hat, versuchen wr trotzdem
1087 : // ein Focus-Control zu finden
1088 0 : if ( HasFocus() )
1089 0 : pFocusControl = NULL;
1090 : else
1091 : {
1092 : // Wenn schon ein Child-Fenster mal den Focus hatte,
1093 : // dann dieses bevorzugen
1094 0 : pFocusControl = ImplGetFirstOverlapWindow()->mpWindowImpl->mpLastFocusWindow;
1095 : // Control aus der Dialog-Steuerung suchen
1096 0 : if ( pFocusControl )
1097 0 : pFocusControl = ImplFindDlgCtrlWindow( pFocusControl );
1098 : }
1099 : // Kein Control hatte vorher den Focus, oder das Control
1100 : // befindet sich nicht in der Tab-Steuerung, dann das erste
1101 : // Control in der TabSteuerung den Focus geben
1102 0 : if ( !pFocusControl ||
1103 0 : !(pFocusControl->GetStyle() & WB_TABSTOP) ||
1104 0 : !isVisibleInLayout(pFocusControl) ||
1105 0 : !isEnabledInLayout(pFocusControl) || !pFocusControl->IsInputEnabled() )
1106 : {
1107 0 : sal_uInt16 n = 0;
1108 0 : pFocusControl = ImplGetDlgWindow( n, DLGWINDOW_FIRST );
1109 : }
1110 0 : if ( pFocusControl )
1111 0 : pFocusControl->ImplControlFocus( GETFOCUS_INIT );
1112 0 : }
1113 :
1114 0 : void Dialog::GetDrawWindowBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder, sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const
1115 : {
1116 0 : ImplBorderWindow aImplWin( (Window*)this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP );
1117 : // aImplWin.SetText( GetText() );
1118 : // aImplWin.SetPosSizePixel( aPos.X(), aPos.Y(), aSize.Width(), aSize.Height() );
1119 : // aImplWin.SetDisplayActive( sal_True );
1120 : // aImplWin.InitView();
1121 0 : aImplWin.GetBorder( rLeftBorder, rTopBorder, rRightBorder, rBottomBorder );
1122 0 : }
1123 :
1124 :
1125 0 : void Dialog::Draw( OutputDevice* pDev, const Point& rPos, const Size& rSize, sal_uLong )
1126 : {
1127 0 : Point aPos = pDev->LogicToPixel( rPos );
1128 0 : Size aSize = pDev->LogicToPixel( rSize );
1129 :
1130 0 : Wallpaper aWallpaper = GetBackground();
1131 0 : if ( !aWallpaper.IsBitmap() )
1132 0 : ImplInitSettings();
1133 :
1134 0 : pDev->Push();
1135 0 : pDev->SetMapMode();
1136 0 : pDev->SetLineColor();
1137 :
1138 0 : if ( aWallpaper.IsBitmap() )
1139 0 : pDev->DrawBitmapEx( aPos, aSize, aWallpaper.GetBitmap() );
1140 : else
1141 : {
1142 0 : pDev->SetFillColor( aWallpaper.GetColor() );
1143 0 : pDev->DrawRect( Rectangle( aPos, aSize ) );
1144 : }
1145 :
1146 0 : if (!( GetStyle() & WB_NOBORDER ))
1147 : {
1148 0 : ImplBorderWindow aImplWin( this, WB_BORDER|WB_STDWORK, BORDERWINDOW_STYLE_OVERLAP );
1149 0 : aImplWin.SetText( GetText() );
1150 0 : aImplWin.setPosSizePixel( aPos.X(), aPos.Y(), aSize.Width(), aSize.Height() );
1151 0 : aImplWin.SetDisplayActive( sal_True );
1152 0 : aImplWin.InitView();
1153 :
1154 0 : aImplWin.Draw( Rectangle( aPos, aSize ), pDev, aPos );
1155 : }
1156 :
1157 0 : pDev->Pop();
1158 0 : }
1159 :
1160 0 : bool Dialog::isLayoutEnabled() const
1161 : {
1162 : //pre dtor called, and single child is a container => we're layout enabled
1163 0 : const Window *pChild = mpDialogImpl ? GetWindow(WINDOW_FIRSTCHILD) : NULL;
1164 0 : return pChild && isContainerWindow(*pChild) && !pChild->GetWindow(WINDOW_NEXT);
1165 : }
1166 :
1167 0 : Size Dialog::GetOptimalSize(WindowSizeType eType) const
1168 : {
1169 0 : if (eType == WINDOWSIZE_MAXIMUM || !isLayoutEnabled())
1170 0 : return SystemWindow::GetOptimalSize(eType);
1171 :
1172 0 : Size aSize = VclContainer::getLayoutRequisition(*GetWindow(WINDOW_FIRSTCHILD));
1173 :
1174 0 : sal_Int32 nBorderWidth = get_border_width();
1175 :
1176 0 : aSize.Height() += mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
1177 0 : + 2*nBorderWidth;
1178 0 : aSize.Width() += mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
1179 0 : + 2*nBorderWidth;
1180 :
1181 0 : return Window::CalcWindowSize(aSize);
1182 : }
1183 :
1184 0 : void Dialog::setPosSizeOnContainee(Size aSize, VclContainer &rBox)
1185 : {
1186 0 : sal_Int32 nBorderWidth = get_border_width();
1187 :
1188 0 : aSize.Width() -= mpWindowImpl->mnLeftBorder + mpWindowImpl->mnRightBorder
1189 0 : + 2 * nBorderWidth;
1190 0 : aSize.Height() -= mpWindowImpl->mnTopBorder + mpWindowImpl->mnBottomBorder
1191 0 : + 2 * nBorderWidth;
1192 :
1193 : Point aPos(mpWindowImpl->mnLeftBorder + nBorderWidth,
1194 0 : mpWindowImpl->mnTopBorder + nBorderWidth);
1195 :
1196 0 : VclContainer::setLayoutAllocation(rBox, aPos, aSize);
1197 0 : }
1198 :
1199 0 : IMPL_LINK( Dialog, ImplHandleLayoutTimerHdl, void*, EMPTYARG )
1200 : {
1201 0 : if (!isLayoutEnabled())
1202 : {
1203 : SAL_WARN("vcl.layout", "Dialog has become non-layout because extra children have been added directly to it.");
1204 0 : return 0;
1205 : }
1206 :
1207 0 : VclBox *pBox = static_cast<VclBox*>(GetWindow(WINDOW_FIRSTCHILD));
1208 : assert(pBox);
1209 0 : setPosSizeOnContainee(GetSizePixel(), *pBox);
1210 0 : return 0;
1211 : }
1212 :
1213 0 : void Dialog::queue_layout()
1214 : {
1215 0 : if (hasPendingLayout())
1216 0 : return;
1217 0 : if (IsInClose())
1218 0 : return;
1219 0 : if (!isLayoutEnabled())
1220 0 : return;
1221 0 : maLayoutTimer.Start();
1222 : }
1223 :
1224 0 : void Dialog::Resize()
1225 : {
1226 0 : queue_layout();
1227 0 : }
1228 :
1229 0 : bool Dialog::set_property(const rtl::OString &rKey, const rtl::OString &rValue)
1230 : {
1231 0 : if (rKey.equalsL(RTL_CONSTASCII_STRINGPARAM("border-width")))
1232 0 : set_border_width(rValue.toInt32());
1233 : else
1234 0 : return SystemWindow::set_property(rKey, rValue);
1235 0 : return true;
1236 : }
1237 :
1238 0 : VclBuilderContainer::VclBuilderContainer()
1239 0 : : m_pUIBuilder(NULL)
1240 : {
1241 0 : }
1242 :
1243 0 : VclBuilderContainer::~VclBuilderContainer()
1244 : {
1245 0 : delete m_pUIBuilder;
1246 0 : }
1247 :
1248 : // -----------------------------------------------------------------------
1249 :
1250 0 : ModelessDialog::ModelessDialog( Window* pParent, const ResId& rResId ) :
1251 0 : Dialog( WINDOW_MODELESSDIALOG )
1252 : {
1253 0 : rResId.SetRT( RSC_MODELESSDIALOG );
1254 :
1255 0 : WinBits nStyle = init( pParent, rResId );
1256 :
1257 0 : if ( !(nStyle & WB_HIDE) )
1258 0 : Show();
1259 0 : }
1260 :
1261 0 : ModelessDialog::ModelessDialog( Window* pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription ) :
1262 0 : Dialog(pParent, rID, rUIXMLDescription, WINDOW_MODELESSDIALOG)
1263 : {
1264 0 : }
1265 :
1266 : // =======================================================================
1267 :
1268 0 : ModalDialog::ModalDialog( Window* pParent, WinBits nStyle ) :
1269 0 : Dialog( WINDOW_MODALDIALOG )
1270 : {
1271 0 : ImplInit( pParent, nStyle );
1272 0 : }
1273 :
1274 : // -----------------------------------------------------------------------
1275 :
1276 0 : ModalDialog::ModalDialog( Window* pParent, const ResId& rResId ) :
1277 0 : Dialog( WINDOW_MODALDIALOG )
1278 : {
1279 0 : rResId.SetRT( RSC_MODALDIALOG );
1280 0 : init( pParent, rResId );
1281 0 : }
1282 :
1283 0 : ModalDialog::ModalDialog( Window* pParent, const rtl::OString& rID, const rtl::OUString& rUIXMLDescription ) :
1284 0 : Dialog(pParent, rID, rUIXMLDescription, WINDOW_MODALDIALOG)
1285 : {
1286 108 : }
1287 :
1288 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|