xref: /trunk/main/sfx2/source/appl/workwin.cxx (revision d119d52d)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sfx2.hxx"
26 
27 #ifndef GCC
28 #endif
29 
30 #include <stdio.h>
31 #include <hash_map>
32 
33 #include <sfx2/docfile.hxx>
34 #include <sfx2/objsh.hxx>
35 #include <sfx2/app.hxx>
36 #include "workwin.hxx"
37 #include <sfx2/viewfrm.hxx>
38 #include "arrdecl.hxx"
39 #include <sfx2/viewfrm.hxx>
40 #include <sfx2/module.hxx>
41 #include <sfx2/dispatch.hxx>
42 #include <sfx2/dockwin.hxx>
43 #include <sfx2/viewsh.hxx>
44 #include "splitwin.hxx"
45 #include <sfx2/msgpool.hxx>
46 #include "sfx2/sfxresid.hxx"
47 #include <sfx2/objsh.hxx>
48 #include <sfx2/request.hxx>      // SFX_ITEMSET_SET
49 #include <vcl/taskpanelist.hxx>
50 #include <vcl/toolbox.hxx>
51 #include <tools/rcid.h>
52 #include <tools/diagnose_ex.h>
53 #include <toolkit/helper/vclunohelper.hxx>
54 #include <svl/itempool.hxx>
55 #include <svl/itemiter.hxx>
56 #include <svl/whiter.hxx>
57 #include <svl/intitem.hxx>
58 #ifndef _SFXEITEM_HXX //autogen
59 #include <svl/eitem.hxx>
60 #endif
61 #include <com/sun/star/ui/XUIElement.hpp>
62 #include <com/sun/star/frame/XLayoutManager.hpp>
63 #include <com/sun/star/frame/XLayoutManagerEventBroadcaster.hpp>
64 #include <com/sun/star/frame/LayoutManagerEvents.hpp>
65 #include <com/sun/star/beans/XPropertySet.hpp>
66 #include <com/sun/star/awt/XWindow.hpp>
67 #include <com/sun/star/lang/DisposedException.hpp>
68 
69 using namespace ::com::sun::star;
70 using namespace ::com::sun::star::uno;
71 namespace css = ::com::sun::star;
72 
73 struct ResIdToResName
74 {
75     sal_uInt16      nId;
76     const char* pName;
77 };
78 
79 static const ResIdToResName pToolBarResToName[] =
80 {
81     { 558,      "fullscreenbar"        },
82     { 560,      "standardbar",         },
83     { 18001,    "formsnavigationbar"   },
84     { 18002,    "formsfilterbar"       },
85     { 18003,    "formtextobjectbar"    },
86     { 18004,    "formcontrols"         },
87     { 18005,    "moreformcontrols"     },
88     { 18006,    "formdesign"           },
89     { 20050,    "toolbar"              },      //math
90     { 30001,    "objectbar"            },      //chart
91     { 30513,    "toolbar"              },      //chart
92     { 25005,    "textobjectbar"        },      //calc
93     { 25053,    "drawobjectbar"        },
94     { 25054,    "graphicobjectbar"     },
95     { 25001,    "formatobjectbar"      },
96     { 25006,    "previewbar"           },
97     { 25035,    "toolbar"              },      //calc
98     { 23015,    "bezierobjectbar"      },      //draw/impress
99     { 23019,    "gluepointsobjectbar"  },
100     { 23030,    "graphicobjectbar"     },
101     { 23013,    "drawingobjectbar"     },      //impress
102     { 23016,    "textobjectbar"        },      //impress
103     { 23028,    "textobjectbar"        },      //draw
104     { 23011,    "toolbar"              },      //impress
105     { 23020,    "optionsbar"           },
106     { 23021,    "commontaskbar"        },
107     { 23025,    "toolbar"              },      //draw
108     { 23026,    "optionsbar"           },
109     { 23027,    "drawingobjectbar"     },      //draw
110     { 23017,    "outlinetoolbar"       },      //impress
111     { 23012,    "slideviewtoolbar"     },
112     { 23014,    "slideviewobjectbar"   },
113     { 23283,    "bezierobjectbar"      },      //writer
114     { 23269,    "drawingobjectbar"     },
115     { 23270,    "drawtextobjectbar"    },
116     { 23267,    "frameobjectbar"       },
117     { 23268,    "graphicobjectbar"     },
118     { 23271,    "numobjectbar"         },
119     { 23272,    "oleobjectbar"         },
120     { 23266,    "tableobjectbar"       },
121     { 23265,    "textobjectbar"        },
122     { 20631,    "previewobjectbar"     },      //writer
123     { 20402,    "toolbar"              },      //web
124     { 20403,    "textobjectbar"        },
125     { 23273,    "toolbar"              },      //writer
126     { 20408,    "frameobjectbar"       },      //web
127     { 20410,    "graphicobjectbar"     },
128     { 20411,    "oleobjectbar"         },
129     { 14850,    "macrobar"             },
130     { 10987,    "fontworkobjectbar"    },      //global
131     { 10986,    "extrusionobjectbar"   },
132     { 23022,    "formsobjectbar"       },
133     { 23310,    "viewerbar"            },      //writer (plugin)
134     { 25000,    "viewerbar"            },      //calc   (plugin)
135     { 23023,    "viewerbar"            },      //impress(plugin)
136     { 23024,    "viewerbar"            },      //draw   (plugin)
137     { 23031,    "mediaobjectbar"       },      //draw/impress
138     { 25060,    "mediaobjectbar"       },      //calc
139     { 23311,    "mediaobjectbar"       },      //writer
140     { 0,        ""                     }
141 };
142 
143 DBG_NAME(SfxWorkWindow)
144 
145 //SV_IMPL_OBJARR( SfxObjectBarArr_Impl, SfxObjectBar_Impl );
146 
147 //====================================================================
148 // Sortiert die Children nach ihrem Alignment
149 // Reihenfolge entspricht der im enum SfxChildAlignment (->CHILDWIN.HXX).
150 //
151 
152 // Hilfe, um die "Anderungen am Alignment kompatibal zu machen!
153 
154 
SFX_IMPL_XINTERFACE_3(LayoutManagerListener,OWeakObject,::com::sun::star::frame::XLayoutManagerListener,::com::sun::star::lang::XEventListener,::com::sun::star::lang::XComponent)155 SFX_IMPL_XINTERFACE_3( LayoutManagerListener, OWeakObject, ::com::sun::star::frame::XLayoutManagerListener, ::com::sun::star::lang::XEventListener, ::com::sun::star::lang::XComponent )
156 SFX_IMPL_XTYPEPROVIDER_3( LayoutManagerListener, ::com::sun::star::frame::XLayoutManagerListener, ::com::sun::star::lang::XEventListener, ::com::sun::star::lang::XComponent )
157 
158 LayoutManagerListener::LayoutManagerListener(
159     SfxWorkWindow* pWrkWin ) :
160     m_bHasFrame( sal_False ),
161     m_pWrkWin( pWrkWin ),
162     m_aLayoutManagerPropName( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" ))
163 {
164 }
165 
~LayoutManagerListener()166 LayoutManagerListener::~LayoutManagerListener()
167 {
168 }
169 
setFrame(const css::uno::Reference<css::frame::XFrame> & xFrame)170 void LayoutManagerListener::setFrame( const css::uno::Reference< css::frame::XFrame >& xFrame )
171 {
172     ::vos::OGuard aGuard( Application::GetSolarMutex() );
173     if ( m_pWrkWin && !m_bHasFrame )
174     {
175         m_xFrame    = xFrame;
176         m_bHasFrame = sal_True;
177 
178         if ( xFrame.is() )
179         {
180             css::uno::Reference< css::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
181             css::uno::Reference< css::frame::XLayoutManagerEventBroadcaster > xLayoutManager;
182             if ( xPropSet.is() )
183             {
184                 try
185                 {
186                     Any aValue = xPropSet->getPropertyValue( m_aLayoutManagerPropName );
187 	                aValue >>= xLayoutManager;
188 
189                     if ( xLayoutManager.is() )
190                         xLayoutManager->addLayoutManagerEventListener(
191                             css::uno::Reference< css::frame::XLayoutManagerListener >(
192                                 static_cast< OWeakObject* >( this ), css::uno::UNO_QUERY ));
193 
194                     xPropSet = css::uno::Reference< css::beans::XPropertySet >( xLayoutManager, UNO_QUERY );
195                     if ( xPropSet.is() )
196                     {
197                         aValue = xPropSet->getPropertyValue(
198                             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "LockCount" )) );
199                         aValue >>= m_pWrkWin->m_nLock;
200                     }
201                 }
202                 catch ( css::lang::DisposedException& )
203                 {
204                 }
205                 catch ( css::uno::RuntimeException& e )
206                 {
207                     throw e;
208                 }
209                 catch ( css::uno::Exception& )
210                 {
211                 }
212             }
213         }
214     }
215 }
216 
217 //---------------------------------------------------------------------------------------------------------
218 //  XComponent
219 //---------------------------------------------------------------------------------------------------------
addEventListener(const css::uno::Reference<css::lang::XEventListener> &)220 void SAL_CALL LayoutManagerListener::addEventListener(
221     const css::uno::Reference< css::lang::XEventListener >& )
222 throw (::com::sun::star::uno::RuntimeException)
223 {
224     // do nothing, only internal class
225 }
226 
removeEventListener(const css::uno::Reference<css::lang::XEventListener> &)227 void SAL_CALL LayoutManagerListener::removeEventListener(
228     const css::uno::Reference< css::lang::XEventListener >& )
229 throw (::com::sun::star::uno::RuntimeException)
230 {
231     // do nothing, only internal class
232 }
233 
dispose()234 void SAL_CALL LayoutManagerListener::dispose()
235 throw( css::uno::RuntimeException )
236 {
237     ::vos::OGuard aGuard( Application::GetSolarMutex() );
238 
239     // reset member
240     m_pWrkWin = 0;
241 
242     css::uno::Reference< css::frame::XFrame > xFrame( m_xFrame.get(), css::uno::UNO_QUERY );
243     if ( xFrame.is() )
244     {
245         m_xFrame = css::uno::Reference< css::frame::XFrame >();
246         m_bHasFrame = sal_False;
247 
248         css::uno::Reference< css::beans::XPropertySet > xPropSet( xFrame, css::uno::UNO_QUERY );
249         css::uno::Reference< css::frame::XLayoutManagerEventBroadcaster > xLayoutManager;
250         if ( xPropSet.is() )
251         {
252             try
253             {
254                 css::uno::Any aValue = xPropSet->getPropertyValue( m_aLayoutManagerPropName );
255 	            aValue >>= xLayoutManager;
256 
257                 // remove as listener from layout manager
258                 if ( xLayoutManager.is() )
259                     xLayoutManager->removeLayoutManagerEventListener(
260                         css::uno::Reference< css::frame::XLayoutManagerListener >(
261                             static_cast< OWeakObject* >( this ), css::uno::UNO_QUERY ));
262             }
263             catch ( css::lang::DisposedException& )
264             {
265             }
266             catch ( css::uno::RuntimeException& e )
267             {
268                 throw e;
269             }
270             catch ( css::uno::Exception& )
271             {
272             }
273         }
274     }
275 }
276 
277 //---------------------------------------------------------------------------------------------------------
278 //  XEventListener
279 //---------------------------------------------------------------------------------------------------------
disposing(const css::lang::EventObject &)280 void SAL_CALL LayoutManagerListener::disposing(
281     const css::lang::EventObject& )
282 throw( css::uno::RuntimeException )
283 {
284     ::vos::OGuard aGuard( Application::GetSolarMutex() );
285     m_pWrkWin = 0;
286     m_bHasFrame = sal_False;
287     m_xFrame = css::uno::Reference< css::frame::XFrame >();
288 }
289 
290 //---------------------------------------------------------------------------------------------------------
291 // XLayoutManagerEventListener
292 //---------------------------------------------------------------------------------------------------------
layoutEvent(const css::lang::EventObject &,::sal_Int16 eLayoutEvent,const css::uno::Any &)293 void SAL_CALL LayoutManagerListener::layoutEvent(
294     const css::lang::EventObject&,
295     ::sal_Int16                   eLayoutEvent,
296     const css::uno::Any&                        )
297 throw (css::uno::RuntimeException)
298 {
299     ::vos::OGuard aGuard( Application::GetSolarMutex() );
300     if ( m_pWrkWin )
301     {
302         if ( eLayoutEvent == css::frame::LayoutManagerEvents::VISIBLE )
303         {
304             m_pWrkWin->MakeVisible_Impl( sal_True );
305             m_pWrkWin->ShowChilds_Impl();
306             m_pWrkWin->ArrangeChilds_Impl( sal_True );
307         }
308         else if ( eLayoutEvent == css::frame::LayoutManagerEvents::INVISIBLE )
309         {
310             m_pWrkWin->MakeVisible_Impl( sal_False );
311             m_pWrkWin->HideChilds_Impl();
312             m_pWrkWin->ArrangeChilds_Impl( sal_True );
313         }
314         else if ( eLayoutEvent == css::frame::LayoutManagerEvents::LOCK )
315         {
316             m_pWrkWin->Lock_Impl( sal_True );
317         }
318         else if ( eLayoutEvent == css::frame::LayoutManagerEvents::UNLOCK )
319         {
320             m_pWrkWin->Lock_Impl( sal_False );
321         }
322     }
323 }
324 
325 //====================================================================
326 
327 typedef std::hash_map< sal_Int32, rtl::OUString > ToolBarResIdToResourceURLMap;
328 
329 static sal_Bool bMapInitialized = sal_False;
330 static ToolBarResIdToResourceURLMap aResIdToResourceURLMap;
331 
GetResourceURLFromResId(sal_uInt16 nResId)332 static rtl::OUString GetResourceURLFromResId( sal_uInt16 nResId )
333 {
334     if ( !bMapInitialized )
335     {
336         osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex() ) ;
337         if ( !bMapInitialized )
338         {
339             sal_Int32 nIndex( 0 );
340             while ( pToolBarResToName[nIndex].nId != 0 )
341             {
342                 rtl::OUString aResourceURL( rtl::OUString::createFromAscii( pToolBarResToName[nIndex].pName ));
343                 aResIdToResourceURLMap.insert( ToolBarResIdToResourceURLMap::value_type(
344                                                     sal_Int32( pToolBarResToName[nIndex].nId ), aResourceURL ));
345                 ++nIndex;
346             }
347             bMapInitialized = sal_True;
348         }
349     }
350 
351     ToolBarResIdToResourceURLMap::const_iterator pIter = aResIdToResourceURLMap.find( nResId );
352     if ( pIter != aResIdToResourceURLMap.end() )
353         return pIter->second;
354     else
355         return rtl::OUString();
356 }
357 
IsAppWorkWinToolbox_Impl(sal_uInt16 nPos)358 sal_Bool IsAppWorkWinToolbox_Impl( sal_uInt16 nPos )
359 {
360 	switch ( nPos )
361 	{
362 		case SFX_OBJECTBAR_APPLICATION :
363 		case SFX_OBJECTBAR_MACRO:
364 		case SFX_OBJECTBAR_FULLSCREEN:
365 			return sal_True;
366 		default:
367 			return sal_False;
368 	}
369 }
370 
TbxMatch(sal_uInt16 nPos)371 sal_uInt16 TbxMatch( sal_uInt16 nPos )
372 {
373     switch ( nPos )
374     {
375         case SFX_OBJECTBAR_APPLICATION :
376             return 0;
377         case SFX_OBJECTBAR_OPTIONS:
378             return 1;
379         case SFX_OBJECTBAR_MACRO:
380             return 2;
381         case SFX_OBJECTBAR_OBJECT:
382             return 3;
383         case SFX_OBJECTBAR_TOOLS:
384             return 4;
385         case SFX_OBJECTBAR_FULLSCREEN:
386         case SFX_OBJECTBAR_COMMONTASK:
387         case SFX_OBJECTBAR_RECORDING:
388             return nPos+1;
389         default:
390             return nPos;
391     }
392 }
393 
ChildAlignValue(SfxChildAlignment eAlign)394 sal_uInt16 ChildAlignValue(SfxChildAlignment eAlign)
395 {
396 	sal_uInt16 ret = 17;
397 
398 	switch (eAlign)
399 	{
400 		case SFX_ALIGN_HIGHESTTOP:
401 			ret = 1;
402 			break;
403 		case SFX_ALIGN_LOWESTBOTTOM:
404 			ret = 2;
405 			break;
406 		case SFX_ALIGN_FIRSTLEFT:
407 			ret = 3;
408 			break;
409 		case SFX_ALIGN_LASTRIGHT:
410 			ret = 4;
411 			break;
412 		case SFX_ALIGN_LEFT:
413 			ret = 5;
414 			break;
415 		case SFX_ALIGN_RIGHT:
416 			ret = 6;
417 			break;
418 		case SFX_ALIGN_FIRSTRIGHT:
419 			ret = 7;
420 			break;
421 		case SFX_ALIGN_LASTLEFT:
422 			ret = 8;
423 			break;
424 		case SFX_ALIGN_TOP:
425 			ret = 9;
426 			break;
427 		case SFX_ALIGN_BOTTOM:
428 			ret = 10;
429 			break;
430 		case SFX_ALIGN_TOOLBOXTOP:
431 			ret = 11;
432 			break;
433 		case SFX_ALIGN_TOOLBOXBOTTOM:
434 			ret = 12;
435 			break;
436 		case SFX_ALIGN_LOWESTTOP:
437 			ret = 13;
438 			break;
439 		case SFX_ALIGN_HIGHESTBOTTOM:
440 			ret = 14;
441 			break;
442 		case SFX_ALIGN_TOOLBOXLEFT:
443 			ret = 15;
444 			break;
445 		case SFX_ALIGN_TOOLBOXRIGHT:
446 			ret = 16;
447 			break;
448 		case SFX_ALIGN_NOALIGNMENT:
449 			break;  // -Wall not handled...
450 	}
451 
452 	return ret;
453 }
454 
ChildTravelValue(SfxChildAlignment eAlign)455 sal_uInt16 ChildTravelValue( SfxChildAlignment eAlign )
456 {
457 	sal_uInt16 ret = 17;
458 
459 	switch (eAlign)
460 	{
461 		case SFX_ALIGN_FIRSTLEFT:
462 			ret = 1;
463 			break;
464 		case SFX_ALIGN_LEFT:
465 			ret = 2;
466 			break;
467 		case SFX_ALIGN_LASTLEFT:
468 			ret = 3;
469 			break;
470 		case SFX_ALIGN_TOOLBOXLEFT:
471 			ret = 4;
472 			break;
473 		case SFX_ALIGN_HIGHESTTOP:
474 			ret = 5;
475 			break;
476 		case SFX_ALIGN_TOP:
477 			ret = 6;
478 			break;
479 		case SFX_ALIGN_TOOLBOXTOP:
480 			ret = 7;
481 			break;
482 		case SFX_ALIGN_LOWESTTOP:
483 			ret = 8;
484 			break;
485 		case SFX_ALIGN_HIGHESTBOTTOM:
486 			ret = 9;
487 			break;
488 		case SFX_ALIGN_TOOLBOXBOTTOM:
489 			ret = 10;
490 			break;
491 		case SFX_ALIGN_BOTTOM:
492 			ret = 11;
493 			break;
494 		case SFX_ALIGN_LOWESTBOTTOM:
495 			ret = 12;
496 			break;
497 		case SFX_ALIGN_TOOLBOXRIGHT:
498 			ret = 13;
499 			break;
500 		case SFX_ALIGN_FIRSTRIGHT:
501 			ret = 14;
502 			break;
503 		case SFX_ALIGN_RIGHT:
504 			ret = 15;
505 			break;
506 		case SFX_ALIGN_LASTRIGHT:
507 			ret = 16;
508 			break;
509 		case SFX_ALIGN_NOALIGNMENT:
510 			break;  // -Wall not handled.
511 	}
512 
513 	return ret;
514 }
515 
Sort_Impl()516 void SfxWorkWindow::Sort_Impl()
517 {
518 	aSortedList.Remove(0, aSortedList.Count());
519 	for (sal_uInt16 i=0; i<pChilds->Count(); i++)
520 	{
521 		SfxChild_Impl *pCli = (*pChilds)[i];
522 		if (pCli)
523 		{
524 			sal_uInt16 k;
525 			for (k=0; k<aSortedList.Count(); k++)
526 //				if ( (*pChilds)[aSortedList[k]]->eAlign > pCli->eAlign )
527 				if (ChildAlignValue((*pChilds)[aSortedList[k]]->eAlign) >
528 					ChildAlignValue(pCli->eAlign))
529 					break;
530 			aSortedList.Insert (i,k);
531 		}
532 	}
533 
534 	bSorted = sal_True;
535 }
536 
537 
538 //====================================================================
539 // ctor f"ur workwin eines Frames
540 
SfxFrameWorkWin_Impl(Window * pWin,SfxFrame * pFrm,SfxFrame * pMaster)541 SfxFrameWorkWin_Impl::SfxFrameWorkWin_Impl( Window *pWin, SfxFrame *pFrm, SfxFrame* pMaster )
542     : SfxWorkWindow(
543         pWin,
544         pFrm->GetCurrentViewFrame()->GetBindings(),
545         pFrm->GetParentFrame() ? pFrm->GetParentFrame()->GetWorkWindow_Impl() : NULL )
546     , pMasterFrame( pMaster )
547     , pFrame( pFrm )
548 {
549 	pConfigShell = pFrm->GetCurrentViewFrame();
550 	if ( pConfigShell && pConfigShell->GetObjectShell() )
551 	{
552 		bShowStatusBar = ( !pConfigShell->GetObjectShell()->IsInPlaceActive() );
553 		bDockingAllowed = sal_True;
554         bInternalDockingAllowed = sal_True;
555 	}
556 
557 	// Die ben"otigten SplitWindows (je eins f"ur jede Seite) werden erzeugt
558 	for ( sal_uInt16 n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
559 	{
560 		// Die SplitWindows sind direkte ChildWindows des WorkWindows und enthalten
561 		// die angedockten Fenster.
562 
563 		SfxChildAlignment eAlign =
564 						( n == SFX_SPLITWINDOWS_LEFT ? SFX_ALIGN_LEFT :
565 							n == SFX_SPLITWINDOWS_RIGHT ? SFX_ALIGN_RIGHT :
566 							n == SFX_SPLITWINDOWS_TOP ? SFX_ALIGN_TOP :
567 								SFX_ALIGN_BOTTOM );
568 		SfxSplitWindow *pSplitWin = new SfxSplitWindow(pWorkWin, eAlign, this, pParent==0 );
569 		pSplit[n] = pSplitWin;
570 	}
571 
572     //nOrigMode = SFX_VISIBILITY_CLIENT;
573     nOrigMode = SFX_VISIBILITY_STANDARD;
574 	nUpdateMode = SFX_VISIBILITY_STANDARD;
575 }
576 
577 //====================================================================
578 // ctor der Basisklasse
579 
SfxWorkWindow(Window * pWin,SfxBindings & rB,SfxWorkWindow * pParentWorkwin)580 SfxWorkWindow::SfxWorkWindow( Window *pWin, SfxBindings& rB, SfxWorkWindow* pParentWorkwin ) :
581 	pParent( pParentWorkwin ),
582 	pBindings(&rB),
583 	pWorkWin (pWin),
584 	pConfigShell( 0 ),
585     pActiveChild( 0 ),
586 	nChilds( 0 ),
587 	nOrigMode( 0 ),
588 	bSorted( sal_True ),
589 	bDockingAllowed(sal_True),
590     bInternalDockingAllowed(sal_True),
591 	bAllChildsVisible(sal_True),
592     bIsFullScreen( sal_False ),
593     bShowStatusBar( sal_True ),
594     m_nLock( 0 ),
595     m_aStatusBarResName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/statusbar/statusbar" )),
596     m_aLayoutManagerPropName( RTL_CONSTASCII_USTRINGPARAM( "LayoutManager" )),
597     m_aTbxTypeName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/toolbar/" )),
598     m_aProgressBarResName( RTL_CONSTASCII_USTRINGPARAM( "private:resource/progressbar/progressbar" ))
599 {
600 	DBG_CTOR(SfxWorkWindow, 0);
601 	DBG_ASSERT (pBindings, "Keine Bindings!");
602 
603 	pBindings->SetWorkWindow_Impl( this );
604 
605 	pChildWins = new SfxChildWindows_Impl;
606 	pChilds = new SfxChildList_Impl;
607 
608 	// F"ur die ObjectBars wird ein fester Platz in der ChildList reserviert,
609 	// damit sie immer in einer definierten Reihenfolge kommen.
610 	SfxChild_Impl* pChild=0;
611 	for (sal_uInt16 n=0; n < SFX_OBJECTBAR_MAX; ++n)
612 		pChilds->Insert(0,pChild);
613 
614     // create and initialize layout manager listener
615     Reference< com::sun::star::frame::XFrame > xFrame = GetFrameInterface();
616     LayoutManagerListener* pLayoutManagerListener = new LayoutManagerListener( this );
617     m_xLayoutManagerListener = css::uno::Reference< css::lang::XComponent >(
618                                     static_cast< cppu::OWeakObject* >( pLayoutManagerListener ),
619                                         css::uno::UNO_QUERY );
620     pLayoutManagerListener->setFrame( xFrame );
621 }
622 
623 //====================================================================
624 // dtor
625 
~SfxWorkWindow()626 SfxWorkWindow::~SfxWorkWindow()
627 {
628 	DBG_DTOR(SfxWorkWindow, 0);
629 
630 	// SplitWindows l"oschen
631     for ( sal_uInt16 n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
632 	{
633 		SfxSplitWindow *p = pSplit[n];
634 		if (p->GetWindowCount())
635 			ReleaseChild_Impl(*p);
636         delete p;
637 	}
638 
639 	// Hilfsstruktur f"ur Child-Windows l"oschen
640 	DBG_ASSERT( pChilds->Count() == 0, "dangling childs" );
641 	delete pChilds;
642 	delete pChildWins;
643 
644     if ( m_xLayoutManagerListener.is() )
645         m_xLayoutManagerListener->dispose();
646 }
647 
GetTopWindow() const648 SystemWindow* SfxWorkWindow::GetTopWindow() const
649 {
650     Window* pRet = pWorkWin;
651     while ( pRet && !pRet->IsSystemWindow() )
652         pRet = pRet->GetParent();
653     return (SystemWindow*) pRet;
654 }
655 
Lock_Impl(sal_Bool bLock)656 void SfxWorkWindow::Lock_Impl( sal_Bool bLock )
657 {
658     if ( bLock )
659         m_nLock++;
660     else
661         --m_nLock;
662     if ( m_nLock<0 )
663     {
664         DBG_ERROR("Lock count underflow!");
665         m_nLock = 0;
666     }
667 
668     if ( !m_nLock )
669         ArrangeChilds_Impl();
670 }
671 
ChangeWindow_Impl(Window * pNew)672 void SfxWorkWindow::ChangeWindow_Impl( Window *pNew )
673 {
674 	Window *pOld = pWorkWin;
675 	pWorkWin = pNew;
676 	for ( sal_uInt16 nPos = 0; nPos < pChilds->Count(); ++nPos )
677 	{
678 		SfxChild_Impl *pCli = (*pChilds)[nPos];
679 		if ( pCli && pCli->pWin && pCli->pWin->GetParent() == pOld )
680 		{
681 			pCli->pWin->SetParent( pNew );
682 		}
683 	}
684 }
685 
SaveStatus_Impl()686 void SfxWorkWindow::SaveStatus_Impl()
687 {
688 	sal_uInt16 nCount = pChildWins->Count();
689     for ( sal_uInt16 n=0; n<nCount; n++ )
690 	{
691 		SfxChildWin_Impl* pCW = (*pChildWins)[n];
692 		SfxChildWindow *pChild = pCW->pWin;
693 		if (pChild)
694 		{
695             sal_uInt16 nFlags = pCW->aInfo.nFlags;
696 			pCW->aInfo = pChild->GetInfo();
697             pCW->aInfo.nFlags |= nFlags;
698 			SaveStatus_Impl(pChild, pCW->aInfo);
699 		}
700 	}
701 }
702 
703 //--------------------------------------------------------------------
704 // Hilfsmethode zum Freigeben der Childlisten. Wenn danach nicht der dtor
705 // aufgerufen wird, sondern weiter gearbeitet wird, mu\s wie im ctor von
706 // SfxWorkWindow noch Platz f"ur die Objectbars und SplitWindows reserviert
707 // werden.
708 
DeleteControllers_Impl()709 void SfxWorkWindow::DeleteControllers_Impl()
710 {
711     DBG_CHKTHIS(SfxWorkWindow, 0);
712 
713     // SplitWindows locken (d.h. Resize-Reaktion an den
714     // DockingWindows unterdr"ucken)
715     sal_uInt16 n;
716     for ( n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
717     {
718         SfxSplitWindow *p = pSplit[n];
719        	if (p->GetWindowCount())
720 	    p->Lock();
721     }
722 
723     // Child-Windows l"oschen
724     for ( n=0; n<pChildWins->Count(); )
725     {
726         SfxChildWin_Impl* pCW = (*pChildWins)[n];
727         pChildWins->Remove(n);
728        	SfxChildWindow *pChild = pCW->pWin;
729 	    if (pChild)
730 	    {
731 /*
732             sal_uInt16 nFlags = pCW->aInfo.nFlags;
733             pCW->aInfo = pChild->GetInfo();
734             pCW->aInfo.nFlags |= nFlags;
735             SaveStatus_Impl(pChild, pCW->aInfo);
736 */
737 	        pChild->Hide();
738 
739 	        // Wenn das ChildWindow ein direktes Childfenster ist und nicht
740 	        // in einem SplitWindow liegt, am WorkWindow abmelden.
741 	        // Nach TH ist eine Abmeldung am Splitwindow nicht erforderlich,
742 	        // wenn dieses auch gleich mit zerst"ort wird (s.u.).
743 	        if (pCW->pCli)
744 	            ReleaseChild_Impl(*pChild->GetWindow());
745 	        pCW->pWin = 0;
746 	        pWorkWin->GetSystemWindow()->GetTaskPaneList()->RemoveWindow( pChild->GetWindow() );
747             pChild->Destroy();
748         }
749 
750 	    delete pCW;
751 
752         // ATTENTION: The array itself is cleared after this loop!!
753         // Therefore we have to set every array entry to zero as it could be
754         // accessed by calling pChild->Destroy().
755         // See task 128307 (Windows)
756         // Window::NotifyAllChilds() calls SfxWorkWindow::DataChanged_Impl for
757         // 8-bit displays (WM_QUERYPALETTECHANGED message due to focus change)!!
758         //(*pChildWins)[n] = 0;
759     }
760 
761     //pChildWins->Remove((sal_uInt16)0, nCount);
762 
763     Reference< com::sun::star::frame::XFrame > xFrame = GetFrameInterface();
764     Reference< com::sun::star::beans::XPropertySet > xPropSet( xFrame, UNO_QUERY );
765     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
766     if ( xPropSet.is() )
767     {
768         try
769         {
770 	        Any aValue = xPropSet->getPropertyValue( m_aLayoutManagerPropName );
771 	        aValue >>= xLayoutManager;
772         }
773         catch ( Exception& )
774         {
775         }
776     }
777 
778     if ( xLayoutManager.is() )
779     {
780         xLayoutManager->reset();
781 
782         // StatusBar l"oschen
783         ResetStatusBar_Impl();
784 
785         // ObjectBars l"oschen( zuletzt, damit pChilds nicht tote Pointer enh"alt )
786         for ( sal_uInt16 i = 0; i < aObjBarList.size(); i++ )
787         {
788             // Nicht jede Position mu\s belegt sein
789             sal_uInt16 nId = aObjBarList[i].nId;
790             if ( nId )
791                 aObjBarList[i].nId = 0;
792         }
793     }
794 
795     // ObjectBars werden alle auf einmal released, da sie einen
796     // festen zusammenh"angenden  Bereich im Array pChilds belegen
797     pChilds->Remove(0, SFX_OBJECTBAR_MAX);
798     bSorted = sal_False;
799 
800     nChilds = 0;
801 }
802 
803 //====================================================================
804 // Virtuelle Methode zum Anordnen der Childfenster.
805 
ArrangeChilds_Impl(sal_Bool)806 void SfxWorkWindow::ArrangeChilds_Impl( sal_Bool /*bForce*/)
807 {
808     Arrange_Impl();
809 }
810 
ArrangeChilds_Impl(sal_Bool bForce)811 void SfxFrameWorkWin_Impl::ArrangeChilds_Impl( sal_Bool bForce )
812 {
813     if ( pFrame->IsClosing_Impl() || ( m_nLock && !bForce ))
814 		return;
815 
816 	SfxInPlaceClient *pClient = 0;
817     SfxViewFrame *pF = pFrame->GetCurrentViewFrame();
818     if ( pF && pF->GetViewShell() )
819         pClient = pF->GetViewShell()->GetIPClient();
820 
821     if ( pClient )
822         return;
823 
824 	aClientArea = GetTopRect_Impl();
825     if ( aClientArea.IsEmpty() )
826         return;
827 
828 	SvBorder aBorder;
829 	if ( nChilds )
830     {
831         if ( IsVisible_Impl() )
832             aBorder = Arrange_Impl();
833     }
834 
835 	// Wenn das aktuelle Dokument der Applikation einen IPClient enth"alt, mu\s
836 	// dem dazugeh"origen Objekt durch SetTopToolFramePixel der zur Verf"ugung
837 	// stehende Platz zugeteilt werden. Das Objekt zeigt dann seine UITools an
838 	// und setzt den App-Border(->SfxInPlaceEnv_Impl::ArrangeChilds_Impl()).
839 	// Anderenfalls wird hier direkt der AppBorder gesetzt, um evtl. den Border
840 	// zu "uberschreiben, den bisher ein Objekt aus einem anderen Dokument
841 	// gesetzt hatte.
842 	// Das Objekt setzt, wenn es seine UI-Tools wegnimmt, den SetAppBorder nicht,
843 	// damit kein ObjectBar-Zappeln entsteht.
844 	// (->SfxInPlaceEnv_Impl::ArrangeChilds_Impl())
845 
846     pMasterFrame->SetToolSpaceBorderPixel_Impl( aBorder );
847 
848     ArrangeAutoHideWindows( NULL );
849 }
850 
851 //--------------------------------------------------------------------
852 
Arrange_Impl()853 SvBorder SfxWorkWindow::Arrange_Impl()
854 
855 /*	[Beschreibung]
856 
857 	Diese Methode ordnet alle sichtbaren ChildFenster so an, da\s die angedockten
858 	Fenster nach der Sorierreihenfolge von au\sen nach innen aneinander
859 	gesetzt werden. Wenn ein an sich sichtbares Fenster nicht mehr in die
860 	noch freie ClientArea pa\st, wird es auf "nicht sichtbar" gesetzt.
861 
862 */
863 {
864     DBG_CHKTHIS(SfxWorkWindow, 0);
865 
866     aClientArea = GetTopRect_Impl();
867     aUpperClientArea = aClientArea;
868 
869     SvBorder aBorder;
870     if ( !nChilds )
871         return aBorder;
872 
873     if (!bSorted)
874         Sort_Impl();
875 
876     Point aPos;
877     Size aSize;
878     Rectangle aTmp( aClientArea );
879 
880     for ( sal_uInt16 n=0; n<aSortedList.Count(); ++n )
881     {
882         SfxChild_Impl* pCli = (*pChilds)[aSortedList[n]];
883         if ( !pCli->pWin )
884             continue;
885 
886         // Zun"achst nehmen wir an, da\s das Fenster Platz hat
887         pCli->nVisible |= CHILD_FITS_IN;
888 
889         // Nicht sichtbare Fenster "uberspringen
890         if (pCli->nVisible != CHILD_VISIBLE)
891             continue;
892 
893         if ( pCli->bResize )
894             aSize = pCli->aSize;
895         else
896             aSize = pCli->pWin->GetSizePixel();
897 
898         SvBorder aTemp = aBorder;
899         sal_Bool bAllowHiding = sal_True;
900         switch ( pCli->eAlign )
901         {
902             case SFX_ALIGN_HIGHESTTOP:
903             case SFX_ALIGN_TOP:
904             case SFX_ALIGN_TOOLBOXTOP:
905             case SFX_ALIGN_LOWESTTOP:
906                 aSize.Width() = aTmp.GetWidth();
907                 if ( pCli->pWin->GetType() == WINDOW_SPLITWINDOW )
908                     aSize = ((SplitWindow *)(pCli->pWin))->CalcLayoutSizePixel( aSize );
909                 bAllowHiding = sal_False;
910                 aBorder.Top() += aSize.Height();
911                 aPos = aTmp.TopLeft();
912                 aTmp.Top() += aSize.Height();
913                 if ( pCli->eAlign == SFX_ALIGN_HIGHESTTOP )
914                     aUpperClientArea.Top() += aSize.Height();
915                 break;
916 
917             case SFX_ALIGN_LOWESTBOTTOM:
918             case SFX_ALIGN_BOTTOM:
919             case SFX_ALIGN_TOOLBOXBOTTOM:
920             case SFX_ALIGN_HIGHESTBOTTOM:
921                 aSize.Width() = aTmp.GetWidth();
922                 if ( pCli->pWin->GetType() == WINDOW_SPLITWINDOW )
923                     aSize = ((SplitWindow *)(pCli->pWin))->CalcLayoutSizePixel( aSize );
924                 aBorder.Bottom() += aSize.Height();
925                 aPos = aTmp.BottomLeft();
926                 aPos.Y() -= (aSize.Height()-1);
927                 aTmp.Bottom() -= aSize.Height();
928                 if ( pCli->eAlign == SFX_ALIGN_LOWESTBOTTOM )
929                     aUpperClientArea.Bottom() -= aSize.Height();
930                 break;
931 
932             case SFX_ALIGN_FIRSTLEFT:
933             case SFX_ALIGN_LEFT:
934             case SFX_ALIGN_LASTLEFT:
935             case SFX_ALIGN_TOOLBOXLEFT:
936                 aSize.Height() = aTmp.GetHeight();
937                 if ( pCli->pWin->GetType() == WINDOW_SPLITWINDOW )
938                     aSize = ((SplitWindow *)(pCli->pWin))->CalcLayoutSizePixel( aSize );
939                 bAllowHiding = sal_False;
940                 aBorder.Left() += aSize.Width();
941                 aPos = aTmp.TopLeft();
942                 aTmp.Left() += aSize.Width();
943                 if ( pCli->eAlign != SFX_ALIGN_TOOLBOXLEFT )
944                     aUpperClientArea.Left() += aSize.Width();
945                 break;
946 
947             case SFX_ALIGN_FIRSTRIGHT:
948             case SFX_ALIGN_RIGHT:
949             case SFX_ALIGN_LASTRIGHT:
950             case SFX_ALIGN_TOOLBOXRIGHT:
951                 aSize.Height() = aTmp.GetHeight();
952                 if ( pCli->pWin->GetType() == WINDOW_SPLITWINDOW )
953                     aSize = ((SplitWindow *)(pCli->pWin))->CalcLayoutSizePixel( aSize );
954                 aBorder.Right() += aSize.Width();
955                 aPos = aTmp.TopRight();
956                 aPos.X() -= (aSize.Width()-1);
957                 aTmp.Right() -= aSize.Width();
958                 if ( pCli->eAlign != SFX_ALIGN_TOOLBOXRIGHT )
959                     aUpperClientArea.Right() -= aSize.Width();
960                 break;
961 
962             default:
963                 pCli->aSize = pCli->pWin->GetSizePixel();
964                 pCli->bResize = sal_False;
965                 continue;
966         }
967 
968         pCli->pWin->SetPosSizePixel( aPos, aSize );
969         pCli->bResize = sal_False;
970         pCli->aSize = aSize;
971         if( bAllowHiding && !RequestTopToolSpacePixel_Impl( aBorder ) )
972         {
973             pCli->nVisible ^= CHILD_FITS_IN;
974             aBorder = aTemp;
975         }
976     }
977 
978     if ( aClientArea.GetWidth() >= aBorder.Left() + aBorder.Right() )
979     {
980         aClientArea.Left() += aBorder.Left();
981         aClientArea.Right() -= aBorder.Right();
982     }
983     else
984     {
985         aBorder.Left() = aClientArea.Left();
986         aBorder.Right() = aClientArea.Right();
987         aClientArea.Right() = aClientArea.Left() = aTmp.Left();
988     }
989 
990     if ( aClientArea.GetHeight() >= aBorder.Top() + aBorder.Bottom() )
991     {
992         aClientArea.Top() += aBorder.Top();
993         aClientArea.Bottom() -= aBorder.Bottom();
994     }
995     else
996     {
997         aBorder.Top() = aClientArea.Top();
998         aBorder.Bottom() = aClientArea.Bottom();
999         aClientArea.Top() = aClientArea.Bottom() = aTmp.Top();
1000     }
1001 
1002     return IsDockingAllowed() ? aBorder : SvBorder();
1003 }
1004 
1005 //--------------------------------------------------------------------
1006 // Close-Handler: die Konfiguration der ChildWindows wird gespeichert.
1007 //
1008 
Close_Impl()1009 void SfxWorkWindow::Close_Impl()
1010 {
1011 	for (sal_uInt16 n=0; n<pChildWins->Count(); n++)
1012 	{
1013 		SfxChildWin_Impl *pCW  = (*pChildWins)[n];
1014 		SfxChildWindow *pChild = pCW->pWin;
1015 		if (pChild)
1016 		{
1017             sal_uInt16 nFlags = pCW->aInfo.nFlags;
1018 			pCW->aInfo = pChild->GetInfo();
1019             pCW->aInfo.nFlags |= nFlags;
1020 			SaveStatus_Impl(pChild, pCW->aInfo);
1021 		}
1022 	}
1023 }
1024 
PrepareClose_Impl()1025 sal_Bool SfxWorkWindow::PrepareClose_Impl()
1026 {
1027 	for (sal_uInt16 n=0; n<pChildWins->Count(); n++)
1028 	{
1029 		SfxChildWin_Impl *pCW  = (*pChildWins)[n];
1030 		SfxChildWindow *pChild = pCW->pWin;
1031 		if ( pChild && !pChild->QueryClose() )
1032 			return sal_False;
1033 	}
1034 
1035 	return sal_True;
1036 }
1037 
1038 //--------------------------------------------------------------------
1039 
RegisterChild_Impl(Window & rWindow,SfxChildAlignment eAlign,sal_Bool bCanGetFocus)1040 SfxChild_Impl* SfxWorkWindow::RegisterChild_Impl( Window& rWindow,
1041 					SfxChildAlignment eAlign, sal_Bool bCanGetFocus )
1042 {
1043 	DBG_CHKTHIS(SfxWorkWindow, 0);
1044 	DBG_ASSERT( pChilds->Count() < 255, "too many childs" );
1045 	DBG_ASSERT( SfxChildAlignValid(eAlign), "invalid align" );
1046 	DBG_ASSERT( !FindChild_Impl(rWindow), "child registered more than once" );
1047 
1048 
1049 	if ( rWindow.GetParent() != pWorkWin )
1050 		rWindow.SetParent( pWorkWin );
1051 
1052 	SfxChild_Impl *pChild = new SfxChild_Impl(rWindow, rWindow.GetSizePixel(),
1053 									eAlign, rWindow.IsVisible());
1054 	pChild->bCanGetFocus = bCanGetFocus;
1055 
1056 	pChilds->Insert(pChilds->Count(), pChild);
1057 	bSorted = sal_False;
1058 	nChilds++;
1059 	return (*pChilds)[pChilds->Count()-1];
1060 }
1061 
1062 //--------------------------------------------------------------------
1063 
AlignChild_Impl(Window & rWindow,const Size & rNewSize,SfxChildAlignment eAlign)1064 void SfxWorkWindow::AlignChild_Impl( Window& rWindow,
1065 											const Size& rNewSize,
1066 											SfxChildAlignment eAlign )
1067 {
1068 	DBG_CHKTHIS(SfxWorkWindow, 0);
1069 //	DBG_ASSERT( pChilds, "aligning unregistered child" );
1070 	DBG_ASSERT( SfxChildAlignValid(eAlign), "invalid align" );
1071 
1072 	SfxChild_Impl *pChild = FindChild_Impl(rWindow);
1073 	if ( pChild )
1074 	{
1075 		if (pChild->eAlign != eAlign)
1076 			bSorted = sal_False;
1077 
1078 		pChild->eAlign = eAlign;
1079 		pChild->aSize = rNewSize;
1080 		pChild->bResize = sal_True;
1081 	}
1082 	else {
1083 		DBG_ERROR( "aligning unregistered child" );
1084     }
1085 }
1086 
1087 //--------------------------------------------------------------------
1088 
ReleaseChild_Impl(Window & rWindow)1089 void SfxWorkWindow::ReleaseChild_Impl( Window& rWindow )
1090 {
1091 	DBG_CHKTHIS(SfxWorkWindow, 0);
1092 //	DBG_ASSERT( pChilds, "releasing unregistered child" );
1093 
1094 	SfxChild_Impl *pChild = 0;
1095 	sal_uInt16 nPos;
1096     for ( nPos = 0; nPos < pChilds->Count(); ++nPos )
1097 	{
1098 		pChild = (*pChilds)[nPos];
1099 		if ( pChild )
1100 		  if ( pChild->pWin == &rWindow )
1101 			break;
1102 	}
1103 
1104     if ( nPos < pChilds->Count() )
1105 	{
1106 		bSorted = sal_False;
1107 		nChilds--;
1108 		pChilds->Remove(nPos);
1109 		delete pChild;
1110 	}
1111 	else {
1112 		DBG_ERROR( "releasing unregistered child" );
1113     }
1114 }
1115 
1116 //--------------------------------------------------------------------
1117 
FindChild_Impl(const Window & rWindow) const1118 SfxChild_Impl* SfxWorkWindow::FindChild_Impl( const Window& rWindow ) const
1119 {
1120 	DBG_CHKTHIS(SfxWorkWindow, 0);
1121 
1122 	SfxChild_Impl *pChild = 0;
1123 	sal_uInt16 nCount = pChilds->Count();
1124 	for ( sal_uInt16 nPos = 0; nPos < nCount; ++nPos )
1125 	{
1126 		pChild = (*pChilds)[nPos];
1127 		if ( pChild )
1128 		  if ( pChild->pWin == &rWindow )
1129 			return pChild;
1130 	}
1131 
1132 	return 0;
1133 }
1134 
1135 //--------------------------------------------------------------------
1136 
ShowChilds_Impl()1137 void SfxWorkWindow::ShowChilds_Impl()
1138 {
1139 	DBG_CHKTHIS(SfxWorkWindow, 0);
1140 
1141     bool bInvisible = ( !IsVisible_Impl() || ( !pWorkWin->IsReallyVisible() && !pWorkWin->IsReallyShown() ));
1142 
1143     SfxChild_Impl *pCli = 0;
1144 	for ( sal_uInt16 nPos = 0; nPos < pChilds->Count(); ++nPos )
1145 	{
1146         SfxChildWin_Impl* pCW = 0;
1147 		pCli = (*pChilds)[nPos];
1148 
1149         if ( pCli && pCli->pWin )
1150         {
1151             // We have to find the SfxChildWin_Impl to retrieve the
1152             // SFX_CHILDWIN flags that can influence visibility.
1153             for (sal_uInt16 n=0; n<pChildWins->Count(); n++)
1154 	        {
1155                 SfxChildWin_Impl* pCWin = (*pChildWins)[n];
1156                 SfxChild_Impl*    pChild  = pCWin->pCli;
1157                 if ( pChild == pCli )
1158                 {
1159                     pCW = pCWin;
1160                     break;
1161                 }
1162             }
1163 
1164             bool bVisible( !bInvisible );
1165             if ( pCW )
1166 		    {
1167                 // Check flag SFX_CHILDWIN_NEVERHIDE that forces us to show
1168                 // the child window even in situations where no child window is
1169                 // visible.
1170                 sal_uInt16 nFlags = pCW->aInfo.nFlags;
1171                 bVisible = !bInvisible || ( bInvisible & (( nFlags & SFX_CHILDWIN_NEVERHIDE ) != 0 ));
1172             }
1173 
1174             if ( CHILD_VISIBLE == (pCli->nVisible & CHILD_VISIBLE) && bVisible )
1175 		    {
1176 			    sal_uInt16 nFlags = pCli->bSetFocus ? 0 : SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE;
1177                 switch ( pCli->pWin->GetType() )
1178 			    {
1179 				    case RSC_DOCKINGWINDOW :
1180                         ((DockingWindow*)pCli->pWin)->Show( sal_True, nFlags );
1181 					    break;
1182 				    case RSC_SPLITWINDOW :
1183                         ((SplitWindow*)pCli->pWin)->Show( sal_True, nFlags );
1184 					    break;
1185 				    default:
1186                         pCli->pWin->Show( sal_True, nFlags );
1187 					    break;
1188 			    }
1189 
1190 			    pCli->bSetFocus = sal_False;
1191 		    }
1192 		    else
1193 		    {
1194 			    switch ( pCli->pWin->GetType() )
1195 			    {
1196 				    case RSC_DOCKINGWINDOW :
1197 					    ((DockingWindow*)pCli->pWin)->Hide();
1198 					    break;
1199 				    default:
1200 					    pCli->pWin->Hide();
1201 					    break;
1202 			    }
1203 		    }
1204         }
1205 	}
1206 }
1207 
1208 //--------------------------------------------------------------------
1209 
HideChilds_Impl()1210 void SfxWorkWindow::HideChilds_Impl()
1211 {
1212 	SfxChild_Impl *pChild = 0;
1213 	for ( sal_uInt16 nPos = pChilds->Count(); nPos > 0; --nPos )
1214 	{
1215 		pChild = (*pChilds)[nPos-1];
1216 		if (pChild && pChild->pWin)
1217 		{
1218 			switch ( pChild->pWin->GetType() )
1219 			{
1220 				case RSC_DOCKINGWINDOW :
1221 					((DockingWindow*)pChild->pWin)->Hide();
1222 					break;
1223 				default:
1224 					pChild->pWin->Hide();
1225 					break;
1226 			}
1227 		}
1228 	}
1229 }
1230 
1231 //------------------------------------------------------------------------
1232 
ResetObjectBars_Impl()1233 void SfxWorkWindow::ResetObjectBars_Impl()
1234 {
1235 	sal_uInt16 n;
1236     for ( n = 0; n < aObjBarList.size(); n++ )
1237         aObjBarList[n].bDestroy = sal_True;
1238 
1239 	for ( n = 0; n < pChildWins->Count(); ++n )
1240 		(*pChildWins)[n]->nId = 0;
1241 }
1242 
NextObjectBar_Impl(sal_uInt16)1243 void SfxWorkWindow::NextObjectBar_Impl( sal_uInt16 )
1244 {
1245 }
1246 
HasNextObjectBar_Impl(sal_uInt16,String *)1247 sal_uInt16 SfxWorkWindow::HasNextObjectBar_Impl( sal_uInt16, String* )
1248 {
1249 	return 0;
1250 }
1251 
1252 //------------------------------------------------------------------------
1253 
SetObjectBar_Impl(sal_uInt16 nPos,sal_uInt32 nResId,SfxInterface * pIFace,const String * pName)1254 void SfxWorkWindow::SetObjectBar_Impl( sal_uInt16 nPos, sal_uInt32 nResId,
1255 			SfxInterface* pIFace, const String *pName)
1256 {
1257 	DBG_ASSERT( (nPos & SFX_POSITION_MASK) < SFX_OBJECTBAR_MAX,
1258 				"object bar position overflow" );
1259 
1260 	sal_uInt16 nRealPos = nPos & SFX_POSITION_MASK;
1261 	if ( pParent && IsAppWorkWinToolbox_Impl( nRealPos ) )
1262 	{
1263 		pParent->SetObjectBar_Impl( nPos, nResId, pIFace, pName );
1264 		return;
1265 	}
1266 
1267 	SfxObjectBar_Impl aObjBar;
1268 	aObjBar.pIFace = pIFace;
1269 	aObjBar.nId = sal::static_int_cast<sal_uInt16>(nResId);
1270     aObjBar.nPos = nRealPos;
1271 	aObjBar.nMode = (nPos & SFX_VISIBILITY_MASK);
1272 	if (pName)
1273 		aObjBar.aName = *pName;
1274 	else
1275 		aObjBar.aName.Erase();
1276 
1277 	for ( sal_uInt16 n=0; n<aObjBarList.size(); n++ )
1278 	{
1279 		if ( aObjBarList[n].nId == aObjBar.nId )
1280 		{
1281             aObjBarList[n] = aObjBar;
1282 			return;
1283 		}
1284 	}
1285 
1286     aObjBarList.push_back( aObjBar );
1287 }
1288 
1289 //------------------------------------------------------------------------
1290 
KnowsObjectBar_Impl(sal_uInt16 nPos) const1291 bool SfxWorkWindow::KnowsObjectBar_Impl( sal_uInt16 nPos ) const
1292 
1293 /*	[Beschreibung]
1294 
1295 	Stellt fest, ob an der betreffenden Position "uberhaupt eine
1296 	Objektleiste zur Verf"ugung stehen w"urde. Ist unabh"agig davon,
1297 	ob diese tats"achlich ein- oder ausgeschaltet ist.
1298 */
1299 
1300 {
1301 	sal_uInt16 nRealPos = nPos & SFX_POSITION_MASK;
1302 	if ( pParent && IsAppWorkWinToolbox_Impl( nRealPos ) )
1303 		return pParent->KnowsObjectBar_Impl( nPos );
1304 
1305 	for ( sal_uInt16 n=0; n<aObjBarList.size(); n++ )
1306     {
1307         if ( aObjBarList[n].nPos == nRealPos )
1308             return true;
1309     }
1310 
1311     return false;
1312 }
1313 
1314 //------------------------------------------------------------------------
1315 
IsVisible_Impl(sal_uInt16 nMode) const1316 sal_Bool SfxWorkWindow::IsVisible_Impl( sal_uInt16 nMode ) const
1317 {
1318 	switch( nUpdateMode )
1319 	{
1320 		case SFX_VISIBILITY_STANDARD:
1321 			return sal_True;
1322 		case SFX_VISIBILITY_UNVISIBLE:
1323 			return sal_False;
1324 		case SFX_VISIBILITY_PLUGSERVER:
1325 		case SFX_VISIBILITY_PLUGCLIENT:
1326 		case SFX_VISIBILITY_CLIENT:
1327 		case SFX_VISIBILITY_SERVER:
1328 			return !!(nMode & nUpdateMode);
1329 		default:
1330 			return !!(nMode & nOrigMode ) ||
1331 				nOrigMode == SFX_VISIBILITY_STANDARD;
1332 	}
1333 }
1334 
GetObjectBar_Impl(sal_uInt16,sal_uInt32)1335 Window* SfxWorkWindow::GetObjectBar_Impl( sal_uInt16, sal_uInt32 )
1336 {
1337     return NULL;
1338 }
1339 
1340 //------------------------------------------------------------------------
UpdateObjectBars_Impl()1341 void SfxFrameWorkWin_Impl::UpdateObjectBars_Impl()
1342 {
1343     if ( pFrame->IsClosing_Impl() )
1344         return;
1345 
1346 	SfxWorkWindow *pWork = pParent;
1347 	while ( pWork )
1348 	{
1349 		pWork->SfxWorkWindow::UpdateObjectBars_Impl();
1350 		pWork = pWork->GetParent_Impl();
1351 	}
1352 
1353 	SfxWorkWindow::UpdateObjectBars_Impl();
1354 
1355 //	if ( pTask->IsActive() )
1356 	{
1357 		pWork = pParent;
1358 		while ( pWork )
1359 		{
1360 			pWork->ArrangeChilds_Impl();
1361 			pWork = pWork->GetParent_Impl();
1362 		}
1363 
1364 		ArrangeChilds_Impl( sal_False );
1365 
1366 		pWork = pParent;
1367 		while ( pWork )
1368 		{
1369 			pWork->ShowChilds_Impl();
1370 			pWork = pWork->GetParent_Impl();
1371 		}
1372 
1373 		ShowChilds_Impl();
1374 	}
1375 
1376     ShowChilds_Impl();
1377 }
1378 
GetStatusIndicator()1379 Reference< ::com::sun::star::task::XStatusIndicator > SfxWorkWindow::GetStatusIndicator()
1380 {
1381     Reference< com::sun::star::beans::XPropertySet > xPropSet( GetFrameInterface(), UNO_QUERY );
1382     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
1383     Reference< com::sun::star::task::XStatusIndicator > xStatusIndicator;
1384 
1385 	if ( xPropSet.is() )
1386 	{
1387 		Any aValue = xPropSet->getPropertyValue( m_aLayoutManagerPropName );
1388 		aValue >>= xLayoutManager;
1389         if ( xLayoutManager.is() )
1390         {
1391             xLayoutManager->createElement( m_aProgressBarResName );
1392             xLayoutManager->showElement( m_aProgressBarResName );
1393 
1394             Reference< ::com::sun::star::ui::XUIElement > xProgressBar =
1395                 xLayoutManager->getElement( m_aProgressBarResName );
1396             if ( xProgressBar.is() )
1397             {
1398                 xStatusIndicator = Reference< ::com::sun::star::task::XStatusIndicator >(
1399                     xProgressBar->getRealInterface(), UNO_QUERY );
1400             }
1401         }
1402     }
1403 
1404     return xStatusIndicator;
1405 }
1406 
1407 //------------------------------------------------------------------------
1408 
IsPluginMode(SfxObjectShell * pObjShell)1409 sal_Bool SfxWorkWindow::IsPluginMode( SfxObjectShell* pObjShell )
1410 {
1411     if ( pObjShell && pObjShell->GetMedium() )
1412     {
1413         SFX_ITEMSET_ARG( pObjShell->GetMedium()->GetItemSet(), pViewOnlyItem, SfxBoolItem, SID_VIEWONLY, sal_False );
1414         if ( pViewOnlyItem && pViewOnlyItem->GetValue() )
1415             return sal_True;
1416     }
1417 
1418     return sal_False;
1419 }
1420 
1421 //------------------------------------------------------------------------
1422 
GetFrameInterface()1423 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxWorkWindow::GetFrameInterface()
1424 {
1425     ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > xFrame;
1426 
1427     SfxDispatcher* pDispatcher( GetBindings().GetDispatcher() );
1428     if ( pDispatcher )
1429     {
1430         SfxViewFrame* pFrame = pDispatcher->GetFrame();
1431         if ( pFrame )
1432            xFrame = pFrame->GetFrame().GetFrameInterface();
1433     }
1434 
1435     return xFrame;
1436 }
1437 
1438 //------------------------------------------------------------------------
1439 
UpdateObjectBars_Impl()1440 void SfxWorkWindow::UpdateObjectBars_Impl()
1441 {
1442 	// SplitWindows locken (d.h. Resize-Reaktion an den
1443 	// DockingWindows unterdr"ucken)
1444     sal_uInt16 n;
1445     for ( n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
1446     {
1447         SfxSplitWindow *p = pSplit[n];
1448         if (p->GetWindowCount())
1449             p->Lock();
1450     }
1451 
1452     // was man so "ofters braucht, merkt man sich (spart Code und Laufzeit)
1453     SFX_APP();
1454 
1455     Reference< com::sun::star::beans::XPropertySet > xPropSet( GetFrameInterface(), UNO_QUERY );
1456     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
1457 
1458 	if ( xPropSet.is() )
1459 	{
1460 		Any aValue = xPropSet->getPropertyValue( m_aLayoutManagerPropName );
1461 		aValue >>= xLayoutManager;
1462     }
1463 
1464     if ( !xLayoutManager.is() )
1465         return;
1466 
1467     sal_Bool       bPluginMode( sal_False );
1468     SfxDispatcher* pDispatcher( GetBindings().GetDispatcher() );
1469 
1470     if ( pDispatcher )
1471     {
1472         SfxViewFrame* pFrame = pDispatcher->GetFrame();
1473         if ( pFrame )
1474            bPluginMode = IsPluginMode( pFrame->GetObjectShell() );
1475     }
1476 
1477     // "uber alle Toolboxen iterieren
1478     xLayoutManager->lock();
1479 	for ( n = 0; n < aObjBarList.size(); ++n )
1480 	{
1481         sal_uInt16      nId      = aObjBarList[n].nId;
1482         sal_Bool    bDestroy = aObjBarList[n].bDestroy;
1483 
1484         // die Modi bestimmen, f"ur die die ToolBox gilt
1485         sal_uInt16 nTbxMode = aObjBarList[n].nMode;
1486         bool bFullScreenTbx = SFX_VISIBILITY_FULLSCREEN ==
1487                                   ( nTbxMode & SFX_VISIBILITY_FULLSCREEN );
1488         nTbxMode &= ~SFX_VISIBILITY_FULLSCREEN;
1489 		nTbxMode &= ~SFX_VISIBILITY_VIEWER;
1490 
1491 		// wird in diesem Kontext eine ToolBox gefordert?
1492 		bool bModesMatching = ( nUpdateMode && ( nTbxMode & nUpdateMode) == nUpdateMode );
1493         if ( bDestroy )
1494         {
1495             rtl::OUString aTbxId( m_aTbxTypeName );
1496             aTbxId += GetResourceURLFromResId( aObjBarList[n].nId );
1497             xLayoutManager->destroyElement( aTbxId );
1498         }
1499 		else if ( nId != 0 && ( ( bModesMatching && !bIsFullScreen ) ||
1500                                 ( bIsFullScreen && bFullScreenTbx ) ) )
1501         {
1502             rtl::OUString aTbxId( m_aTbxTypeName );
1503             aTbxId += GetResourceURLFromResId( aObjBarList[n].nId );
1504             if ( !IsDockingAllowed() && !xLayoutManager->isElementFloating( aTbxId ))
1505                 xLayoutManager->destroyElement( aTbxId );
1506             else
1507             {
1508                 xLayoutManager->requestElement( aTbxId );
1509                 if ( bPluginMode )
1510                     xLayoutManager->lockWindow( aTbxId );
1511             }
1512         }
1513 		else if ( nId != 0 )
1514 		{
1515 		    // ggf. Toolbox an dieser Position l"oschen
1516             rtl::OUString aTbxId( m_aTbxTypeName );
1517             aTbxId += GetResourceURLFromResId( aObjBarList[n].nId );
1518             xLayoutManager->destroyElement( aTbxId );
1519         }
1520 	}
1521 
1522 	UpdateStatusBar_Impl();
1523 
1524     // unlocking automatically forces Layout
1525     xLayoutManager->unlock();
1526 
1527 	UpdateChildWindows_Impl();
1528 
1529 	// SplitWindows wieder ent-locken
1530 	for ( n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
1531 	{
1532 		SfxSplitWindow *p = pSplit[n];
1533 		if (p->GetWindowCount())
1534 			p->Lock(sal_False);
1535 	}
1536 }
1537 
AllowChildWindowCreation_Impl(const SfxChildWin_Impl & i_rCW) const1538 bool SfxWorkWindow::AllowChildWindowCreation_Impl( const SfxChildWin_Impl& i_rCW ) const
1539 {
1540     // or checking the availability of child windows, we need access to the module
1541     const SfxViewFrame* pViewFrame = pBindings->GetDispatcher_Impl()->GetFrame();
1542     const SfxObjectShell* pShell = pViewFrame ? pViewFrame->GetObjectShell() : NULL;
1543     const SfxModule* pModule = pShell ? pShell->GetModule() : NULL;
1544     ENSURE_OR_RETURN( pModule, "SfxWorkWindow::UpdateChildWindows_Impl: did not find an SfxModule to ask for the child win availability!", true );
1545     return pModule->IsChildWindowAvailable( i_rCW.nId, pViewFrame );
1546 }
1547 
UpdateChildWindows_Impl()1548 void SfxWorkWindow::UpdateChildWindows_Impl()
1549 {
1550 	// alle vorhandenen oder in den Kontext gekommenen ChildWindows
1551 	for ( sal_uInt16 n=0; n<pChildWins->Count(); n++ )
1552 	{
1553 		SfxChildWin_Impl *pCW = (*pChildWins)[n];
1554 		SfxChildWindow *pChildWin = pCW->pWin;
1555 		sal_Bool bCreate = sal_False;
1556         if ( pCW->nId && !pCW->bDisabled  && (pCW->aInfo.nFlags & SFX_CHILDWIN_ALWAYSAVAILABLE || IsVisible_Impl( pCW->nVisibility ) ) )
1557 		{
1558 			// Im Kontext ist ein geeignetes ChildWindow erlaubt;
1559 			// ist es auch eingeschaltet ?
1560 			if ( pChildWin == NULL && pCW->bCreate )
1561 			{
1562                 // Internal docking is only used for embedding into another
1563                 // container. We force the floating state of all floatable
1564                 // child windows.
1565                 if ( !bInternalDockingAllowed )
1566                 {
1567                     // Special case for all non-floatable child windows. We have
1568                     // to prevent the creation here!
1569                     bCreate = !( pCW->aInfo.nFlags & SFX_CHILDWIN_FORCEDOCK );
1570                 }
1571                 else if ( !IsDockingAllowed() || bIsFullScreen ) // || !bInternalDocking )
1572 				{
1573                     // im PresentationMode oder FullScreen nur FloatingWindows
1574 					SfxChildAlignment eAlign;
1575 					if ( pCW->aInfo.GetExtraData_Impl( &eAlign ) )
1576 						bCreate = ( eAlign == SFX_ALIGN_NOALIGNMENT );
1577 				}
1578 				else
1579 					bCreate = sal_True;
1580 
1581                 if ( bCreate )
1582                     bCreate = AllowChildWindowCreation_Impl( *pCW );
1583 
1584 				// Momentan kein Fenster da, aber es ist eingeschaltet; Fenster
1585 				// und ggf. Context erzeugen
1586 				if ( bCreate )
1587                     CreateChildWin_Impl( pCW, sal_False );
1588 
1589 				if ( !bAllChildsVisible )
1590 				{
1591 					if ( pCW->pCli )
1592 						pCW->pCli->nVisible &= ~CHILD_ACTIVE;
1593 				}
1594 			}
1595 			else if ( pChildWin )
1596 			{
1597 				// Fenster existiert schon; soll es auch sichtbar sein ?
1598                 if ( ( !bIsFullScreen || pChildWin->GetAlignment() == SFX_ALIGN_NOALIGNMENT ) && bAllChildsVisible )
1599 				{
1600 					// Updatemode ist kompatibel; auf jeden Fall wieder einschalten
1601                     bCreate = AllowChildWindowCreation_Impl( *pCW );
1602                     if ( bCreate )
1603                     {
1604 					    if ( pCW->pCli )
1605 					    {
1606 						    // Fenster ist direktes Child
1607                             if ( bAllChildsVisible && ( (IsDockingAllowed() && bInternalDockingAllowed) || pCW->pCli->eAlign == SFX_ALIGN_NOALIGNMENT ) )
1608                                 pCW->pCli->nVisible |= CHILD_NOT_HIDDEN;
1609 					    }
1610                         else
1611                         {
1612                             if ( pCW->bCreate && IsDockingAllowed() && bInternalDockingAllowed )
1613 						        // Fenster liegt in einem SplitWindow
1614 						        ((SfxDockingWindow*)pChildWin->GetWindow())->Reappear_Impl();
1615                         }
1616 
1617 					    if ( pCW->nInterfaceId != pChildWin->GetContextId() )
1618 						    pChildWin->CreateContext( pCW->nInterfaceId, GetBindings() );
1619                     }
1620 				}
1621 			}
1622 		}
1623 
1624 		if ( pChildWin && !bCreate )
1625 		{
1626 			if ( !pChildWin->QueryClose() || pChildWin->IsHideNotDelete() || Application::IsUICaptured() )
1627 			{
1628 				if ( pCW->pCli )
1629 				{
1630 					if ( pCW->pCli->nVisible & CHILD_NOT_HIDDEN )
1631 						pCW->pCli->nVisible ^= CHILD_NOT_HIDDEN;
1632 				}
1633 				else
1634 					((SfxDockingWindow*)pChildWin->GetWindow())->Disappear_Impl();
1635 			}
1636 			else
1637 				RemoveChildWin_Impl( pCW );
1638 		}
1639 	}
1640 }
1641 
CreateChildWin_Impl(SfxChildWin_Impl * pCW,sal_Bool bSetFocus)1642 void SfxWorkWindow::CreateChildWin_Impl( SfxChildWin_Impl *pCW, sal_Bool bSetFocus )
1643 {
1644 	if ( pCW->aInfo.bVisible != 42 )
1645 		pCW->aInfo.bVisible = sal_True;
1646 
1647     SfxChildWindow *pChildWin = SfxChildWindow::CreateChildWindow( pCW->nId, pWorkWin, &GetBindings(), pCW->aInfo);
1648 	if (pChildWin)
1649 	{
1650 		if ( bSetFocus )
1651 			bSetFocus = pChildWin->WantsFocus();
1652 		pChildWin->SetWorkWindow_Impl( this );
1653 #if 0
1654 		// Enable-Status richtig setzen
1655 		pChildWin->GetWindow()->EnableInput( pCW->bEnable &&
1656             ( pWorkWin->IsInputEnabled() /* || pChildWin->GetAlignment() == SFX_ALIGN_NOALIGNMENT */ ) );
1657 #endif
1658 		// Zumindest der ExtraString wird beim Auswerten ver"andert, also neu holen
1659         SfxChildWinInfo aInfo = pChildWin->GetInfo();
1660         pCW->aInfo.aExtraString = aInfo.aExtraString;
1661         pCW->aInfo.bVisible = aInfo.bVisible;
1662         pCW->aInfo.nFlags |= aInfo.nFlags;
1663 
1664 		// Nein !! Sonst kann man keine Fenster defaultmaessig ausschalten ( Partwindow! )
1665 //		pCW->aInfo.bVisible = sal_True;
1666 
1667 		// Erzeugung war erfolgreich
1668 		GetBindings().Invalidate(pCW->nId);
1669 
1670 		sal_uInt16 nPos = pChildWin->GetPosition();
1671 		if (nPos != CHILDWIN_NOPOS)
1672 		{
1673 			DBG_ASSERT(nPos < SFX_OBJECTBAR_MAX, "Illegal objectbar position!");
1674 			if ((*pChilds)[TbxMatch(nPos)])// &&
1675 //							  pChildWin->GetAlignment() == (*pChilds)[nPos]->eAlign )
1676 			{
1677 				// ChildWindow ersetzt ObjectBar
1678 				(*pChilds)[TbxMatch(nPos)]->nVisible ^= CHILD_NOT_HIDDEN;
1679 			}
1680 		}
1681 
1682 		// make childwin keyboard accessible
1683 		pWorkWin->GetSystemWindow()->GetTaskPaneList()->AddWindow( pChildWin->GetWindow() );
1684 
1685 		pCW->pWin = pChildWin;
1686 
1687 		if ( pChildWin->GetAlignment() == SFX_ALIGN_NOALIGNMENT || pChildWin->GetWindow()->GetParent() == pWorkWin)
1688 		{
1689 			// Das Fenster ist entweder nicht angedockt oder au\serhalb
1690 			// eines SplitWindows angedockt und mu\s daher explizit als
1691 			// Child registriert werden
1692 			pCW->pCli = RegisterChild_Impl(*(pChildWin->GetWindow()), pChildWin->GetAlignment(), pChildWin->CanGetFocus());
1693 			pCW->pCli->nVisible = CHILD_VISIBLE;
1694             if ( pChildWin->GetAlignment() != SFX_ALIGN_NOALIGNMENT && bIsFullScreen )
1695 				pCW->pCli->nVisible ^= CHILD_ACTIVE;
1696 			pCW->pCli->bSetFocus = bSetFocus;
1697 		}
1698 		else
1699 		{
1700 			// Ein angedocktes Fenster, dessen Parent nicht das WorkWindow ist,
1701 			// mu\s in einem SplitWindow liegen und daher nicht explizit
1702 			// registriert werden.
1703 			// Das passiert aber schon bei der Initialisierung des
1704 			// SfxDockingWindows!
1705 		}
1706 
1707 		if ( pCW->nInterfaceId != pChildWin->GetContextId() )
1708 			pChildWin->CreateContext( pCW->nInterfaceId, GetBindings() );
1709 
1710 		// Information in der INI-Datei sichern
1711         SaveStatus_Impl(pChildWin, pCW->aInfo);
1712 	}
1713 }
1714 
RemoveChildWin_Impl(SfxChildWin_Impl * pCW)1715 void SfxWorkWindow::RemoveChildWin_Impl( SfxChildWin_Impl *pCW )
1716 {
1717 	sal_uInt16 nId = pCW->nSaveId;
1718 	SfxChildWindow *pChildWin = pCW->pWin;
1719 
1720 	// vorhandenes Fenster geht aus dem Kontext und wird daher entfernt
1721 	sal_uInt16 nPos = pChildWin->GetPosition();
1722 	if (nPos != CHILDWIN_NOPOS)
1723 	{
1724 /*
1725 		// ChildWindow "uberlagert einen ObjectBar
1726 		DBG_ASSERT(nPos < SFX_OBJECTBAR_MAX, "Illegal objectbar position!");
1727 		if ((*pChilds)[TbxMatch(nPos)] &&
1728 			(aObjBars[nPos].nMode & nUpdateMode) ) //&&
1729 //						   pChildWin->GetAlignment() == (*pChilds)[nPos]->eAlign )
1730 		{
1731 			// ObjectBar war "uberlagert; jetzt wieder anzeigen
1732 			(*pChilds)[TbxMatch(nPos)]->nVisible ^= CHILD_NOT_HIDDEN;
1733 		}
1734 */
1735 	}
1736 
1737 	// Information in der INI-Datei sichern
1738     sal_uInt16 nFlags = pCW->aInfo.nFlags;
1739     pCW->aInfo = pChildWin->GetInfo();
1740     pCW->aInfo.nFlags |= nFlags;
1741 	SaveStatus_Impl(pChildWin, pCW->aInfo);
1742 
1743 	pChildWin->Hide();
1744 
1745 	if ( pCW->pCli )
1746 	{
1747 		// ChildWindow ist ein direktes ChildWindow und mu\s sich daher
1748 		// beim WorkWindow abmelden
1749 		pCW->pCli = 0;
1750 		ReleaseChild_Impl(*pChildWin->GetWindow());
1751 	}
1752 	else
1753 	{
1754 		// ChildWindow liegt in einem SplitWindow und meldet sich
1755 		// selbst im dtor dort ab
1756 	}
1757 
1758 	pWorkWin->GetSystemWindow()->GetTaskPaneList()->RemoveWindow( pChildWin->GetWindow() );
1759 	pCW->pWin = 0;
1760 	pChildWin->Destroy();
1761 
1762 	GetBindings().Invalidate( nId );
1763 }
1764 
ResetStatusBar_Impl()1765 void SfxWorkWindow::ResetStatusBar_Impl()
1766 {
1767 	aStatBar.nId = 0;
1768 }
1769 
1770 //--------------------------------------------------------------------
SetStatusBar_Impl(sal_uInt32 nResId,SfxShell *,SfxBindings &)1771 void SfxWorkWindow::SetStatusBar_Impl( sal_uInt32 nResId, SfxShell*, SfxBindings& )
1772 {
1773     if ( nResId && bShowStatusBar && IsVisible_Impl() )
1774 		aStatBar.nId = sal::static_int_cast<sal_uInt16>(nResId);
1775 }
1776 
1777 #define SFX_ITEMTYPE_STATBAR 4
1778 
SetTempStatusBar_Impl(sal_Bool bSet)1779 void SfxWorkWindow::SetTempStatusBar_Impl( sal_Bool bSet )
1780 {
1781     if ( aStatBar.bTemp != bSet && bShowStatusBar && IsVisible_Impl() )
1782 	{
1783 		sal_Bool bOn = sal_False;
1784         sal_Bool bReset = sal_False;
1785         if ( bSet && !aStatBar.nId )
1786         {
1787             bReset = sal_True;
1788             SetStatusBar_Impl( SFX_ITEMTYPE_STATBAR, SFX_APP(), GetBindings() );
1789         }
1790 
1791         if ( aStatBar.nId && aStatBar.bOn && !bIsFullScreen )
1792 			bOn = sal_True;
1793 
1794 		aStatBar.bTemp = bSet;
1795         if ( !bOn || bReset || (!bSet && aStatBar.nId ) )
1796 		{
1797 			// Nur was tun, wenn die Temp-Einstellung wirklich was bewirkt
1798 			UpdateStatusBar_Impl();
1799 			ArrangeChilds_Impl();
1800 			ShowChilds_Impl();
1801 		}
1802 
1803         if ( bReset )
1804             ResetStatusBar_Impl();
1805 	}
1806 }
1807 
UpdateStatusBar_Impl()1808 void SfxWorkWindow::UpdateStatusBar_Impl()
1809 {
1810     Reference< ::com::sun::star::beans::XPropertySet > xPropSet( GetFrameInterface(), UNO_QUERY );
1811     Reference< ::com::sun::star::frame::XLayoutManager > xLayoutManager;
1812 
1813 	Any aValue = xPropSet->getPropertyValue( m_aLayoutManagerPropName );
1814 	aValue >>= xLayoutManager;
1815 
1816 	// keine Statusleiste, wenn keine Id gew"unscht oder bei FullScreenView
1817 	// oder wenn ausgeschaltet
1818     if ( aStatBar.nId && IsDockingAllowed() && bInternalDockingAllowed && bShowStatusBar &&
1819          ( (aStatBar.bOn && !bIsFullScreen) || aStatBar.bTemp ) )
1820 	{
1821 		// Id hat sich ge"andert, also passenden Statusbarmanager erzeugen,
1822 		// dieser "ubernimmt die aktuelle Statusleiste;
1823         if ( xLayoutManager.is() )
1824             xLayoutManager->requestElement( m_aStatusBarResName );
1825 	}
1826 	else
1827 	{
1828 		// Aktuelle StatusBar vernichten
1829 		// Der Manager erzeugt die Statusleiste nur, er zerst"ort sie
1830 		// nicht !
1831         if ( xLayoutManager.is() )
1832             xLayoutManager->destroyElement( m_aStatusBarResName );
1833 	}
1834 }
1835 
1836 //------------------------------------------------------------------------
1837 /*
1838 void SfxWorkWindow::SetObjectBarVisibility_Impl( sal_uInt16 nMask )
1839 {
1840 	switch( nMask )
1841 	{
1842 		case SFX_VISIBILITY_UNVISIBLE:
1843 		case SFX_VISIBILITY_STANDARD:
1844 		case SFX_VISIBILITY_CLIENT:
1845 		case SFX_VISIBILITY_SERVER:
1846 			nOrigMode = nMask;
1847 	}
1848 	if (nMask != nUpdateMode)
1849 		nUpdateMode = nMask;
1850 }*/
1851 
MakeVisible_Impl(sal_Bool bVis)1852 void SfxWorkWindow::MakeVisible_Impl( sal_Bool bVis )
1853 {
1854     if ( bVis )
1855         nOrigMode = SFX_VISIBILITY_STANDARD;
1856     else
1857         nOrigMode = SFX_VISIBILITY_UNVISIBLE;
1858 
1859     if ( nOrigMode != nUpdateMode)
1860         nUpdateMode = nOrigMode;
1861 }
1862 
IsVisible_Impl()1863 sal_Bool SfxWorkWindow::IsVisible_Impl()
1864 {
1865     return nOrigMode != SFX_VISIBILITY_UNVISIBLE;
1866 }
1867 
1868 //------------------------------------------------------------------------
HidePopups_Impl(sal_Bool bHide,sal_Bool bParent,sal_uInt16 nId)1869 void SfxWorkWindow::HidePopups_Impl(sal_Bool bHide, sal_Bool bParent, sal_uInt16 nId )
1870 {
1871 	for ( sal_uInt16 n = 0; n < pChildWins->Count(); ++n )
1872 	{
1873 		SfxChildWindow *pCW = (*pChildWins)[n]->pWin;
1874 		if (pCW && pCW->GetAlignment() == SFX_ALIGN_NOALIGNMENT && pCW->GetType() != nId)
1875 		{
1876 			Window *pWin = pCW->GetWindow();
1877 			SfxChild_Impl *pChild = FindChild_Impl(*pWin);
1878 			if (bHide)
1879 			{
1880 				pChild->nVisible &= ~CHILD_ACTIVE;
1881 				pCW->Hide();
1882 			}
1883 			else
1884 			{
1885 				pChild->nVisible |= CHILD_ACTIVE;
1886 				if ( CHILD_VISIBLE == (pChild->nVisible & CHILD_VISIBLE) )
1887                     pCW->Show( SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
1888 			}
1889 		}
1890 	}
1891 
1892 	if ( bParent && pParent )
1893 		pParent->HidePopups_Impl( bHide, bParent, nId );
1894 }
1895 
1896 //------------------------------------------------------------------------
1897 
ConfigChild_Impl(SfxChildIdentifier eChild,SfxDockingConfig eConfig,sal_uInt16 nId)1898 void SfxWorkWindow::ConfigChild_Impl(SfxChildIdentifier eChild,
1899 			SfxDockingConfig eConfig, sal_uInt16 nId)
1900 {
1901 	SfxDockingWindow* pDockWin=0;
1902 	sal_uInt16 nPos = USHRT_MAX;
1903 	Window *pWin=0;
1904 	SfxChildWin_Impl *pCW = 0;
1905 
1906     if ( eChild == SFX_CHILDWIN_OBJECTBAR )
1907 	{
1908         return;
1909 	}
1910 	else
1911 	{
1912         // configure direct childwindow
1913 		for (sal_uInt16 n=0; n<pChildWins->Count(); n++)
1914 		{
1915 			pCW = (*pChildWins)[n];
1916 			SfxChildWindow *pChild = pCW->pWin;
1917             if ( pChild )
1918 			{
1919                 if ( pChild->GetType() == nId )
1920 				{
1921                     if ( pChild->GetWindow()->GetType() == RSC_DOCKINGWINDOW )
1922                         // it's a DockingWindow
1923                         pDockWin = (SfxDockingWindow*) pChild->GetWindow();
1924                     else
1925                         // FloatingWindow or ModelessDialog
1926                         pWin = pChild->GetWindow();
1927 					break;
1928 				}
1929 			}
1930 		}
1931 
1932 		if ( pDockWin )
1933 		{
1934             if ( eChild == SFX_CHILDWIN_DOCKINGWINDOW || pDockWin->GetAlignment() == SFX_ALIGN_NOALIGNMENT )
1935 			{
1936 				if ( eChild == SFX_CHILDWIN_SPLITWINDOW && eConfig == SFX_TOGGLEFLOATMODE)
1937 				{
1938                     // DockingWindow was dragged out of a SplitWindow
1939                     pCW->pCli = RegisterChild_Impl(*pDockWin, pDockWin->GetAlignment(), pCW->pWin->CanGetFocus());
1940 					pCW->pCli->nVisible = CHILD_VISIBLE;
1941 				}
1942 
1943 				pWin = pDockWin;
1944 			}
1945 			else
1946 			{
1947 				SfxSplitWindow *pSplitWin = GetSplitWindow_Impl(pDockWin->GetAlignment());
1948 
1949                 // configure DockingWindow inside a SplitWindow
1950 				if ( eConfig == SFX_TOGGLEFLOATMODE)
1951 				{
1952                     // DockingWindow was dragged into a SplitWindow
1953 					pCW->pCli = 0;
1954 					ReleaseChild_Impl(*pDockWin);
1955 				}
1956 
1957 				pWin = pSplitWin->GetSplitWindow();
1958 				if ( pSplitWin->GetWindowCount() == 1 )
1959                     ((SplitWindow*)pWin)->Show( sal_True, SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
1960 			}
1961 		}
1962 
1963         DBG_ASSERT( pCW, "Unknown window!" );
1964         if ( !pCW && pParent )
1965 		{
1966 			pParent->ConfigChild_Impl( eChild, eConfig, nId );
1967 			return;
1968 		}
1969 	}
1970 
1971     if ( !bSorted )
1972         // windows may have been registered and released without an update until now
1973 		Sort_Impl();
1974 
1975 	SfxChild_Impl *pChild = 0;
1976 	sal_uInt16 n;
1977 	for ( n=0; n<aSortedList.Count(); ++n )
1978 	{
1979 		pChild = (*pChilds)[aSortedList[n]];
1980 		if ( pChild )
1981 			if ( pChild->pWin == pWin )
1982 			break;
1983 	}
1984 
1985     if ( n < aSortedList.Count() )
1986         // sometimes called while toggeling float mode
1987         nPos = aSortedList[n];
1988 
1989 	switch ( eConfig )
1990 	{
1991 		case SFX_SETDOCKINGRECTS :
1992 		{
1993             if ( nPos == USHRT_MAX )
1994                 return;
1995 
1996 //			SfxChild_Impl *pChild = (*pChilds)[nPos];
1997 			Rectangle aOuterRect( GetTopRect_Impl() );
1998             aOuterRect.SetPos( pWorkWin->OutputToScreenPixel( aOuterRect.TopLeft() ));
1999             Rectangle aInnerRect( aOuterRect );
2000 			sal_Bool bTbx = (eChild == SFX_CHILDWIN_OBJECTBAR);
2001 
2002 			// Das gerade betroffene Fenster wird bei der Berechnung des
2003 			// inneren Rechtecks mit eingeschlossen!
2004 			for ( sal_uInt16 m=0; m<aSortedList.Count(); ++m )
2005 			{
2006 				sal_uInt16 i=aSortedList[m];
2007 				SfxChild_Impl* pCli = (*pChilds)[i];
2008 
2009                 if ( pCli && pCli->nVisible == CHILD_VISIBLE && pCli->pWin )
2010 				{
2011 					switch ( pCli->eAlign )
2012 					{
2013 						case SFX_ALIGN_TOP:
2014 							// Objekt-Toolboxen kommen immer zuletzt
2015 							//if ( bTbx || i <= nPos)
2016 								aInnerRect.Top() += pCli->aSize.Height();
2017 							break;
2018 
2019 						case SFX_ALIGN_TOOLBOXTOP:
2020 							// Toolbox geht nur vor, wenn nicht h"ohere Position
2021 							if ( bTbx && i <= nPos)
2022 								aInnerRect.Top() += pCli->aSize.Height();
2023 							break;
2024 
2025 						case SFX_ALIGN_HIGHESTTOP:
2026 							// Geht immer vor
2027 							aInnerRect.Top() += pCli->aSize.Height();
2028 							break;
2029 
2030 						case SFX_ALIGN_LOWESTTOP:
2031 							// Wird nur mitgez"ahlt, wenn es das aktuelle Fenster ist
2032 							if ( i == nPos )
2033 								aInnerRect.Top() += pCli->aSize.Height();
2034 							break;
2035 
2036 						case SFX_ALIGN_BOTTOM:
2037 							// Objekt-Toolboxen kommen immer zuletzt
2038 							//if ( bTbx || i <= nPos)
2039 								aInnerRect.Bottom() -= pCli->aSize.Height();
2040 							break;
2041 
2042 						case SFX_ALIGN_TOOLBOXBOTTOM:
2043 							// Toolbox geht nur vor, wenn nicht h"ohere Position
2044 							if ( bTbx && i <= nPos)
2045 								aInnerRect.Bottom() -= pCli->aSize.Height();
2046 							break;
2047 
2048 						case SFX_ALIGN_LOWESTBOTTOM:
2049 							// Geht immer vor
2050 							aInnerRect.Bottom() -= pCli->aSize.Height();
2051 							break;
2052 
2053 						case SFX_ALIGN_HIGHESTBOTTOM:
2054 							// Wird nur mitgez"ahlt, wenn es das aktuelle Fenster ist
2055 							if ( i == nPos )
2056 								aInnerRect.Bottom() -= pCli->aSize.Height();
2057 							break;
2058 
2059 						case SFX_ALIGN_LEFT:
2060 							// Toolboxen kommen immer zuletzt
2061 							//if (bTbx || i <= nPos)
2062 								aInnerRect.Left() += pCli->aSize.Width();
2063 							break;
2064 
2065 						case SFX_ALIGN_TOOLBOXLEFT:
2066 							// Toolboxen kommen immer zuletzt
2067 							if (bTbx && i <= nPos)
2068 								aInnerRect.Left() += pCli->aSize.Width();
2069 							break;
2070 
2071 						case SFX_ALIGN_FIRSTLEFT:
2072 							// Geht immer vor
2073 							aInnerRect.Left() += pCli->aSize.Width();
2074 							break;
2075 
2076 						case SFX_ALIGN_LASTLEFT:
2077 							// Wird nur mitgez"ahlt, wenn es das aktuelle Fenster ist
2078 							if (i == nPos)
2079 								aInnerRect.Left() += pCli->aSize.Width();
2080 
2081 						case SFX_ALIGN_RIGHT:
2082 							// Toolboxen kommen immer zuletzt
2083 							//if (bTbx || i <= nPos)
2084 								aInnerRect.Right() -= pCli->aSize.Width();
2085 							break;
2086 
2087 						case SFX_ALIGN_TOOLBOXRIGHT:
2088 							// Toolboxen kommen immer zuletzt
2089 							if (bTbx && i <= nPos)
2090 								aInnerRect.Right() -= pCli->aSize.Width();
2091 							break;
2092 
2093 						case SFX_ALIGN_FIRSTRIGHT:
2094 							// Wird nur mitgez"ahlt, wenn es das aktuelle Fenster ist
2095 							if (i == nPos)
2096 								aInnerRect.Right() -= pCli->aSize.Width();
2097 							break;
2098 
2099 						case SFX_ALIGN_LASTRIGHT:
2100 							// Geht immer vor
2101 							aInnerRect.Right() -= pCli->aSize.Width();
2102 							break;
2103 
2104 						default:
2105 							break;
2106 					}
2107 				}
2108 			}
2109 
2110             pDockWin->SetDockingRects(aOuterRect, aInnerRect);
2111 			break;
2112 		}
2113 
2114 		case SFX_MOVEDOCKINGWINDOW :
2115 		case SFX_ALIGNDOCKINGWINDOW :
2116 		case SFX_TOGGLEFLOATMODE:
2117 		{
2118             if ( nPos == USHRT_MAX && !pCW )
2119                 return;
2120 
2121             SfxChildAlignment eAlign = SFX_ALIGN_NOALIGNMENT;
2122             SfxChild_Impl *pCli = ( nPos != USHRT_MAX ) ? (*pChilds)[nPos] : 0;
2123             if ( pCli && pDockWin )
2124 			{
2125 				eAlign = pDockWin->GetAlignment();
2126                 if ( eChild == SFX_CHILDWIN_DOCKINGWINDOW || eAlign == SFX_ALIGN_NOALIGNMENT)
2127 				{
2128                     // configuration inside the SplitWindow, no change for the SplitWindows' configuration
2129 					pCli->bResize = sal_True;
2130 					pCli->aSize = pDockWin->GetSizePixel();
2131 				}
2132 			}
2133 
2134             if ( pCli )
2135             {
2136                 if( pCli->eAlign != eAlign )
2137                 {
2138                     bSorted = sal_False;
2139                     pCli->eAlign = eAlign;
2140                 }
2141 
2142                 ArrangeChilds_Impl();
2143                 ShowChilds_Impl();
2144             }
2145 
2146             if ( pCW && pCW->pWin )
2147 			{
2148                 // store changed configuration
2149                 sal_uInt16 nFlags = pCW->aInfo.nFlags;
2150                 pCW->aInfo = pCW->pWin->GetInfo();
2151                 pCW->aInfo.nFlags |= nFlags;
2152 				if ( eConfig != SFX_MOVEDOCKINGWINDOW )
2153 					SaveStatus_Impl( pCW->pWin, pCW->aInfo);
2154 			}
2155 
2156 			break;
2157 		}
2158 	}
2159 }
2160 
2161 
2162 //--------------------------------------------------------------------
2163 
SetChildWindowVisible_Impl(sal_uInt32 lId,sal_Bool bEnabled,sal_uInt16 nMode)2164 void SfxWorkWindow::SetChildWindowVisible_Impl( sal_uInt32 lId, sal_Bool bEnabled, sal_uInt16 nMode )
2165 {
2166 	sal_uInt16 nInter = (sal_uInt16) ( lId >> 16 );
2167 	sal_uInt16 nId = (sal_uInt16) ( lId & 0xFFFF );
2168 
2169 	SfxChildWin_Impl *pCW=NULL;
2170 	SfxWorkWindow *pWork = pParent;
2171 
2172 	// Den obersten parent nehmen; ChildWindows werden immer am WorkWindow
2173 	// der Task bzw. des Frames oder am AppWorkWindow angemeldet
2174 	while ( pWork && pWork->pParent )
2175 		pWork = pWork->pParent;
2176 
2177 	if ( pWork )
2178 	{
2179 		// Dem Parent schon bekannt ?
2180 		sal_uInt16 nCount = pWork->pChildWins->Count();
2181 		for (sal_uInt16 n=0; n<nCount; n++)
2182 			if ((*pWork->pChildWins)[n]->nSaveId == nId)
2183 			{
2184 				pCW = (*pWork->pChildWins)[n];
2185 				break;
2186 			}
2187 	}
2188 
2189 	if ( !pCW )
2190 	{
2191 		// Kein Parent oder dem Parent noch unbekannt, dann bei mir suchen
2192 		sal_uInt16 nCount = pChildWins->Count();
2193 		for (sal_uInt16 n=0; n<nCount; n++)
2194 			if ((*pChildWins)[n]->nSaveId == nId)
2195 			{
2196 				pCW = (*pChildWins)[n];
2197 				break;
2198 			}
2199 	}
2200 
2201 	if ( !pCW )
2202 	{
2203 		// Ist neu, also initialisieren; je nach Flag beim Parent oder bei
2204 		// mir eintragen
2205 		pCW = new SfxChildWin_Impl( lId );
2206 		pCW->nId = nId;
2207 		InitializeChild_Impl( pCW );
2208 		if ( pWork && !( pCW->aInfo.nFlags & SFX_CHILDWIN_TASK ) )
2209 			pWork->pChildWins->Insert( pWork->pChildWins->Count(), pCW );
2210 		else
2211 			pChildWins->Insert( pChildWins->Count(), pCW );
2212 	}
2213 
2214 	pCW->nId = nId;
2215 	if ( nInter )
2216 		pCW->nInterfaceId = nInter;
2217 	pCW->nVisibility = nMode;
2218 	pCW->bEnable = bEnabled;
2219 #if 0
2220 	if ( pCW->pWin )
2221 		pCW->pWin->GetWindow()->EnableInput( bEnabled &&
2222             ( pWorkWin->IsInputEnabled() /* || pCW->pWin->GetAlignment() == SFX_ALIGN_NOALIGNMENT */ ) );
2223 #endif
2224 	pCW->nVisibility = nMode;
2225 }
2226 
2227 //--------------------------------------------------------------------
2228 // Der An/Aus-Status eines ChildWindows wird umgeschaltet.
2229 
ToggleChildWindow_Impl(sal_uInt16 nId,sal_Bool bSetFocus)2230 void SfxWorkWindow::ToggleChildWindow_Impl(sal_uInt16 nId, sal_Bool bSetFocus)
2231 {
2232 	sal_uInt16 nCount = pChildWins->Count();
2233 	sal_uInt16 n;
2234 	for (n=0; n<nCount; n++)
2235 		if ((*pChildWins)[n]->nId == nId)
2236 			break;
2237 
2238 	if ( n<nCount )
2239 	{
2240 		// Das Fenster ist schon bekannt
2241 		SfxChildWin_Impl *pCW = (*pChildWins)[n];
2242 		SfxChildWindow *pChild = pCW->pWin;
2243 
2244         bool bCreationAllowed( true );
2245         if ( !bInternalDockingAllowed )
2246         {
2247             // Special case for all non-floatable child windows. We have
2248             // to prevent the creation here!
2249             bCreationAllowed = !( pCW->aInfo.nFlags & SFX_CHILDWIN_FORCEDOCK );
2250         }
2251 
2252         if ( bCreationAllowed )
2253         {
2254             if ( pCW->bCreate )
2255             {
2256                 if ( pChild )
2257 		        {
2258 			        if ( pChild->QueryClose() )
2259 			        {
2260 				        pCW->bCreate = sal_False;
2261 				        if ( pChild->IsHideAtToggle() )
2262 				        {
2263                             ShowChildWindow_Impl( nId, sal_False, bSetFocus );
2264 				        }
2265 				        else
2266 				        {
2267 					        // Fenster soll ausgeschaltet werdem
2268 					        pChild->SetVisible_Impl( sal_False );
2269 					        RemoveChildWin_Impl( pCW );
2270 				        }
2271 			        }
2272 		        }
2273                 else
2274                 {
2275                     // no actual Window exists, yet => just remember the "switched off" state
2276                     pCW->bCreate = sal_False;
2277                 }
2278             }
2279             else
2280 		    {
2281 			    pCW->bCreate = AllowChildWindowCreation_Impl( *pCW );
2282                 if ( pCW->bCreate )
2283                 {
2284 			        if ( pChild )
2285 			        {
2286                         ShowChildWindow_Impl( nId, sal_True, bSetFocus );
2287 			        }
2288 			        else
2289 			        {
2290 				        // create actual Window
2291 				        CreateChildWin_Impl( pCW, bSetFocus );
2292 				        if ( !pCW->pWin )
2293 					        // no success
2294 					        pCW->bCreate = sal_False;
2295 			        }
2296                 }
2297 		    }
2298         }
2299 
2300 		ArrangeChilds_Impl();
2301 		ShowChilds_Impl();
2302 
2303 		if ( pCW->bCreate && bCreationAllowed )
2304 		{
2305 			if ( !pCW->pCli )
2306 			{
2307 				SfxDockingWindow *pDock =
2308 					(SfxDockingWindow*) pCW->pWin->GetWindow();
2309                 if ( pDock->IsAutoHide_Impl() )
2310 					pDock->AutoShow_Impl();
2311 			}
2312 		}
2313 
2314 		return;
2315 	}
2316 	else if ( pParent )
2317 	{
2318         pParent->ToggleChildWindow_Impl( nId, bSetFocus );
2319 		return;
2320 	}
2321 
2322 #ifdef DBG_UTIL
2323 	nCount = pChildWins->Count();
2324 	for (n=0; n<nCount; n++)
2325 		if ((*pChildWins)[n]->nSaveId == nId)
2326 			break;
2327 
2328 	if ( n < nCount )
2329 	{
2330 		DBG_ERROR("ChildWindow ist nicht im Kontext!");
2331 	}
2332 	else
2333 	{
2334 		DBG_ERROR("ChildWindow ist nicht registriert!");
2335 	}
2336 #endif
2337 }
2338 
2339 //--------------------------------------------------------------------
2340 
HasChildWindow_Impl(sal_uInt16 nId)2341 sal_Bool SfxWorkWindow::HasChildWindow_Impl(sal_uInt16 nId)
2342 {
2343 	sal_uInt16 nCount = pChildWins->Count();
2344 	sal_uInt16 n;
2345 	for (n=0; n<nCount; n++)
2346 		if ((*pChildWins)[n]->nSaveId == nId)
2347 			break;
2348 
2349 	if (n<nCount)
2350 	{
2351 		SfxChildWin_Impl *pCW = (*pChildWins)[n];
2352 		SfxChildWindow *pChild = pCW->pWin;
2353 		return ( pChild && pCW->bCreate );
2354 	}
2355 
2356 	if ( pParent )
2357 		return pParent->HasChildWindow_Impl( nId );
2358 
2359 	return sal_False;
2360 }
2361 
IsFloating(sal_uInt16 nId)2362 sal_Bool SfxWorkWindow::IsFloating( sal_uInt16 nId )
2363 {
2364 	SfxChildWin_Impl *pCW=NULL;
2365 	SfxWorkWindow *pWork = pParent;
2366 
2367 	// Den obersten parent nehmen; ChildWindows werden immer am WorkWindow
2368 	// der Task bzw. des Frames oder am AppWorkWindow angemeldet
2369 	while ( pWork && pWork->pParent )
2370 		pWork = pWork->pParent;
2371 
2372 	if ( pWork )
2373 	{
2374 		// Dem Parent schon bekannt ?
2375 		sal_uInt16 nCount = pWork->pChildWins->Count();
2376 		for (sal_uInt16 n=0; n<nCount; n++)
2377 			if ((*pWork->pChildWins)[n]->nSaveId == nId)
2378 			{
2379 				pCW = (*pWork->pChildWins)[n];
2380 				break;
2381 			}
2382 	}
2383 
2384 	if ( !pCW )
2385 	{
2386 		// Kein Parent oder dem Parent noch unbekannt, dann bei mir suchen
2387 		sal_uInt16 nCount = pChildWins->Count();
2388 		for (sal_uInt16 n=0; n<nCount; n++)
2389 			if ((*pChildWins)[n]->nSaveId == nId)
2390 			{
2391 				pCW = (*pChildWins)[n];
2392 				break;
2393 			}
2394 	}
2395 
2396 	if ( !pCW )
2397 	{
2398 		// Ist neu, also initialisieren; je nach Flag beim Parent oder bei
2399 		// mir eintragen
2400 		pCW = new SfxChildWin_Impl( nId );
2401 		pCW->bEnable = sal_False;
2402 		pCW->nId = 0;
2403 		pCW->nVisibility = 0;
2404 		InitializeChild_Impl( pCW );
2405 		if ( pWork && !( pCW->aInfo.nFlags & SFX_CHILDWIN_TASK ) )
2406 			pWork->pChildWins->Insert( pWork->pChildWins->Count(), pCW );
2407 		else
2408 			pChildWins->Insert( pChildWins->Count(), pCW );
2409 	}
2410 
2411 	SfxChildAlignment eAlign;
2412 	if ( pCW->aInfo.GetExtraData_Impl( &eAlign ) )
2413 		return( eAlign == SFX_ALIGN_NOALIGNMENT );
2414 	else
2415 		return sal_True;
2416 }
2417 
2418 //--------------------------------------------------------------------
2419 
KnowsChildWindow_Impl(sal_uInt16 nId)2420 sal_Bool SfxWorkWindow::KnowsChildWindow_Impl(sal_uInt16 nId)
2421 {
2422 	SfxChildWin_Impl *pCW=0;
2423 	sal_uInt16 nCount = pChildWins->Count();
2424 	sal_uInt16 n;
2425 	for (n=0; n<nCount; n++)
2426 	{
2427 		pCW = (*pChildWins)[n];
2428 		if ( pCW->nSaveId == nId)
2429 			 break;
2430 	}
2431 
2432 	if (n<nCount)
2433 	{
2434         if ( !(pCW->aInfo.nFlags & SFX_CHILDWIN_ALWAYSAVAILABLE) && !IsVisible_Impl(  pCW->nVisibility ) )
2435 			return sal_False;
2436 		return pCW->bEnable;
2437 	}
2438 	else if ( pParent )
2439 		return pParent->KnowsChildWindow_Impl( nId );
2440 	else
2441 		return sal_False;
2442 }
2443 
2444 //--------------------------------------------------------------------
2445 
SetChildWindow_Impl(sal_uInt16 nId,sal_Bool bOn,sal_Bool bSetFocus)2446 void SfxWorkWindow::SetChildWindow_Impl(sal_uInt16 nId, sal_Bool bOn, sal_Bool bSetFocus)
2447 {
2448 	SfxChildWin_Impl *pCW=NULL;
2449 	SfxWorkWindow *pWork = pParent;
2450 
2451 	// Den obersten parent nehmen; ChildWindows werden immer am WorkWindow
2452 	// der Task bzw. des Frames oder am AppWorkWindow angemeldet
2453 	while ( pWork && pWork->pParent )
2454 		pWork = pWork->pParent;
2455 
2456 	if ( pWork )
2457 	{
2458 		// Dem Parent schon bekannt ?
2459 		sal_uInt16 nCount = pWork->pChildWins->Count();
2460 		for (sal_uInt16 n=0; n<nCount; n++)
2461 			if ((*pWork->pChildWins)[n]->nSaveId == nId)
2462 			{
2463 				pCW = (*pWork->pChildWins)[n];
2464 				break;
2465 			}
2466 	}
2467 
2468 	if ( !pCW )
2469 	{
2470 		// Kein Parent oder dem Parent noch unbekannt, dann bei mir suchen
2471 		sal_uInt16 nCount = pChildWins->Count();
2472 		for (sal_uInt16 n=0; n<nCount; n++)
2473 			if ((*pChildWins)[n]->nSaveId == nId)
2474 			{
2475 				pCW = (*pChildWins)[n];
2476 				pWork = this;
2477 				break;
2478 			}
2479 	}
2480 
2481 	if ( !pCW )
2482 	{
2483 		// Ist neu, also initialisieren; je nach Flag beim Parent oder bei
2484 		// mir eintragen
2485 		pCW = new SfxChildWin_Impl( nId );
2486 		InitializeChild_Impl( pCW );
2487 		if ( !pWork || pCW->aInfo.nFlags & SFX_CHILDWIN_TASK )
2488 			pWork = this;
2489 		pWork->pChildWins->Insert( pWork->pChildWins->Count(), pCW );
2490 	}
2491 
2492     if ( pCW->bCreate != bOn )
2493         pWork->ToggleChildWindow_Impl(nId,bSetFocus);
2494 }
2495 
2496 //--------------------------------------------------------------------
2497 
ShowChildWindow_Impl(sal_uInt16 nId,sal_Bool bVisible,sal_Bool bSetFocus)2498 void SfxWorkWindow::ShowChildWindow_Impl(sal_uInt16 nId, sal_Bool bVisible, sal_Bool bSetFocus)
2499 {
2500 	sal_uInt16 nCount = pChildWins->Count();
2501 	SfxChildWin_Impl* pCW=0;
2502 	sal_uInt16 n;
2503 	for (n=0; n<nCount; n++)
2504 	{
2505 		pCW = (*pChildWins)[n];
2506 		if (pCW->nId == nId)
2507 			break;
2508 	}
2509 
2510 	if ( n<nCount )
2511 	{
2512 		SfxChildWindow *pChildWin = pCW->pWin;
2513 		if ( pChildWin )
2514 		{
2515 			if ( bVisible )
2516 			{
2517 				if ( pCW->pCli )
2518 				{
2519 					pCW->pCli->bSetFocus = bSetFocus;
2520 					pCW->pCli->nVisible = CHILD_VISIBLE;
2521                     pChildWin->Show( bSetFocus && pChildWin->WantsFocus() ? 0 : SHOW_NOFOCUSCHANGE | SHOW_NOACTIVATE );
2522 				}
2523 				else
2524 					((SfxDockingWindow*)pChildWin->GetWindow())->Reappear_Impl();
2525 
2526 			}
2527 			else
2528 			{
2529 				if ( pCW->pCli )
2530 				{
2531 					pCW->pCli->nVisible = CHILD_VISIBLE ^ CHILD_NOT_HIDDEN;
2532 					pCW->pWin->Hide();
2533 				}
2534 				else
2535 					((SfxDockingWindow*)pChildWin->GetWindow())->Disappear_Impl();
2536 
2537 			}
2538 
2539 			ArrangeChilds_Impl();
2540 			ShowChilds_Impl();
2541 		}
2542 		else if ( bVisible )
2543 		{
2544             SetChildWindow_Impl( nId, sal_True, bSetFocus );
2545 			pChildWin = pCW->pWin;
2546 		}
2547 
2548 		if ( pChildWin )
2549 		{
2550 			pChildWin->SetVisible_Impl( bVisible );
2551             sal_uInt16 nFlags = pCW->aInfo.nFlags;
2552             pCW->aInfo = pChildWin->GetInfo();
2553             pCW->aInfo.nFlags |= nFlags;
2554 			if ( !pCW->bCreate )
2555 				SaveStatus_Impl( pChildWin, pCW->aInfo );
2556 		}
2557 
2558 		return;
2559 	}
2560 
2561 	if ( pParent )
2562 	{
2563         pParent->ShowChildWindow_Impl( nId, bVisible, bSetFocus );
2564 		return;
2565 	}
2566 
2567 #ifdef DBG_UTIL
2568 	nCount = pChildWins->Count();
2569 	for (n=0; n<nCount; n++)
2570 		if ((*pChildWins)[n]->nSaveId == nId)
2571 			break;
2572 
2573 	if ( n<nCount )
2574 	{
2575 		DBG_ERROR("ChildWindow ist nicht im Kontext!");
2576 	}
2577 	else
2578 	{
2579 		DBG_ERROR("ChildWindow ist nicht registriert!");
2580 	}
2581 #endif
2582 }
2583 
2584 //--------------------------------------------------------------------
2585 
GetChildWindow_Impl(sal_uInt16 nId)2586 SfxChildWindow* SfxWorkWindow::GetChildWindow_Impl(sal_uInt16 nId)
2587 {
2588 	sal_uInt16 nCount = pChildWins->Count();
2589 	sal_uInt16 n;
2590 	for (n=0; n<nCount; n++)
2591 		if ((*pChildWins)[n]->nSaveId == nId)
2592 			 break;
2593 
2594 	if (n<nCount)
2595 		return (*pChildWins)[n]->pWin;
2596 	else if ( pParent )
2597 		return pParent->GetChildWindow_Impl( nId );
2598 	return 0;
2599 }
2600 
2601 //------------------------------------------------------------------------
2602 
ResetChildWindows_Impl()2603 void SfxWorkWindow::ResetChildWindows_Impl()
2604 {
2605 //	if ( pParent )
2606 //		pParent->ResetChildWindows_Impl();
2607 
2608 	for ( sal_uInt16 n = 0; n < pChildWins->Count(); ++n )
2609 	{
2610 		(*pChildWins)[n]->nId = 0;
2611 		(*pChildWins)[n]->bEnable = sal_False;
2612 	}
2613 }
2614 
2615 //------------------------------------------------------------------------
2616 // Virtuelle Methode, die die Gr"o\se der Fl"ache (client area) des parent
2617 // windows liefert, in der Child-Fenster angeordnet werden k"onnen.
2618 // in der ClientArea des parent findet.
2619 
GetTopRect_Impl()2620 Rectangle SfxWorkWindow::GetTopRect_Impl()
2621 {
2622 	return Rectangle (Point(), pWorkWin->GetOutputSizePixel() );
2623 }
2624 
2625 //------------------------------------------------------------------------
2626 // Virtuelle Methode, die die Gr"o\se der Fl"ache (client area) des parent
2627 // windows liefert, in der Child-Fenster angeordnet werden k"onnen.
2628 // in der ClientArea des parent findet.
2629 
GetTopRect_Impl()2630 Rectangle SfxFrameWorkWin_Impl::GetTopRect_Impl()
2631 {
2632     return pMasterFrame->GetTopOuterRectPixel_Impl();
2633 }
2634 
2635 //------------------------------------------------------------------------
2636 // Virtuelle Methode, um herauszufinden, ob ein Child-Fenster noch Platz
2637 // in der ClientArea des parent findet.
2638 
RequestTopToolSpacePixel_Impl(SvBorder aBorder)2639 sal_Bool SfxWorkWindow::RequestTopToolSpacePixel_Impl( SvBorder aBorder )
2640 {
2641 	if ( !IsDockingAllowed() ||
2642 			aClientArea.GetWidth() < aBorder.Left() + aBorder.Right() ||
2643 			aClientArea.GetHeight() < aBorder.Top() + aBorder.Bottom() )
2644 		return sal_False;
2645 	else
2646 		return sal_True;;
2647 }
2648 
SaveStatus_Impl(SfxChildWindow * pChild,const SfxChildWinInfo & rInfo)2649 void SfxWorkWindow::SaveStatus_Impl(SfxChildWindow *pChild, const SfxChildWinInfo &rInfo)
2650 {
2651 	// Den Status vom Presentation mode wollen wir nicht sichern
2652     if ( IsDockingAllowed() && bInternalDockingAllowed )
2653 		pChild->SaveStatus(rInfo);
2654 }
2655 
InitializeChild_Impl(SfxChildWin_Impl * pCW)2656 void SfxWorkWindow::InitializeChild_Impl(SfxChildWin_Impl *pCW)
2657 {
2658 	SfxChildWinFactory* pFact=0;
2659 	SfxApplication *pApp = SFX_APP();
2660     {
2661 	    SfxChildWinFactArr_Impl &rFactories = pApp->GetChildWinFactories_Impl();
2662 	    for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
2663 	    {
2664 		    pFact = rFactories[nFactory];
2665 		    if ( pFact->nId == pCW->nSaveId )
2666 		    {
2667 			    pCW->aInfo   = pFact->aInfo;
2668 			    SfxChildWindow::InitializeChildWinFactory_Impl(
2669 										    pCW->nSaveId, pCW->aInfo);
2670                 pCW->bCreate = pCW->aInfo.bVisible;
2671 			    sal_uInt16 nFlags = pFact->aInfo.nFlags;
2672 			    if ( nFlags & SFX_CHILDWIN_TASK )
2673 				    pCW->aInfo.nFlags |= SFX_CHILDWIN_TASK;
2674 			    if ( nFlags & SFX_CHILDWIN_CANTGETFOCUS )
2675 				    pCW->aInfo.nFlags |= SFX_CHILDWIN_CANTGETFOCUS;
2676                 if ( nFlags & SFX_CHILDWIN_FORCEDOCK )
2677                     pCW->aInfo.nFlags |= SFX_CHILDWIN_FORCEDOCK;
2678 			    pFact->aInfo = pCW->aInfo;
2679 			    return;
2680 		    }
2681 	    }
2682     }
2683 
2684 	SfxDispatcher *pDisp = pBindings->GetDispatcher_Impl();
2685     SfxModule *pMod = pDisp ? SfxModule::GetActiveModule( pDisp->GetFrame() ) :0;
2686 	if ( pMod )
2687 	{
2688 		SfxChildWinFactArr_Impl *pFactories = pMod->GetChildWinFactories_Impl();
2689 		if ( pFactories )
2690 		{
2691 			SfxChildWinFactArr_Impl &rFactories = *pFactories;
2692 			for ( sal_uInt16 nFactory = 0; nFactory < rFactories.Count(); ++nFactory )
2693 			{
2694 				pFact = rFactories[nFactory];
2695 				if ( pFact->nId == pCW->nSaveId )
2696 				{
2697 					pCW->aInfo   = pFact->aInfo;
2698 					SfxChildWindow::InitializeChildWinFactory_Impl(
2699 												pCW->nSaveId, pCW->aInfo);
2700 					pCW->bCreate = pCW->aInfo.bVisible;
2701 					sal_uInt16 nFlags = pFact->aInfo.nFlags;
2702 					if ( nFlags & SFX_CHILDWIN_TASK )
2703 						pCW->aInfo.nFlags |= SFX_CHILDWIN_TASK;
2704 					if ( nFlags & SFX_CHILDWIN_CANTGETFOCUS )
2705 						pCW->aInfo.nFlags |= SFX_CHILDWIN_CANTGETFOCUS;
2706                     if ( nFlags & SFX_CHILDWIN_FORCEDOCK )
2707                         pCW->aInfo.nFlags |= SFX_CHILDWIN_FORCEDOCK;
2708                     if ( nFlags & SFX_CHILDWIN_ALWAYSAVAILABLE )
2709                         pCW->aInfo.nFlags |= SFX_CHILDWIN_ALWAYSAVAILABLE;
2710 					pFact->aInfo = pCW->aInfo;
2711 					return;
2712 				}
2713 			}
2714 		}
2715 	}
2716 }
2717 /*
2718 SfxStatBar_Impl* SfxWorkWindow::GetStatusBar_Impl()
2719 {
2720     return &aStatBar;
2721 } */
2722 
GetSplitWindow_Impl(SfxChildAlignment eAlign)2723 SfxSplitWindow* SfxWorkWindow::GetSplitWindow_Impl( SfxChildAlignment eAlign )
2724 {
2725 	switch ( eAlign )
2726 	{
2727 		case SFX_ALIGN_TOP:
2728 			return pSplit[2];
2729 
2730 		case SFX_ALIGN_BOTTOM:
2731 			return pSplit[3];
2732 
2733 		case SFX_ALIGN_LEFT:
2734 			return pSplit[0];
2735 
2736 		case SFX_ALIGN_RIGHT:
2737 			return pSplit[1];
2738 
2739 		default:
2740 			return 0;
2741 	}
2742 }
2743 
MakeChildsVisible_Impl(sal_Bool bVis)2744 void SfxWorkWindow::MakeChildsVisible_Impl( sal_Bool bVis )
2745 {
2746 	if ( pParent )
2747 		pParent->MakeChildsVisible_Impl( bVis );
2748 
2749 	bAllChildsVisible = bVis;
2750 	if ( bVis )
2751 	{
2752 		if ( !bSorted )
2753 			Sort_Impl();
2754 		for ( sal_uInt16 n=0; n<aSortedList.Count(); ++n )
2755 		{
2756 			SfxChild_Impl* pCli = (*pChilds)[aSortedList[n]];
2757             if ( (pCli->eAlign == SFX_ALIGN_NOALIGNMENT) || (IsDockingAllowed() && bInternalDockingAllowed) )
2758 				pCli->nVisible |= CHILD_ACTIVE;
2759 		}
2760 	}
2761 	else
2762 	{
2763 		if ( !bSorted )
2764 			Sort_Impl();
2765 		for ( sal_uInt16 n=0; n<aSortedList.Count(); ++n )
2766 		{
2767 			SfxChild_Impl* pCli = (*pChilds)[aSortedList[n]];
2768 			pCli->nVisible &= ~CHILD_ACTIVE;
2769 		}
2770 	}
2771 }
2772 
IsAutoHideMode(const SfxSplitWindow * pSplitWin)2773 sal_Bool SfxWorkWindow::IsAutoHideMode( const SfxSplitWindow *pSplitWin )
2774 {
2775 	for ( sal_uInt16 n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
2776 	{
2777 		if ( pSplit[n] != pSplitWin && pSplit[n]->IsAutoHide( sal_True ) )
2778 			return sal_True;
2779 	}
2780 	return sal_False;
2781 }
2782 
2783 
EndAutoShow_Impl(Point aPos)2784 void SfxWorkWindow::EndAutoShow_Impl( Point aPos )
2785 {
2786 	if ( pParent )
2787         pParent->EndAutoShow_Impl( aPos );
2788 
2789 	for ( sal_uInt16 n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
2790 	{
2791 		SfxSplitWindow *p = pSplit[n];
2792 		if ( p && p->IsAutoHide() )
2793         {
2794             Point aLocalPos = p->ScreenToOutputPixel( aPos );
2795 	    Point aEmptyPoint = Point();
2796             Rectangle aRect( aEmptyPoint, p->GetSizePixel() );
2797             if ( !aRect.IsInside( aLocalPos ) )
2798                 p->FadeOut();
2799         }
2800 	}
2801 }
2802 
ArrangeAutoHideWindows(SfxSplitWindow * pActSplitWin)2803 void SfxWorkWindow::ArrangeAutoHideWindows( SfxSplitWindow *pActSplitWin )
2804 {
2805     if ( m_nLock )
2806         return;
2807 
2808 	if ( pParent )
2809 		pParent->ArrangeAutoHideWindows( pActSplitWin );
2810 
2811     Rectangle aArea( aUpperClientArea );
2812 	for ( sal_uInt16 n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
2813 	{
2814 		// Es werden entweder Dummyfenster oder Fenster im AutoShow-Modus
2815 		// ( nicht gepinned, FadeIn ) behandelt.
2816 		// Nur das "ubergebene Fenster darf unsichtbar sein, denn vielleicht
2817 		// soll daf"ur gerade die Gr"o\se berechnet werden, bevor es angezeigt
2818 		// wird.
2819 		SfxSplitWindow* pSplitWin = pSplit[n];
2820 		sal_Bool bDummyWindow = !pSplitWin->IsFadeIn();
2821 		Window *pDummy = pSplitWin->GetSplitWindow();
2822 		Window *pWin = bDummyWindow ? pDummy : pSplitWin;
2823 		if ( (pSplitWin->IsPinned() && !bDummyWindow) || (!pWin->IsVisible() && pActSplitWin != pSplitWin) )
2824 			continue;
2825 
2826 		// Breite und Position des Dummy-Fensters als Ausgangspunkt
2827 		Size aSize = pDummy->GetSizePixel();
2828 		Point aPos = pDummy->GetPosPixel();
2829 
2830 		switch ( n )
2831 		{
2832 			case ( 0 ) :
2833 			{
2834 				// Linkes SplitWindow
2835 				// Breite vom Fenster selbst holen, wenn nicht das DummyWindow
2836 				if ( !bDummyWindow )
2837 					aSize.Width() = pSplitWin->GetSizePixel().Width();
2838 
2839 				// Wenn links ein Window sichtbar ist, beginnt der freie
2840 				// Bereich rechts davon bzw. bei der Client area
2841 				long nLeft = aPos.X() + aSize.Width();
2842 				if ( nLeft > aArea.Left() )
2843 					aArea.Left() = nLeft;
2844 				break;
2845 			}
2846 			case ( 1 ) :
2847 			{
2848 				// Rechtes SplitWindow
2849 				// Position um Differenz der Breiten korrigieren
2850 				aPos.X() += aSize.Width();
2851 
2852 				// Breite vom Fenster selbst holen, wenn nicht das DummyWindow
2853 				if ( !bDummyWindow )
2854 					aSize.Width() = pSplitWin->GetSizePixel().Width();
2855 
2856 				aPos.X() -= aSize.Width();
2857 
2858 				// Wenn links schon ein Fenster aufgeklappt ist, darf
2859 				// das rechte nicht dar"uber gehen
2860 				if ( aPos.X() < aArea.Left() )
2861 				{
2862 					aPos.X() = aArea.Left();
2863 					aSize.Width() = aArea.GetWidth();
2864 				}
2865 
2866 				// Wenn rechts ein Window sichtbar ist, endet der freie
2867 				// Bereich links davon bzw. bei der Client area
2868 				long nRight = aPos.X();
2869 				if ( nRight < aArea.Right() )
2870 					aArea.Right() = nRight;
2871 				break;
2872 			}
2873 			case ( 2 ) :
2874 			{
2875 				// Oberes SplitWindow
2876 				// H"ohe vom Fenster selbst holen, wenn nicht das DummyWindow
2877 				if ( !bDummyWindow )
2878 					aSize.Height() = pSplitWin->GetSizePixel().Height();
2879 
2880 				// Breite anpassen, je nachdem ob links oder rechts
2881 				// schon ein Fenster aufgeklappt ist
2882 				aPos.X() = aArea.Left();
2883 				aSize.Width() = aArea.GetWidth();
2884 
2885 				// Wenn oben ein Window sichtbar ist, beginnt der freie
2886 				// Bereich darunter bzw. bei der Client Area
2887 				long nTop = aPos.Y() + aSize.Height();
2888 				if ( nTop > aArea.Top() )
2889 					aArea.Top() = nTop;
2890 				break;
2891 			}
2892 			case ( 3 ) :
2893 			{
2894 				// Das untere SplitWindow
2895 				// Position um Differenz der H"ohen korrigieren
2896 				aPos.Y() += aSize.Height();
2897 
2898 				// H"ohe vom Fenster selbst holen, wenn nicht das DummmyWindow
2899 				if ( !bDummyWindow )
2900 					aSize.Height() = pSplitWin->GetSizePixel().Height();
2901 
2902 				aPos.Y() -= aSize.Height();
2903 
2904 				// Breite anpassen, je nachdem ob links oder rechts
2905 				// schon ein Fenster aufgeklappt ist
2906 				aPos.X() = aArea.Left();
2907 				aSize.Width() = aArea.GetWidth();
2908 
2909 				// Wenn oben schon ein Fenster aufgeklappt ist, darf
2910 				// das untere nicht dar"uber gehen
2911 				if ( aPos.Y() < aArea.Top() )
2912 				{
2913 					aPos.Y() = aArea.Top();
2914 					aSize.Height() = aArea.GetHeight();
2915 				}
2916 
2917 				break;
2918 			}
2919 		}
2920 
2921 		if ( !bDummyWindow )
2922 			// Das FadeIn-Window ist ein Float, dessen Koordinaten in
2923 			// Screenkoordinaten gesetzt werden
2924 			pSplitWin->SetPosSizePixel( pWorkWin->OutputToScreenPixel(aPos), aSize );
2925 		else
2926 			// Das angedockte DummyWindow
2927 			pDummy->SetPosSizePixel( aPos, aSize );
2928 	}
2929 }
2930 
GetFreeArea(sal_Bool bAutoHide) const2931 Rectangle SfxWorkWindow::GetFreeArea( sal_Bool bAutoHide ) const
2932 {
2933 	if ( bAutoHide )
2934 	{
2935 		Rectangle aArea( aClientArea );
2936 		for ( sal_uInt16 n=0; n<SFX_SPLITWINDOWS_MAX; n++ )
2937 		{
2938 			if ( pSplit[n]->IsPinned() || !pSplit[n]->IsVisible() )
2939 				continue;
2940 
2941 			Size aSize = pSplit[n]->GetSizePixel();
2942 			switch ( n )
2943 			{
2944 				case ( 0 ) :
2945 					aArea.Left() += aSize.Width();
2946 					break;
2947 				case ( 1 ) :
2948 					aArea.Right() -= aSize.Width();
2949 					break;
2950 				case ( 2 ) :
2951 					aArea.Top() += aSize.Height();
2952 					break;
2953 				case ( 3 ) :
2954 					aArea.Bottom() -= aSize.Height();
2955 					break;
2956 			}
2957 		}
2958 
2959 		return aArea;
2960 	}
2961 	else
2962 		return aClientArea;
2963 }
2964 
SfxChildWinController_Impl(sal_uInt16 nID,SfxWorkWindow * pWork)2965 SfxChildWinController_Impl::SfxChildWinController_Impl( sal_uInt16 nID, SfxWorkWindow *pWork )
2966 	: SfxControllerItem( nID, pWork->GetBindings() )
2967 	, pWorkwin( pWork )
2968 {}
2969 
CreateDispatch(const String &)2970 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch > SfxWorkWindow::CreateDispatch( const String& )
2971 {
2972 	return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XDispatch >();
2973 }
2974 
StateChanged(sal_uInt16 nSID,SfxItemState eState,const SfxPoolItem *)2975 void SfxChildWinController_Impl::StateChanged(
2976     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* )
2977 {
2978 	pWorkwin->DisableChildWindow_Impl( nSID, eState == SFX_ITEM_DISABLED );
2979 }
2980 
DisableChildWindow_Impl(sal_uInt16 nId,sal_Bool bDisable)2981 void SfxWorkWindow::DisableChildWindow_Impl( sal_uInt16 nId, sal_Bool bDisable )
2982 {
2983 	sal_uInt16 nCount = pChildWins->Count();
2984 	sal_uInt16 n;
2985 	for (n=0; n<nCount; n++)
2986 		if ((*pChildWins)[n]->nSaveId == nId)
2987 			 break;
2988 	if ( n<nCount && (*pChildWins)[n]->bDisabled != bDisable )
2989 	{
2990 		(*pChildWins)[n]->bDisabled = bDisable;
2991 		UpdateChildWindows_Impl();
2992 		ArrangeChilds_Impl();
2993 		ShowChilds_Impl();
2994 	}
2995 }
2996 
SetActiveChild_Impl(Window * pChild)2997 void SfxWorkWindow::SetActiveChild_Impl( Window *pChild )
2998 {
2999 	pActiveChild = pChild;
3000 }
3001 
GetActiveChild_Impl()3002 Window*	SfxWorkWindow::GetActiveChild_Impl()
3003 {
3004 	return pActiveChild;
3005 }
3006 
ActivateNextChild_Impl(sal_Bool bForward)3007 sal_Bool SfxWorkWindow::ActivateNextChild_Impl( sal_Bool bForward )
3008 {
3009 	// Alle Kinder gem"a\s Liste sortieren
3010 	SvUShorts aList;
3011 	for ( sal_uInt16 i=SFX_OBJECTBAR_MAX; i<pChilds->Count(); i++)
3012 	{
3013 		SfxChild_Impl *pCli = (*pChilds)[i];
3014         if ( pCli && pCli->bCanGetFocus && pCli->pWin )
3015 		{
3016 			sal_uInt16 k;
3017 			for (k=0; k<aList.Count(); k++)
3018 				if ( ChildTravelValue((*pChilds)[aList[k]]->eAlign) > ChildTravelValue(pCli->eAlign) )
3019 					break;
3020 			aList.Insert(i,k);
3021 		}
3022 	}
3023 
3024     if ( aList.Count() == 0 )
3025         return sal_False;
3026 
3027 	sal_uInt16 nTopValue  = ChildTravelValue( SFX_ALIGN_LOWESTTOP );
3028 	for ( sal_uInt16 i=0; i<aList.Count(); i++ )
3029 	{
3030 		SfxChild_Impl* pCli = (*pChilds)[aList[i]];
3031         if ( pCli->pWin && ChildTravelValue( pCli->eAlign ) > nTopValue )
3032 			break;
3033 	}
3034 
3035 	sal_uInt16 n = bForward ? 0 : aList.Count()-1;
3036 	SfxChild_Impl *pAct=NULL;
3037     if ( pActiveChild )
3038 	{
3039 		// Das aktive Fenster suchen
3040 		for ( n=0; n<aList.Count(); n++ )
3041 		{
3042 			SfxChild_Impl* pCli = (*pChilds)[aList[n]];
3043 			if ( pCli && pCli->pWin && ( pCli->pWin == pActiveChild || !pActiveChild ) )
3044 			{
3045 				pAct = pCli;
3046 				break;
3047 			}
3048 		}
3049 	}
3050 
3051     // dummy entries for the container window
3052     aList.Insert( 0xFFFF, 0 );
3053     aList.Insert( 0xFFFF, aList.Count() );
3054     n = n + 1;
3055     if ( pAct )
3056 	{
3057 		for ( sal_uInt16 i=0; i<SFX_SPLITWINDOWS_MAX; i++ )
3058 		{
3059 			// Eventuell ist pAct ein Splitwindow
3060 			SfxSplitWindow *p = pSplit[i];
3061 			if ( pAct->pWin == p )
3062 			{
3063 				if( p->ActivateNextChild_Impl( bForward ) )
3064 					return sal_True;
3065 				break;
3066 			}
3067 		}
3068 
3069 		// pAct ist ein direktes ChildWindow
3070 		// mit dem Nachfolger bzw. Vorg"anger des aktiven Fensters weitermachen
3071 		if ( bForward )
3072             n = n+1;
3073 		else
3074             n = n-1;
3075 
3076         if ( n == 0 || n == aList.Count()-1 )
3077             return sal_False;
3078 	}
3079 
3080 	for( ;; )
3081 	{
3082         SfxChild_Impl* pCli = (*pChilds)[aList[n]];
3083         if ( pCli->pWin )
3084         {
3085             SfxChild_Impl* pNext = pCli;
3086             for ( sal_uInt16 i=0; n<SFX_SPLITWINDOWS_MAX; n++ )
3087             {
3088                 // Eventuell ist pNext ein Splitwindow
3089                 SfxSplitWindow *p = pSplit[i];
3090                 if ( pNext->pWin == p )
3091                 {
3092                     // Das erste/letzte Fenster dort aktivieren
3093                     p->SetActiveWindow_Impl( NULL );
3094                     pNext = NULL;
3095                     if( p->ActivateNextChild_Impl( bForward ) )
3096                         return sal_True;
3097                     break;
3098                 }
3099             }
3100 
3101             if ( pNext )
3102             {
3103                 pNext->pWin->GrabFocus();
3104                 pActiveChild = pNext->pWin;
3105                 return sal_True;
3106             }
3107         }
3108 
3109 		if ( bForward )
3110             n = n+1;
3111 		else
3112             n = n-1;
3113 
3114         if ( n == 0 || n == aList.Count()-1 )
3115 			break;
3116 	}
3117 
3118 	return sal_False;
3119 }
3120 
SetObjectBarCustomizeMode_Impl(sal_Bool)3121 void SfxWorkWindow::SetObjectBarCustomizeMode_Impl( sal_Bool )
3122 {
3123 }
3124 
DataChanged_Impl(const DataChangedEvent &)3125 void SfxWorkWindow::DataChanged_Impl( const DataChangedEvent& )
3126 {
3127 	sal_uInt16 n;
3128     sal_uInt16 nCount = pChildWins->Count();
3129 	for (n=0; n<nCount; n++)
3130 	{
3131         SfxChildWin_Impl*pCW = (*pChildWins)[n];
3132         if ( pCW && pCW->pWin )
3133             pCW->pWin->GetWindow()->UpdateSettings( Application::GetSettings() );
3134     }
3135 
3136     ArrangeChilds_Impl();
3137 }
3138 
3139