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