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 <tools/debug.hxx>
21 :
22 : #include <vcl/svapp.hxx>
23 : #include <vcl/menu.hxx>
24 : #include <vcl/svapp.hxx>
25 : #include <vcl/event.hxx>
26 : #include <vcl/syswin.hxx>
27 : #include <vcl/taskpanelist.hxx>
28 : #include <vcl/unowrap.hxx>
29 :
30 : #include <rtl/strbuf.hxx>
31 :
32 : #include <salframe.hxx>
33 : #include <svdata.hxx>
34 : #include <brdwin.hxx>
35 : #include <window.h>
36 :
37 : using namespace ::com::sun::star::uno;
38 : using namespace ::com::sun::star::lang;
39 :
40 : // =======================================================================
41 : class SystemWindow::ImplData
42 : {
43 : public:
44 : ImplData();
45 : ~ImplData();
46 :
47 : TaskPaneList* mpTaskPaneList;
48 : Size maMaxOutSize;
49 : rtl::OUString maRepresentedURL;
50 : Link maCloseHdl;
51 : };
52 :
53 263 : SystemWindow::ImplData::ImplData()
54 : {
55 263 : mpTaskPaneList = NULL;
56 263 : maMaxOutSize = Size( SHRT_MAX, SHRT_MAX );
57 263 : }
58 :
59 126 : SystemWindow::ImplData::~ImplData()
60 : {
61 63 : if( mpTaskPaneList )
62 63 : delete mpTaskPaneList;
63 63 : }
64 :
65 : // =======================================================================
66 :
67 263 : SystemWindow::SystemWindow( WindowType nType ) :
68 263 : Window( nType )
69 : {
70 263 : mpImplData = new ImplData;
71 263 : mpWindowImpl->mbSysWin = sal_True;
72 263 : mpWindowImpl->mnActivateMode = ACTIVATE_MODE_GRABFOCUS;
73 :
74 263 : mpMenuBar = NULL;
75 263 : mbPined = sal_False;
76 263 : mbRollUp = sal_False;
77 263 : mbRollFunc = sal_False;
78 263 : mbDockBtn = sal_False;
79 263 : mbHideBtn = sal_False;
80 263 : mbSysChild = sal_False;
81 263 : mnMenuBarMode = MENUBAR_MODE_NORMAL;
82 263 : mnIcon = 0;
83 263 : }
84 :
85 126 : SystemWindow::~SystemWindow()
86 : {
87 63 : delete mpImplData;
88 63 : mpImplData = NULL;
89 63 : }
90 :
91 : // -----------------------------------------------------------------------
92 :
93 1165 : long SystemWindow::Notify( NotifyEvent& rNEvt )
94 : {
95 : // capture KeyEvents for menu handling
96 1165 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
97 : {
98 0 : MenuBar* pMBar = mpMenuBar;
99 0 : if ( !pMBar && ( GetType() == WINDOW_FLOATINGWINDOW ) )
100 : {
101 0 : Window* pWin = ImplGetFrameWindow()->ImplGetWindow();
102 0 : if( pWin && pWin->IsSystemWindow() )
103 0 : pMBar = ((SystemWindow*)pWin)->GetMenuBar();
104 : }
105 0 : if ( pMBar && pMBar->ImplHandleKeyEvent( *rNEvt.GetKeyEvent(), sal_False ) )
106 0 : return sal_True;
107 : }
108 :
109 1165 : return Window::Notify( rNEvt );
110 : }
111 :
112 : // -----------------------------------------------------------------------
113 :
114 1052 : long SystemWindow::PreNotify( NotifyEvent& rNEvt )
115 : {
116 : // capture KeyEvents for taskpane cycling
117 1052 : if ( rNEvt.GetType() == EVENT_KEYINPUT )
118 : {
119 0 : if( rNEvt.GetKeyEvent()->GetKeyCode().GetCode() == KEY_F6 &&
120 0 : rNEvt.GetKeyEvent()->GetKeyCode().IsMod1() &&
121 0 : !rNEvt.GetKeyEvent()->GetKeyCode().IsShift() )
122 : {
123 : // Ctrl-F6 goes directly to the document
124 0 : GrabFocusToDocument();
125 0 : return sal_True;
126 : }
127 : else
128 : {
129 0 : TaskPaneList *pTList = mpImplData->mpTaskPaneList;
130 0 : if( !pTList && ( GetType() == WINDOW_FLOATINGWINDOW ) )
131 : {
132 0 : Window* pWin = ImplGetFrameWindow()->ImplGetWindow();
133 0 : if( pWin && pWin->IsSystemWindow() )
134 0 : pTList = ((SystemWindow*)pWin)->mpImplData->mpTaskPaneList;
135 : }
136 0 : if( !pTList )
137 : {
138 : // search topmost system window which is the one to handle dialog/toolbar cycling
139 0 : SystemWindow *pSysWin = this;
140 0 : Window *pWin = this;
141 0 : while( pWin )
142 : {
143 0 : pWin = pWin->GetParent();
144 0 : if( pWin && pWin->IsSystemWindow() )
145 0 : pSysWin = (SystemWindow*) pWin;
146 : }
147 0 : pTList = pSysWin->mpImplData->mpTaskPaneList;
148 : }
149 0 : if( pTList && pTList->HandleKeyEvent( *rNEvt.GetKeyEvent() ) )
150 0 : return sal_True;
151 : }
152 : }
153 1052 : return Window::PreNotify( rNEvt );
154 : }
155 :
156 : // -----------------------------------------------------------------------
157 :
158 1220 : TaskPaneList* SystemWindow::GetTaskPaneList()
159 : {
160 1220 : if( mpImplData->mpTaskPaneList )
161 984 : return mpImplData->mpTaskPaneList ;
162 : else
163 : {
164 236 : mpImplData->mpTaskPaneList = new TaskPaneList();
165 236 : MenuBar* pMBar = mpMenuBar;
166 236 : if ( !pMBar && ( GetType() == WINDOW_FLOATINGWINDOW ) )
167 : {
168 0 : Window* pWin = ImplGetFrameWindow()->ImplGetWindow();
169 0 : if ( pWin && pWin->IsSystemWindow() )
170 0 : pMBar = ((SystemWindow*)pWin)->GetMenuBar();
171 : }
172 236 : if( pMBar )
173 0 : mpImplData->mpTaskPaneList->AddWindow( pMBar->ImplGetWindow() );
174 236 : return mpImplData->mpTaskPaneList;
175 : }
176 : }
177 :
178 : // -----------------------------------------------------------------------
179 :
180 0 : sal_Bool SystemWindow::Close()
181 : {
182 0 : ImplDelData aDelData;
183 0 : ImplAddDel( &aDelData );
184 0 : ImplCallEventListeners( VCLEVENT_WINDOW_CLOSE );
185 0 : if ( aDelData.IsDead() )
186 0 : return sal_False;
187 0 : ImplRemoveDel( &aDelData );
188 :
189 0 : if ( mpWindowImpl->mxWindowPeer.is() && IsCreatedWithToolkit() )
190 0 : return sal_False;
191 :
192 : // Is Window not closeable, ignore close
193 0 : Window* pBorderWin = ImplGetBorderWindow();
194 : WinBits nStyle;
195 0 : if ( pBorderWin )
196 0 : nStyle = pBorderWin->GetStyle();
197 : else
198 0 : nStyle = GetStyle();
199 0 : if ( !(nStyle & WB_CLOSEABLE) )
200 0 : return sal_False;
201 :
202 0 : Hide();
203 :
204 0 : return sal_True;
205 : }
206 :
207 : // -----------------------------------------------------------------------
208 :
209 0 : void SystemWindow::TitleButtonClick( sal_uInt16 )
210 : {
211 0 : }
212 :
213 : // -----------------------------------------------------------------------
214 :
215 0 : void SystemWindow::Pin()
216 : {
217 0 : }
218 :
219 : // -----------------------------------------------------------------------
220 :
221 0 : void SystemWindow::Roll()
222 : {
223 0 : }
224 :
225 : // -----------------------------------------------------------------------
226 :
227 0 : void SystemWindow::Resizing( Size& )
228 : {
229 0 : }
230 :
231 : // -----------------------------------------------------------------------
232 :
233 303 : void SystemWindow::SetRepresentedURL( const rtl::OUString& i_rURL )
234 : {
235 303 : bool bChanged = (i_rURL != mpImplData->maRepresentedURL);
236 303 : mpImplData->maRepresentedURL = i_rURL;
237 303 : if ( !mbSysChild && bChanged )
238 : {
239 259 : const Window* pWindow = this;
240 777 : while ( pWindow->mpWindowImpl->mpBorderWindow )
241 259 : pWindow = pWindow->mpWindowImpl->mpBorderWindow;
242 :
243 259 : if ( pWindow->mpWindowImpl->mbFrame )
244 259 : pWindow->mpWindowImpl->mpFrame->SetRepresentedURL( i_rURL );
245 : }
246 303 : }
247 :
248 : // -----------------------------------------------------------------------
249 :
250 543 : void SystemWindow::SetIcon( sal_uInt16 nIcon )
251 : {
252 543 : if ( mnIcon == nIcon )
253 850 : return;
254 :
255 236 : mnIcon = nIcon;
256 :
257 236 : if ( !mbSysChild )
258 : {
259 236 : const Window* pWindow = this;
260 708 : while ( pWindow->mpWindowImpl->mpBorderWindow )
261 236 : pWindow = pWindow->mpWindowImpl->mpBorderWindow;
262 :
263 236 : if ( pWindow->mpWindowImpl->mbFrame )
264 236 : pWindow->mpWindowImpl->mpFrame->SetIcon( nIcon );
265 : }
266 : }
267 :
268 : // -----------------------------------------------------------------------
269 :
270 0 : void SystemWindow::EnableSaveBackground( sal_Bool bSave )
271 : {
272 0 : if( ImplGetSVData()->maWinData.mbNoSaveBackground )
273 0 : bSave = false;
274 :
275 0 : Window* pWindow = this;
276 0 : while ( pWindow->mpWindowImpl->mpBorderWindow )
277 0 : pWindow = pWindow->mpWindowImpl->mpBorderWindow;
278 0 : if ( pWindow->mpWindowImpl->mbOverlapWin && !pWindow->mpWindowImpl->mbFrame )
279 : {
280 0 : pWindow->mpWindowImpl->mpOverlapData->mbSaveBack = bSave;
281 0 : if ( !bSave )
282 0 : pWindow->ImplDeleteOverlapBackground();
283 : }
284 0 : }
285 :
286 : // -----------------------------------------------------------------------
287 :
288 0 : sal_Bool SystemWindow::IsSaveBackgroundEnabled() const
289 : {
290 0 : const Window* pWindow = this;
291 0 : while ( pWindow->mpWindowImpl->mpBorderWindow )
292 0 : pWindow = pWindow->mpWindowImpl->mpBorderWindow;
293 0 : if ( pWindow->mpWindowImpl->mpOverlapData )
294 0 : return pWindow->mpWindowImpl->mpOverlapData->mbSaveBack;
295 : else
296 0 : return sal_False;
297 : }
298 :
299 : // -----------------------------------------------------------------------
300 :
301 0 : void SystemWindow::ShowTitleButton( sal_uInt16 nButton, sal_Bool bVisible )
302 : {
303 0 : if ( nButton == TITLE_BUTTON_DOCKING )
304 : {
305 0 : if ( mbDockBtn != bVisible )
306 : {
307 0 : mbDockBtn = bVisible;
308 0 : if ( mpWindowImpl->mpBorderWindow )
309 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetDockButton( bVisible );
310 : }
311 : }
312 0 : else if ( nButton == TITLE_BUTTON_HIDE )
313 : {
314 0 : if ( mbHideBtn != bVisible )
315 : {
316 0 : mbHideBtn = bVisible;
317 0 : if ( mpWindowImpl->mpBorderWindow )
318 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetHideButton( bVisible );
319 : }
320 : }
321 0 : else if ( nButton == TITLE_BUTTON_MENU )
322 : {
323 0 : if ( mpWindowImpl->mpBorderWindow )
324 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuButton( bVisible );
325 : }
326 : else
327 0 : return;
328 : }
329 :
330 : // -----------------------------------------------------------------------
331 :
332 0 : sal_Bool SystemWindow::IsTitleButtonVisible( sal_uInt16 nButton ) const
333 : {
334 0 : if ( nButton == TITLE_BUTTON_DOCKING )
335 0 : return mbDockBtn;
336 : else /* if ( nButton == TITLE_BUTTON_HIDE ) */
337 0 : return mbHideBtn;
338 : }
339 :
340 : // -----------------------------------------------------------------------
341 :
342 0 : void SystemWindow::SetPin( sal_Bool bPin )
343 : {
344 0 : if ( bPin != mbPined )
345 : {
346 0 : mbPined = bPin;
347 0 : if ( mpWindowImpl->mpBorderWindow )
348 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetPin( bPin );
349 : }
350 0 : }
351 :
352 : // -----------------------------------------------------------------------
353 :
354 0 : void SystemWindow::RollUp()
355 : {
356 0 : if ( !mbRollUp )
357 : {
358 0 : maOrgSize = GetOutputSizePixel();
359 0 : mbRollFunc = sal_True;
360 0 : Size aSize = maRollUpOutSize;
361 0 : if ( !aSize.Width() )
362 0 : aSize.Width() = GetOutputSizePixel().Width();
363 0 : mbRollUp = sal_True;
364 0 : if ( mpWindowImpl->mpBorderWindow )
365 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetRollUp( sal_True, aSize );
366 : else
367 0 : SetOutputSizePixel( aSize );
368 0 : mbRollFunc = sal_False;
369 : }
370 0 : }
371 :
372 : // -----------------------------------------------------------------------
373 :
374 0 : void SystemWindow::RollDown()
375 : {
376 0 : if ( mbRollUp )
377 : {
378 0 : mbRollUp = sal_False;
379 0 : if ( mpWindowImpl->mpBorderWindow )
380 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetRollUp( sal_False, maOrgSize );
381 : else
382 0 : SetOutputSizePixel( maOrgSize );
383 : }
384 0 : }
385 :
386 : // -----------------------------------------------------------------------
387 :
388 0 : void SystemWindow::SetMinOutputSizePixel( const Size& rSize )
389 : {
390 0 : maMinOutSize = rSize;
391 0 : if ( mpWindowImpl->mpBorderWindow )
392 : {
393 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMinOutputSize( rSize.Width(), rSize.Height() );
394 0 : if ( mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame )
395 0 : mpWindowImpl->mpBorderWindow->mpWindowImpl->mpFrame->SetMinClientSize( rSize.Width(), rSize.Height() );
396 : }
397 0 : else if ( mpWindowImpl->mbFrame )
398 0 : mpWindowImpl->mpFrame->SetMinClientSize( rSize.Width(), rSize.Height() );
399 0 : }
400 :
401 : // -----------------------------------------------------------------------
402 :
403 0 : void SystemWindow::SetMaxOutputSizePixel( const Size& rSize )
404 : {
405 0 : Size aSize( rSize );
406 0 : if( aSize.Width() > SHRT_MAX || aSize.Width() <= 0 )
407 0 : aSize.Width() = SHRT_MAX;
408 0 : if( aSize.Height() > SHRT_MAX || aSize.Height() <= 0 )
409 0 : aSize.Height() = SHRT_MAX;
410 :
411 0 : mpImplData->maMaxOutSize = aSize;
412 0 : if ( mpWindowImpl->mpBorderWindow )
413 : {
414 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMaxOutputSize( aSize.Width(), aSize.Height() );
415 0 : if ( mpWindowImpl->mpBorderWindow->mpWindowImpl->mbFrame )
416 0 : mpWindowImpl->mpBorderWindow->mpWindowImpl->mpFrame->SetMaxClientSize( aSize.Width(), aSize.Height() );
417 : }
418 0 : else if ( mpWindowImpl->mbFrame )
419 0 : mpWindowImpl->mpFrame->SetMaxClientSize( aSize.Width(), aSize.Height() );
420 0 : }
421 :
422 0 : const Size& SystemWindow::GetMaxOutputSizePixel() const
423 : {
424 0 : return mpImplData->maMaxOutSize;
425 : }
426 : // -----------------------------------------------------------------------
427 :
428 0 : Size SystemWindow::GetResizeOutputSizePixel() const
429 : {
430 0 : Size aSize = GetOutputSizePixel();
431 0 : if ( aSize.Width() < maMinOutSize.Width() )
432 0 : aSize.Width() = maMinOutSize.Width();
433 0 : if ( aSize.Height() < maMinOutSize.Height() )
434 0 : aSize.Height() = maMinOutSize.Height();
435 0 : return aSize;
436 : }
437 :
438 : // -----------------------------------------------------------------------
439 :
440 142 : static void ImplWindowStateFromStr(WindowStateData& rData,
441 : const rtl::OString& rStr)
442 : {
443 142 : sal_uLong nValidMask = 0;
444 142 : sal_Int32 nIndex = 0;
445 142 : rtl::OString aTokenStr;
446 :
447 142 : aTokenStr = rStr.getToken(0, ',', nIndex);
448 142 : if (!aTokenStr.isEmpty())
449 : {
450 142 : rData.SetX(aTokenStr.toInt32());
451 142 : if( rData.GetX() > -16384 && rData.GetX() < 16384 )
452 142 : nValidMask |= WINDOWSTATE_MASK_X;
453 : else
454 0 : rData.SetX( 0 );
455 : }
456 : else
457 0 : rData.SetX( 0 );
458 142 : aTokenStr = rStr.getToken(0, ',', nIndex);
459 142 : if (!aTokenStr.isEmpty())
460 : {
461 142 : rData.SetY(aTokenStr.toInt32());
462 142 : if( rData.GetY() > -16384 && rData.GetY() < 16384 )
463 142 : nValidMask |= WINDOWSTATE_MASK_Y;
464 : else
465 0 : rData.SetY( 0 );
466 : }
467 : else
468 0 : rData.SetY( 0 );
469 142 : aTokenStr = rStr.getToken(0, ',', nIndex);
470 142 : if (!aTokenStr.isEmpty())
471 : {
472 142 : rData.SetWidth(aTokenStr.toInt32());
473 142 : if( rData.GetWidth() > 0 && rData.GetWidth() < 16384 )
474 142 : nValidMask |= WINDOWSTATE_MASK_WIDTH;
475 : else
476 0 : rData.SetWidth( 0 );
477 : }
478 : else
479 0 : rData.SetWidth( 0 );
480 142 : aTokenStr = rStr.getToken(0, ';', nIndex);
481 142 : if (!aTokenStr.isEmpty())
482 : {
483 142 : rData.SetHeight(aTokenStr.toInt32());
484 142 : if( rData.GetHeight() > 0 && rData.GetHeight() < 16384 )
485 142 : nValidMask |= WINDOWSTATE_MASK_HEIGHT;
486 : else
487 0 : rData.SetHeight( 0 );
488 : }
489 : else
490 0 : rData.SetHeight( 0 );
491 142 : aTokenStr = rStr.getToken(0, ';', nIndex);
492 142 : if (!aTokenStr.isEmpty())
493 : {
494 : // #94144# allow Minimize again, should be masked out when read from configuration
495 : // 91625 - ignore Minimize
496 142 : sal_uInt32 nState = (sal_uInt32)aTokenStr.toInt32();
497 : //nState &= ~(WINDOWSTATE_STATE_MINIMIZED);
498 142 : rData.SetState( nState );
499 142 : nValidMask |= WINDOWSTATE_MASK_STATE;
500 : }
501 : else
502 0 : rData.SetState( 0 );
503 :
504 : // read maximized pos/size
505 142 : aTokenStr = rStr.getToken(0, ',', nIndex);
506 142 : if (!aTokenStr.isEmpty())
507 : {
508 142 : rData.SetMaximizedX(aTokenStr.toInt32());
509 142 : if( rData.GetMaximizedX() > -16384 && rData.GetMaximizedX() < 16384 )
510 142 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_X;
511 : else
512 0 : rData.SetMaximizedX( 0 );
513 : }
514 : else
515 0 : rData.SetMaximizedX( 0 );
516 142 : aTokenStr = rStr.getToken(0, ',', nIndex);
517 142 : if (!aTokenStr.isEmpty())
518 : {
519 142 : rData.SetMaximizedY(aTokenStr.toInt32());
520 142 : if( rData.GetMaximizedY() > -16384 && rData.GetMaximizedY() < 16384 )
521 142 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_Y;
522 : else
523 0 : rData.SetMaximizedY( 0 );
524 : }
525 : else
526 0 : rData.SetMaximizedY( 0 );
527 142 : aTokenStr = rStr.getToken(0, ',', nIndex);
528 142 : if (!aTokenStr.isEmpty())
529 : {
530 142 : rData.SetMaximizedWidth(aTokenStr.toInt32());
531 142 : if( rData.GetMaximizedWidth() > 0 && rData.GetMaximizedWidth() < 16384 )
532 0 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_WIDTH;
533 : else
534 142 : rData.SetMaximizedWidth( 0 );
535 : }
536 : else
537 0 : rData.SetMaximizedWidth( 0 );
538 142 : aTokenStr = rStr.getToken(0, ';', nIndex);
539 142 : if (!aTokenStr.isEmpty())
540 : {
541 142 : rData.SetMaximizedHeight(aTokenStr.toInt32());
542 142 : if( rData.GetMaximizedHeight() > 0 && rData.GetMaximizedHeight() < 16384 )
543 0 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_HEIGHT;
544 : else
545 142 : rData.SetMaximizedHeight( 0 );
546 : }
547 : else
548 0 : rData.SetMaximizedHeight( 0 );
549 :
550 : // mark valid fields
551 142 : rData.SetMask( nValidMask );
552 142 : }
553 :
554 : // -----------------------------------------------------------------------
555 :
556 170 : static rtl::OString ImplWindowStateToStr(const WindowStateData& rData)
557 : {
558 170 : sal_uLong nValidMask = rData.GetMask();
559 170 : if ( !nValidMask )
560 0 : return rtl::OString();
561 :
562 170 : rtl::OStringBuffer rStrBuf;
563 :
564 170 : if ( nValidMask & WINDOWSTATE_MASK_X )
565 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetX()));
566 170 : rStrBuf.append(',');
567 170 : if ( nValidMask & WINDOWSTATE_MASK_Y )
568 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetY()));
569 170 : rStrBuf.append(',');
570 170 : if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
571 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetWidth()));
572 170 : rStrBuf.append(',');
573 170 : if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
574 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetHeight()));
575 170 : rStrBuf.append( ';' );
576 170 : if ( nValidMask & WINDOWSTATE_MASK_STATE )
577 : {
578 : // #94144# allow Minimize again, should be masked out when read from configuration
579 : // 91625 - ignore Minimize
580 170 : sal_uInt32 nState = rData.GetState();
581 170 : rStrBuf.append(static_cast<sal_Int32>(nState));
582 : }
583 170 : rStrBuf.append(';');
584 170 : if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_X )
585 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedX()));
586 170 : rStrBuf.append(',');
587 170 : if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_Y )
588 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedY()));
589 170 : rStrBuf.append( ',' );
590 170 : if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_WIDTH )
591 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedWidth()));
592 170 : rStrBuf.append(',');
593 170 : if ( nValidMask & WINDOWSTATE_MASK_MAXIMIZED_HEIGHT )
594 170 : rStrBuf.append(static_cast<sal_Int32>(rData.GetMaximizedHeight()));
595 170 : rStrBuf.append(';');
596 :
597 170 : return rStrBuf.makeStringAndClear();
598 : }
599 :
600 : // -----------------------------------------------------------------------
601 :
602 284 : void SystemWindow::ImplMoveToScreen( long& io_rX, long& io_rY, long i_nWidth, long i_nHeight, Window* i_pConfigureWin )
603 : {
604 284 : Rectangle aScreenRect;
605 284 : if( !Application::IsUnifiedDisplay() )
606 0 : aScreenRect = Application::GetScreenPosSizePixel( GetScreenNumber() );
607 : else
608 : {
609 284 : aScreenRect = Application::GetScreenPosSizePixel( 0 );
610 284 : for( unsigned int i = 1; i < Application::GetScreenCount(); i++ )
611 0 : aScreenRect.Union( Application::GetScreenPosSizePixel( i ) );
612 : }
613 : // unfortunately most of the time width and height are not really known
614 284 : if( i_nWidth < 1 )
615 142 : i_nWidth = 50;
616 284 : if( i_nHeight < 1 )
617 142 : i_nHeight = 50;
618 :
619 : // check left border
620 284 : bool bMove = false;
621 284 : if( io_rX + i_nWidth < aScreenRect.Left() )
622 : {
623 0 : bMove = true;
624 0 : io_rX = aScreenRect.Left();
625 : }
626 : // check right border
627 284 : if( io_rX > aScreenRect.Right() - i_nWidth )
628 : {
629 0 : bMove = true;
630 0 : io_rX = aScreenRect.Right() - i_nWidth;
631 : }
632 : // check top border
633 284 : if( io_rY + i_nHeight < aScreenRect.Top() )
634 : {
635 0 : bMove = true;
636 0 : io_rY = aScreenRect.Top();
637 : }
638 : // check bottom border
639 284 : if( io_rY > aScreenRect.Bottom() - i_nHeight )
640 : {
641 0 : bMove = true;
642 0 : io_rY = aScreenRect.Bottom() - i_nHeight;
643 : }
644 284 : Window* pParent = i_pConfigureWin->GetParent();
645 284 : if( bMove && pParent )
646 : {
647 : // calculate absolute screen pos here, since that is what is contained in WindowState
648 0 : Point aParentAbsPos( pParent->OutputToAbsoluteScreenPixel( Point(0,0) ) );
649 0 : Size aParentSizePixel( pParent->GetOutputSizePixel() );
650 0 : Point aPos( (aParentSizePixel.Width() - i_nWidth) / 2,
651 0 : (aParentSizePixel.Height() - i_nHeight) / 2 );
652 0 : io_rX = aParentAbsPos.X() + aPos.X();
653 0 : io_rY = aParentAbsPos.Y() + aPos.Y();
654 : }
655 284 : }
656 :
657 142 : void SystemWindow::SetWindowStateData( const WindowStateData& rData )
658 : {
659 142 : sal_uLong nValidMask = rData.GetMask();
660 142 : if ( !nValidMask )
661 0 : return;
662 :
663 142 : if ( mbSysChild )
664 0 : return;
665 :
666 142 : Window* pWindow = this;
667 426 : while ( pWindow->mpWindowImpl->mpBorderWindow )
668 142 : pWindow = pWindow->mpWindowImpl->mpBorderWindow;
669 :
670 142 : if ( pWindow->mpWindowImpl->mbFrame )
671 : {
672 142 : sal_uLong nState = rData.GetState();
673 : SalFrameState aState;
674 142 : aState.mnMask = rData.GetMask();
675 142 : aState.mnX = rData.GetX();
676 142 : aState.mnY = rData.GetY();
677 142 : aState.mnWidth = rData.GetWidth();
678 142 : aState.mnHeight = rData.GetHeight();
679 :
680 142 : if( rData.GetMask() & (WINDOWSTATE_MASK_WIDTH|WINDOWSTATE_MASK_HEIGHT) )
681 : {
682 : // #i43799# adjust window state sizes if a minimial output size was set
683 : // otherwise the frame and the client might get different sizes
684 142 : if( maMinOutSize.Width() > aState.mnWidth )
685 0 : aState.mnWidth = maMinOutSize.Width();
686 142 : if( maMinOutSize.Height() > aState.mnHeight )
687 0 : aState.mnHeight = maMinOutSize.Height();
688 : }
689 :
690 142 : aState.mnMaximizedX = rData.GetMaximizedX();
691 142 : aState.mnMaximizedY = rData.GetMaximizedY();
692 142 : aState.mnMaximizedWidth = rData.GetMaximizedWidth();
693 142 : aState.mnMaximizedHeight = rData.GetMaximizedHeight();
694 : // #94144# allow Minimize again, should be masked out when read from configuration
695 : // 91625 - ignore Minimize
696 : //nState &= ~(WINDOWSTATE_STATE_MINIMIZED);
697 142 : aState.mnState = nState & SAL_FRAMESTATE_SYSTEMMASK;
698 :
699 : // normalize window positions onto screen
700 142 : ImplMoveToScreen( aState.mnX, aState.mnY, aState.mnWidth, aState.mnHeight, pWindow );
701 142 : ImplMoveToScreen( aState.mnMaximizedX, aState.mnMaximizedY, aState.mnMaximizedWidth, aState.mnMaximizedHeight, pWindow );
702 :
703 : // #96568# avoid having multiple frames at the same screen location
704 : // do the check only if not maximized
705 142 : if( !((rData.GetMask() & WINDOWSTATE_MASK_STATE) && (nState & WINDOWSTATE_STATE_MAXIMIZED)) )
706 142 : if( rData.GetMask() & (WINDOWSTATE_MASK_POS|WINDOWSTATE_MASK_WIDTH|WINDOWSTATE_MASK_HEIGHT) )
707 : {
708 142 : Rectangle aDesktop = GetDesktopRectPixel();
709 142 : ImplSVData *pSVData = ImplGetSVData();
710 142 : Window *pWin = pSVData->maWinData.mpFirstFrame;
711 142 : sal_Bool bWrapped = sal_False;
712 6073 : while( pWin )
713 : {
714 11516 : if( !pWin->ImplIsRealParentPath( this ) && ( pWin != this ) &&
715 5687 : pWin->ImplGetWindow()->IsTopWindow() && pWin->mpWindowImpl->mbReallyVisible )
716 : {
717 5585 : SalFrameGeometry g = pWin->mpWindowImpl->mpFrame->GetGeometry();
718 5585 : if( abs(g.nX-aState.mnX) < 2 && abs(g.nY-aState.mnY) < 5 )
719 : {
720 678 : long displacement = g.nTopDecoration ? g.nTopDecoration : 20;
721 1356 : if( (unsigned long) (aState.mnX + displacement + aState.mnWidth + g.nRightDecoration) > (unsigned long) aDesktop.Right() ||
722 678 : (unsigned long) (aState.mnY + displacement + aState.mnHeight + g.nBottomDecoration) > (unsigned long) aDesktop.Bottom() )
723 : {
724 : // displacing would leave screen
725 84 : aState.mnX = g.nLeftDecoration ? g.nLeftDecoration : 10; // should result in (0,0)
726 84 : aState.mnY = displacement;
727 172 : if( bWrapped ||
728 44 : (unsigned long) (aState.mnX + displacement + aState.mnWidth + g.nRightDecoration) > (unsigned long) aDesktop.Right() ||
729 44 : (unsigned long) (aState.mnY + displacement + aState.mnHeight + g.nBottomDecoration) > (unsigned long) aDesktop.Bottom() )
730 : break; // further displacement not possible -> break
731 : // avoid endless testing
732 44 : bWrapped = sal_True;
733 : }
734 : else
735 : {
736 : // displace
737 594 : aState.mnX += displacement;
738 594 : aState.mnY += displacement;
739 : }
740 638 : pWin = pSVData->maWinData.mpFirstFrame; // check new pos again
741 : }
742 : }
743 5789 : pWin = pWin->mpWindowImpl->mpFrameData->mpNextFrame;
744 : }
745 : }
746 :
747 142 : mpWindowImpl->mpFrame->SetWindowState( &aState );
748 :
749 : // do a synchronous resize for layout reasons
750 : // but use rData only when the window is not to be maximized (#i38089#)
751 : // otherwise we have no useful size information
752 142 : if( (rData.GetMask() & WINDOWSTATE_MASK_STATE) && (nState & WINDOWSTATE_STATE_MAXIMIZED) )
753 : {
754 : // query maximized size from frame
755 0 : SalFrameGeometry aGeometry = mpWindowImpl->mpFrame->GetGeometry();
756 :
757 : // but use it only if it is different from the restore size (rData)
758 : // as currently only on windows the exact size of a maximized window
759 : // can be computed without actually showing the window
760 0 : if( aGeometry.nWidth != rData.GetWidth() || aGeometry.nHeight != rData.GetHeight() )
761 0 : ImplHandleResize( pWindow, aGeometry.nWidth, aGeometry.nHeight );
762 : }
763 : else
764 142 : if( rData.GetMask() & (WINDOWSTATE_MASK_WIDTH|WINDOWSTATE_MASK_HEIGHT) )
765 142 : ImplHandleResize( pWindow, aState.mnWidth, aState.mnHeight ); // #i43799# use aState and not rData, see above
766 : }
767 : else
768 : {
769 0 : sal_uInt16 nPosSize = 0;
770 0 : if ( nValidMask & WINDOWSTATE_MASK_X )
771 0 : nPosSize |= WINDOW_POSSIZE_X;
772 0 : if ( nValidMask & WINDOWSTATE_MASK_Y )
773 0 : nPosSize |= WINDOW_POSSIZE_Y;
774 0 : if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
775 0 : nPosSize |= WINDOW_POSSIZE_WIDTH;
776 0 : if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
777 0 : nPosSize |= WINDOW_POSSIZE_HEIGHT;
778 :
779 0 : if( IsRollUp() )
780 0 : RollDown();
781 :
782 0 : long nX = rData.GetX();
783 0 : long nY = rData.GetY();
784 0 : long nWidth = rData.GetWidth();
785 0 : long nHeight = rData.GetHeight();
786 0 : const SalFrameGeometry& rGeom = pWindow->mpWindowImpl->mpFrame->GetGeometry();
787 0 : if( nX < 0 )
788 0 : nX = 0;
789 0 : if( nX + nWidth > (long) rGeom.nWidth )
790 0 : nX = rGeom.nWidth - nWidth;
791 0 : if( nY < 0 )
792 0 : nY = 0;
793 0 : if( nY + nHeight > (long) rGeom.nHeight )
794 0 : nY = rGeom.nHeight - nHeight;
795 0 : setPosSizePixel( nX, nY, nWidth, nHeight, nPosSize );
796 0 : maOrgSize = Size( nWidth, nHeight );
797 :
798 : // 91625 - ignore Minimize
799 0 : if ( nValidMask & WINDOWSTATE_MASK_STATE )
800 : {
801 0 : sal_uLong nState = rData.GetState();
802 0 : if ( nState & WINDOWSTATE_STATE_ROLLUP )
803 0 : RollUp();
804 : else
805 0 : RollDown();
806 : }
807 : }
808 : }
809 :
810 : // -----------------------------------------------------------------------
811 :
812 170 : void SystemWindow::GetWindowStateData( WindowStateData& rData ) const
813 : {
814 170 : sal_uLong nValidMask = rData.GetMask();
815 170 : if ( !nValidMask )
816 0 : return;
817 :
818 170 : if ( mbSysChild )
819 0 : return;
820 :
821 170 : const Window* pWindow = this;
822 510 : while ( pWindow->mpWindowImpl->mpBorderWindow )
823 170 : pWindow = pWindow->mpWindowImpl->mpBorderWindow;
824 :
825 170 : if ( pWindow->mpWindowImpl->mbFrame )
826 : {
827 : SalFrameState aState;
828 170 : aState.mnMask = 0xFFFFFFFF;
829 170 : if ( mpWindowImpl->mpFrame->GetWindowState( &aState ) )
830 : {
831 170 : if ( nValidMask & WINDOWSTATE_MASK_X )
832 170 : rData.SetX( aState.mnX );
833 170 : if ( nValidMask & WINDOWSTATE_MASK_Y )
834 170 : rData.SetY( aState.mnY );
835 170 : if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
836 170 : rData.SetWidth( aState.mnWidth );
837 170 : if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
838 170 : rData.SetHeight( aState.mnHeight );
839 170 : if ( aState.mnMask & SAL_FRAMESTATE_MASK_MAXIMIZED_X )
840 : {
841 0 : rData.SetMaximizedX( aState.mnMaximizedX );
842 0 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_X;
843 : }
844 170 : if ( aState.mnMask & SAL_FRAMESTATE_MASK_MAXIMIZED_Y )
845 : {
846 0 : rData.SetMaximizedY( aState.mnMaximizedY );
847 0 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_Y;
848 : }
849 170 : if ( aState.mnMask & SAL_FRAMESTATE_MASK_MAXIMIZED_WIDTH )
850 : {
851 0 : rData.SetMaximizedWidth( aState.mnMaximizedWidth );
852 0 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_WIDTH;
853 : }
854 170 : if ( aState.mnMask & SAL_FRAMESTATE_MASK_MAXIMIZED_HEIGHT )
855 : {
856 0 : rData.SetMaximizedHeight( aState.mnMaximizedHeight );
857 0 : nValidMask |= WINDOWSTATE_MASK_MAXIMIZED_HEIGHT;
858 : }
859 170 : if ( nValidMask & WINDOWSTATE_MASK_STATE )
860 : {
861 : // #94144# allow Minimize again, should be masked out when read from configuration
862 : // 91625 - ignore Minimize
863 170 : if ( !(nValidMask&WINDOWSTATE_MASK_MINIMIZED) )
864 63 : aState.mnState &= ~(WINDOWSTATE_STATE_MINIMIZED);
865 170 : rData.SetState( aState.mnState );
866 : }
867 170 : rData.SetMask( nValidMask );
868 : }
869 : else
870 0 : rData.SetMask( 0 );
871 : }
872 : else
873 : {
874 0 : Point aPos = GetPosPixel();
875 0 : Size aSize = GetSizePixel();
876 0 : sal_uLong nState = 0;
877 :
878 0 : if ( IsRollUp() )
879 : {
880 0 : aSize.Height() += maOrgSize.Height();
881 0 : nState |= WINDOWSTATE_STATE_ROLLUP;
882 : }
883 :
884 0 : if ( nValidMask & WINDOWSTATE_MASK_X )
885 0 : rData.SetX( aPos.X() );
886 0 : if ( nValidMask & WINDOWSTATE_MASK_Y )
887 0 : rData.SetY( aPos.Y() );
888 0 : if ( nValidMask & WINDOWSTATE_MASK_WIDTH )
889 0 : rData.SetWidth( aSize.Width() );
890 0 : if ( nValidMask & WINDOWSTATE_MASK_HEIGHT )
891 0 : rData.SetHeight( aSize.Height() );
892 0 : if ( nValidMask & WINDOWSTATE_MASK_STATE )
893 0 : rData.SetState( nState );
894 : }
895 : }
896 :
897 : // -----------------------------------------------------------------------
898 :
899 142 : void SystemWindow::SetWindowState(const rtl::OString& rStr)
900 : {
901 142 : if (rStr.isEmpty())
902 142 : return;
903 :
904 142 : WindowStateData aData;
905 142 : ImplWindowStateFromStr( aData, rStr );
906 142 : SetWindowStateData( aData );
907 : }
908 :
909 : // -----------------------------------------------------------------------
910 :
911 170 : rtl::OString SystemWindow::GetWindowState( sal_uLong nMask ) const
912 : {
913 170 : WindowStateData aData;
914 170 : aData.SetMask( nMask );
915 170 : GetWindowStateData( aData );
916 :
917 170 : return ImplWindowStateToStr(aData);
918 : }
919 :
920 : // -----------------------------------------------------------------------
921 :
922 456 : void SystemWindow::SetMenuBar( MenuBar* pMenuBar )
923 : {
924 456 : if ( mpMenuBar != pMenuBar )
925 : {
926 299 : MenuBar* pOldMenuBar = mpMenuBar;
927 299 : Window* pOldWindow = NULL;
928 299 : Window* pNewWindow=NULL;
929 299 : mpMenuBar = pMenuBar;
930 :
931 299 : if ( mpWindowImpl->mpBorderWindow && (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) )
932 : {
933 299 : if ( pOldMenuBar )
934 63 : pOldWindow = pOldMenuBar->ImplGetWindow();
935 : else
936 236 : pOldWindow = NULL;
937 299 : if ( pOldWindow )
938 : {
939 63 : ImplCallEventListeners( VCLEVENT_WINDOW_MENUBARREMOVED, (void*) pOldMenuBar );
940 63 : pOldWindow->SetAccessible( ::com::sun::star::uno::Reference< ::com::sun::star::accessibility::XAccessible >() );
941 : }
942 299 : if ( pMenuBar )
943 : {
944 : DBG_ASSERT( !pMenuBar->pWindow, "SystemWindow::SetMenuBar() - MenuBars can only set in one SystemWindow at time" );
945 236 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuBarWindow( pNewWindow = MenuBar::ImplCreate( mpWindowImpl->mpBorderWindow, pOldWindow, pMenuBar ) );
946 236 : ImplCallEventListeners( VCLEVENT_WINDOW_MENUBARADDED, (void*) pMenuBar );
947 : }
948 : else
949 63 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuBarWindow( NULL );
950 299 : ImplToBottomChild();
951 299 : if ( pOldMenuBar )
952 : {
953 63 : sal_Bool bDelete = (pMenuBar == 0) ? sal_True : sal_False;
954 63 : if( bDelete && pOldWindow )
955 : {
956 63 : if( mpImplData->mpTaskPaneList )
957 63 : mpImplData->mpTaskPaneList->RemoveWindow( pOldWindow );
958 : }
959 63 : MenuBar::ImplDestroy( pOldMenuBar, bDelete );
960 63 : if( bDelete )
961 63 : pOldWindow = NULL; // will be deleted in MenuBar::ImplDestroy,
962 : }
963 :
964 : }
965 : else
966 : {
967 0 : if( pMenuBar )
968 0 : pNewWindow = pMenuBar->ImplGetWindow();
969 0 : if( pOldMenuBar )
970 0 : pOldWindow = pOldMenuBar->ImplGetWindow();
971 : }
972 :
973 : // update taskpane list to make menubar accessible
974 299 : if( mpImplData->mpTaskPaneList )
975 : {
976 299 : if( pOldWindow )
977 0 : mpImplData->mpTaskPaneList->RemoveWindow( pOldWindow );
978 299 : if( pNewWindow )
979 236 : mpImplData->mpTaskPaneList->AddWindow( pNewWindow );
980 : }
981 : }
982 456 : }
983 :
984 : // -----------------------------------------------------------------------
985 :
986 0 : void SystemWindow::SetMenuBarMode( sal_uInt16 nMode )
987 : {
988 0 : if ( mnMenuBarMode != nMode )
989 : {
990 0 : mnMenuBarMode = nMode;
991 0 : if ( mpWindowImpl->mpBorderWindow && (mpWindowImpl->mpBorderWindow->GetType() == WINDOW_BORDERWINDOW) )
992 : {
993 0 : if ( nMode == MENUBAR_MODE_HIDE )
994 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuBarMode( sal_True );
995 : else
996 0 : ((ImplBorderWindow*)mpWindowImpl->mpBorderWindow)->SetMenuBarMode( sal_False );
997 : }
998 : }
999 0 : }
1000 :
1001 : // -----------------------------------------------------------------------
1002 :
1003 385 : sal_Bool SystemWindow::ImplIsInTaskPaneList( Window* pWin )
1004 : {
1005 385 : if( mpImplData && mpImplData->mpTaskPaneList )
1006 385 : return mpImplData->mpTaskPaneList->IsInList( pWin );
1007 0 : return sal_False;
1008 : }
1009 :
1010 0 : unsigned int SystemWindow::GetScreenNumber() const
1011 : {
1012 0 : return mpWindowImpl->mpFrame->maGeometry.nDisplayScreenNumber;
1013 : }
1014 :
1015 0 : void SystemWindow::SetScreenNumber(unsigned int nDisplayScreen)
1016 : {
1017 0 : mpWindowImpl->mpFrame->SetScreenNumber( nDisplayScreen );
1018 0 : }
1019 :
1020 366 : void SystemWindow::SetApplicationID(const rtl::OUString &rApplicationID)
1021 : {
1022 366 : mpWindowImpl->mpFrame->SetApplicationID( rApplicationID );
1023 366 : }
1024 :
1025 0 : void SystemWindow::SetCloseHdl(const Link& rLink)
1026 : {
1027 0 : mpImplData->maCloseHdl = rLink;
1028 0 : }
1029 :
1030 0 : const Link& SystemWindow::GetCloseHdl() const
1031 : {
1032 0 : return mpImplData->maCloseHdl;
1033 : }
1034 :
1035 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|