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 <svx/svditer.hxx>
21 : #include <svx/svdobj.hxx>
22 : #include <svx/svdpage.hxx>
23 : #include <svx/svdpagv.hxx>
24 : #include <svx/svdview.hxx>
25 : #include <svx/svdxcgv.hxx>
26 : #include <sfx2/linkmgr.hxx>
27 : #include <sfx2/docfile.hxx>
28 : #include <sfx2/viewfrm.hxx>
29 : #include <vcl/help.hxx>
30 : #include <vcl/svapp.hxx>
31 : #include <tools/urlobj.hxx>
32 : #include <svl/urlbmk.hxx>
33 : #include <svtools/svlbitm.hxx>
34 : #include <svtools/treelistentry.hxx>
35 : #include <stdlib.h>
36 :
37 : #include "content.hxx"
38 : #include "navipi.hxx"
39 : #include "global.hxx"
40 : #include "docsh.hxx"
41 : #include "scmod.hxx"
42 : #include "rangenam.hxx"
43 : #include "dbdata.hxx"
44 : #include "tablink.hxx"
45 : #include "popmenu.hxx"
46 : #include "drwlayer.hxx"
47 : #include "transobj.hxx"
48 : #include "drwtrans.hxx"
49 : #include "lnktrans.hxx"
50 : #include "formulacell.hxx"
51 : #include "dociter.hxx"
52 : #include "scresid.hxx"
53 : #include "globstr.hrc"
54 : #include "navipi.hrc"
55 : #include "arealink.hxx"
56 : #include "navicfg.hxx"
57 : #include "navsett.hxx"
58 : #include "postit.hxx"
59 : #include "tabvwsh.hxx"
60 : #include "drawview.hxx"
61 : #include "clipparam.hxx"
62 : #include "markdata.hxx"
63 :
64 : using namespace com::sun::star;
65 :
66 : // Reihenfolge der Kategorien im Navigator -------------------------------------
67 :
68 : static const sal_uInt16 pTypeList[SC_CONTENT_COUNT] =
69 : {
70 : SC_CONTENT_ROOT, // ROOT (0) muss vorne stehen
71 : SC_CONTENT_TABLE,
72 : SC_CONTENT_RANGENAME,
73 : SC_CONTENT_DBAREA,
74 : SC_CONTENT_AREALINK,
75 : SC_CONTENT_GRAPHIC,
76 : SC_CONTENT_OLEOBJECT,
77 : SC_CONTENT_NOTE,
78 : SC_CONTENT_DRAWING
79 : };
80 :
81 : bool ScContentTree::bIsInDrag = false;
82 :
83 0 : ScDocShell* ScContentTree::GetManualOrCurrent()
84 : {
85 0 : ScDocShell* pSh = NULL;
86 0 : if ( !aManualDoc.isEmpty() )
87 : {
88 0 : TypeId aScType = TYPE(ScDocShell);
89 0 : SfxObjectShell* pObjSh = SfxObjectShell::GetFirst( &aScType );
90 0 : while ( pObjSh && !pSh )
91 : {
92 0 : if ( pObjSh->GetTitle() == aManualDoc )
93 0 : pSh = PTR_CAST( ScDocShell, pObjSh );
94 0 : pObjSh = SfxObjectShell::GetNext( *pObjSh, &aScType );
95 : }
96 : }
97 : else
98 : {
99 : // Current nur, wenn keine manuell eingestellt ist
100 : // (damit erkannt wird, wenn das Dokument nicht mehr existiert)
101 :
102 0 : SfxViewShell* pViewSh = SfxViewShell::Current();
103 0 : if ( pViewSh )
104 : {
105 0 : SfxObjectShell* pObjSh = pViewSh->GetViewFrame()->GetObjectShell();
106 0 : pSh = PTR_CAST( ScDocShell, pObjSh );
107 : }
108 : }
109 :
110 0 : return pSh;
111 : }
112 :
113 : // ScContentTree
114 :
115 0 : ScContentTree::ScContentTree( vcl::Window* pParent, const ResId& rResId ) :
116 : SvTreeListBox ( pParent, rResId ),
117 : aEntryImages ( ScResId( RID_IMAGELIST_NAVCONT ) ),
118 : nRootType ( SC_CONTENT_ROOT ),
119 : bHiddenDoc ( false ),
120 : pHiddenDocument ( NULL ),
121 0 : bisInNavigatoeDlg ( false )
122 : {
123 : sal_uInt16 i;
124 0 : for (i=0; i<SC_CONTENT_COUNT; i++)
125 0 : pPosList[pTypeList[i]] = i; // invers zum suchen
126 :
127 0 : pParentWindow = static_cast<ScNavigatorDlg*>(pParent);
128 :
129 0 : pRootNodes[0] = NULL;
130 0 : for (i=1; i<SC_CONTENT_COUNT; i++)
131 0 : InitRoot(i);
132 :
133 0 : SetNodeDefaultImages();
134 :
135 0 : SetDoubleClickHdl( LINK( this, ScContentTree, ContentDoubleClickHdl ) );
136 :
137 0 : pTmpEntry= NULL;
138 0 : m_bFirstPaint=true;
139 :
140 0 : SetStyle( GetStyle() | WB_QUICK_SEARCH );
141 0 : }
142 :
143 0 : ScContentTree::~ScContentTree()
144 : {
145 0 : disposeOnce();
146 0 : }
147 :
148 0 : void ScContentTree::dispose()
149 : {
150 0 : pParentWindow.clear();
151 0 : SvTreeListBox::dispose();
152 0 : }
153 :
154 : // helper function for GetEntryAltText and GetEntryLongDescription
155 0 : OUString ScContentTree::getAltLongDescText( SvTreeListEntry* pEntry, bool isAltText) const
156 : {
157 0 : SdrObject* pFound = NULL;
158 :
159 : sal_uInt16 nType;
160 : sal_uLong nChild;
161 0 : GetEntryIndexes( nType, nChild, pEntry );
162 0 : switch( nType )
163 : {
164 : case SC_CONTENT_OLEOBJECT:
165 : case SC_CONTENT_GRAPHIC:
166 : case SC_CONTENT_DRAWING:
167 : {
168 0 : ScDocument* pDoc = ( const_cast< ScContentTree* >(this) )->GetSourceDocument();
169 0 : SdrIterMode eIter = ( nType == SC_CONTENT_DRAWING ) ? IM_FLAT : IM_DEEPNOGROUPS;
170 0 : ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
171 0 : SfxObjectShell* pShell = pDoc->GetDocumentShell();
172 0 : if (pDrawLayer && pShell)
173 : {
174 0 : sal_uInt16 nTabCount = pDoc->GetTableCount();
175 0 : for (sal_uInt16 nTab=0; nTab<nTabCount; nTab++)
176 : {
177 0 : SdrPage* pPage = pDrawLayer->GetPage(nTab);
178 : DBG_ASSERT(pPage,"Page ?");
179 0 : if (pPage)
180 : {
181 0 : SdrObjListIter aIter( *pPage, eIter );
182 0 : SdrObject* pObject = aIter.Next();
183 0 : while (pObject)
184 : {
185 0 : if( ScDrawLayer::GetVisibleName( pObject ) == GetEntryText( pEntry ) )
186 : {
187 0 : pFound = pObject;
188 0 : break;
189 : }
190 0 : pObject = aIter.Next();
191 0 : }
192 : }
193 : }
194 : }
195 0 : if( pFound )
196 : {
197 0 : if( isAltText )
198 0 : return pFound->GetTitle();
199 : else
200 0 : return pFound->GetDescription();
201 : }
202 : }
203 0 : break;
204 : }
205 0 : return OUString();
206 : }
207 :
208 0 : OUString ScContentTree::GetEntryAltText( SvTreeListEntry* pEntry ) const
209 : {
210 0 : return getAltLongDescText( pEntry, true );
211 : }
212 :
213 0 : OUString ScContentTree::GetEntryLongDescription( SvTreeListEntry* pEntry ) const
214 : {
215 0 : return getAltLongDescText( pEntry, false );
216 : }
217 :
218 0 : void ScContentTree::InitRoot( sal_uInt16 nType )
219 : {
220 0 : if ( !nType )
221 0 : return;
222 :
223 0 : if ( nRootType && nRootType != nType ) // ausgeblendet ?
224 : {
225 0 : pRootNodes[nType] = NULL;
226 0 : return;
227 : }
228 :
229 0 : const Image& rImage = aEntryImages.GetImage( nType );
230 0 : OUString aName( ScResId( SCSTR_CONTENT_ROOT + nType ) );
231 : // wieder an die richtige Position:
232 0 : sal_uInt16 nPos = nRootType ? 0 : pPosList[nType]-1;
233 0 : SvTreeListEntry* pNew = InsertEntry( aName, rImage, rImage, NULL, false, nPos );
234 :
235 0 : pRootNodes[nType] = pNew;
236 : }
237 :
238 0 : void ScContentTree::ClearAll()
239 : {
240 : //There are one method in Control::SetUpdateMode(), and one override method SvTreeListBox::SetUpdateMode(). Here although
241 : //SvTreeListBox::SetUpdateMode() is called in refresh method, it only call SvTreeListBox::SetUpdateMode(), not Control::SetUpdateMode().
242 : //In SvTreeList::Clear(), Broadcast( LISTACTION_CLEARED ) will be called and finally, it will be trapped into the event yield() loop. And
243 : //the InitRoot() method won't be called. Then if a user click or press key to update the navigator tree, crash happens.
244 : //So the solution is to disable the UpdateMode of Control, then call Clear(), then recover the update mode
245 0 : bool bOldUpdate = Control::IsUpdateMode();
246 0 : Control::SetUpdateMode(false);
247 0 : Clear();
248 0 : Control::SetUpdateMode(bOldUpdate);
249 0 : for (sal_uInt16 i=1; i<SC_CONTENT_COUNT; i++)
250 0 : InitRoot(i);
251 0 : }
252 :
253 0 : void ScContentTree::ClearType(sal_uInt16 nType)
254 : {
255 0 : if (!nType)
256 0 : ClearAll();
257 : else
258 : {
259 0 : SvTreeListEntry* pParent = pRootNodes[nType];
260 0 : if ( !pParent || GetChildCount(pParent) ) // nicht, wenn ohne Children schon da
261 : {
262 0 : if (pParent)
263 0 : GetModel()->Remove( pParent ); // mit allen Children
264 0 : InitRoot( nType ); // ggf. neu eintragen
265 : }
266 : }
267 0 : }
268 :
269 0 : void ScContentTree::InsertContent( sal_uInt16 nType, const OUString& rValue )
270 : {
271 0 : if (nType >= SC_CONTENT_COUNT)
272 : {
273 : OSL_FAIL("ScContentTree::InsertContent mit falschem Typ");
274 0 : return;
275 : }
276 :
277 0 : SvTreeListEntry* pParent = pRootNodes[nType];
278 0 : if (pParent)
279 0 : InsertEntry( rValue, pParent );
280 : else
281 : {
282 : OSL_FAIL("InsertContent ohne Parent");
283 : }
284 : }
285 :
286 0 : void ScContentTree::GetEntryIndexes( sal_uInt16& rnRootIndex, sal_uLong& rnChildIndex, SvTreeListEntry* pEntry ) const
287 : {
288 0 : rnRootIndex = SC_CONTENT_ROOT;
289 0 : rnChildIndex = SC_CONTENT_NOCHILD;
290 :
291 0 : if( !pEntry )
292 0 : return;
293 :
294 0 : SvTreeListEntry* pParent = GetParent( pEntry );
295 0 : bool bFound = false;
296 0 : for( sal_uInt16 nRoot = 1; !bFound && (nRoot < SC_CONTENT_COUNT); ++nRoot )
297 : {
298 0 : if( pEntry == pRootNodes[ nRoot ] )
299 : {
300 0 : rnRootIndex = nRoot;
301 0 : rnChildIndex = ~0UL;
302 0 : bFound = true;
303 : }
304 0 : else if( pParent && (pParent == pRootNodes[ nRoot ]) )
305 : {
306 0 : rnRootIndex = nRoot;
307 :
308 : // search the entry in all child entries of the parent
309 0 : sal_uLong nEntry = 0;
310 0 : SvTreeListEntry* pIterEntry = FirstChild( pParent );
311 0 : while( !bFound && pIterEntry )
312 : {
313 0 : if ( pEntry == pIterEntry )
314 : {
315 0 : rnChildIndex = nEntry;
316 0 : bFound = true; // exit the while loop
317 : }
318 0 : pIterEntry = NextSibling( pIterEntry );
319 0 : ++nEntry;
320 : }
321 :
322 0 : bFound = true; // exit the for loop
323 : }
324 : }
325 : }
326 :
327 0 : sal_uLong ScContentTree::GetChildIndex( SvTreeListEntry* pEntry ) const
328 : {
329 : sal_uInt16 nRoot;
330 : sal_uLong nChild;
331 0 : GetEntryIndexes( nRoot, nChild, pEntry );
332 0 : return nChild;
333 : }
334 :
335 0 : static OUString lcl_GetDBAreaRange( ScDocument* pDoc, const OUString& rDBName )
336 : {
337 0 : OUString aRet;
338 0 : if (pDoc)
339 : {
340 0 : ScDBCollection* pDbNames = pDoc->GetDBCollection();
341 0 : const ScDBData* pData = pDbNames->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(rDBName));
342 0 : if (pData)
343 : {
344 0 : ScRange aRange;
345 0 : pData->GetArea(aRange);
346 0 : aRet = aRange.Format(SCR_ABS_3D, pDoc);
347 : }
348 : }
349 0 : return aRet;
350 : }
351 :
352 0 : IMPL_LINK_NOARG(ScContentTree, ContentDoubleClickHdl)
353 : {
354 : sal_uInt16 nType;
355 : sal_uLong nChild;
356 0 : SvTreeListEntry* pEntry = GetCurEntry();
357 0 : GetEntryIndexes( nType, nChild, pEntry );
358 :
359 0 : if( pEntry && (nType != SC_CONTENT_ROOT) && (nChild != SC_CONTENT_NOCHILD) )
360 : {
361 0 : if ( bHiddenDoc )
362 0 : return 0; //! spaeter...
363 :
364 0 : OUString aText( GetEntryText( pEntry ) );
365 :
366 0 : if ( !aManualDoc.isEmpty() )
367 0 : pParentWindow->SetCurrentDoc( aManualDoc );
368 :
369 0 : switch( nType )
370 : {
371 : case SC_CONTENT_TABLE:
372 0 : pParentWindow->SetCurrentTableStr( aText );
373 0 : break;
374 :
375 : case SC_CONTENT_RANGENAME:
376 0 : pParentWindow->SetCurrentCellStr( aText );
377 0 : break;
378 :
379 : case SC_CONTENT_DBAREA:
380 : {
381 : // Wenn gleiche Bereichs- und DB-Namen existieren, wird
382 : // bei SID_CURRENTCELL der Bereichsname genommen.
383 : // DB-Bereiche darum direkt ueber die Adresse anspringen.
384 :
385 0 : OUString aRangeStr = lcl_GetDBAreaRange( GetSourceDocument(), aText );
386 0 : if (!aRangeStr.isEmpty())
387 0 : pParentWindow->SetCurrentCellStr( aRangeStr );
388 : }
389 0 : break;
390 :
391 : case SC_CONTENT_OLEOBJECT:
392 : case SC_CONTENT_GRAPHIC:
393 : case SC_CONTENT_DRAWING:
394 0 : pParentWindow->SetCurrentObject( aText );
395 0 : break;
396 :
397 : case SC_CONTENT_NOTE:
398 : {
399 0 : ScAddress aPos = GetNotePos( nChild );
400 0 : pParentWindow->SetCurrentTable( aPos.Tab() );
401 0 : pParentWindow->SetCurrentCell( aPos.Col(), aPos.Row() );
402 : }
403 0 : break;
404 :
405 : case SC_CONTENT_AREALINK:
406 : {
407 0 : const ScAreaLink* pLink = GetLink( nChild );
408 0 : if( pLink )
409 : {
410 0 : ScRange aRange = pLink->GetDestArea();
411 0 : ScDocument* pSrcDoc = GetSourceDocument();
412 0 : OUString aRangeStr(aRange.Format(SCR_ABS_3D, pSrcDoc, pSrcDoc->GetAddressConvention()));
413 0 : pParentWindow->SetCurrentCellStr( aRangeStr );
414 : }
415 : }
416 0 : break;
417 : }
418 :
419 0 : ScNavigatorDlg::ReleaseFocus(); // set focus into document
420 : }
421 :
422 0 : return 0;
423 : }
424 :
425 0 : void ScContentTree::MouseButtonDown( const MouseEvent& rMEvt )
426 : {
427 0 : SvTreeListBox::MouseButtonDown( rMEvt );
428 0 : StoreNavigatorSettings();
429 0 : }
430 :
431 0 : void ScContentTree::KeyInput( const KeyEvent& rKEvt )
432 : {
433 0 : bool bUsed = false;
434 :
435 0 : const vcl::KeyCode aCode = rKEvt.GetKeyCode();
436 0 : if (aCode.GetCode() == KEY_RETURN)
437 : {
438 0 : switch (aCode.GetModifier())
439 : {
440 : case KEY_MOD1:
441 0 : ToggleRoot(); // toggle root mode (as in Writer)
442 0 : bUsed = true;
443 0 : break;
444 : case 0:
445 : {
446 0 : SvTreeListEntry* pEntry = GetCurEntry();
447 0 : if( pEntry )
448 : {
449 : sal_uInt16 nType;
450 : sal_uLong nChild;
451 0 : GetEntryIndexes( nType, nChild, pEntry );
452 :
453 0 : if( (nType != SC_CONTENT_ROOT) && (nChild == SC_CONTENT_NOCHILD) )
454 : {
455 0 : if ( IsExpanded( pEntry ) )
456 0 : Collapse( pEntry );
457 : else
458 0 : Expand( pEntry );
459 : }
460 : else
461 0 : ContentDoubleClickHdl(0); // select content as if double clicked
462 : }
463 :
464 0 : bUsed = true;
465 : }
466 0 : break;
467 : }
468 : }
469 : //Make KEY_SPACE has same function as DoubleClick
470 0 : if ( bisInNavigatoeDlg )
471 : {
472 0 : if(aCode.GetCode() == KEY_SPACE )
473 : {
474 0 : bUsed = true;
475 : sal_uInt16 nType;
476 : sal_uLong nChild;
477 0 : SvTreeListEntry* pEntry = GetCurEntry();
478 0 : GetEntryIndexes( nType, nChild, pEntry );
479 0 : if( pEntry && (nType != SC_CONTENT_ROOT) && (nChild != SC_CONTENT_NOCHILD) )
480 : {
481 0 : if ( bHiddenDoc )
482 0 : return ; //! spaeter...
483 0 : OUString aText( GetEntryText( pEntry ) );
484 0 : sKeyString = aText;
485 0 : if (!aManualDoc.isEmpty())
486 0 : pParentWindow->SetCurrentDoc( aManualDoc );
487 0 : switch( nType )
488 : {
489 : case SC_CONTENT_OLEOBJECT:
490 : case SC_CONTENT_GRAPHIC:
491 : case SC_CONTENT_DRAWING:
492 : {
493 0 : vcl::Window* pWindow=reinterpret_cast<vcl::Window*>(GetParent(pEntry));
494 0 : ScNavigatorDlg* pScNavigatorDlg = static_cast<ScNavigatorDlg*>(pWindow);
495 0 : ScTabViewShell* pScTabViewShell = NULL;
496 0 : ScDrawView* pScDrawView = NULL;
497 0 : if (pScNavigatorDlg!=NULL)
498 0 : pScTabViewShell = ScNavigatorDlg::GetTabViewShell();
499 0 : if(pScTabViewShell !=NULL)
500 0 : pScDrawView =pScTabViewShell->GetViewData().GetScDrawView();
501 0 : if(pScDrawView!=NULL)
502 : {
503 0 : pScDrawView->SelectCurrentViewObject(aText );
504 0 : bool bHasMakredObject = false;
505 0 : SvTreeListEntry* pParent = pRootNodes[nType];
506 0 : SvTreeListEntry* pBeginEntry = NULL;
507 0 : if( pParent )
508 0 : pBeginEntry = FirstChild(pParent);
509 0 : while( pBeginEntry )
510 : {
511 0 : OUString aTempText( GetEntryText( pBeginEntry ) );
512 0 : if( pScDrawView->GetObjectIsMarked( pScDrawView->GetObjectByName( aTempText ) ) )
513 : {
514 0 : bHasMakredObject = true;
515 0 : break;
516 : }
517 0 : pBeginEntry = Next( pBeginEntry );
518 0 : }
519 0 : if( !bHasMakredObject && pScTabViewShell)
520 0 : pScTabViewShell->SetDrawShell(false);
521 0 : ObjectFresh( nType,pEntry );
522 : }
523 : }
524 0 : break;
525 0 : }
526 : }
527 : }
528 : }
529 :
530 0 : if( !bUsed )
531 : {
532 0 : if(aCode.GetCode() == KEY_F5 )
533 : {
534 0 : StoreNavigatorSettings();
535 0 : SvTreeListBox::KeyInput(rKEvt);
536 : }
537 : else
538 : {
539 0 : SvTreeListBox::KeyInput(rKEvt);
540 0 : StoreNavigatorSettings();
541 : }
542 : }
543 : }
544 :
545 0 : sal_Int8 ScContentTree::AcceptDrop( const AcceptDropEvent& /* rEvt */ )
546 : {
547 0 : return DND_ACTION_NONE;
548 : }
549 :
550 0 : sal_Int8 ScContentTree::ExecuteDrop( const ExecuteDropEvent& /* rEvt */ )
551 : {
552 0 : return DND_ACTION_NONE;
553 : }
554 :
555 0 : void ScContentTree::StartDrag( sal_Int8 /* nAction */, const Point& /* rPosPixel */ )
556 : {
557 0 : DoDrag();
558 0 : }
559 :
560 0 : void ScContentTree::DragFinished( sal_Int8 /* nAction */ )
561 : {
562 0 : }
563 :
564 0 : void ScContentTree::Command( const CommandEvent& rCEvt )
565 : {
566 0 : bool bDone = false;
567 :
568 0 : switch ( rCEvt.GetCommand() )
569 : {
570 : case CommandEventId::StartDrag:
571 : // Aus dem ExecuteDrag heraus kann der Navigator geloescht werden
572 : // (beim Umschalten auf einen anderen Dokument-Typ), das wuerde aber
573 : // den StarView MouseMove-Handler, der Command() aufruft, umbringen.
574 : // Deshalb Drag&Drop asynchron:
575 :
576 0 : Application::PostUserEvent( LINK( this, ScContentTree, ExecDragHdl ), NULL, true );
577 :
578 0 : bDone = true;
579 0 : break;
580 :
581 : case CommandEventId::ContextMenu:
582 : {
583 : // Drag-Drop Modus
584 :
585 0 : PopupMenu aPop;
586 0 : ScPopupMenu aDropMenu( ScResId( RID_POPUP_DROPMODE ) );
587 0 : aDropMenu.CheckItem( RID_DROPMODE_URL + pParentWindow->GetDropMode() );
588 0 : aPop.InsertItem( 1, pParentWindow->GetStrDragMode() );
589 0 : aPop.SetPopupMenu( 1, &aDropMenu );
590 :
591 : // angezeigtes Dokument
592 :
593 0 : ScPopupMenu aDocMenu;
594 0 : aDocMenu.SetMenuFlags( aDocMenu.GetMenuFlags() | MenuFlags::NoAutoMnemonics );
595 0 : sal_uInt16 i=0;
596 0 : sal_uInt16 nPos=0;
597 : // geladene Dokumente
598 0 : ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
599 0 : SfxObjectShell* pSh = SfxObjectShell::GetFirst();
600 0 : while ( pSh )
601 : {
602 0 : if ( pSh->ISA(ScDocShell) )
603 : {
604 0 : OUString aName = pSh->GetTitle();
605 0 : OUString aEntry = aName;
606 0 : if ( pSh == pCurrentSh )
607 0 : aEntry += pParentWindow->aStrActive;
608 : else
609 0 : aEntry += pParentWindow->aStrNotActive;
610 0 : aDocMenu.InsertItem( ++i, aEntry );
611 0 : if ( !bHiddenDoc && aName == aManualDoc )
612 0 : nPos = i;
613 : }
614 0 : pSh = SfxObjectShell::GetNext( *pSh );
615 : }
616 : // "aktives Fenster"
617 0 : aDocMenu.InsertItem( ++i, pParentWindow->aStrActiveWin );
618 0 : if (!bHiddenDoc && aManualDoc.isEmpty())
619 0 : nPos = i;
620 : // verstecktes Dokument
621 0 : if ( !aHiddenTitle.isEmpty() )
622 : {
623 0 : OUString aEntry = aHiddenTitle;
624 0 : aEntry += pParentWindow->aStrHidden;
625 0 : aDocMenu.InsertItem( ++i, aEntry );
626 0 : if (bHiddenDoc)
627 0 : nPos = i;
628 : }
629 0 : aDocMenu.CheckItem( nPos );
630 0 : aPop.InsertItem( 2, pParentWindow->GetStrDisplay() );
631 0 : aPop.SetPopupMenu( 2, &aDocMenu );
632 :
633 : // ausfuehren
634 :
635 0 : aPop.Execute( this, rCEvt.GetMousePosPixel() );
636 :
637 0 : if ( aDropMenu.WasHit() ) // Drag-Drop Modus
638 : {
639 0 : sal_uInt16 nId = aDropMenu.GetSelected();
640 0 : if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
641 0 : pParentWindow->SetDropMode( nId - RID_DROPMODE_URL );
642 : }
643 0 : else if ( aDocMenu.WasHit() ) // angezeigtes Dokument
644 : {
645 0 : sal_uInt16 nId = aDocMenu.GetSelected();
646 0 : OUString aName = aDocMenu.GetItemText(nId);
647 0 : SelectDoc( aName );
648 0 : }
649 : }
650 0 : break;
651 0 : default: break;
652 : }
653 :
654 0 : if (!bDone)
655 0 : SvTreeListBox::Command(rCEvt);
656 0 : }
657 :
658 0 : void ScContentTree::RequestHelp( const HelpEvent& rHEvt )
659 : {
660 0 : bool bDone = false;
661 0 : if( rHEvt.GetMode() & HelpEventMode::QUICK )
662 : {
663 0 : Point aPos( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ));
664 0 : SvTreeListEntry* pEntry = GetEntry( aPos );
665 0 : if ( pEntry )
666 : {
667 0 : bool bRet = false;
668 0 : OUString aHelpText;
669 0 : SvTreeListEntry* pParent = GetParent(pEntry);
670 0 : if ( !pParent ) // Top-Level ?
671 : {
672 0 : aHelpText = OUString::number( GetChildCount(pEntry) ) +
673 0 : " " + GetEntryText(pEntry);
674 0 : bRet = true;
675 : }
676 0 : else if ( pParent == pRootNodes[SC_CONTENT_NOTE] )
677 : {
678 0 : aHelpText = GetEntryText(pEntry); // Notizen als Help-Text
679 0 : bRet = true;
680 : }
681 0 : else if ( pParent == pRootNodes[SC_CONTENT_AREALINK] )
682 : {
683 0 : sal_uLong nIndex = GetChildIndex(pEntry);
684 0 : if( nIndex != SC_CONTENT_NOCHILD )
685 : {
686 0 : const ScAreaLink* pLink = GetLink(nIndex);
687 0 : if (pLink)
688 : {
689 0 : aHelpText = pLink->GetFile(); // Source-Datei als Help-Text
690 0 : bRet = true;
691 : }
692 : }
693 : }
694 :
695 0 : if (bRet)
696 : {
697 : SvLBoxTab* pTab;
698 0 : SvLBoxString* pItem = static_cast<SvLBoxString*>(GetItem( pEntry, aPos.X(), &pTab ));
699 0 : if( pItem )
700 : {
701 0 : aPos = GetEntryPosition( pEntry );
702 0 : aPos.X() = GetTabPos( pEntry, pTab );
703 0 : aPos = OutputToScreenPixel(aPos);
704 0 : Size aSize( pItem->GetSize( this, pEntry ) );
705 :
706 0 : Rectangle aItemRect( aPos, aSize );
707 0 : Help::ShowQuickHelp( this, aItemRect, aHelpText );
708 0 : bDone = true;
709 : }
710 0 : }
711 : }
712 : }
713 0 : if (!bDone)
714 0 : Window::RequestHelp( rHEvt );
715 0 : }
716 :
717 0 : ScDocument* ScContentTree::GetSourceDocument()
718 : {
719 0 : if (bHiddenDoc)
720 0 : return pHiddenDocument;
721 : else
722 : {
723 0 : ScDocShell* pSh = GetManualOrCurrent();
724 0 : if (pSh)
725 0 : return &pSh->GetDocument();
726 :
727 : }
728 0 : return NULL;
729 : }
730 :
731 : //Move along and draw "*" sign .
732 0 : void ScContentTree::ObjectFresh( sal_uInt16 nType, SvTreeListEntry* pEntry )
733 : {
734 0 : if ( bHiddenDoc && !pHiddenDocument )
735 0 : return; // anderes Dokument angezeigt
736 0 : if(nType ==SC_CONTENT_GRAPHIC||nType ==SC_CONTENT_OLEOBJECT||nType ==SC_CONTENT_DRAWING)
737 : {
738 0 : SetUpdateMode(false);
739 0 : ClearType( nType );
740 0 : GetDrawNames( nType/*, nId*/ );
741 0 : if( !pEntry )
742 0 : ApplyNavigatorSettings();
743 0 : SetUpdateMode(true);
744 0 : if( pEntry )
745 : {
746 0 : SvTreeListEntry* pParent = pRootNodes[nType];
747 0 : SvTreeListEntry* pBeginEntry = NULL;
748 0 : SvTreeListEntry* pOldEntry = NULL;
749 0 : if( pParent )
750 0 : pBeginEntry = FirstChild(pParent);
751 0 : while( pBeginEntry )
752 : {
753 0 : OUString aTempText( GetEntryText( pBeginEntry ) );
754 0 : if( aTempText == sKeyString )
755 : {
756 0 : pOldEntry = pBeginEntry;
757 0 : break;
758 : }
759 0 : pBeginEntry = Next( pBeginEntry );
760 0 : }
761 0 : if( pOldEntry )
762 : {
763 0 : Expand(pParent);
764 0 : Select( pOldEntry, true);
765 : }
766 : }
767 : }
768 : }
769 :
770 0 : void ScContentTree::Refresh( sal_uInt16 nType )
771 : {
772 0 : if ( bHiddenDoc && !pHiddenDocument )
773 0 : return; // anderes Dokument angezeigt
774 :
775 : // wenn sich nichts geaendert hat, gleich abbrechen (gegen Geflacker)
776 :
777 0 : if ( nType == SC_CONTENT_NOTE )
778 0 : if (!NoteStringsChanged())
779 0 : return;
780 0 : if ( nType == SC_CONTENT_GRAPHIC )
781 0 : if (!DrawNamesChanged(SC_CONTENT_GRAPHIC))
782 0 : return;
783 0 : if ( nType == SC_CONTENT_OLEOBJECT )
784 0 : if (!DrawNamesChanged(SC_CONTENT_OLEOBJECT))
785 0 : return;
786 0 : if ( nType == SC_CONTENT_DRAWING )
787 0 : if (!DrawNamesChanged(SC_CONTENT_DRAWING))
788 0 : return;
789 :
790 0 : SetUpdateMode(false);
791 :
792 0 : ClearType( nType );
793 :
794 0 : if ( !nType || nType == SC_CONTENT_TABLE )
795 0 : GetTableNames();
796 0 : if ( !nType || nType == SC_CONTENT_RANGENAME )
797 0 : GetAreaNames();
798 0 : if ( !nType || nType == SC_CONTENT_DBAREA )
799 0 : GetDbNames();
800 0 : if ( !nType || nType == SC_CONTENT_GRAPHIC )
801 0 : GetGraphicNames();
802 0 : if ( !nType || nType == SC_CONTENT_OLEOBJECT )
803 0 : GetOleNames();
804 0 : if ( !nType || nType == SC_CONTENT_DRAWING )
805 0 : GetDrawingNames();
806 0 : if ( !nType || nType == SC_CONTENT_NOTE )
807 0 : GetNoteStrings();
808 0 : if ( !nType || nType == SC_CONTENT_AREALINK )
809 0 : GetLinkNames();
810 :
811 0 : ApplyNavigatorSettings();
812 0 : SetUpdateMode(true);
813 : }
814 :
815 0 : void ScContentTree::GetTableNames()
816 : {
817 0 : if ( nRootType && nRootType != SC_CONTENT_TABLE ) // ausgeblendet ?
818 0 : return;
819 :
820 0 : ScDocument* pDoc = GetSourceDocument();
821 0 : if (!pDoc)
822 0 : return;
823 :
824 0 : OUString aName;
825 0 : SCTAB nCount = pDoc->GetTableCount();
826 0 : for ( SCTAB i=0; i<nCount; i++ )
827 : {
828 0 : pDoc->GetName( i, aName );
829 0 : InsertContent( SC_CONTENT_TABLE, aName );
830 0 : }
831 : }
832 :
833 : namespace {
834 :
835 0 : OUString createLocalRangeName(const OUString& rName, const OUString& rTableName)
836 : {
837 0 : OUStringBuffer aString (rName);
838 0 : aString.append(" (");
839 0 : aString.append(rTableName);
840 0 : aString.append(")");
841 0 : return aString.makeStringAndClear();
842 : }
843 : }
844 :
845 0 : void ScContentTree::GetAreaNames()
846 : {
847 0 : if ( nRootType && nRootType != SC_CONTENT_RANGENAME ) // ausgeblendet ?
848 0 : return;
849 :
850 0 : ScDocument* pDoc = GetSourceDocument();
851 0 : if (!pDoc)
852 0 : return;
853 :
854 0 : ScRange aDummy;
855 0 : std::set<OUString> aSet;
856 0 : ScRangeName* pRangeNames = pDoc->GetRangeName();
857 0 : if (!pRangeNames->empty())
858 : {
859 0 : ScRangeName::const_iterator itrBeg = pRangeNames->begin(), itrEnd = pRangeNames->end();
860 0 : for (ScRangeName::const_iterator itr = itrBeg; itr != itrEnd; ++itr)
861 : {
862 0 : if (itr->second->IsValidReference(aDummy))
863 0 : aSet.insert(itr->second->GetName());
864 : }
865 : }
866 0 : for (SCTAB i = 0; i < pDoc->GetTableCount(); ++i)
867 : {
868 0 : ScRangeName* pLocalRangeName = pDoc->GetRangeName(i);
869 0 : if (pLocalRangeName && !pLocalRangeName->empty())
870 : {
871 0 : OUString aTableName;
872 0 : pDoc->GetName(i, aTableName);
873 0 : for (ScRangeName::const_iterator itr = pLocalRangeName->begin(); itr != pLocalRangeName->end(); ++itr)
874 : {
875 0 : if (itr->second->IsValidReference(aDummy))
876 0 : aSet.insert(createLocalRangeName(itr->second->GetName(), aTableName));
877 0 : }
878 : }
879 : }
880 :
881 0 : if (!aSet.empty())
882 : {
883 0 : for (std::set<OUString>::iterator itr = aSet.begin();
884 0 : itr != aSet.end(); ++itr)
885 : {
886 0 : InsertContent(SC_CONTENT_RANGENAME, *itr);
887 : }
888 0 : }
889 : }
890 :
891 0 : void ScContentTree::GetDbNames()
892 : {
893 0 : if ( nRootType && nRootType != SC_CONTENT_DBAREA ) // ausgeblendet ?
894 0 : return;
895 :
896 0 : ScDocument* pDoc = GetSourceDocument();
897 0 : if (!pDoc)
898 0 : return;
899 :
900 0 : ScDBCollection* pDbNames = pDoc->GetDBCollection();
901 0 : const ScDBCollection::NamedDBs& rDBs = pDbNames->getNamedDBs();
902 0 : ScDBCollection::NamedDBs::const_iterator itr = rDBs.begin(), itrEnd = rDBs.end();
903 0 : for (; itr != itrEnd; ++itr)
904 : {
905 0 : const OUString& aStrName = itr->GetName();
906 0 : InsertContent(SC_CONTENT_DBAREA, aStrName);
907 : }
908 : }
909 :
910 0 : bool ScContentTree::IsPartOfType( sal_uInt16 nContentType, sal_uInt16 nObjIdentifier )
911 : {
912 0 : bool bRet = false;
913 0 : switch ( nContentType )
914 : {
915 : case SC_CONTENT_GRAPHIC:
916 0 : bRet = ( nObjIdentifier == OBJ_GRAF );
917 0 : break;
918 : case SC_CONTENT_OLEOBJECT:
919 0 : bRet = ( nObjIdentifier == OBJ_OLE2 );
920 0 : break;
921 : case SC_CONTENT_DRAWING:
922 0 : bRet = ( nObjIdentifier != OBJ_GRAF && nObjIdentifier != OBJ_OLE2 ); // everything else
923 0 : break;
924 : default:
925 : OSL_FAIL("unknown content type");
926 : }
927 0 : return bRet;
928 : }
929 :
930 0 : void ScContentTree::GetDrawNames( sal_uInt16 nType )
931 : {
932 0 : if ( nRootType && nRootType != nType ) // ausgeblendet ?
933 0 : return;
934 :
935 0 : ScDocument* pDoc = GetSourceDocument();
936 0 : if (!pDoc)
937 0 : return;
938 :
939 : // iterate in flat mode for groups
940 0 : SdrIterMode eIter = ( nType == SC_CONTENT_DRAWING ) ? IM_FLAT : IM_DEEPNOGROUPS;
941 :
942 0 : ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
943 0 : SfxObjectShell* pShell = pDoc->GetDocumentShell();
944 0 : if (pDrawLayer && pShell)
945 : {
946 0 : SCTAB nTabCount = pDoc->GetTableCount();
947 0 : for (SCTAB nTab=0; nTab<nTabCount; nTab++)
948 : {
949 0 : SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
950 : OSL_ENSURE(pPage,"Page ?");
951 0 : if (pPage)
952 : {
953 0 : SdrObjListIter aIter( *pPage, eIter );
954 0 : SdrObject* pObject = aIter.Next();
955 0 : while (pObject)
956 : {
957 0 : if ( IsPartOfType( nType, pObject->GetObjIdentifier() ) )
958 : {
959 0 : OUString aName = ScDrawLayer::GetVisibleName( pObject );
960 0 : if (!aName.isEmpty())
961 : {
962 0 : if( bisInNavigatoeDlg )
963 : {
964 0 : if (nType >= SC_CONTENT_COUNT)
965 : {
966 : SAL_WARN("sc", "ScContentTree::InsertContent mit falschem Typ");
967 0 : return;
968 : }
969 :
970 0 : SvTreeListEntry* pParent = pRootNodes[nType];
971 0 : if (pParent)
972 : {
973 0 : SvTreeListEntry* pChild=InsertEntry( aName, pParent );
974 0 : if(pChild)
975 0 : pChild->SetMarked(false);
976 0 : vcl::Window* pWindow=NULL;
977 0 : ScTabViewShell* pScTabViewShell=NULL;
978 0 : ScDrawView* pScDrawView=NULL;
979 0 : ScNavigatorDlg* pScNavigatorDlg=NULL;
980 0 : if(pChild)
981 0 : pWindow=reinterpret_cast<vcl::Window*>(GetParent(pChild));
982 0 : if(pWindow)
983 0 : pScNavigatorDlg = static_cast<ScNavigatorDlg*>(pWindow);
984 0 : if (pScNavigatorDlg!=NULL)
985 0 : pScTabViewShell = ScNavigatorDlg::GetTabViewShell();
986 0 : if(pScTabViewShell !=NULL)
987 0 : pScDrawView =pScTabViewShell->GetViewData().GetScDrawView();
988 0 : if(pScDrawView!=NULL)
989 : {
990 0 : bool bMarked =pScDrawView->GetObjectIsMarked(pObject);
991 0 : pChild->SetMarked( bMarked );
992 : }
993 : }//end if parent
994 : else
995 : SAL_WARN("sc", "InsertContent ohne Parent");
996 : }
997 0 : }
998 :
999 : }
1000 :
1001 0 : pObject = aIter.Next();
1002 0 : }
1003 : }
1004 : }
1005 : }
1006 : }
1007 :
1008 0 : void ScContentTree::GetGraphicNames()
1009 : {
1010 0 : GetDrawNames( SC_CONTENT_GRAPHIC );
1011 0 : }
1012 :
1013 0 : void ScContentTree::GetOleNames()
1014 : {
1015 0 : GetDrawNames( SC_CONTENT_OLEOBJECT );
1016 0 : }
1017 :
1018 0 : void ScContentTree::GetDrawingNames()
1019 : {
1020 0 : GetDrawNames( SC_CONTENT_DRAWING );
1021 0 : }
1022 :
1023 0 : void ScContentTree::GetLinkNames()
1024 : {
1025 0 : if ( nRootType && nRootType != SC_CONTENT_AREALINK ) // ausgeblendet ?
1026 0 : return;
1027 :
1028 0 : ScDocument* pDoc = GetSourceDocument();
1029 0 : if (!pDoc)
1030 0 : return;
1031 :
1032 0 : sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
1033 : OSL_ENSURE(pLinkManager, "kein LinkManager am Dokument?");
1034 0 : const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
1035 0 : sal_uInt16 nCount = rLinks.size();
1036 0 : for (sal_uInt16 i=0; i<nCount; i++)
1037 : {
1038 0 : ::sfx2::SvBaseLink* pBase = *rLinks[i];
1039 0 : if (pBase->ISA(ScAreaLink))
1040 0 : InsertContent( SC_CONTENT_AREALINK, static_cast<ScAreaLink*>(pBase)->GetSource() );
1041 :
1042 : // in der Liste die Namen der Quellbereiche
1043 : }
1044 : }
1045 :
1046 0 : const ScAreaLink* ScContentTree::GetLink( sal_uLong nIndex )
1047 : {
1048 0 : ScDocument* pDoc = GetSourceDocument();
1049 0 : if (!pDoc)
1050 0 : return NULL;
1051 :
1052 0 : sal_uLong nFound = 0;
1053 0 : sfx2::LinkManager* pLinkManager = pDoc->GetLinkManager();
1054 : OSL_ENSURE(pLinkManager, "kein LinkManager am Dokument?");
1055 0 : const ::sfx2::SvBaseLinks& rLinks = pLinkManager->GetLinks();
1056 0 : sal_uInt16 nCount = rLinks.size();
1057 0 : for (sal_uInt16 i=0; i<nCount; i++)
1058 : {
1059 0 : ::sfx2::SvBaseLink* pBase = *rLinks[i];
1060 0 : if (pBase->ISA(ScAreaLink))
1061 : {
1062 0 : if (nFound == nIndex)
1063 0 : return static_cast<const ScAreaLink*>(pBase);
1064 0 : ++nFound;
1065 : }
1066 : }
1067 :
1068 : OSL_FAIL("link not found");
1069 0 : return NULL;
1070 : }
1071 :
1072 0 : static OUString lcl_NoteString( const ScPostIt& rNote )
1073 : {
1074 0 : OUString aText = rNote.GetText();
1075 : sal_Int32 nAt;
1076 0 : while ( (nAt = aText.indexOf( '\n' )) != -1 )
1077 0 : aText = aText.replaceAt( nAt, 1, " " );
1078 0 : return aText;
1079 : }
1080 :
1081 0 : void ScContentTree::GetNoteStrings()
1082 : {
1083 0 : if ( nRootType && nRootType != SC_CONTENT_NOTE ) // ausgeblendet ?
1084 0 : return;
1085 :
1086 0 : ScDocument* pDoc = GetSourceDocument();
1087 0 : if (!pDoc)
1088 0 : return;
1089 :
1090 : // loop over cell notes
1091 0 : std::vector<sc::NoteEntry> aEntries;
1092 0 : pDoc->GetAllNoteEntries(aEntries);
1093 0 : std::vector<sc::NoteEntry>::const_iterator it = aEntries.begin(), itEnd = aEntries.end();
1094 0 : for (; it != itEnd; ++it)
1095 0 : InsertContent(SC_CONTENT_NOTE, lcl_NoteString(*it->mpNote));
1096 : }
1097 :
1098 0 : ScAddress ScContentTree::GetNotePos( sal_uLong nIndex )
1099 : {
1100 0 : ScDocument* pDoc = GetSourceDocument();
1101 0 : if (!pDoc)
1102 0 : return ScAddress();
1103 :
1104 0 : return pDoc->GetNotePosition(nIndex);
1105 : }
1106 :
1107 0 : bool ScContentTree::NoteStringsChanged()
1108 : {
1109 0 : ScDocument* pDoc = GetSourceDocument();
1110 0 : if (!pDoc)
1111 0 : return false;
1112 :
1113 0 : SvTreeListEntry* pParent = pRootNodes[SC_CONTENT_NOTE];
1114 0 : if (!pParent)
1115 0 : return false;
1116 :
1117 0 : SvTreeListEntry* pEntry = FirstChild( pParent );
1118 :
1119 0 : std::vector<sc::NoteEntry> aEntries;
1120 0 : pDoc->GetAllNoteEntries(aEntries);
1121 0 : std::vector<sc::NoteEntry>::const_iterator it = aEntries.begin(), itEnd = aEntries.end();
1122 0 : for (; it != itEnd; ++it)
1123 : {
1124 0 : const ScPostIt* pNote = it->mpNote;
1125 0 : if (!pEntry)
1126 0 : return true;
1127 :
1128 0 : if (lcl_NoteString(*pNote) != GetEntryText(pEntry))
1129 0 : return true;
1130 :
1131 0 : pEntry = NextSibling(pEntry);
1132 : }
1133 :
1134 0 : if ( pEntry )
1135 0 : return true;
1136 :
1137 0 : return false;
1138 : }
1139 :
1140 0 : bool ScContentTree::DrawNamesChanged( sal_uInt16 nType )
1141 : {
1142 0 : ScDocument* pDoc = GetSourceDocument();
1143 0 : if (!pDoc)
1144 0 : return false;
1145 :
1146 0 : SvTreeListEntry* pParent = pRootNodes[nType];
1147 0 : if (!pParent)
1148 0 : return false;
1149 :
1150 0 : SvTreeListEntry* pEntry = FirstChild( pParent );
1151 :
1152 : // iterate in flat mode for groups
1153 0 : SdrIterMode eIter = ( nType == SC_CONTENT_DRAWING ) ? IM_FLAT : IM_DEEPNOGROUPS;
1154 :
1155 0 : bool bEqual = true;
1156 0 : ScDrawLayer* pDrawLayer = pDoc->GetDrawLayer();
1157 0 : SfxObjectShell* pShell = pDoc->GetDocumentShell();
1158 0 : if (pDrawLayer && pShell)
1159 : {
1160 0 : SCTAB nTabCount = pDoc->GetTableCount();
1161 0 : for (SCTAB nTab=0; nTab<nTabCount && bEqual; nTab++)
1162 : {
1163 0 : SdrPage* pPage = pDrawLayer->GetPage(static_cast<sal_uInt16>(nTab));
1164 : OSL_ENSURE(pPage,"Page ?");
1165 0 : if (pPage)
1166 : {
1167 0 : SdrObjListIter aIter( *pPage, eIter );
1168 0 : SdrObject* pObject = aIter.Next();
1169 0 : while (pObject && bEqual)
1170 : {
1171 0 : if ( IsPartOfType( nType, pObject->GetObjIdentifier() ) )
1172 : {
1173 0 : if ( !pEntry )
1174 0 : bEqual = false;
1175 : else
1176 : {
1177 0 : if ( ScDrawLayer::GetVisibleName( pObject ) != GetEntryText(pEntry) )
1178 0 : bEqual = false;
1179 :
1180 0 : pEntry = NextSibling( pEntry );
1181 : }
1182 : }
1183 0 : pObject = aIter.Next();
1184 0 : }
1185 : }
1186 : }
1187 : }
1188 :
1189 0 : if ( pEntry )
1190 0 : bEqual = false; // kommt noch was
1191 :
1192 0 : return !bEqual;
1193 : }
1194 :
1195 0 : static bool lcl_GetRange( ScDocument* pDoc, sal_uInt16 nType, const OUString& rName, ScRange& rRange )
1196 : {
1197 0 : bool bFound = false;
1198 :
1199 0 : if ( nType == SC_CONTENT_RANGENAME )
1200 : {
1201 0 : ScRangeName* pList = pDoc->GetRangeName();
1202 0 : if (pList)
1203 : {
1204 0 : const ScRangeData* p = pList->findByUpperName(ScGlobal::pCharClass->uppercase(rName));
1205 0 : if (p && p->IsValidReference(rRange))
1206 0 : bFound = true;
1207 : }
1208 : }
1209 0 : else if ( nType == SC_CONTENT_DBAREA )
1210 : {
1211 0 : ScDBCollection* pList = pDoc->GetDBCollection();
1212 0 : if (pList)
1213 : {
1214 0 : const ScDBData* p = pList->getNamedDBs().findByUpperName(ScGlobal::pCharClass->uppercase(rName));
1215 0 : if (p)
1216 : {
1217 : SCTAB nTab;
1218 : SCCOL nCol1, nCol2;
1219 : SCROW nRow1, nRow2;
1220 0 : p->GetArea(nTab, nCol1, nRow1, nCol2, nRow2);
1221 0 : rRange = ScRange(nCol1, nRow1, nTab, nCol2, nRow2, nTab);
1222 0 : bFound = true;
1223 : }
1224 : }
1225 : }
1226 :
1227 0 : return bFound;
1228 : }
1229 :
1230 0 : static void lcl_DoDragObject( ScDocShell* pSrcShell, const OUString& rName, sal_uInt16 nType, vcl::Window* pWin )
1231 : {
1232 0 : ScDocument& rSrcDoc = pSrcShell->GetDocument();
1233 0 : ScDrawLayer* pModel = rSrcDoc.GetDrawLayer();
1234 0 : if (pModel)
1235 : {
1236 0 : bool bOle = ( nType == SC_CONTENT_OLEOBJECT );
1237 0 : bool bGraf = ( nType == SC_CONTENT_GRAPHIC );
1238 0 : sal_uInt16 nDrawId = sal::static_int_cast<sal_uInt16>( bOle ? OBJ_OLE2 : ( bGraf ? OBJ_GRAF : OBJ_GRUP ) );
1239 0 : SCTAB nTab = 0;
1240 0 : SdrObject* pObject = pModel->GetNamedObject( rName, nDrawId, nTab );
1241 0 : if (pObject)
1242 : {
1243 0 : SdrView aEditView( pModel );
1244 0 : aEditView.ShowSdrPage(aEditView.GetModel()->GetPage(nTab));
1245 0 : SdrPageView* pPV = aEditView.GetSdrPageView();
1246 0 : aEditView.MarkObj(pObject, pPV);
1247 :
1248 0 : SdrModel* pDragModel = aEditView.GetMarkedObjModel();
1249 :
1250 0 : TransferableObjectDescriptor aObjDesc;
1251 0 : pSrcShell->FillTransferableObjectDescriptor( aObjDesc );
1252 0 : aObjDesc.maDisplayName = pSrcShell->GetMedium()->GetURLObject().GetURLNoPass();
1253 : // maSize is set in ScDrawTransferObj ctor
1254 :
1255 0 : ScDrawTransferObj* pTransferObj = new ScDrawTransferObj( pDragModel, pSrcShell, aObjDesc );
1256 0 : uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
1257 :
1258 0 : pTransferObj->SetDragSourceObj( pObject, nTab );
1259 0 : pTransferObj->SetDragSourceFlags( SC_DROP_NAVIGATOR );
1260 :
1261 0 : SC_MOD()->SetDragObject( NULL, pTransferObj );
1262 0 : pWin->ReleaseMouse();
1263 0 : pTransferObj->StartDrag( pWin, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
1264 : }
1265 : }
1266 0 : }
1267 :
1268 0 : static void lcl_DoDragCells( ScDocShell* pSrcShell, const ScRange& rRange, sal_uInt16 nFlags, vcl::Window* pWin )
1269 : {
1270 0 : ScMarkData aMark;
1271 0 : aMark.SelectTable( rRange.aStart.Tab(), true );
1272 0 : aMark.SetMarkArea( rRange );
1273 :
1274 0 : ScDocument& rSrcDoc = pSrcShell->GetDocument();
1275 0 : if ( !rSrcDoc.HasSelectedBlockMatrixFragment( rRange.aStart.Col(), rRange.aStart.Row(),
1276 0 : rRange.aEnd.Col(), rRange.aEnd.Row(),
1277 0 : aMark ) )
1278 : {
1279 0 : ScDocument* pClipDoc = new ScDocument( SCDOCMODE_CLIP );
1280 0 : ScClipParam aClipParam(rRange, false);
1281 0 : rSrcDoc.CopyToClip(aClipParam, pClipDoc, &aMark);
1282 : // pClipDoc->ExtendMerge( rRange, sal_True );
1283 :
1284 0 : TransferableObjectDescriptor aObjDesc;
1285 0 : pSrcShell->FillTransferableObjectDescriptor( aObjDesc );
1286 0 : aObjDesc.maDisplayName = pSrcShell->GetMedium()->GetURLObject().GetURLNoPass();
1287 : // maSize is set in ScTransferObj ctor
1288 :
1289 0 : ScTransferObj* pTransferObj = new ScTransferObj( pClipDoc, aObjDesc );
1290 0 : uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
1291 :
1292 0 : pTransferObj->SetDragSource( pSrcShell, aMark );
1293 0 : pTransferObj->SetDragSourceFlags( nFlags );
1294 :
1295 0 : SC_MOD()->SetDragObject( pTransferObj, NULL ); // for internal D&D
1296 0 : pWin->ReleaseMouse();
1297 0 : pTransferObj->StartDrag( pWin, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
1298 0 : }
1299 0 : }
1300 :
1301 0 : void ScContentTree::DoDrag()
1302 : {
1303 0 : ScDocumentLoader* pDocLoader = NULL;
1304 0 : bIsInDrag = true;
1305 :
1306 0 : ScModule* pScMod = SC_MOD();
1307 :
1308 : sal_uInt16 nType;
1309 : sal_uLong nChild;
1310 0 : SvTreeListEntry* pEntry = GetCurEntry();
1311 0 : GetEntryIndexes( nType, nChild, pEntry );
1312 :
1313 0 : if( pEntry &&
1314 0 : (nChild != SC_CONTENT_NOCHILD) &&
1315 0 : (nType != SC_CONTENT_ROOT) &&
1316 0 : (nType != SC_CONTENT_NOTE) &&
1317 0 : (nType != SC_CONTENT_AREALINK) )
1318 : {
1319 0 : OUString aText( GetEntryText( pEntry ) );
1320 :
1321 0 : ScDocument* pLocalDoc = NULL; // fuer URL-Drop
1322 0 : OUString aDocName;
1323 0 : if (bHiddenDoc)
1324 0 : aDocName = aHiddenName;
1325 : else
1326 : {
1327 0 : ScDocShell* pDocSh = GetManualOrCurrent();
1328 0 : if (pDocSh)
1329 : {
1330 0 : if (pDocSh->HasName())
1331 0 : aDocName = pDocSh->GetMedium()->GetName();
1332 : else
1333 0 : pLocalDoc = &pDocSh->GetDocument(); // Drop nur in dieses Dokument
1334 : }
1335 : }
1336 :
1337 0 : bool bDoLinkTrans = false; // use ScLinkTransferObj
1338 0 : OUString aLinkURL; // for ScLinkTransferObj
1339 0 : OUString aLinkText;
1340 :
1341 0 : sal_uInt16 nDropMode = pParentWindow->GetDropMode();
1342 0 : switch ( nDropMode )
1343 : {
1344 : case SC_DROPMODE_URL:
1345 : {
1346 0 : OUString aUrl = aDocName + "#" + aText;
1347 :
1348 0 : pScMod->SetDragJump( pLocalDoc, aUrl, aText );
1349 :
1350 0 : if (!aDocName.isEmpty())
1351 : {
1352 : // provide URL to outside only if the document has a name
1353 : // (without name, only internal D&D via SetDragJump)
1354 :
1355 0 : aLinkURL = aUrl;
1356 0 : aLinkText = aText;
1357 : }
1358 0 : bDoLinkTrans = true;
1359 : }
1360 0 : break;
1361 : case SC_DROPMODE_LINK:
1362 : {
1363 0 : if ( !aDocName.isEmpty() ) // link only to named documents
1364 : {
1365 : // for internal D&D, set flag to insert a link
1366 :
1367 0 : switch ( nType )
1368 : {
1369 : case SC_CONTENT_TABLE:
1370 0 : pScMod->SetDragLink( aDocName, aText, EMPTY_OUSTRING );
1371 0 : bDoLinkTrans = true;
1372 0 : break;
1373 : case SC_CONTENT_RANGENAME:
1374 : case SC_CONTENT_DBAREA:
1375 0 : pScMod->SetDragLink( aDocName, EMPTY_OUSTRING, aText );
1376 0 : bDoLinkTrans = true;
1377 0 : break;
1378 :
1379 : // other types cannot be linked
1380 : }
1381 : }
1382 : }
1383 0 : break;
1384 : case SC_DROPMODE_COPY:
1385 : {
1386 0 : ScDocShell* pSrcShell = NULL;
1387 0 : if ( bHiddenDoc )
1388 : {
1389 0 : OUString aFilter, aOptions;
1390 0 : OUString aURL = aHiddenName;
1391 0 : pDocLoader = new ScDocumentLoader( aURL, aFilter, aOptions );
1392 0 : if (!pDocLoader->IsError())
1393 0 : pSrcShell = pDocLoader->GetDocShell();
1394 : }
1395 : else
1396 0 : pSrcShell = GetManualOrCurrent();
1397 :
1398 0 : if ( pSrcShell )
1399 : {
1400 0 : ScDocument& rSrcDoc = pSrcShell->GetDocument();
1401 0 : if ( nType == SC_CONTENT_RANGENAME || nType == SC_CONTENT_DBAREA )
1402 : {
1403 0 : ScRange aRange;
1404 0 : if ( lcl_GetRange( &rSrcDoc, nType, aText, aRange ) )
1405 : {
1406 0 : lcl_DoDragCells( pSrcShell, aRange, SC_DROP_NAVIGATOR, this );
1407 0 : }
1408 : }
1409 0 : else if ( nType == SC_CONTENT_TABLE )
1410 : {
1411 : SCTAB nTab;
1412 0 : if ( rSrcDoc.GetTable( aText, nTab ) )
1413 : {
1414 0 : ScRange aRange( 0,0,nTab, MAXCOL,MAXROW,nTab );
1415 0 : lcl_DoDragCells( pSrcShell, aRange, SC_DROP_NAVIGATOR | SC_DROP_TABLE, this );
1416 : }
1417 : }
1418 0 : else if ( nType == SC_CONTENT_GRAPHIC || nType == SC_CONTENT_OLEOBJECT ||
1419 0 : nType == SC_CONTENT_DRAWING )
1420 : {
1421 0 : lcl_DoDragObject( pSrcShell, aText, nType, this );
1422 :
1423 : // in ExecuteDrag kann der Navigator geloescht worden sein
1424 : // -> nicht mehr auf Member zugreifen !!!
1425 : }
1426 : }
1427 : }
1428 0 : break;
1429 : }
1430 :
1431 0 : if (bDoLinkTrans)
1432 : {
1433 0 : ScLinkTransferObj* pTransferObj = new ScLinkTransferObj;
1434 0 : uno::Reference<datatransfer::XTransferable> xTransferable( pTransferObj );
1435 :
1436 0 : if ( !aLinkURL.isEmpty() )
1437 0 : pTransferObj->SetLinkURL( aLinkURL, aLinkText );
1438 :
1439 : // SetDragJump / SetDragLink has been done above
1440 :
1441 0 : ReleaseMouse();
1442 0 : pTransferObj->StartDrag( this, DND_ACTION_COPYMOVE | DND_ACTION_LINK );
1443 0 : }
1444 : }
1445 :
1446 0 : bIsInDrag = false; // static Member
1447 :
1448 0 : delete pDocLoader; // falls Dokument zum Draggen geladen wurde
1449 0 : }
1450 :
1451 0 : IMPL_LINK_NOARG(ScContentTree, ExecDragHdl)
1452 : {
1453 : // als Link, damit asynchron ohne ImpMouseMoveMsg auf dem Stack auch der
1454 : // Navigator geloescht werden darf
1455 :
1456 0 : DoDrag();
1457 0 : return 0;
1458 : }
1459 :
1460 0 : bool ScContentTree::LoadFile( const OUString& rUrl )
1461 : {
1462 0 : OUString aDocName = rUrl;
1463 0 : sal_Int32 nPos = aDocName.indexOf('#');
1464 0 : if ( nPos != -1 )
1465 0 : aDocName = aDocName.copy(0, nPos); // nur der Name, ohne #...
1466 :
1467 0 : bool bReturn = false;
1468 0 : OUString aURL = aDocName;
1469 0 : OUString aFilter, aOptions;
1470 0 : ScDocumentLoader aLoader( aURL, aFilter, aOptions );
1471 0 : if ( !aLoader.IsError() )
1472 : {
1473 0 : bHiddenDoc = true;
1474 0 : aHiddenName = aDocName;
1475 0 : aHiddenTitle = aLoader.GetTitle();
1476 0 : pHiddenDocument = aLoader.GetDocument();
1477 :
1478 0 : Refresh(); // Inhalte aus geladenem Dokument holen
1479 :
1480 0 : pHiddenDocument = NULL;
1481 :
1482 0 : pParentWindow->GetDocNames( &aHiddenTitle ); // Liste fuellen
1483 : }
1484 :
1485 : // Dokument wird im dtor von ScDocumentLoader wieder geschlossen
1486 :
1487 0 : return bReturn;
1488 : }
1489 :
1490 0 : void ScContentTree::InitWindowBits( bool bButtons )
1491 : {
1492 0 : WinBits nFlags = GetStyle() | WB_CLIPCHILDREN | WB_HSCROLL;
1493 0 : if (bButtons)
1494 0 : nFlags |= WB_HASBUTTONS | WB_HASBUTTONSATROOT;
1495 :
1496 0 : SetStyle( nFlags );
1497 0 : }
1498 :
1499 0 : void ScContentTree::SetRootType( sal_uInt16 nNew )
1500 : {
1501 0 : if ( nNew != nRootType )
1502 : {
1503 0 : nRootType = nNew;
1504 0 : InitWindowBits( nNew == 0 );
1505 0 : Refresh();
1506 :
1507 0 : ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
1508 0 : rCfg.SetRootType( nRootType );
1509 : }
1510 0 : }
1511 :
1512 0 : void ScContentTree::ToggleRoot() // nach Selektion
1513 : {
1514 0 : sal_uInt16 nNew = SC_CONTENT_ROOT;
1515 0 : if ( nRootType == SC_CONTENT_ROOT )
1516 : {
1517 0 : SvTreeListEntry* pEntry = GetCurEntry();
1518 0 : if (pEntry)
1519 : {
1520 0 : SvTreeListEntry* pParent = GetParent(pEntry);
1521 0 : for (sal_uInt16 i=1; i<SC_CONTENT_COUNT; i++)
1522 0 : if ( pEntry == pRootNodes[i] || pParent == pRootNodes[i] )
1523 0 : nNew = i;
1524 : }
1525 : }
1526 :
1527 0 : SetRootType( nNew );
1528 0 : }
1529 :
1530 0 : void ScContentTree::ResetManualDoc()
1531 : {
1532 0 : aManualDoc.clear();
1533 0 : bHiddenDoc = false;
1534 :
1535 0 : ActiveDocChanged();
1536 0 : }
1537 :
1538 0 : void ScContentTree::ActiveDocChanged()
1539 : {
1540 0 : if ( !bHiddenDoc && aManualDoc.isEmpty() )
1541 0 : Refresh(); // Inhalte nur wenn automatisch
1542 :
1543 : // Listbox muss immer geupdated werden, wegen aktiv-Flag
1544 :
1545 0 : OUString aCurrent;
1546 0 : if ( bHiddenDoc )
1547 0 : aCurrent = aHiddenTitle;
1548 : else
1549 : {
1550 0 : ScDocShell* pSh = GetManualOrCurrent();
1551 0 : if (pSh)
1552 0 : aCurrent = pSh->GetTitle();
1553 : else
1554 : {
1555 : // eingestelltes Dokument existiert nicht mehr
1556 :
1557 0 : aManualDoc.clear(); // wieder automatisch
1558 0 : Refresh();
1559 0 : pSh = GetManualOrCurrent(); // sollte jetzt aktives sein
1560 0 : if (pSh)
1561 0 : aCurrent = pSh->GetTitle();
1562 : }
1563 : }
1564 0 : pParentWindow->GetDocNames( &aCurrent ); // selektieren
1565 0 : }
1566 :
1567 0 : void ScContentTree::SetManualDoc(const OUString& rName)
1568 : {
1569 0 : aManualDoc = rName;
1570 0 : if (!bHiddenDoc)
1571 : {
1572 0 : Refresh();
1573 0 : pParentWindow->GetDocNames( &aManualDoc ); // selektieren
1574 : }
1575 0 : }
1576 :
1577 0 : void ScContentTree::SelectDoc(const OUString& rName) // rName wie im Menue/Listbox angezeigt
1578 : {
1579 0 : if ( rName == pParentWindow->aStrActiveWin )
1580 : {
1581 0 : ResetManualDoc();
1582 0 : return;
1583 : }
1584 :
1585 : // "aktiv" oder "inaktiv" weglassen
1586 :
1587 0 : OUString aRealName = rName;
1588 0 : sal_Int32 nLen = rName.getLength();
1589 0 : sal_Int32 nActiveStart = nLen - pParentWindow->aStrActive.getLength();
1590 0 : if ( rName.copy( nActiveStart ) == pParentWindow->aStrActive )
1591 0 : aRealName = rName.copy( 0, nActiveStart );
1592 0 : sal_Int32 nNotActiveStart = nLen - pParentWindow->aStrNotActive.getLength();
1593 0 : if ( rName.copy( nNotActiveStart ) == pParentWindow->aStrNotActive )
1594 0 : aRealName = rName.copy( 0, nNotActiveStart );
1595 :
1596 0 : bool bLoaded = false;
1597 :
1598 : // ist es ein normal geladenes Doc ?
1599 :
1600 0 : SfxObjectShell* pSh = SfxObjectShell::GetFirst();
1601 0 : while ( pSh && !bLoaded )
1602 : {
1603 0 : if ( pSh->ISA(ScDocShell) )
1604 0 : if ( pSh->GetTitle() == aRealName )
1605 0 : bLoaded = true;
1606 0 : pSh = SfxObjectShell::GetNext( *pSh );
1607 : }
1608 :
1609 0 : if (bLoaded)
1610 : {
1611 0 : bHiddenDoc = false;
1612 0 : SetManualDoc(aRealName);
1613 : }
1614 0 : else if (!aHiddenTitle.isEmpty()) // verstecktes ausgewaehlt
1615 : {
1616 0 : if (!bHiddenDoc)
1617 0 : LoadFile(aHiddenName);
1618 : }
1619 : else
1620 : {
1621 : OSL_FAIL("SelectDoc: nicht gefunden");
1622 0 : }
1623 : }
1624 :
1625 0 : void ScContentTree::ApplyNavigatorSettings()
1626 : {
1627 0 : const ScNavigatorSettings* pSettings = ScNavigatorDlg::GetNavigatorSettings();
1628 0 : if( pSettings )
1629 : {
1630 0 : sal_uInt16 nRootSel = pSettings->GetRootSelected();
1631 0 : sal_uLong nChildSel = pSettings->GetChildSelected();
1632 :
1633 0 : for( sal_uInt16 nEntry = 1; nEntry < SC_CONTENT_COUNT; ++nEntry )
1634 : {
1635 0 : if( pRootNodes[ nEntry ] )
1636 : {
1637 : // expand
1638 0 : bool bExp = pSettings->IsExpanded( nEntry );
1639 0 : if( bExp != IsExpanded( pRootNodes[ nEntry ] ) )
1640 : {
1641 0 : if( bExp )
1642 0 : Expand( pRootNodes[ nEntry ] );
1643 : else
1644 0 : Collapse( pRootNodes[ nEntry ] );
1645 : }
1646 :
1647 : // select
1648 0 : if( nRootSel == nEntry )
1649 : {
1650 0 : SvTreeListEntry* pEntry = NULL;
1651 0 : if( bExp && (nChildSel != SC_CONTENT_NOCHILD) )
1652 0 : pEntry = GetEntry( pRootNodes[ nEntry ], nChildSel );
1653 0 : Select( pEntry ? pEntry : pRootNodes[ nEntry ] );
1654 : }
1655 : }
1656 : }
1657 : }
1658 0 : }
1659 :
1660 0 : void ScContentTree::StoreNavigatorSettings() const
1661 : {
1662 0 : ScNavigatorSettings* pSettings = ScNavigatorDlg::GetNavigatorSettings();
1663 0 : if( pSettings )
1664 : {
1665 0 : for( sal_uInt16 nEntry = 1; nEntry < SC_CONTENT_COUNT; ++nEntry )
1666 : {
1667 0 : bool bExp = pRootNodes[ nEntry ] && IsExpanded( pRootNodes[ nEntry ] );
1668 0 : pSettings->SetExpanded( nEntry, bExp );
1669 : }
1670 : sal_uInt16 nRoot;
1671 : sal_uLong nChild;
1672 0 : GetEntryIndexes( nRoot, nChild, GetCurEntry() );
1673 0 : pSettings->SetRootSelected( nRoot );
1674 0 : pSettings->SetChildSelected( nChild );
1675 : }
1676 0 : }
1677 :
1678 0 : void ScContentTree::InitEntry(SvTreeListEntry* pEntry,
1679 : const OUString& rStr, const Image& rImg1, const Image& rImg2, SvLBoxButtonKind eButtonKind)
1680 : {
1681 0 : sal_uInt16 nColToHilite = 1; //0==Bitmap;1=="Spalte1";2=="Spalte2"
1682 0 : SvTreeListBox::InitEntry( pEntry, rStr, rImg1, rImg2, eButtonKind );
1683 0 : SvLBoxString* pCol = static_cast<SvLBoxString*>(pEntry->GetItem( nColToHilite ));
1684 0 : SvLBoxString* pStr = new SvLBoxString( pEntry, 0, pCol->GetText() );
1685 0 : pEntry->ReplaceItem( pStr, nColToHilite );
1686 156 : }
1687 :
1688 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|