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 #include <com/sun/star/embed/EmbedStates.hpp>
27 #include <com/sun/star/uno/Reference.h>
28 #include <com/sun/star/awt/XWindow.hpp>
29 #include <com/sun/star/util/XURLTransformer.hpp>
30 #include <com/sun/star/util/XCloseable.hpp>
31 #include <com/sun/star/util/CloseVetoException.hpp>
32 #include <com/sun/star/lang/XComponent.hpp>
33 #include <com/sun/star/lang/DisposedException.hpp>
34 #include <com/sun/star/container/XChild.hpp>
35
36 #ifndef _MENU_HXX //autogen
37 #include <vcl/menu.hxx>
38 #endif
39 #include <svl/intitem.hxx>
40 #ifndef _SPLITWIN_HXX //autogen
41 #include <vcl/splitwin.hxx>
42 #endif
43 #include <svl/eitem.hxx>
44 #include <svl/stritem.hxx>
45 #ifndef _TOOLKIT_UNOHLP_HXX
46 #include <toolkit/helper/vclunohelper.hxx>
47 #endif
48 #include <com/sun/star/awt/PosSize.hpp>
49 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
50 #include <comphelper/processfactory.hxx>
51 #endif
52 #include <vcl/msgbox.hxx>
53
54 #ifndef GCC
55 #endif
56
57 // wg. pTopFrames
58 #include "appdata.hxx"
59 #include <sfx2/app.hxx>
60 #include <sfx2/event.hxx>
61 #include <sfx2/unoctitm.hxx>
62 #include <sfx2/frame.hxx>
63 #include "arrdecl.hxx"
64 #include <sfx2/objsh.hxx>
65 #include <sfx2/dispatch.hxx>
66 #include <sfx2/docfile.hxx>
67 #include <sfx2/docfilt.hxx>
68 #include <sfx2/frmdescr.hxx>
69 #include "openflag.hxx"
70 #include <sfx2/viewsh.hxx>
71 #include <sfx2/viewfrm.hxx>
72 #include <sfx2/request.hxx>
73 #include <sfx2/fcontnr.hxx>
74 #include "impframe.hxx"
75 #include <sfx2/appuno.hxx>
76 #include <sfx2/viewfrm.hxx>
77 #include "workwin.hxx"
78 #include <sfx2/sfxuno.hxx>
79 #include <sfx2/msgpool.hxx>
80 #include "objshimp.hxx"
81 #include <sfx2/ipclient.hxx>
82
83 #ifdef DBG_UTIL
84 #include <sfx2/frmhtmlw.hxx>
85 #endif
86
87 using namespace com::sun::star;
88
89 static SfxFrameArr_Impl* pFramesArr_Impl=0;
90
91 using namespace ::com::sun::star::uno;
92 using namespace ::com::sun::star::util;
93 using namespace ::com::sun::star::frame;
94 using namespace ::com::sun::star::container;
95
96 TYPEINIT1(SfxFrame, SfxListener);
97 TYPEINIT1_AUTOFACTORY(SfxFrameItem, SfxPoolItem);
98 TYPEINIT1(SfxUsrAnyItem, SfxPoolItem);
99 TYPEINIT1_AUTOFACTORY(SfxUnoFrameItem, SfxPoolItem);
100
GetHdl()101 SvCompatWeakHdl* SfxFrame::GetHdl()
102 {
103 return pImp->GetHdl();
104 }
105
106 //--------------------------------------------------------------------
Construct_Impl()107 void SfxFrame::Construct_Impl()
108 {
109 pImp = new SfxFrame_Impl( this );
110 if ( !pFramesArr_Impl )
111 pFramesArr_Impl = new SfxFrameArr_Impl;
112 pFramesArr_Impl->Insert( this, pFramesArr_Impl->Count() );
113 }
114
115 //--------------------------------------------------------------------
116
~SfxFrame()117 SfxFrame::~SfxFrame()
118 {
119 RemoveTopFrame_Impl( this );
120 DELETEZ( pWindow );
121
122 pFramesArr_Impl->Remove( pFramesArr_Impl->GetPos( this ) );
123
124 if ( pParentFrame )
125 {
126 pParentFrame->RemoveChildFrame_Impl( this );
127 pParentFrame = 0;
128 }
129
130 delete pImp->pDescr;
131
132 if ( pChildArr )
133 {
134 DBG_ASSERT( !pChildArr->Count(), "Childs nicht entfernt!" );
135 delete pChildArr;
136 }
137
138 delete pImp;
139 }
140
DoClose()141 sal_Bool SfxFrame::DoClose()
142 {
143 // Eigentlich wird noch ein PrepareClose gebraucht !!!
144 sal_Bool bRet = sal_False;
145 if ( !pImp->bClosing )
146 {
147 pImp->bClosing = sal_True;
148 CancelTransfers();
149
150 // now close frame; it will be deleted if this call is successful, so don't use any members after that!
151 bRet = sal_True;
152 try
153 {
154 Reference< XCloseable > xCloseable ( pImp->xFrame, UNO_QUERY );
155 if ( (!GetCurrentDocument() || !GetCurrentDocument()->Get_Impl()->bDisposing ) && xCloseable.is())
156 xCloseable->close(sal_True);
157 else if ( pImp->xFrame.is() )
158 {
159 Reference < XFrame > xFrame = pImp->xFrame;
160 xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
161 xFrame->dispose();
162 }
163 else
164 bRet = DoClose_Impl();
165 }
166 catch( ::com::sun::star::util::CloseVetoException& )
167 {
168 pImp->bClosing = sal_False;
169 bRet = sal_False;
170 }
171 catch( ::com::sun::star::lang::DisposedException& )
172 {
173 }
174 }
175
176 return bRet;
177 }
178
DoClose_Impl()179 sal_Bool SfxFrame::DoClose_Impl()
180 {
181 sal_Bool bRet = sal_True;
182 SfxBindings* pBindings = NULL;
183 if ( pImp->pCurrentViewFrame )
184 pBindings = &pImp->pCurrentViewFrame->GetBindings();
185
186 // Bei internen Tasks m"ussen Controller und Tools abger"aumt werden
187 if ( pImp->pWorkWin )
188 pImp->pWorkWin->DeleteControllers_Impl();
189
190 if ( pImp->pCurrentViewFrame )
191 bRet = pImp->pCurrentViewFrame->Close();
192
193 if ( pImp->bOwnsBindings )
194 DELETEZ( pBindings );
195
196 bRet = Close();
197 DBG_ASSERT( bRet, "Impossible state: frame closes, but controller refuses!");
198 return bRet;
199 }
200
DocIsModified_Impl()201 sal_Bool SfxFrame::DocIsModified_Impl()
202 {
203 if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetObjectShell() &&
204 pImp->pCurrentViewFrame->GetObjectShell()->IsModified() )
205 return sal_True;
206 for( sal_uInt16 nPos = GetChildFrameCount(); nPos--; )
207 if( pChildArr->GetObject( nPos )->DocIsModified_Impl() )
208 return sal_True;
209 return sal_False;
210 }
211
PrepareClose_Impl(sal_Bool bUI,sal_Bool bForBrowsing)212 sal_uInt16 SfxFrame::PrepareClose_Impl( sal_Bool bUI, sal_Bool bForBrowsing )
213 {
214 sal_uInt16 nRet = RET_OK;
215
216 // prevent recursive calls
217 if( !pImp->bPrepClosing )
218 {
219 pImp->bPrepClosing = sal_True;
220
221 SfxObjectShell* pCur = GetCurrentDocument() ;
222 if( pCur )
223 {
224 // SFX components have a known behaviour
225 // First check if this frame is the only view to its current document
226 int bOther = sal_False;
227 for ( const SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pCur );
228 !bOther && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, pCur ) )
229 {
230 bOther = ( &pFrame->GetFrame() != this );
231 }
232
233 SFX_APP()->NotifyEvent( SfxViewEventHint(SFX_EVENT_PREPARECLOSEVIEW, GlobalEventConfig::GetEventName( STR_EVENT_PREPARECLOSEVIEW ), pCur, GetController() ) );
234
235 if ( bOther )
236 // if there are other views only the current view of this frame must be asked
237 nRet = GetCurrentViewFrame()->GetViewShell()->PrepareClose( bUI, bForBrowsing );
238 else
239 // otherwise ask the document
240 nRet = pCur->PrepareClose( bUI, bForBrowsing );
241 }
242
243 if ( nRet == RET_OK )
244 {
245 // if this frame has child frames, ask them too
246 for( sal_uInt16 nPos = GetChildFrameCount(); nRet == RET_OK && nPos--; )
247 nRet = pChildArr->GetObject( nPos )->PrepareClose_Impl( bUI, bForBrowsing );
248 }
249
250 pImp->bPrepClosing = sal_False;
251 }
252
253 if ( nRet == RET_OK && pImp->pWorkWin )
254 // if closing was accepted by the component the UI subframes must be asked also
255 nRet = pImp->pWorkWin->PrepareClose_Impl();
256
257 return nRet;
258 }
259
260 //--------------------------------------------------------------------
261
GetChildFrame(sal_uInt16 nPos) const262 SfxFrame* SfxFrame::GetChildFrame( sal_uInt16 nPos ) const
263 {
264 if ( pChildArr && pChildArr->Count() > nPos )
265 {
266 DBG_ASSERT( nPos < pChildArr->Count(), "Falscher Index!");
267 return (*pChildArr)[nPos];
268 }
269
270 return 0L;
271 }
272
RemoveChildFrame_Impl(SfxFrame * pFrame)273 void SfxFrame::RemoveChildFrame_Impl( SfxFrame* pFrame )
274 {
275 DBG_ASSERT( pChildArr, "Unbekannter Frame!");
276 sal_uInt16 nPos = pChildArr->GetPos(pFrame);
277 pChildArr->Remove( nPos );
278 };
279
GetTopFrame() const280 SfxFrame& SfxFrame::GetTopFrame() const
281 {
282 const SfxFrame* pParent = this;
283 while ( pParent->pParentFrame )
284 pParent = pParent->pParentFrame;
285 return *const_cast< SfxFrame* >( pParent );
286 }
287
IsClosing_Impl() const288 sal_Bool SfxFrame::IsClosing_Impl() const
289 {
290 return pImp->bClosing;
291 }
292
SetIsClosing_Impl()293 void SfxFrame::SetIsClosing_Impl()
294 {
295 pImp->bClosing = sal_True;
296 }
297
GetChildFrameCount() const298 sal_uInt16 SfxFrame::GetChildFrameCount() const
299 {
300 return pChildArr ? pChildArr->Count() : 0;
301 }
302
CancelTransfers(sal_Bool)303 void SfxFrame::CancelTransfers( sal_Bool /*bCancelLoadEnv*/ )
304 {
305 if( !pImp->bInCancelTransfers )
306 {
307 pImp->bInCancelTransfers = sal_True;
308 SfxObjectShell* pObj = GetCurrentDocument();
309 if( pObj ) //&& !( pObj->Get_Impl()->nLoadedFlags & SFX_LOADED_ALL ))
310 {
311 SfxViewFrame* pFrm;
312 for( pFrm = SfxViewFrame::GetFirst( pObj );
313 pFrm && &pFrm->GetFrame() == this;
314 pFrm = SfxViewFrame::GetNext( *pFrm, pObj ) ) ;
315 // Keine anderer Frame mehr auf Doc -> Cancel
316 if( !pFrm )
317 {
318 pObj->CancelTransfers();
319 GetCurrentDocument()->Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
320 }
321 }
322
323 // zuerst Nachladende Frames stoppen
324 sal_uInt16 nCount = GetChildFrameCount();
325 for( sal_uInt16 n = 0; n<nCount; n++ )
326 GetChildFrame( n )->CancelTransfers();
327
328 // ggf. StarOne-Loader canceln
329 SfxFrameWeak wFrame( this );
330 if (wFrame.Is())
331 pImp->bInCancelTransfers = sal_False;
332 }
333 }
334
GetCurrentViewFrame() const335 SfxViewFrame* SfxFrame::GetCurrentViewFrame() const
336 {
337 return pImp->pCurrentViewFrame;
338 }
339
GetDispatcher_Impl() const340 SfxDispatcher* SfxFrame::GetDispatcher_Impl() const
341 {
342 if ( pImp->pCurrentViewFrame )
343 return pImp->pCurrentViewFrame->GetDispatcher();
344 return GetParentFrame()->GetDispatcher_Impl();
345 }
346
GetCurrentDocument() const347 SfxObjectShell* SfxFrame::GetCurrentDocument() const
348 {
349 return pImp->pCurrentViewFrame ?
350 pImp->pCurrentViewFrame->GetObjectShell() :
351 NULL;
352 }
353
SetCurrentViewFrame_Impl(SfxViewFrame * pFrame)354 void SfxFrame::SetCurrentViewFrame_Impl( SfxViewFrame *pFrame )
355 {
356 pImp->pCurrentViewFrame = pFrame;
357 }
358
GetFrameType() const359 sal_uInt32 SfxFrame::GetFrameType() const
360 {
361 return pImp->nType;
362 }
363
SetFrameType_Impl(sal_uInt32 n)364 void SfxFrame::SetFrameType_Impl( sal_uInt32 n )
365 {
366 pImp->nType = n;
367 }
368
GetViewData_Impl()369 void SfxFrame::GetViewData_Impl()
370 {
371 // Alle zwischen Laden und Entfernen "anderbaren Daten aktualisieren; die
372 // festen Daten werden nur einmal ( nach PrepareForDoc_Impl in UpdateDescriptor )
373 // geholt, um Zeit zu sparen.
374 SfxViewFrame* pViewFrame = GetCurrentViewFrame();
375 if( pViewFrame && pViewFrame->GetViewShell() )
376 {
377 const SfxMedium *pMed = GetCurrentDocument()->GetMedium();
378 sal_Bool bReadOnly = pMed->GetOpenMode() == SFX_STREAM_READONLY;
379 GetDescriptor()->SetReadOnly( bReadOnly );
380
381 SfxItemSet *pSet = GetDescriptor()->GetArgs();
382 sal_Bool bGetViewData = sal_False;
383 if ( GetController().is() && pSet->GetItemState( SID_VIEW_DATA ) != SFX_ITEM_SET )
384 {
385 ::com::sun::star::uno::Any aData = GetController()->getViewData();
386 pSet->Put( SfxUsrAnyItem( SID_VIEW_DATA, aData ) );
387 bGetViewData = sal_True;
388 }
389
390 if ( pViewFrame->GetCurViewId() )
391 pSet->Put( SfxUInt16Item( SID_VIEW_ID, pViewFrame->GetCurViewId() ) );
392 if ( pChildArr )
393 {
394 // Bei Framesets m"ussen auch die Daten der ChildViews geholt werden
395 sal_uInt16 nCount = pChildArr->Count();
396 for ( sal_uInt16 n=nCount; n>0; n--)
397 {
398 SfxFrame* pFrame = (*pChildArr)[n-1];
399 if ( bGetViewData )
400 pFrame->GetDescriptor()->GetArgs()->ClearItem( SID_VIEW_DATA );
401 pFrame->GetViewData_Impl();
402 }
403 }
404 }
405 }
406
UpdateDescriptor(SfxObjectShell * pDoc)407 void SfxFrame::UpdateDescriptor( SfxObjectShell *pDoc )
408 {
409 // Beim PrepareForDoc_Impl wird der Descriptor des Frames aktualisiert
410 // und sein ItemSet neu initialisiert. Alle Daten, die f"ur ein sp"ateres
411 // Restaurieren der View n"otig sind, sind damit festgehalten.
412 // Soll das Dokument ersetzt werden, wird durch GetViewData_Impl (s.o.)
413 // die neueste Information hinzugef"ugt. Alles zusammen wird dann in der
414 // Browse-History gesichert. Beim Aktivieren eines solchen FramePickEntry
415 // wird das komplette ItemSet und der Descriptor im OpenDoc mitgeschickt.
416 // Hier werden nur die festen Eigenschaften gesichert; die "anderbaren werden
417 // durch GetViewData geholt ( spart Zeit ).
418 DBG_ASSERT( pDoc, "NULL-Document inserted ?!" );
419
420 GetParentFrame();
421 const SfxMedium *pMed = pDoc->GetMedium();
422 GetDescriptor()->SetActualURL( pMed->GetOrigURL() );
423
424 SFX_ITEMSET_ARG( pMed->GetItemSet(), pItem, SfxBoolItem, SID_EDITDOC, sal_False );
425 sal_Bool bEditable = ( !pItem || pItem->GetValue() );
426
427 GetDescriptor()->SetEditable( bEditable );
428
429 // FileOpen-Parameter merken
430 SfxItemSet* pItemSet = pMed->GetItemSet();
431 String aMedName( pMed->GetName() );
432
433 const SfxFilter* pFilter = pMed->GetOrigFilter();
434 String aFilter;
435 if ( pFilter )
436 aFilter = pFilter->GetFilterName();
437
438 SFX_ITEMSET_ARG( pItemSet, pRefererItem, SfxStringItem, SID_REFERER, sal_False);
439 SFX_ITEMSET_ARG( pItemSet, pOptionsItem, SfxStringItem, SID_FILE_FILTEROPTIONS, sal_False);
440 SFX_ITEMSET_ARG( pItemSet, pTitle1Item, SfxStringItem, SID_DOCINFO_TITLE, sal_False);
441
442 SfxItemSet *pSet = GetDescriptor()->GetArgs();
443
444 // Alle alten Items l"oschen
445 pSet->ClearItem();
446
447 if ( pRefererItem )
448 pSet->Put( *pRefererItem );
449 else
450 pSet->Put( SfxStringItem( SID_REFERER, String() ) );
451
452 if ( pOptionsItem )
453 pSet->Put( *pOptionsItem );
454
455 if ( pTitle1Item )
456 pSet->Put( *pTitle1Item );
457
458 pSet->Put( SfxStringItem( SID_FILTER_NAME, aFilter ));
459 }
460
461 //-------------------------------------------------------------------------
462
SetDescriptor(SfxFrameDescriptor * pD)463 void SfxFrame::SetDescriptor( SfxFrameDescriptor *pD )
464 {
465 DBG_ASSERT( pD, "Kein Descriptor!" );
466 DBG_ASSERT( pD != pImp->pDescr, "Descriptor ist schon gesetzt!" );
467
468 if ( pImp->pDescr )
469 {
470 // Nur TopLevel-Frames verwalten ihren Descriptor selbst, bei den
471 // anderen tut es das Frameset
472 if ( !pParentFrame )
473 delete pImp->pDescr;
474 }
475 pImp->pDescr = pD;
476 }
477
478 //-------------------------------------------------------------------------
479
GetDescriptor() const480 SfxFrameDescriptor* SfxFrame::GetDescriptor() const
481 {
482 // On Demand einen FrameDescriptor anlegen; wenn es kein TopLevel-Frame
483 // ist, f"uhrt es zu Fehlern, da keine g"ulige Verkettung hergestellt wird
484
485 if ( !pImp->pDescr )
486 {
487 DBG_ASSERT( !GetParentFrame(), "Kein TopLevel-Frame, aber kein Descriptor!" );
488 pImp->pDescr = new SfxFrameDescriptor;
489 if ( GetCurrentDocument() )
490 pImp->pDescr->SetURL( GetCurrentDocument()->GetMedium()->GetOrigURL() );
491 }
492 return pImp->pDescr;
493 }
494
495 //-------------------------------------------------------------------------
496
GetTargetList(TargetList & rList) const497 void SfxFrame::GetTargetList( TargetList& rList ) const
498 {
499 if ( !GetParentFrame() )
500 {
501 // Einen Leerstring f"ur 'Kein Target'
502 rList.Insert( new String() );
503 rList.Insert( new String( DEFINE_CONST_UNICODE( "_top" ) ) );
504 rList.Insert( new String( DEFINE_CONST_UNICODE( "_parent" ) ) );
505 rList.Insert( new String( DEFINE_CONST_UNICODE( "_blank" ) ) );
506 rList.Insert( new String( DEFINE_CONST_UNICODE( "_self" ) ) );
507 }
508
509 SfxViewFrame* pView = GetCurrentViewFrame();
510 if( pView && pView->GetViewShell() && pChildArr )
511 {
512 sal_uInt16 nCount = pChildArr->Count();
513 for ( sal_uInt16 n=0; n<nCount; n++)
514 {
515 SfxFrame* pFrame = (*pChildArr)[n];
516 pFrame->GetTargetList( rList );
517 }
518 }
519 }
520
521 //-------------------------------------------------------------------------
522
GetBroadcaster() const523 SfxBroadcaster& SfxFrame::GetBroadcaster() const
524 {
525 return *pImp;
526 }
527
IsParent(SfxFrame * pFrame) const528 sal_Bool SfxFrame::IsParent( SfxFrame *pFrame ) const
529 {
530 SfxFrame *pParent = pParentFrame;
531 while ( pParent )
532 {
533 if ( pParent == pFrame )
534 return sal_True;
535 pParent = pParent->pParentFrame;
536 }
537
538 return sal_False;
539 }
540
InsertTopFrame_Impl(SfxFrame * pFrame)541 void SfxFrame::InsertTopFrame_Impl( SfxFrame* pFrame )
542 {
543 SfxFrameArr_Impl& rArr = *SFX_APP()->Get_Impl()->pTopFrames;
544 rArr.Insert( pFrame, rArr.Count() );
545 }
546
RemoveTopFrame_Impl(SfxFrame * pFrame)547 void SfxFrame::RemoveTopFrame_Impl( SfxFrame* pFrame )
548 {
549 SfxFrameArr_Impl& rArr = *SFX_APP()->Get_Impl()->pTopFrames;
550 rArr.Remove( rArr.GetPos( pFrame ) );
551 }
552
SfxFrameItem(sal_uInt16 nWhichId,SfxViewFrame * p)553 SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxViewFrame *p )
554 : SfxPoolItem( nWhichId ), pFrame( p ? &p->GetFrame() : NULL )
555 {
556 wFrame = pFrame;
557 }
558
SfxFrameItem(sal_uInt16 nWhichId,SfxFrame * p)559 SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxFrame *p ):
560 SfxPoolItem( nWhichId ),
561 pFrame( p ), wFrame( p )
562 {
563 }
564
SfxFrameItem(SfxFrame * p)565 SfxFrameItem::SfxFrameItem( SfxFrame *p ):
566 SfxPoolItem( 0 ),
567 pFrame( p ), wFrame( p )
568 {
569 }
570
operator ==(const SfxPoolItem & rItem) const571 int SfxFrameItem::operator==( const SfxPoolItem &rItem ) const
572 {
573 return ((SfxFrameItem&)rItem).pFrame == pFrame &&
574 ((SfxFrameItem&)rItem).wFrame == wFrame;
575 }
576
577 //--------------------------------------------------------------------
578
GetValueText() const579 String SfxFrameItem::GetValueText() const
580 {
581 return String();
582 }
583
Clone(SfxItemPool *) const584 SfxPoolItem* SfxFrameItem::Clone( SfxItemPool *) const
585 {
586 SfxFrameItem* pNew = new SfxFrameItem( wFrame);
587 pNew->SetFramePtr_Impl( pFrame );
588 return pNew;
589 }
590
QueryValue(com::sun::star::uno::Any & rVal,sal_uInt8) const591 sal_Bool SfxFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const
592 {
593 if ( wFrame )
594 {
595 rVal <<= wFrame->GetFrameInterface();
596 return sal_True;
597 }
598
599 return sal_False;
600 }
601
PutValue(const com::sun::star::uno::Any & rVal,sal_uInt8)602 sal_Bool SfxFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 )
603 {
604 Reference < XFrame > xFrame;
605 if ( (rVal >>= xFrame) && xFrame.is() )
606 {
607 SfxFrame* pFr = SfxFrame::GetFirst();
608 while ( pFr )
609 {
610 if ( pFr->GetFrameInterface() == xFrame )
611 {
612 wFrame = pFrame = pFr;
613 return sal_True;
614 }
615
616 pFr = SfxFrame::GetNext( *pFr );
617 }
618 return sal_True;
619 }
620
621 return sal_False;
622 }
623
624
SfxUsrAnyItem(sal_uInt16 nWhichId,const::com::sun::star::uno::Any & rAny)625 SfxUsrAnyItem::SfxUsrAnyItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Any& rAny )
626 : SfxPoolItem( nWhichId )
627 {
628 aValue = rAny;
629 }
630
operator ==(const SfxPoolItem &) const631 int SfxUsrAnyItem::operator==( const SfxPoolItem& /*rItem*/ ) const
632 {
633 // return rItem.ISA( SfxUsrAnyItem ) && ((SfxUsrAnyItem&)rItem).aValue == aValue;
634 return sal_False;
635 }
636
Clone(SfxItemPool *) const637 SfxPoolItem* SfxUsrAnyItem::Clone( SfxItemPool *) const
638 {
639 return new SfxUsrAnyItem( Which(), aValue );
640 }
641
QueryValue(com::sun::star::uno::Any & rVal,sal_uInt8) const642 sal_Bool SfxUsrAnyItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
643 {
644 rVal = aValue;
645 return sal_True;
646 }
647
PutValue(const com::sun::star::uno::Any & rVal,sal_uInt8)648 sal_Bool SfxUsrAnyItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
649 {
650 aValue = rVal;
651 return sal_True;
652 }
653
SfxUnoFrameItem()654 SfxUnoFrameItem::SfxUnoFrameItem()
655 : SfxPoolItem()
656 , m_xFrame()
657 {
658 }
659
SfxUnoFrameItem(sal_uInt16 nWhichId,const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & i_rFrame)660 SfxUnoFrameItem::SfxUnoFrameItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& i_rFrame )
661 : SfxPoolItem( nWhichId )
662 , m_xFrame( i_rFrame )
663 {
664 }
665
operator ==(const SfxPoolItem & i_rItem) const666 int SfxUnoFrameItem::operator==( const SfxPoolItem& i_rItem ) const
667 {
668 return i_rItem.ISA( SfxUnoFrameItem ) && static_cast< const SfxUnoFrameItem& >( i_rItem ).m_xFrame == m_xFrame;
669 }
670
Clone(SfxItemPool *) const671 SfxPoolItem* SfxUnoFrameItem::Clone( SfxItemPool* ) const
672 {
673 return new SfxUnoFrameItem( Which(), m_xFrame );
674 }
675
QueryValue(com::sun::star::uno::Any & rVal,sal_uInt8) const676 sal_Bool SfxUnoFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
677 {
678 rVal <<= m_xFrame;
679 return sal_True;
680 }
681
PutValue(const com::sun::star::uno::Any & rVal,sal_uInt8)682 sal_Bool SfxUnoFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
683 {
684 return ( rVal >>= m_xFrame );
685 }
686
SfxFrameIterator(const SfxFrame & rFrame,sal_Bool bRecur)687 SfxFrameIterator::SfxFrameIterator( const SfxFrame& rFrame, sal_Bool bRecur )
688 : pFrame( &rFrame )
689 , bRecursive( bRecur )
690 {}
691
FirstFrame()692 SfxFrame* SfxFrameIterator::FirstFrame()
693 {
694 // GetFirst beginnt die Iteration beim ersten ChildFrame
695 return pFrame->GetChildFrame( 0 );
696 }
697
NextFrame(SfxFrame & rPrev)698 SfxFrame* SfxFrameIterator::NextFrame( SfxFrame& rPrev )
699 {
700 // Zuerst auf Kinder testen, wenn Rekursion erw"unscht
701 SfxFrame *pRet = NULL;
702 if ( bRecursive )
703 pRet = rPrev.GetChildFrame( 0 );
704 if ( !pRet )
705 {
706 // Anderenfalls mit den Geschwistern von rPrev weitermachen
707 pRet = NextSibling_Impl( rPrev );
708 }
709
710 return pRet;
711 }
712
713
NextSibling_Impl(SfxFrame & rPrev)714 SfxFrame* SfxFrameIterator::NextSibling_Impl( SfxFrame& rPrev )
715 {
716 SfxFrame *pRet = NULL;
717 if ( &rPrev != pFrame )
718 {
719 SfxFrameArr_Impl& rArr = *rPrev.pParentFrame->pChildArr;
720 sal_uInt16 nPos = rArr.GetPos( &rPrev );
721 if ( nPos+1 < rArr.Count() )
722 pRet = rArr[nPos+1];
723
724 if ( !pRet && rPrev.pParentFrame->pParentFrame )
725 pRet = NextSibling_Impl( *rPrev.pParentFrame );
726 }
727
728 return pRet;
729 }
730
IsTop() const731 sal_Bool SfxFrame::IsTop() const
732 {
733 return GetFrameInterface().is() ? GetFrameInterface()->isTop() : sal_False;
734 }
735
HasComponent() const736 sal_Bool SfxFrame::HasComponent() const
737 {
738 return sal_False;
739 }
740
GetController() const741 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SfxFrame::GetController() const
742 {
743 if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetViewShell() )
744 return pImp->pCurrentViewFrame->GetViewShell()->GetController();
745 else
746 return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > ();
747 }
748
GetFrameInterface() const749 ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxFrame::GetFrameInterface() const
750 {
751 return pImp->xFrame;
752 }
753
SetFrameInterface_Impl(const::com::sun::star::uno::Reference<::com::sun::star::frame::XFrame> & rFrame)754 void SfxFrame::SetFrameInterface_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame )
755 {
756 pImp->xFrame = rFrame;
757 com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder;
758 if ( !rFrame.is() && GetCurrentViewFrame() )
759 GetCurrentViewFrame()->GetBindings().SetRecorder_Impl( xRecorder );
760 }
761
Appear()762 void SfxFrame::Appear()
763 {
764 if ( GetCurrentViewFrame() )
765 {
766 GetCurrentViewFrame()->Show();
767 GetWindow().Show();
768 pImp->xFrame->getContainerWindow()->setVisible( sal_True );
769 if ( pParentFrame )
770 pParentFrame->Appear();
771 Reference < ::com::sun::star::awt::XTopWindow > xTopWindow( pImp->xFrame->getContainerWindow(), UNO_QUERY );
772 if ( xTopWindow.is() )
773 xTopWindow->toFront();
774 }
775 }
776
AppearWithUpdate()777 void SfxFrame::AppearWithUpdate()
778 {
779 Appear();
780 if ( GetCurrentViewFrame() )
781 GetCurrentViewFrame()->GetDispatcher()->Update_Impl( sal_True );
782 }
783
SetOwnsBindings_Impl(sal_Bool bSet)784 void SfxFrame::SetOwnsBindings_Impl( sal_Bool bSet )
785 {
786 pImp->bOwnsBindings = bSet;
787 }
788
OwnsBindings_Impl() const789 sal_Bool SfxFrame::OwnsBindings_Impl() const
790 {
791 return pImp->bOwnsBindings;
792 }
793
SetToolSpaceBorderPixel_Impl(const SvBorder & rBorder)794 void SfxFrame::SetToolSpaceBorderPixel_Impl( const SvBorder& rBorder )
795 {
796 pImp->aBorder = rBorder;
797 SfxViewFrame *pF = GetCurrentViewFrame();
798 if ( pF )
799 {
800 Point aPos ( rBorder.Left(), rBorder.Top() );
801 Size aSize( GetWindow().GetOutputSizePixel() );
802 long nDeltaX = rBorder.Left() + rBorder.Right();
803 if ( aSize.Width() > nDeltaX )
804 aSize.Width() -= nDeltaX;
805 else
806 aSize.Width() = 0;
807
808 long nDeltaY = rBorder.Top() + rBorder.Bottom();
809 if ( aSize.Height() > nDeltaY )
810 aSize.Height() -= nDeltaY;
811 else
812 aSize.Height() = 0;
813
814 if ( GetParentFrame() )
815 {
816 sal_Bool bHasTools = rBorder.Left() != rBorder.Right() || rBorder.Top() != rBorder.Bottom();
817 pF->GetWindow().SetBorderStyle( bHasTools ? WINDOW_BORDER_NORMAL : WINDOW_BORDER_NOBORDER );
818 }
819
820 pF->GetWindow().SetPosSizePixel( aPos, aSize );
821 }
822 }
823
GetTopOuterRectPixel_Impl() const824 Rectangle SfxFrame::GetTopOuterRectPixel_Impl() const
825 {
826 Size aSize( GetWindow().GetOutputSizePixel() );
827 Point aPoint;
828 return ( Rectangle ( aPoint, aSize ) );
829 }
830
GetWorkWindow_Impl() const831 SfxWorkWindow* SfxFrame::GetWorkWindow_Impl() const
832 {
833 if ( pImp->pWorkWin )
834 return pImp->pWorkWin;
835 else if ( pParentFrame )
836 return pParentFrame->GetWorkWindow_Impl();
837 else
838 return NULL;
839 }
840
SetWorkWindow_Impl(SfxWorkWindow * pWorkwin)841 void SfxFrame::SetWorkWindow_Impl( SfxWorkWindow* pWorkwin )
842 {
843 pImp->pWorkWin = pWorkwin;
844 }
845
CreateWorkWindow_Impl()846 void SfxFrame::CreateWorkWindow_Impl()
847 {
848 SfxFrame* pFrame = this;
849
850 if ( IsInPlace() )
851 {
852 // this makes sense only for inplace activated objects
853 try
854 {
855 Reference < XChild > xChild( GetCurrentDocument()->GetModel(), UNO_QUERY );
856 if ( xChild.is() )
857 {
858 Reference < XModel > xParent( xChild->getParent(), UNO_QUERY );
859 if ( xParent.is() )
860 {
861 Reference< XController > xParentCtrler = xParent->getCurrentController();
862 if ( xParentCtrler.is() )
863 {
864 Reference < XFrame > xFrame( xParentCtrler->getFrame() );
865 SfxFrame* pFr = SfxFrame::GetFirst();
866 while ( pFr )
867 {
868 if ( pFr->GetFrameInterface() == xFrame )
869 {
870 pFrame = pFr;
871 break;
872 }
873
874 pFr = SfxFrame::GetNext( *pFr );
875 }
876 }
877 }
878 }
879 }
880 catch(Exception&)
881 {
882 OSL_ENSURE(0,"SfxFrame::CreateWorkWindow_Impl: Exception cachted. Please try to submit a repoducable bug !");
883 }
884 }
885
886 pImp->pWorkWin = new SfxFrameWorkWin_Impl( &pFrame->GetWindow(), this, pFrame );
887 }
888
GrabFocusOnComponent_Impl()889 void SfxFrame::GrabFocusOnComponent_Impl()
890 {
891 if ( pImp->bReleasingComponent )
892 {
893 GetWindow().GrabFocus();
894 return;
895 }
896
897 Window* pFocusWindow = &GetWindow();
898 if ( GetCurrentViewFrame() && GetCurrentViewFrame()->GetViewShell() && GetCurrentViewFrame()->GetViewShell()->GetWindow() )
899 pFocusWindow = GetCurrentViewFrame()->GetViewShell()->GetWindow();
900
901 if( !pFocusWindow->HasChildPathFocus() )
902 pFocusWindow->GrabFocus();
903 }
904
ReleasingComponent_Impl(sal_Bool bSet)905 void SfxFrame::ReleasingComponent_Impl( sal_Bool bSet )
906 {
907 pImp->bReleasingComponent = bSet;
908 }
909
IsInPlace() const910 sal_Bool SfxFrame::IsInPlace() const
911 {
912 return pImp->bInPlace;
913 }
914
SetInPlace_Impl(sal_Bool bSet)915 void SfxFrame::SetInPlace_Impl( sal_Bool bSet )
916 {
917 pImp->bInPlace = bSet;
918 }
919
Resize()920 void SfxFrame::Resize()
921 {
922 if ( IsClosing_Impl() )
923 return;
924
925 if ( OwnsBindings_Impl() )
926 {
927 if ( IsInPlace() )
928 {
929 SetToolSpaceBorderPixel_Impl( SvBorder() );
930 }
931 else
932 {
933 // check for IPClient that contains UIactive object or object that is currently UI activating
934 SfxWorkWindow *pWork = GetWorkWindow_Impl();
935 SfxInPlaceClient* pClient = GetCurrentViewFrame()->GetViewShell() ? GetCurrentViewFrame()->GetViewShell()->GetUIActiveIPClient_Impl() : 0;
936 if ( pClient )
937 {
938 uno::Reference < lang::XUnoTunnel > xObj( pClient->GetObject()->getComponent(), uno::UNO_QUERY );
939 uno::Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() );
940 sal_Int64 nHandle = (xObj.is()? xObj->getSomething( aSeq ): 0);
941 if ( nHandle )
942 {
943 SfxObjectShell* pDoc = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle ));
944 pWork = SfxViewFrame::GetFirst( pDoc )->GetFrame().GetWorkWindow_Impl();
945 }
946 }
947
948 if ( pWork )
949 {
950 pWork->ArrangeChilds_Impl();
951 pWork->ShowChilds_Impl();
952 }
953
954 // problem in presence of UIActive object: when the window is resized, but the toolspace border
955 // remains the same, setting the toolspace border at the ContainerEnvironment doesn't force a
956 // resize on the IPEnvironment; without that no resize is called for the SfxViewFrame. So always
957 // set the window size of the SfxViewFrame explicit.
958 SetToolSpaceBorderPixel_Impl( pImp->aBorder );
959 }
960 }
961 else if ( pImp->pCurrentViewFrame )
962 {
963 pImp->pCurrentViewFrame->GetWindow().SetSizePixel( GetWindow().GetOutputSizePixel() );
964 }
965
966 }
967
GetFirst()968 SfxFrame* SfxFrame::GetFirst()
969 {
970 if ( !pFramesArr_Impl )
971 return 0;
972 return pFramesArr_Impl->Count() ? pFramesArr_Impl->GetObject(0) : 0;
973 }
974
GetNext(SfxFrame & rFrame)975 SfxFrame* SfxFrame::GetNext( SfxFrame& rFrame )
976 {
977 sal_uInt16 nPos = pFramesArr_Impl->GetPos( &rFrame );
978 if ( nPos+1 < pFramesArr_Impl->Count() )
979 return pFramesArr_Impl->GetObject(nPos+1);
980 else
981 return NULL;
982 }
983
OpenDocumentSynchron(SfxItemSet & i_rSet,const Reference<XFrame> & i_rTargetFrame)984 const SfxPoolItem* SfxFrame::OpenDocumentSynchron( SfxItemSet& i_rSet, const Reference< XFrame >& i_rTargetFrame )
985 {
986 i_rSet.Put( SfxUnoFrameItem( SID_FILLFRAME, i_rTargetFrame ) );
987 i_rSet.ClearItem( SID_TARGETNAME );
988 return SFX_APP()->GetDispatcher_Impl()->Execute( SID_OPENDOC, SFX_CALLMODE_SYNCHRON, i_rSet );
989 }
990
991