Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <com/sun/star/embed/EmbedStates.hpp>
21 : #include <com/sun/star/uno/Reference.h>
22 : #include <com/sun/star/awt/XWindow.hpp>
23 : #include <com/sun/star/util/XURLTransformer.hpp>
24 : #include <com/sun/star/util/XCloseable.hpp>
25 : #include <com/sun/star/util/CloseVetoException.hpp>
26 : #include <com/sun/star/lang/XComponent.hpp>
27 : #include <com/sun/star/lang/DisposedException.hpp>
28 : #include <com/sun/star/container/XChild.hpp>
29 :
30 : #include <vcl/menu.hxx>
31 : #include <svl/intitem.hxx>
32 : #include <vcl/splitwin.hxx>
33 : #include <svl/eitem.hxx>
34 : #include <svl/stritem.hxx>
35 : #include <toolkit/helper/vclunohelper.hxx>
36 : #include <com/sun/star/awt/PosSize.hpp>
37 : #include <comphelper/processfactory.hxx>
38 : #include <vcl/msgbox.hxx>
39 :
40 : // due to pTopFrames
41 : #include "appdata.hxx"
42 : #include <sfx2/app.hxx>
43 : #include <sfx2/event.hxx>
44 : #include <sfx2/unoctitm.hxx>
45 : #include <sfx2/frame.hxx>
46 : #include "arrdecl.hxx"
47 : #include <sfx2/objsh.hxx>
48 : #include <sfx2/dispatch.hxx>
49 : #include <sfx2/docfile.hxx>
50 : #include <sfx2/docfilt.hxx>
51 : #include <sfx2/frmdescr.hxx>
52 : #include "openflag.hxx"
53 : #include <sfx2/viewsh.hxx>
54 : #include <sfx2/viewfrm.hxx>
55 : #include <sfx2/request.hxx>
56 : #include <sfx2/fcontnr.hxx>
57 : #include "impframe.hxx"
58 : #include "workwin.hxx"
59 : #include <sfx2/sfxuno.hxx>
60 : #include <sfx2/msgpool.hxx>
61 : #include "objshimp.hxx"
62 : #include <sfx2/ipclient.hxx>
63 :
64 : #ifdef DBG_UTIL
65 : #include <sfx2/frmhtmlw.hxx>
66 : #endif
67 :
68 : using namespace com::sun::star;
69 :
70 : static SfxFrameArr_Impl* pFramesArr_Impl=0;
71 :
72 : using namespace ::com::sun::star::uno;
73 : using namespace ::com::sun::star::util;
74 : using namespace ::com::sun::star::frame;
75 : using namespace ::com::sun::star::container;
76 :
77 0 : TYPEINIT1(SfxFrame, SfxListener);
78 8 : TYPEINIT1_AUTOFACTORY(SfxFrameItem, SfxPoolItem);
79 375904 : TYPEINIT1(SfxUsrAnyItem, SfxPoolItem);
80 453 : TYPEINIT1_AUTOFACTORY(SfxUnoFrameItem, SfxPoolItem);
81 :
82 5508 : void SfxFrame::Construct_Impl()
83 : {
84 5508 : pImp = new SfxFrame_Impl( this );
85 5508 : if ( !pFramesArr_Impl )
86 148 : pFramesArr_Impl = new SfxFrameArr_Impl;
87 5508 : pFramesArr_Impl->push_back( this );
88 5508 : }
89 :
90 :
91 :
92 16518 : SfxFrame::~SfxFrame()
93 : {
94 5506 : RemoveTopFrame_Impl( this );
95 5506 : DELETEZ( pWindow );
96 :
97 5506 : SfxFrameArr_Impl::iterator it = std::find( pFramesArr_Impl->begin(), pFramesArr_Impl->end(), this );
98 5506 : if ( it != pFramesArr_Impl->end() )
99 5506 : pFramesArr_Impl->erase( it );
100 :
101 5506 : if ( pParentFrame )
102 : {
103 0 : pParentFrame->RemoveChildFrame_Impl( this );
104 0 : pParentFrame = 0;
105 : }
106 :
107 5506 : delete pImp->pDescr;
108 :
109 5506 : if ( pChildArr )
110 : {
111 : DBG_ASSERT( pChildArr->empty(), "Children are not removed!" );
112 0 : delete pChildArr;
113 : }
114 :
115 5506 : delete pImp;
116 11012 : }
117 :
118 5267 : bool SfxFrame::DoClose()
119 : {
120 : // Actually, one more PrepareClose is still needed!
121 5267 : bool bRet = false;
122 5267 : if ( !pImp->bClosing )
123 : {
124 5267 : pImp->bClosing = true;
125 5267 : CancelTransfers();
126 :
127 : // now close frame; it will be deleted if this call is successful, so don't use any members after that!
128 5267 : bRet = true;
129 : try
130 : {
131 5267 : Reference< XCloseable > xCloseable ( pImp->xFrame, UNO_QUERY );
132 5267 : if ( (!GetCurrentDocument() || !GetCurrentDocument()->Get_Impl()->bDisposing ) && xCloseable.is())
133 5267 : xCloseable->close(sal_True);
134 0 : else if ( pImp->xFrame.is() )
135 : {
136 0 : Reference < XFrame > xFrame = pImp->xFrame;
137 0 : xFrame->setComponent( Reference < com::sun::star::awt::XWindow >(), Reference < XController >() );
138 0 : xFrame->dispose();
139 : }
140 : else
141 0 : bRet = DoClose_Impl();
142 : }
143 0 : catch( ::com::sun::star::util::CloseVetoException& )
144 : {
145 0 : pImp->bClosing = false;
146 0 : bRet = false;
147 : }
148 0 : catch( ::com::sun::star::lang::DisposedException& )
149 : {
150 : }
151 : }
152 :
153 5267 : return bRet;
154 : }
155 :
156 5506 : bool SfxFrame::DoClose_Impl()
157 : {
158 5506 : SfxBindings* pBindings = NULL;
159 5506 : if ( pImp->pCurrentViewFrame )
160 5506 : pBindings = &pImp->pCurrentViewFrame->GetBindings();
161 :
162 : // For internal tasks Controllers and Tools must be cleared
163 5506 : if ( pImp->pWorkWin )
164 5506 : pImp->pWorkWin->DeleteControllers_Impl();
165 :
166 5506 : if ( pImp->pCurrentViewFrame )
167 5506 : pImp->pCurrentViewFrame->Close();
168 :
169 5506 : if ( pImp->bOwnsBindings )
170 5506 : DELETEZ( pBindings );
171 :
172 5506 : bool bRet = Close();
173 : DBG_ASSERT( bRet, "Impossible state: frame closes, but controller refuses!");
174 5506 : return bRet;
175 : }
176 :
177 0 : bool SfxFrame::DocIsModified_Impl()
178 : {
179 0 : if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetObjectShell() &&
180 0 : pImp->pCurrentViewFrame->GetObjectShell()->IsModified() )
181 0 : return true;
182 0 : for( sal_uInt16 nPos = GetChildFrameCount(); nPos--; )
183 0 : if( (*pChildArr)[ nPos ]->DocIsModified_Impl() )
184 0 : return true;
185 0 : return false;
186 : }
187 :
188 6 : bool SfxFrame::PrepareClose_Impl( bool bUI )
189 : {
190 6 : bool nRet = true;
191 :
192 : // prevent recursive calls
193 6 : if( !pImp->bPrepClosing )
194 : {
195 6 : pImp->bPrepClosing = true;
196 :
197 6 : SfxObjectShell* pCur = GetCurrentDocument() ;
198 6 : if( pCur )
199 : {
200 : // SFX components have a known behaviour
201 : // First check if this frame is the only view to its current document
202 6 : bool bOther = false;
203 24 : for ( const SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pCur );
204 24 : !bOther && pFrame; pFrame = SfxViewFrame::GetNext( *pFrame, pCur ) )
205 : {
206 6 : bOther = ( &pFrame->GetFrame() != this );
207 : }
208 :
209 6 : SfxGetpApp()->NotifyEvent( SfxViewEventHint(SFX_EVENT_PREPARECLOSEVIEW, GlobalEventConfig::GetEventName( STR_EVENT_PREPARECLOSEVIEW ), pCur, GetController() ) );
210 :
211 6 : if ( bOther )
212 : // if there are other views only the current view of this frame must be asked
213 0 : nRet = GetCurrentViewFrame()->GetViewShell()->PrepareClose( bUI );
214 : else
215 : // otherwise ask the document
216 6 : nRet = pCur->PrepareClose( bUI );
217 : }
218 :
219 6 : if ( nRet )
220 : {
221 : // if this frame has child frames, ask them too
222 12 : for( sal_uInt16 nPos = GetChildFrameCount(); nRet && nPos--; )
223 0 : nRet = (*pChildArr)[ nPos ]->PrepareClose_Impl( bUI );
224 : }
225 :
226 6 : pImp->bPrepClosing = false;
227 : }
228 :
229 6 : if ( nRet && pImp->pWorkWin )
230 : // if closing was accepted by the component the UI subframes must be asked also
231 6 : nRet = pImp->pWorkWin->PrepareClose_Impl();
232 :
233 6 : return nRet;
234 : }
235 :
236 :
237 :
238 0 : SfxFrame* SfxFrame::GetChildFrame( sal_uInt16 nPos ) const
239 : {
240 0 : if ( pChildArr && pChildArr->size() > nPos )
241 : {
242 : DBG_ASSERT( nPos < pChildArr->size(), "Wrong Index!");
243 0 : return (*pChildArr)[nPos];
244 : }
245 :
246 0 : return 0L;
247 : }
248 :
249 0 : void SfxFrame::RemoveChildFrame_Impl( SfxFrame* pFrame )
250 : {
251 : DBG_ASSERT( pChildArr, "Unknown Frame!");
252 0 : SfxFrameArr_Impl::iterator it = std::find( pChildArr->begin(), pChildArr->end(), pFrame );
253 0 : if ( it != pChildArr->end() )
254 0 : pChildArr->erase( it );
255 0 : };
256 :
257 43658 : SfxFrame& SfxFrame::GetTopFrame() const
258 : {
259 43658 : const SfxFrame* pParent = this;
260 87316 : while ( pParent->pParentFrame )
261 0 : pParent = pParent->pParentFrame;
262 43658 : return *const_cast< SfxFrame* >( pParent );
263 : }
264 :
265 397353 : bool SfxFrame::IsClosing_Impl() const
266 : {
267 397353 : return pImp->bClosing;
268 : }
269 :
270 5506 : void SfxFrame::SetIsClosing_Impl()
271 : {
272 5506 : pImp->bClosing = true;
273 5506 : }
274 :
275 5273 : sal_uInt16 SfxFrame::GetChildFrameCount() const
276 : {
277 5273 : return pChildArr ? pChildArr->size() : 0;
278 : }
279 :
280 5267 : void SfxFrame::CancelTransfers( bool /*bCancelLoadEnv*/ )
281 : {
282 5267 : if( !pImp->bInCancelTransfers )
283 : {
284 5267 : pImp->bInCancelTransfers = true;
285 5267 : SfxObjectShell* pObj = GetCurrentDocument();
286 5267 : if( pObj ) //&& !( pObj->Get_Impl()->nLoadedFlags & SFX_LOADED_ALL ))
287 : {
288 : SfxViewFrame* pFrm;
289 15734 : for( pFrm = SfxViewFrame::GetFirst( pObj );
290 10467 : pFrm && &pFrm->GetFrame() == this;
291 : pFrm = SfxViewFrame::GetNext( *pFrm, pObj ) ) ;
292 : // No more Frame in Document -> Cancel
293 5267 : if( !pFrm )
294 : {
295 5265 : pObj->CancelTransfers();
296 5265 : GetCurrentDocument()->Broadcast( SfxSimpleHint(SFX_HINT_TITLECHANGED) );
297 : }
298 : }
299 :
300 : // First stop multiload Frames
301 5267 : sal_uInt16 nCount = GetChildFrameCount();
302 5267 : for( sal_uInt16 n = 0; n<nCount; n++ )
303 0 : GetChildFrame( n )->CancelTransfers();
304 :
305 : // Check if StarOne-Loader should be canceled
306 5267 : SfxFrameWeakRef wFrame( this );
307 5267 : if (wFrame.Is())
308 5267 : pImp->bInCancelTransfers = false;
309 : }
310 5267 : }
311 :
312 229320 : SfxViewFrame* SfxFrame::GetCurrentViewFrame() const
313 : {
314 229320 : return pImp->pCurrentViewFrame;
315 : }
316 :
317 0 : SfxDispatcher* SfxFrame::GetDispatcher_Impl() const
318 : {
319 0 : if ( pImp->pCurrentViewFrame )
320 0 : return pImp->pCurrentViewFrame->GetDispatcher();
321 0 : return GetParentFrame()->GetDispatcher_Impl();
322 : }
323 :
324 0 : bool SfxFrame::IsAutoLoadLocked_Impl() const
325 : {
326 : // Its own Docucument is locked?
327 0 : const SfxObjectShell* pObjSh = GetCurrentDocument();
328 0 : if ( !pObjSh || !pObjSh->IsAutoLoadLocked() )
329 0 : return false;
330 :
331 : // Its children are locked?
332 0 : for ( sal_uInt16 n = GetChildFrameCount(); n--; )
333 0 : if ( !GetChildFrame(n)->IsAutoLoadLocked_Impl() )
334 0 : return false;
335 :
336 : // otherwise allow AutoLoad
337 0 : return true;
338 : }
339 :
340 26582 : SfxObjectShell* SfxFrame::GetCurrentDocument() const
341 : {
342 : return pImp->pCurrentViewFrame ?
343 21074 : pImp->pCurrentViewFrame->GetObjectShell() :
344 47656 : NULL;
345 : }
346 :
347 11014 : void SfxFrame::SetCurrentViewFrame_Impl( SfxViewFrame *pFrame )
348 : {
349 11014 : pImp->pCurrentViewFrame = pFrame;
350 11014 : }
351 :
352 11014 : sal_uInt32 SfxFrame::GetFrameType() const
353 : {
354 11014 : return pImp->nType;
355 : }
356 :
357 5508 : void SfxFrame::SetFrameType_Impl( sal_uInt32 n )
358 : {
359 5508 : pImp->nType = n;
360 5508 : }
361 :
362 2 : void SfxFrame::GetViewData_Impl()
363 : {
364 : // Update all modifiable data between load and unload, the
365 : // fixed data is only processed once (after PrepareForDoc_Impl in
366 : // updateDescriptor) to save time.
367 :
368 2 : SfxViewFrame* pViewFrame = GetCurrentViewFrame();
369 2 : if( pViewFrame && pViewFrame->GetViewShell() )
370 : {
371 2 : const SfxMedium *pMed = GetCurrentDocument()->GetMedium();
372 2 : bool bReadOnly = pMed->GetOpenMode() == SFX_STREAM_READONLY;
373 2 : GetDescriptor()->SetReadOnly( bReadOnly );
374 :
375 2 : SfxItemSet *pSet = GetDescriptor()->GetArgs();
376 2 : bool bGetViewData = false;
377 2 : if ( GetController().is() && pSet->GetItemState( SID_VIEW_DATA ) != SfxItemState::SET )
378 : {
379 2 : ::com::sun::star::uno::Any aData = GetController()->getViewData();
380 2 : pSet->Put( SfxUsrAnyItem( SID_VIEW_DATA, aData ) );
381 2 : bGetViewData = true;
382 : }
383 :
384 2 : if ( pViewFrame->GetCurViewId() )
385 2 : pSet->Put( SfxUInt16Item( SID_VIEW_ID, pViewFrame->GetCurViewId() ) );
386 2 : if ( pChildArr )
387 : {
388 : // For Framesets also the data from the ChildViews hace to be processed
389 0 : sal_uInt16 nCount = pChildArr->size();
390 0 : for ( sal_uInt16 n=nCount; n>0; n--)
391 : {
392 0 : SfxFrame* pFrame = (*pChildArr)[n-1];
393 0 : if ( bGetViewData )
394 0 : pFrame->GetDescriptor()->GetArgs()->ClearItem( SID_VIEW_DATA );
395 0 : pFrame->GetViewData_Impl();
396 : }
397 : }
398 : }
399 2 : }
400 :
401 5508 : void SfxFrame::UpdateDescriptor( SfxObjectShell *pDoc )
402 : {
403 : // For PrepareForDoc_Impl frames, the descriptor of the updated
404 : // and new itemset to be initialized. All data fir restoring the view
405 : // are thus saved. If the document be replaced, GetViewData_Impl (so)
406 : // the latest information hinzugef by "added. All together then the
407 : // browser-history saved in. When you activate such frame pick entry
408 : // is complete itemsets and the descriptor in the OpenDoc sent;.
409 : // Here only the fixed properties identified "other adjustable, the
410 : // retrieved by GetViewData (saves time).
411 :
412 : assert(pDoc && "NULL-Document inserted ?!");
413 :
414 5508 : GetParentFrame();
415 5508 : const SfxMedium *pMed = pDoc->GetMedium();
416 5508 : GetDescriptor()->SetActualURL( pMed->GetOrigURL() );
417 :
418 5508 : SFX_ITEMSET_ARG( pMed->GetItemSet(), pItem, SfxBoolItem, SID_EDITDOC, false );
419 5508 : bool bEditable = ( !pItem || pItem->GetValue() );
420 :
421 5508 : GetDescriptor()->SetEditable( bEditable );
422 :
423 : // Mark FileOpen parameter
424 5508 : SfxItemSet* pItemSet = pMed->GetItemSet();
425 :
426 5508 : const SfxFilter* pFilter = pMed->GetOrigFilter();
427 5508 : OUString aFilter;
428 5508 : if ( pFilter )
429 5480 : aFilter = pFilter->GetFilterName();
430 :
431 5508 : SFX_ITEMSET_ARG( pItemSet, pRefererItem, SfxStringItem, SID_REFERER, false);
432 5508 : SFX_ITEMSET_ARG( pItemSet, pOptionsItem, SfxStringItem, SID_FILE_FILTEROPTIONS, false);
433 5508 : SFX_ITEMSET_ARG( pItemSet, pTitle1Item, SfxStringItem, SID_DOCINFO_TITLE, false);
434 :
435 5508 : SfxItemSet *pSet = GetDescriptor()->GetArgs();
436 :
437 : // Delete all old Items
438 5508 : pSet->ClearItem();
439 :
440 5508 : if ( pRefererItem )
441 1474 : pSet->Put( *pRefererItem );
442 : else
443 4034 : pSet->Put( SfxStringItem( SID_REFERER, OUString() ) );
444 :
445 5508 : if ( pOptionsItem )
446 0 : pSet->Put( *pOptionsItem );
447 :
448 5508 : if ( pTitle1Item )
449 0 : pSet->Put( *pTitle1Item );
450 :
451 5508 : pSet->Put( SfxStringItem( SID_FILTER_NAME, aFilter ));
452 5508 : }
453 :
454 :
455 :
456 16528 : SfxFrameDescriptor* SfxFrame::GetDescriptor() const
457 : {
458 : // Create a FrameDescriptor On Demand; if there is no TopLevel-Frame
459 : // will result in an error, as no valid link is created.
460 :
461 16528 : if ( !pImp->pDescr )
462 : {
463 : DBG_ASSERT( !GetParentFrame(), "No TopLevel-Frame, but no Descriptor!" );
464 5508 : pImp->pDescr = new SfxFrameDescriptor;
465 5508 : if ( GetCurrentDocument() )
466 0 : pImp->pDescr->SetURL( GetCurrentDocument()->GetMedium()->GetOrigURL() );
467 : }
468 16528 : return pImp->pDescr;
469 : }
470 :
471 0 : void SfxFrame::GetDefaultTargetList(TargetList& rList)
472 : {
473 : // An empty string for 'No Target'
474 0 : rList.push_back( OUString() );
475 0 : rList.push_back( OUString( "_top" ) );
476 0 : rList.push_back( OUString( "_parent" ) );
477 0 : rList.push_back( OUString( "_blank" ) );
478 0 : rList.push_back( OUString( "_self" ) );
479 0 : }
480 :
481 0 : void SfxFrame::GetTargetList( TargetList& rList ) const
482 : {
483 0 : if ( !GetParentFrame() )
484 : {
485 0 : SfxFrame::GetDefaultTargetList(rList);
486 : }
487 :
488 0 : SfxViewFrame* pView = GetCurrentViewFrame();
489 0 : if( pView && pView->GetViewShell() && pChildArr )
490 : {
491 0 : sal_uInt16 nCount = pChildArr->size();
492 0 : for ( sal_uInt16 n=0; n<nCount; n++)
493 : {
494 0 : SfxFrame* pFrame = (*pChildArr)[n];
495 0 : pFrame->GetTargetList( rList );
496 : }
497 : }
498 0 : }
499 :
500 0 : bool SfxFrame::IsParent( SfxFrame *pFrame ) const
501 : {
502 0 : SfxFrame *pParent = pParentFrame;
503 0 : while ( pParent )
504 : {
505 0 : if ( pParent == pFrame )
506 0 : return true;
507 0 : pParent = pParent->pParentFrame;
508 : }
509 :
510 0 : return false;
511 : }
512 :
513 5508 : void SfxFrame::InsertTopFrame_Impl( SfxFrame* pFrame )
514 : {
515 5508 : SfxFrameArr_Impl& rArr = *SfxGetpApp()->Get_Impl()->pTopFrames;
516 5508 : rArr.push_back( pFrame );
517 5508 : }
518 :
519 5506 : void SfxFrame::RemoveTopFrame_Impl( SfxFrame* pFrame )
520 : {
521 5506 : SfxFrameArr_Impl& rArr = *SfxGetpApp()->Get_Impl()->pTopFrames;
522 5506 : SfxFrameArr_Impl::iterator it = std::find( rArr.begin(), rArr.end(), pFrame );
523 5506 : if ( it != rArr.end() )
524 5506 : rArr.erase( it );
525 5506 : }
526 :
527 0 : SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxViewFrame *p )
528 0 : : SfxPoolItem( nWhichId ), pFrame( p ? &p->GetFrame() : NULL )
529 : {
530 0 : wFrame = pFrame;
531 0 : }
532 :
533 0 : SfxFrameItem::SfxFrameItem( sal_uInt16 nWhichId, SfxFrame *p ):
534 : SfxPoolItem( nWhichId ),
535 0 : pFrame( p ), wFrame( p )
536 : {
537 0 : }
538 :
539 0 : SfxFrameItem::SfxFrameItem( SfxFrame *p ):
540 : SfxPoolItem( 0 ),
541 0 : pFrame( p ), wFrame( p )
542 : {
543 0 : }
544 :
545 0 : bool SfxFrameItem::operator==( const SfxPoolItem &rItem ) const
546 : {
547 0 : return static_cast<const SfxFrameItem&>(rItem).pFrame == pFrame &&
548 0 : static_cast<const SfxFrameItem&>(rItem).wFrame == wFrame;
549 : }
550 :
551 :
552 :
553 0 : OUString SfxFrameItem::GetValueText() const
554 : {
555 0 : return OUString();
556 : }
557 :
558 0 : SfxPoolItem* SfxFrameItem::Clone( SfxItemPool *) const
559 : {
560 0 : SfxFrameItem* pNew = new SfxFrameItem( wFrame);
561 0 : pNew->SetFramePtr_Impl( pFrame );
562 0 : return pNew;
563 : }
564 :
565 0 : bool SfxFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 ) const
566 : {
567 0 : if ( wFrame )
568 : {
569 0 : rVal <<= wFrame->GetFrameInterface();
570 0 : return true;
571 : }
572 :
573 0 : return false;
574 : }
575 :
576 0 : bool SfxFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 )
577 : {
578 0 : Reference < XFrame > xFrame;
579 0 : if ( (rVal >>= xFrame) && xFrame.is() )
580 : {
581 0 : SfxFrame* pFr = SfxFrame::GetFirst();
582 0 : while ( pFr )
583 : {
584 0 : if ( pFr->GetFrameInterface() == xFrame )
585 : {
586 0 : wFrame = pFrame = pFr;
587 0 : return true;
588 : }
589 :
590 0 : pFr = SfxFrame::GetNext( *pFr );
591 : }
592 0 : return true;
593 : }
594 :
595 0 : return false;
596 : }
597 :
598 :
599 91328 : SfxUsrAnyItem::SfxUsrAnyItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Any& rAny )
600 91328 : : SfxPoolItem( nWhichId )
601 : {
602 91328 : aValue = rAny;
603 91328 : }
604 :
605 0 : bool SfxUsrAnyItem::operator==( const SfxPoolItem& /*rItem*/ ) const
606 : {
607 0 : return false;
608 : }
609 :
610 51767 : SfxPoolItem* SfxUsrAnyItem::Clone( SfxItemPool *) const
611 : {
612 51767 : return new SfxUsrAnyItem( Which(), aValue );
613 : }
614 :
615 0 : bool SfxUsrAnyItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
616 : {
617 0 : rVal = aValue;
618 0 : return true;
619 : }
620 :
621 0 : bool SfxUsrAnyItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
622 : {
623 0 : aValue = rVal;
624 0 : return true;
625 : }
626 :
627 0 : SfxUnoFrameItem::SfxUnoFrameItem()
628 : : SfxPoolItem()
629 0 : , m_xFrame()
630 : {
631 0 : }
632 :
633 1160 : SfxUnoFrameItem::SfxUnoFrameItem( sal_uInt16 nWhichId, const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& i_rFrame )
634 : : SfxPoolItem( nWhichId )
635 1160 : , m_xFrame( i_rFrame )
636 : {
637 1160 : }
638 :
639 0 : bool SfxUnoFrameItem::operator==( const SfxPoolItem& i_rItem ) const
640 : {
641 0 : return i_rItem.ISA( SfxUnoFrameItem ) && static_cast< const SfxUnoFrameItem& >( i_rItem ).m_xFrame == m_xFrame;
642 : }
643 :
644 862 : SfxPoolItem* SfxUnoFrameItem::Clone( SfxItemPool* ) const
645 : {
646 862 : return new SfxUnoFrameItem( Which(), m_xFrame );
647 : }
648 :
649 0 : bool SfxUnoFrameItem::QueryValue( com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ ) const
650 : {
651 0 : rVal <<= m_xFrame;
652 0 : return true;
653 : }
654 :
655 0 : bool SfxUnoFrameItem::PutValue( const com::sun::star::uno::Any& rVal, sal_uInt8 /*nMemberId*/ )
656 : {
657 0 : return ( rVal >>= m_xFrame );
658 : }
659 :
660 0 : SfxFrameIterator::SfxFrameIterator( const SfxFrame& rFrame, bool bRecur )
661 : : pFrame( &rFrame )
662 0 : , bRecursive( bRecur )
663 0 : {}
664 :
665 0 : SfxFrame* SfxFrameIterator::FirstFrame()
666 : {
667 : // GetFirst starts the iteration at the first child frame
668 0 : return pFrame->GetChildFrame( 0 );
669 : }
670 :
671 0 : SfxFrame* SfxFrameIterator::NextFrame( SfxFrame& rPrev )
672 : {
673 : // If recursion is requested testing is done first on Children.
674 0 : SfxFrame *pRet = NULL;
675 0 : if ( bRecursive )
676 0 : pRet = rPrev.GetChildFrame( 0 );
677 0 : if ( !pRet )
678 : {
679 : // In other case continue with the siblings of rPrev
680 0 : pRet = NextSibling_Impl( rPrev );
681 : }
682 :
683 0 : return pRet;
684 : }
685 :
686 :
687 0 : SfxFrame* SfxFrameIterator::NextSibling_Impl( SfxFrame& rPrev )
688 : {
689 0 : SfxFrame *pRet = NULL;
690 0 : if ( &rPrev != pFrame )
691 : {
692 0 : SfxFrameArr_Impl& rArr = *rPrev.pParentFrame->pChildArr;
693 0 : SfxFrameArr_Impl::iterator it = std::find( rArr.begin(), rArr.end(), &rPrev );
694 0 : if ( it != rArr.end() && (++it) != rArr.end() )
695 0 : pRet = *it;
696 :
697 0 : if ( !pRet && rPrev.pParentFrame->pParentFrame )
698 0 : pRet = NextSibling_Impl( *rPrev.pParentFrame );
699 : }
700 :
701 0 : return pRet;
702 : }
703 :
704 15264 : bool SfxFrame::HasComponent() const
705 : {
706 15264 : return false;
707 : }
708 :
709 29722 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > SfxFrame::GetController() const
710 : {
711 29722 : if ( pImp->pCurrentViewFrame && pImp->pCurrentViewFrame->GetViewShell() )
712 28628 : return pImp->pCurrentViewFrame->GetViewShell()->GetController();
713 : else
714 1094 : return ::com::sun::star::uno::Reference< ::com::sun::star::frame::XController > ();
715 : }
716 :
717 394450 : ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame > SfxFrame::GetFrameInterface() const
718 : {
719 394450 : return pImp->xFrame;
720 : }
721 :
722 11014 : void SfxFrame::SetFrameInterface_Impl( const ::com::sun::star::uno::Reference< ::com::sun::star::frame::XFrame >& rFrame )
723 : {
724 11014 : pImp->xFrame = rFrame;
725 11014 : com::sun::star::uno::Reference< com::sun::star::frame::XDispatchRecorder > xRecorder;
726 11014 : if ( !rFrame.is() && GetCurrentViewFrame() )
727 5506 : GetCurrentViewFrame()->GetBindings().SetRecorder_Impl( xRecorder );
728 11014 : }
729 :
730 2 : void SfxFrame::Appear()
731 : {
732 2 : if ( GetCurrentViewFrame() )
733 : {
734 2 : GetCurrentViewFrame()->Show();
735 2 : GetWindow().Show();
736 2 : pImp->xFrame->getContainerWindow()->setVisible( sal_True );
737 2 : if ( pParentFrame )
738 0 : pParentFrame->Appear();
739 2 : Reference < ::com::sun::star::awt::XTopWindow > xTopWindow( pImp->xFrame->getContainerWindow(), UNO_QUERY );
740 2 : if ( xTopWindow.is() )
741 2 : xTopWindow->toFront();
742 : }
743 2 : }
744 :
745 0 : void SfxFrame::AppearWithUpdate()
746 : {
747 0 : Appear();
748 0 : if ( GetCurrentViewFrame() )
749 0 : GetCurrentViewFrame()->GetDispatcher()->Update_Impl( true );
750 0 : }
751 :
752 5508 : void SfxFrame::SetOwnsBindings_Impl( bool bSet )
753 : {
754 5508 : pImp->bOwnsBindings = bSet;
755 5508 : }
756 :
757 29271 : bool SfxFrame::OwnsBindings_Impl() const
758 : {
759 29271 : return pImp->bOwnsBindings;
760 : }
761 :
762 43374 : void SfxFrame::SetToolSpaceBorderPixel_Impl( const SvBorder& rBorder )
763 : {
764 43374 : pImp->aBorder = rBorder;
765 43374 : SfxViewFrame *pF = GetCurrentViewFrame();
766 43374 : if ( pF )
767 : {
768 43374 : Point aPos ( rBorder.Left(), rBorder.Top() );
769 43374 : Size aSize( GetWindow().GetOutputSizePixel() );
770 43374 : long nDeltaX = rBorder.Left() + rBorder.Right();
771 43374 : if ( aSize.Width() > nDeltaX )
772 41720 : aSize.Width() -= nDeltaX;
773 : else
774 1654 : aSize.Width() = 0;
775 :
776 43374 : long nDeltaY = rBorder.Top() + rBorder.Bottom();
777 43374 : if ( aSize.Height() > nDeltaY )
778 41720 : aSize.Height() -= nDeltaY;
779 : else
780 1654 : aSize.Height() = 0;
781 :
782 43374 : if ( GetParentFrame() )
783 : {
784 0 : bool bHasTools = rBorder.Left() != rBorder.Right() || rBorder.Top() != rBorder.Bottom();
785 0 : pF->GetWindow().SetBorderStyle( bHasTools ? WindowBorderStyle::NORMAL : WindowBorderStyle::NOBORDER );
786 : }
787 :
788 43374 : pF->GetWindow().SetPosSizePixel( aPos, aSize );
789 : }
790 43374 : }
791 :
792 65091 : Rectangle SfxFrame::GetTopOuterRectPixel_Impl() const
793 : {
794 65091 : Size aSize( GetWindow().GetOutputSizePixel() );
795 65091 : Point aPoint;
796 65091 : return ( Rectangle ( aPoint, aSize ) );
797 : }
798 :
799 347465 : SfxWorkWindow* SfxFrame::GetWorkWindow_Impl() const
800 : {
801 347465 : if ( pImp->pWorkWin )
802 347465 : return pImp->pWorkWin;
803 0 : else if ( pParentFrame )
804 0 : return pParentFrame->GetWorkWindow_Impl();
805 : else
806 0 : return NULL;
807 : }
808 :
809 5508 : void SfxFrame::CreateWorkWindow_Impl()
810 : {
811 5508 : SfxFrame* pFrame = this;
812 :
813 5508 : if ( IsInPlace() )
814 : {
815 : // this makes sence only for inplace activated objects
816 : try
817 : {
818 0 : Reference < XChild > xChild( GetCurrentDocument()->GetModel(), UNO_QUERY );
819 0 : if ( xChild.is() )
820 : {
821 0 : Reference < XModel > xParent( xChild->getParent(), UNO_QUERY );
822 0 : if ( xParent.is() )
823 : {
824 0 : Reference< XController > xParentCtrler = xParent->getCurrentController();
825 0 : if ( xParentCtrler.is() )
826 : {
827 0 : Reference < XFrame > xFrame( xParentCtrler->getFrame() );
828 0 : SfxFrame* pFr = SfxFrame::GetFirst();
829 0 : while ( pFr )
830 : {
831 0 : if ( pFr->GetFrameInterface() == xFrame )
832 : {
833 0 : pFrame = pFr;
834 0 : break;
835 : }
836 :
837 0 : pFr = SfxFrame::GetNext( *pFr );
838 0 : }
839 0 : }
840 0 : }
841 0 : }
842 : }
843 0 : catch(Exception&)
844 : {
845 : OSL_FAIL("SfxFrame::CreateWorkWindow_Impl: Exception cachted. Please try to submit a repoducable bug !");
846 : }
847 : }
848 :
849 5508 : pImp->pWorkWin = new SfxFrameWorkWin_Impl( &pFrame->GetWindow(), this, pFrame );
850 5508 : }
851 :
852 4958 : void SfxFrame::GrabFocusOnComponent_Impl()
853 : {
854 4958 : if ( pImp->bReleasingComponent )
855 : {
856 0 : GetWindow().GrabFocus();
857 4958 : return;
858 : }
859 :
860 4958 : vcl::Window* pFocusWindow = &GetWindow();
861 4958 : if ( GetCurrentViewFrame() && GetCurrentViewFrame()->GetViewShell() && GetCurrentViewFrame()->GetViewShell()->GetWindow() )
862 4958 : pFocusWindow = GetCurrentViewFrame()->GetViewShell()->GetWindow();
863 :
864 4958 : if( !pFocusWindow->HasChildPathFocus() )
865 4942 : pFocusWindow->GrabFocus();
866 : }
867 :
868 5506 : void SfxFrame::ReleasingComponent_Impl( bool bSet )
869 : {
870 5506 : pImp->bReleasingComponent = bSet;
871 5506 : }
872 :
873 426393 : bool SfxFrame::IsInPlace() const
874 : {
875 426393 : return pImp->bInPlace;
876 : }
877 :
878 0 : void SfxFrame::SetInPlace_Impl( bool bSet )
879 : {
880 0 : pImp->bInPlace = bSet;
881 0 : }
882 :
883 18309 : void SfxFrame::Resize()
884 : {
885 18309 : if ( IsClosing_Impl() )
886 18359 : return;
887 :
888 18259 : if ( OwnsBindings_Impl() )
889 : {
890 14475 : if ( IsInPlace() )
891 : {
892 0 : SetToolSpaceBorderPixel_Impl( SvBorder() );
893 : }
894 : else
895 : {
896 : // check for IPClient that contains UIactive object or object that is currently UI activating
897 14475 : SfxWorkWindow *pWork = GetWorkWindow_Impl();
898 14475 : SfxInPlaceClient* pClient = GetCurrentViewFrame()->GetViewShell() ? GetCurrentViewFrame()->GetViewShell()->GetUIActiveIPClient_Impl() : 0;
899 14475 : if ( pClient )
900 : {
901 2 : uno::Reference < lang::XUnoTunnel > xObj( pClient->GetObject()->getComponent(), uno::UNO_QUERY );
902 4 : uno::Sequence < sal_Int8 > aSeq( SvGlobalName( SFX_GLOBAL_CLASSID ).GetByteSequence() );
903 2 : sal_Int64 nHandle = (xObj.is()? xObj->getSomething( aSeq ): 0);
904 2 : if ( nHandle )
905 : {
906 0 : SfxObjectShell* pDoc = reinterpret_cast< SfxObjectShell* >( sal::static_int_cast< sal_IntPtr >( nHandle ));
907 0 : SfxViewFrame *pFrame = SfxViewFrame::GetFirst( pDoc );
908 0 : pWork = pFrame ? pFrame->GetFrame().GetWorkWindow_Impl() : NULL;
909 2 : }
910 : }
911 :
912 14475 : if ( pWork )
913 : {
914 14475 : pWork->ArrangeChildren_Impl();
915 14475 : pWork->ShowChildren_Impl();
916 : }
917 :
918 : // problem in presence of UIActive object: when the window is resized, but the toolspace border
919 : // remains the same, setting the toolspace border at the ContainerEnvironment doesn't force a
920 : // resize on the IPEnvironment; without that no resize is called for the SfxViewFrame. So always
921 : // set the window size of the SfxViewFrame explicit.
922 14475 : SetToolSpaceBorderPixel_Impl( pImp->aBorder );
923 : }
924 : }
925 3784 : else if ( pImp->pCurrentViewFrame )
926 : {
927 0 : pImp->pCurrentViewFrame->GetWindow().SetSizePixel( GetWindow().GetOutputSizePixel() );
928 : }
929 :
930 : }
931 :
932 0 : SfxFrame* SfxFrame::GetFirst()
933 : {
934 0 : if ( !pFramesArr_Impl )
935 0 : return 0;
936 0 : return pFramesArr_Impl->empty() ? 0 : pFramesArr_Impl->front();
937 : }
938 :
939 0 : SfxFrame* SfxFrame::GetNext( SfxFrame& rFrame )
940 : {
941 0 : SfxFrameArr_Impl::iterator it = std::find( pFramesArr_Impl->begin(), pFramesArr_Impl->end(), &rFrame );
942 0 : if ( it != pFramesArr_Impl->end() && (++it) != pFramesArr_Impl->end() )
943 0 : return *it;
944 : else
945 0 : return NULL;
946 : }
947 :
948 0 : const SfxPoolItem* SfxFrame::OpenDocumentSynchron( SfxItemSet& i_rSet, const Reference< XFrame >& i_rTargetFrame )
949 : {
950 0 : i_rSet.Put( SfxUnoFrameItem( SID_FILLFRAME, i_rTargetFrame ) );
951 0 : i_rSet.ClearItem( SID_TARGETNAME );
952 0 : return SfxGetpApp()->GetDispatcher_Impl()->Execute( SID_OPENDOC, SfxCallMode::SYNCHRON, i_rSet );
953 951 : }
954 :
955 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|