xref: /trunk/main/sc/source/ui/navipi/navipi.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 //------------------------------------------------------------------
32 
33 // #include <math.h>
34 #include <rangelst.hxx>
35 #include <sfx2/app.hxx>
36 #include <sfx2/bindings.hxx>
37 #include <sfx2/dispatch.hxx>
38 #include <sfx2/event.hxx>
39 #include <sfx2/imgmgr.hxx>
40 #include <sfx2/navigat.hxx>
41 #include <svl/stritem.hxx>
42 #include <svl/urlbmk.hxx>
43 #include <vcl/sound.hxx>
44 #include <unotools/charclass.hxx>
45 #include <stdlib.h>
46 
47 #include "viewdata.hxx"
48 #include "tabvwsh.hxx"
49 #include "docsh.hxx"
50 #include "document.hxx"
51 #include "dbcolect.hxx"
52 #include "rangenam.hxx"
53 #include "rangeutl.hxx"
54 #include "popmenu.hxx"
55 #include "scresid.hxx"
56 #include "scmod.hxx"
57 #include "navicfg.hxx"
58 #include "navcitem.hxx"
59 #include "navipi.hrc"
60 #include "navipi.hxx"
61 #include "navsett.hxx"
62 
63 //  Timeout, um Notizen zu suchen
64 #define SC_CONTENT_TIMEOUT  1000
65 
66 //  Toleranz, wieviel ueber der eingeklappten Groesse noch klein ist
67 #define SCNAV_MINTOL        5
68 
69 //  maximum values for UI
70 #define SCNAV_MAXCOL        (MAXCOLCOUNT)
71 // macro is sufficient since only used in ctor
72 #define SCNAV_COLDIGITS     (static_cast<xub_StrLen>( floor( log10( static_cast<double>(SCNAV_MAXCOL)))) + 1)   // 1...256...18278
73 // precomputed constant because it is used in every change of spin button field
74 static const xub_StrLen SCNAV_COLLETTERS = ::ScColToAlpha(SCNAV_MAXCOL).Len();    // A...IV...ZZZ
75 
76 #define SCNAV_MAXROW        (MAXROWCOUNT)
77 
78 //------------------------------------------------------------------------
79 
80 //  static
81 void ScNavigatorDlg::ReleaseFocus()
82 {
83     SfxViewShell* pCurSh = SfxViewShell::Current();
84 
85     if ( pCurSh )
86     {
87         Window* pShellWnd = pCurSh->GetWindow();
88         if ( pShellWnd )
89             pShellWnd->GrabFocus();
90     }
91 }
92 
93 //==================================================================
94 //  class ColumnEdit
95 //==================================================================
96 
97 ColumnEdit::ColumnEdit( ScNavigatorDlg* pParent, const ResId& rResId )
98     :   SpinField   ( pParent, rResId ),
99         rDlg        ( *pParent ),
100         nCol        ( 0 ),
101         nKeyGroup   ( KEYGROUP_ALPHA )
102 {
103     SetMaxTextLen( SCNAV_COLDIGITS );   // 1...256...18278 or A...IV...ZZZ
104 }
105 
106 //------------------------------------------------------------------------
107 
108 __EXPORT ColumnEdit::~ColumnEdit()
109 {
110 }
111 
112 //------------------------------------------------------------------------
113 
114 long __EXPORT ColumnEdit::Notify( NotifyEvent& rNEvt )
115 {
116     long nHandled = SpinField::Notify( rNEvt );
117 
118     sal_uInt16 nType = rNEvt.GetType();
119     if ( nType == EVENT_KEYINPUT )
120     {
121         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
122         KeyCode aCode = pKEvt->GetKeyCode();
123 
124         if ( !aCode.IsMod1() && !aCode.IsMod2() )
125         {
126             //! Eingabeueberpruefung (nur Zahlen oder nur Buchstaben, max 2 bzw 3 Stellen)
127             //! war vor VCL per nicht weitergeleitetem KeyInput
128             //! dafuer was neues ausdenken!!!
129 
130             if ( aCode.GetCode() == KEY_RETURN )
131             {
132                 ScNavigatorDlg::ReleaseFocus();
133                 ExecuteCol();
134                 nHandled = 1;
135             }
136         }
137     }
138     else if ( nType == EVENT_LOSEFOCUS )    // LoseFocus wird bei VCL nicht gerufen
139         EvalText();                         // nCol setzen
140 
141     return nHandled;
142 }
143 
144 //------------------------------------------------------------------------
145 
146 void __EXPORT ColumnEdit::LoseFocus()
147 {
148     EvalText();
149 }
150 
151 
152 //------------------------------------------------------------------------
153 
154 void __EXPORT ColumnEdit::Up()
155 {
156     nCol++;
157 
158 #ifdef OS2
159     if ( nCol > SCNAV_MAXCOL )
160         nCol = 1;
161 #endif
162 
163     if ( nCol <= SCNAV_MAXCOL )
164         SetCol( nCol );
165     else
166         nCol--;
167 }
168 
169 //------------------------------------------------------------------------
170 
171 void __EXPORT ColumnEdit::Down()
172 {
173     if ( nCol>1 )
174         SetCol( nCol-1 );
175 #ifdef OS2
176     else
177         SetCol( SCNAV_MAXCOL );
178 #endif
179 }
180 
181 //------------------------------------------------------------------------
182 
183 void __EXPORT ColumnEdit::First()
184 {
185     nCol = 1;
186     SetText( 'A' );
187 }
188 
189 //------------------------------------------------------------------------
190 
191 void __EXPORT ColumnEdit::Last()
192 {
193     String aStr;
194     nCol = NumToAlpha( SCNAV_MAXCOL, aStr );
195     SetText( aStr );
196 }
197 
198 
199 //------------------------------------------------------------------------
200 
201 void ColumnEdit::EvalText()
202 {
203     String aStrCol = GetText();
204 
205     if ( aStrCol.Len() > 0 )
206     {
207         //  nKeyGroup wird bei VCL mangels KeyInput nicht mehr gesetzt
208 
209         if ( CharClass::isAsciiNumeric(aStrCol) )
210             nCol = NumStrToAlpha( aStrCol );
211         else
212             nCol = AlphaToNum( aStrCol );
213     }
214     else
215         nCol = 0;
216 
217     SetText( aStrCol );
218     nKeyGroup = KEYGROUP_ALPHA;
219 }
220 
221 //------------------------------------------------------------------------
222 
223 void ColumnEdit::ExecuteCol()
224 {
225     SCROW nRow = rDlg.aEdRow.GetRow();
226 
227     EvalText(); // setzt nCol
228 
229     if ( (nCol > 0) && (nRow > 0) )
230         rDlg.SetCurrentCell( nCol-1, nRow-1 );
231 }
232 
233 //------------------------------------------------------------------------
234 
235 void ColumnEdit::SetCol( SCCOL nColNo )
236 {
237     String aStr;
238 
239     if ( nColNo == 0 )
240     {
241         nCol = 0;
242         SetText( aStr );
243     }
244     else
245     {
246         nColNo = NumToAlpha( nColNo, aStr );
247         nCol = nColNo;
248         SetText( aStr );
249     }
250 }
251 
252 //------------------------------------------------------------------------
253 
254 SCCOL ColumnEdit::AlphaToNum( String& rStr )
255 {
256     SCCOL  nColumn = 0;
257 
258     if ( CharClass::isAsciiAlpha( rStr) )
259     {
260         rStr.ToUpperAscii();
261 
262         if (::AlphaToCol( nColumn, rStr))
263             ++nColumn;
264 
265         if ( (rStr.Len() > SCNAV_COLLETTERS) || (nColumn > SCNAV_MAXCOL) )
266         {
267             nColumn = SCNAV_MAXCOL;
268             NumToAlpha( nColumn, rStr );
269         }
270     }
271     else
272         rStr.Erase();
273 
274     return nColumn;
275 }
276 
277 //------------------------------------------------------------------------
278 
279 SCCOL ColumnEdit::NumStrToAlpha( String& rStr )
280 {
281     SCCOL  nColumn = 0;
282 
283     if ( CharClass::isAsciiNumeric(rStr) )
284         nColumn = NumToAlpha( (SCCOL)rStr.ToInt32(), rStr );
285     else
286         rStr.Erase();
287 
288     return nColumn;
289 }
290 
291 //------------------------------------------------------------------------
292 
293 SCCOL ColumnEdit::NumToAlpha( SCCOL nColNo, String& rStr )
294 {
295     if ( nColNo > SCNAV_MAXCOL )
296         nColNo = SCNAV_MAXCOL;
297     else if ( nColNo < 1 )
298         nColNo = 1;
299 
300     ::ScColToAlpha( rStr, nColNo - 1);
301 
302     return nColNo;
303 }
304 
305 //==================================================================
306 //  class RowEdit
307 //==================================================================
308 
309 RowEdit::RowEdit( ScNavigatorDlg* pParent, const ResId& rResId )
310     :   NumericField( pParent, rResId ),
311         rDlg        ( *pParent )
312 {
313     SetMax( SCNAV_MAXROW);
314     SetLast( SCNAV_MAXROW);
315 }
316 
317 //------------------------------------------------------------------------
318 
319 __EXPORT RowEdit::~RowEdit()
320 {
321 }
322 
323 //------------------------------------------------------------------------
324 
325 long __EXPORT RowEdit::Notify( NotifyEvent& rNEvt )
326 {
327     long nHandled = NumericField::Notify( rNEvt );
328 
329     if ( rNEvt.GetType() == EVENT_KEYINPUT )
330     {
331         const KeyEvent* pKEvt = rNEvt.GetKeyEvent();
332         KeyCode aCode = pKEvt->GetKeyCode();
333         if ( aCode.GetCode() == KEY_RETURN && !aCode.IsMod1() && !aCode.IsMod2() )
334         {
335             ScNavigatorDlg::ReleaseFocus();
336             ExecuteRow();
337             nHandled = 1;
338         }
339     }
340 
341     return nHandled;
342 }
343 
344 //------------------------------------------------------------------------
345 
346 void __EXPORT RowEdit::LoseFocus()
347 {
348 }
349 
350 //------------------------------------------------------------------------
351 
352 void RowEdit::ExecuteRow()
353 {
354     SCCOL nCol = rDlg.aEdCol.GetCol();
355     SCROW nRow = (SCROW)GetValue();
356 
357     if ( (nCol > 0) && (nRow > 0) )
358         rDlg.SetCurrentCell( nCol-1, nRow-1 );
359 }
360 
361 //==================================================================
362 //  class ScDocListBox
363 //==================================================================
364 
365 ScDocListBox::ScDocListBox( ScNavigatorDlg* pParent, const ResId& rResId )
366     :   ListBox ( pParent, rResId ),
367         rDlg    ( *pParent )
368 {
369 }
370 
371 //------------------------------------------------------------------------
372 
373 __EXPORT ScDocListBox::~ScDocListBox()
374 {
375 }
376 
377 //------------------------------------------------------------------------
378 
379 void __EXPORT ScDocListBox::Select()
380 {
381     ScNavigatorDlg::ReleaseFocus();
382 
383     String aDocName = GetSelectEntry();
384     rDlg.aLbEntries.SelectDoc( aDocName );
385 }
386 
387 //==================================================================
388 //  class CommandToolBox
389 //==================================================================
390 
391 CommandToolBox::CommandToolBox( ScNavigatorDlg* pParent, const ResId& rResId )
392     :   ToolBox ( pParent, rResId ),
393         rDlg    ( *pParent )
394 {
395     InitImageList();    // ImageList members of ScNavigatorDlg must be initialized before!
396 
397     SetSizePixel( CalcWindowSizePixel() );
398     SetDropdownClickHdl( LINK(this, CommandToolBox, ToolBoxDropdownClickHdl) );
399     SetItemBits( IID_DROPMODE, GetItemBits( IID_DROPMODE ) | TIB_DROPDOWNONLY );
400 //  EnableItem( IID_UP, sal_False );
401 //  EnableItem( IID_DOWN, sal_False );
402 }
403 
404 //------------------------------------------------------------------------
405 
406 __EXPORT CommandToolBox::~CommandToolBox()
407 {
408 }
409 
410 //------------------------------------------------------------------------
411 
412 void CommandToolBox::Select( sal_uInt16 nSelId )
413 {
414     //  Modus umschalten ?
415 
416     if ( nSelId == IID_ZOOMOUT || nSelId == IID_SCENARIOS )
417     {
418         NavListMode eOldMode = rDlg.eListMode;
419         NavListMode eNewMode = eOldMode;
420 
421         if ( nSelId == IID_SCENARIOS )                  // auf Szenario
422         {
423             if ( eOldMode == NAV_LMODE_SCENARIOS )
424                 eNewMode = NAV_LMODE_AREAS;
425             else
426                 eNewMode = NAV_LMODE_SCENARIOS;
427         }
428         else                                            // ein/aus
429         {
430             if ( eOldMode == NAV_LMODE_NONE )
431                 eNewMode = NAV_LMODE_AREAS;
432             else
433                 eNewMode = NAV_LMODE_NONE;
434         }
435         rDlg.SetListMode( eNewMode );
436         UpdateButtons();
437     }
438     else
439         switch ( nSelId )
440         {
441             case IID_DATA:
442                 rDlg.MarkDataArea();
443                 break;
444             case IID_UP:
445                 rDlg.StartOfDataArea();
446                 break;
447             case IID_DOWN:
448                 rDlg.EndOfDataArea();
449                 break;
450             // IID_DROPMODE ist in Click
451             case IID_CHANGEROOT:
452                 rDlg.aLbEntries.ToggleRoot();
453                 UpdateButtons();
454                 break;
455         }
456 }
457 
458 void __EXPORT CommandToolBox::Select()
459 {
460     Select( GetCurItemId() );
461 }
462 
463 //------------------------------------------------------------------------
464 
465 void __EXPORT CommandToolBox::Click()
466 {
467 }
468 
469 //------------------------------------------------------------------------
470 
471 IMPL_LINK( CommandToolBox, ToolBoxDropdownClickHdl, ToolBox*, EMPTYARG )
472 {
473     //  Das Popupmenue fuer den Dropmodus muss im Click (Button Down)
474     //  statt im Select (Button Up) aufgerufen werden.
475 
476     if ( GetCurItemId() == IID_DROPMODE )
477     {
478         ScPopupMenu aPop( ScResId( RID_POPUP_DROPMODE ) );
479         aPop.CheckItem( RID_DROPMODE_URL + rDlg.GetDropMode() );
480         aPop.Execute( this, GetItemRect(IID_DROPMODE), POPUPMENU_EXECUTE_DOWN );
481         sal_uInt16 nId = aPop.GetSelected();
482 
483         EndSelection();     // vor SetDropMode (SetDropMode ruft SetItemImage)
484 
485         if ( nId >= RID_DROPMODE_URL && nId <= RID_DROPMODE_COPY )
486             rDlg.SetDropMode( nId - RID_DROPMODE_URL );
487 
488         //  #49956# den gehighlighteten Button aufheben
489         Point aPoint;
490         MouseEvent aLeave( aPoint, 0, MOUSE_LEAVEWINDOW | MOUSE_SYNTHETIC );
491         MouseMove( aLeave );
492     }
493 
494     return 1;
495 }
496 
497 //------------------------------------------------------------------------
498 
499 void CommandToolBox::UpdateButtons()
500 {
501     NavListMode eMode = rDlg.eListMode;
502     CheckItem( IID_SCENARIOS,   eMode == NAV_LMODE_SCENARIOS );
503     CheckItem( IID_ZOOMOUT,     eMode != NAV_LMODE_NONE );
504 
505     //  Umschalten-Button:
506     if ( eMode == NAV_LMODE_SCENARIOS || eMode == NAV_LMODE_NONE )
507     {
508         EnableItem( IID_CHANGEROOT, sal_False );
509         CheckItem( IID_CHANGEROOT, sal_False );
510     }
511     else
512     {
513         EnableItem( IID_CHANGEROOT, sal_True );
514         sal_Bool bRootSet = rDlg.aLbEntries.GetRootType() != SC_CONTENT_ROOT;
515         CheckItem( IID_CHANGEROOT, bRootSet );
516     }
517 
518     sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
519 
520     sal_uInt16 nImageId = 0;
521     switch ( rDlg.nDropMode )
522     {
523         case SC_DROPMODE_URL:   nImageId = bHC ? RID_IMG_H_DROP_URL  : RID_IMG_DROP_URL;  break;
524         case SC_DROPMODE_LINK:  nImageId = bHC ? RID_IMG_H_DROP_LINK : RID_IMG_DROP_LINK; break;
525         case SC_DROPMODE_COPY:  nImageId = bHC ? RID_IMG_H_DROP_COPY : RID_IMG_DROP_COPY; break;
526     }
527     SetItemImage( IID_DROPMODE, Image(ScResId(nImageId)) );
528 }
529 
530 void CommandToolBox::InitImageList()
531 {
532     sal_Bool bHC = GetSettings().GetStyleSettings().GetHighContrastMode();
533 
534     ImageList& rImgLst = bHC ? rDlg.aCmdImageListH : rDlg.aCmdImageList;
535 
536     sal_uInt16 nCount = GetItemCount();
537     for (sal_uInt16 i = 0; i < nCount; i++)
538     {
539         sal_uInt16 nId = GetItemId(i);
540         SetItemImage( nId, rImgLst.GetImage( nId ) );
541     }
542 }
543 
544 void CommandToolBox::DataChanged( const DataChangedEvent& rDCEvt )
545 {
546     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
547     {
548         //  update item images
549 
550         InitImageList();
551         UpdateButtons();    // drop mode
552     }
553 
554     ToolBox::DataChanged( rDCEvt );
555 }
556 
557 //==================================================================
558 //  class ScNavigatorSettings
559 //==================================================================
560 
561 ScNavigatorSettings::ScNavigatorSettings() :
562     maExpandedVec( SC_CONTENT_COUNT, sal_False ),
563     mnRootSelected( SC_CONTENT_ROOT ),
564     mnChildSelected( SC_CONTENT_NOCHILD )
565 {
566 }
567 
568 //==================================================================
569 //  class ScNavigatorDlgWrapper
570 //==================================================================
571 
572 SFX_IMPL_CHILDWINDOWCONTEXT( ScNavigatorDialogWrapper, SID_NAVIGATOR )
573 
574 #define IS_MODE(bit)(((nFlags)&(bit))==(bit))
575 
576 ScNavigatorDialogWrapper::ScNavigatorDialogWrapper(
577                                     Window*          pParent,
578                                     sal_uInt16           nId,
579                                     SfxBindings*     pBind,
580                                     SfxChildWinInfo* /* pInfo */ ) :
581         SfxChildWindowContext( nId )
582 {
583     pNavigator = new ScNavigatorDlg( pBind, this, pParent );
584     SetWindow( pNavigator );
585 
586     //  Einstellungen muessen anderswo gemerkt werden,
587     //  pInfo geht uns (ausser der Groesse) nichts mehr an
588 
589     Size aInfoSize = pParent->GetOutputSizePixel();     // von aussen vorgegebene Groesse
590     Size aNavSize = pNavigator->GetOutputSizePixel();   // Default-Groesse
591 
592     aNavSize.Width()  = Max( aInfoSize.Width(),  aNavSize.Width() );
593     aNavSize.Height() = Max( aInfoSize.Height(), aNavSize.Height() );
594     pNavigator->nListModeHeight = Max( aNavSize.Height(), pNavigator->nListModeHeight );
595 
596     //  Die Groesse kann in einem anderen Modul geaendert worden sein,
597     //  deshalb muessen in Abhaengigkeit von der momentanen Groesse die
598     //  Inhalte eingeblendet werden oder nicht
599 
600     sal_Bool bSmall = ( aInfoSize.Height() <= pNavigator->aInitSize.Height() + SCNAV_MINTOL );
601     NavListMode eNavMode = NAV_LMODE_NONE;
602     if (!bSmall)
603     {
604         //  wenn Szenario aktiv war, wieder einschalten
605 
606         ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
607         NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
608         if ( eLastMode == NAV_LMODE_SCENARIOS )
609             eNavMode = NAV_LMODE_SCENARIOS;
610         else
611             eNavMode = NAV_LMODE_AREAS;
612     }
613 
614     //  Die Groesse des Floats nicht neu setzen (sal_False bei SetListMode), damit der
615     //  Navigator nicht aufgeklappt wird, wenn er minimiert war (#38872#).
616 
617     pNavigator->SetListMode( eNavMode, sal_False );     // FALSE: Groesse des Float nicht setzen
618 
619     sal_uInt16 nCmdId;
620     switch (eNavMode)
621     {
622         case NAV_LMODE_DOCS:        nCmdId = IID_DOCS;      break;
623         case NAV_LMODE_AREAS:       nCmdId = IID_AREAS;     break;
624         case NAV_LMODE_DBAREAS:     nCmdId = IID_DBAREAS;   break;
625         case NAV_LMODE_SCENARIOS:   nCmdId = IID_SCENARIOS; break;
626         default:                    nCmdId = 0;
627     }
628     if (nCmdId)
629     {
630         pNavigator->aTbxCmd.CheckItem( nCmdId );
631         pNavigator->DoResize();
632     }
633 
634     pNavigator->bFirstBig = ( nCmdId == 0 );    // dann spaeter
635 
636 /*???
637     FloatingWindow* pFloat = GetFloatingWindow();
638     if ( pFloat )
639         pFloat->SetMinOutputSizePixel( pNavigator->GetMinOutputSizePixel() );
640 */
641 
642 //!?    pNavigator->Show();
643 }
644 
645 void __EXPORT ScNavigatorDialogWrapper::Resizing( Size& rSize )
646 {
647     ((ScNavigatorDlg*)GetWindow())->Resizing(rSize);
648 }
649 
650 //========================================================================
651 // class ScNavigatorPI
652 //========================================================================
653 
654 #define CTRL_ITEMS 4
655 
656 #define REGISTER_SLOT(i,id) \
657     ppBoundItems[i]=new ScNavigatorControllerItem(id,*this,rBindings);
658 
659 ScNavigatorDlg::ScNavigatorDlg( SfxBindings* pB, SfxChildWindowContext* pCW, Window* pParent ) :
660         Window( pParent, ScResId(RID_SCDLG_NAVIGATOR) ),
661         rBindings   ( *pB ),                                // is used in CommandToolBox ctor
662         aCmdImageList( ScResId( IL_CMD ) ),
663         aCmdImageListH( ScResId( ILH_CMD ) ),
664         aFtCol      ( this, ScResId( FT_COL ) ),
665         aEdCol      ( this, ScResId( ED_COL ) ),
666         aFtRow      ( this, ScResId( FT_ROW ) ),
667         aEdRow      ( this, ScResId( ED_ROW ) ),
668         aTbxCmd     ( this, ScResId( TBX_CMD ) ),
669         aLbEntries  ( this, ScResId( LB_ENTRIES ) ),
670         aWndScenarios( this,ScResId( STR_QHLP_SCEN_LISTBOX), ScResId(STR_QHLP_SCEN_COMMENT)),
671         aLbDocuments( this, ScResId( LB_DOCUMENTS ) ),
672         aStrDragMode ( ScResId( STR_DRAGMODE ) ),
673         aStrDisplay  ( ScResId( STR_DISPLAY ) ),
674         aStrActiveWin( ScResId( STR_ACTIVEWIN ) ),
675         pContextWin ( pCW ),
676         pMarkArea   ( NULL ),
677         pViewData   ( NULL ),
678         nListModeHeight( 0 ),
679         nInitListHeight( 0 ),
680         eListMode   ( NAV_LMODE_NONE ),
681         nDropMode   ( SC_DROPMODE_URL ),
682         nCurCol     ( 0 ),
683         nCurRow     ( 0 ),
684         nCurTab     ( 0 ),
685         bFirstBig   ( sal_False )
686 {
687     ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
688     nDropMode = rCfg.GetDragMode();
689     //  eListMode wird von aussen gesetzt, Root weiter unten
690 
691     aLbDocuments.SetDropDownLineCount(9);
692     String aOpen = String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM( " (" ));
693     aStrActive = aOpen;
694     aStrActive += String( ScResId( STR_ACTIVE ) );
695     aStrActive += ')';                                      // " (aktiv)"
696     aStrNotActive = aOpen;
697     aStrNotActive += String( ScResId( STR_NOTACTIVE ) );
698     aStrNotActive += ')';                                   // " (inaktiv)"
699     aStrHidden = aOpen;
700     aStrHidden += String( ScResId( STR_HIDDEN ) );
701     aStrHidden += ')';                                      // " (versteckt)"
702 
703     aTitleBase = GetText();
704 
705     long nListboxYPos = aTbxCmd.GetPosPixel().Y() + aTbxCmd.GetSizePixel().Height() + 4;
706     aLbEntries.SetPosSizePixel( 0, nListboxYPos, 0, 0, WINDOW_POSSIZE_Y);
707 
708     nBorderOffset = aLbEntries.GetPosPixel().X();
709 
710     aInitSize.Width()  =  aTbxCmd.GetPosPixel().X()
711                         + aTbxCmd.GetSizePixel().Width()
712                         + nBorderOffset;
713     aInitSize.Height() = aLbEntries.GetPosPixel().Y();
714 
715     nInitListHeight = aLbEntries.GetSizePixel().Height();
716     nListModeHeight =  aInitSize.Height()
717                      + nInitListHeight;
718 
719     //  kein Resize, eh der ganze Kontext-Kram initialisiert ist!
720 //  SetOutputSizePixel( aInitSize );        //???
721 /*! FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
722     if ( pFloat)
723         pFloat->SetMinOutputSizePixel( aInitSize );
724 */
725     ppBoundItems = new ScNavigatorControllerItem* [CTRL_ITEMS];
726 
727     rBindings.ENTERREGISTRATIONS();
728     //-----------------------------
729     REGISTER_SLOT( 0, SID_CURRENTCELL       );
730     REGISTER_SLOT( 1, SID_CURRENTTAB        );
731     REGISTER_SLOT( 2, SID_CURRENTDOC        );
732     REGISTER_SLOT( 3, SID_SELECT_SCENARIO   );
733     //-----------------------------
734     rBindings.LEAVEREGISTRATIONS();
735 
736     StartListening( *(SFX_APP()) );
737     StartListening( rBindings );
738 
739     aLbDocuments.Hide();        // bei NAV_LMODE_NONE gibts die nicht
740 
741     aLbEntries.InitWindowBits(sal_True);
742 
743     aLbEntries.SetSpaceBetweenEntries(0);
744     aLbEntries.SetSelectionMode( SINGLE_SELECTION );
745     aLbEntries.SetDragDropMode(     SV_DRAGDROP_CTRL_MOVE |
746                                     SV_DRAGDROP_CTRL_COPY |
747                                     SV_DRAGDROP_ENABLE_TOP );
748 
749     //  war eine Kategorie als Root ausgewaehlt?
750     sal_uInt16 nLastRoot = rCfg.GetRootType();
751     if ( nLastRoot )
752         aLbEntries.SetRootType( nLastRoot );
753 
754     aLbEntries.Refresh();
755     GetDocNames();
756 
757     aTbxCmd.UpdateButtons();
758 
759     UpdateColumn();
760     UpdateRow();
761     UpdateTable();
762     aLbEntries.Hide();
763     aWndScenarios.Hide();
764     aWndScenarios.SetPosPixel( aLbEntries.GetPosPixel() );
765 
766     aContentTimer.SetTimeoutHdl( LINK( this, ScNavigatorDlg, TimeHdl ) );
767     aContentTimer.SetTimeout( SC_CONTENT_TIMEOUT );
768 
769     FreeResource();
770 
771     aLbEntries.SetAccessibleRelationLabeledBy(&aLbEntries);
772     aTbxCmd.SetAccessibleRelationLabeledBy(&aTbxCmd);
773     aLbDocuments.SetAccessibleName(aStrActiveWin);
774 }
775 
776 //------------------------------------------------------------------------
777 
778 __EXPORT ScNavigatorDlg::~ScNavigatorDlg()
779 {
780     aContentTimer.Stop();
781 
782     sal_uInt16 i;
783     for ( i=0; i<CTRL_ITEMS; i++ )
784         delete ppBoundItems[i];
785 
786     delete [] ppBoundItems;
787     delete pMarkArea;
788 
789     EndListening( *(SFX_APP()) );
790     EndListening( rBindings );
791 }
792 
793 //------------------------------------------------------------------------
794 
795 void __EXPORT ScNavigatorDlg::Resizing( Size& rNewSize )  // Size = Outputsize?
796 {
797     FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
798     if ( pFloat )
799     {
800         Size aMinOut = pFloat->GetMinOutputSizePixel();
801 
802         if ( rNewSize.Width() < aMinOut.Width() )
803             rNewSize.Width() = aMinOut.Width();
804 
805         if ( eListMode == NAV_LMODE_NONE )
806             rNewSize.Height() = aInitSize.Height();
807         else
808         {
809             if ( rNewSize.Height() < aMinOut.Height() )
810                 rNewSize.Height() = aMinOut.Height();
811         }
812     }
813 //  else
814 //      SfxDockingWindow::Resizing(rNewSize);
815 }
816 
817 
818 
819 void ScNavigatorDlg::Paint( const Rectangle& rRec )
820 {
821     const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
822     Color aBgColor = rStyleSettings.GetFaceColor();
823     Wallpaper aBack( aBgColor );
824 
825     SetBackground( aBack );
826     aFtCol.SetBackground( aBack );
827     aFtRow.SetBackground( aBack );
828 
829     Window::Paint( rRec );
830 }
831 
832 void ScNavigatorDlg::DataChanged( const DataChangedEvent& rDCEvt )
833 {
834     if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
835     {
836         //  toolbox images are exchanged in CommandToolBox::DataChanged
837         Invalidate();
838     }
839 
840     Window::DataChanged( rDCEvt );
841 }
842 
843 //------------------------------------------------------------------------
844 
845 void __EXPORT ScNavigatorDlg::Resize()
846 {
847     DoResize();
848 }
849 
850 //------------------------------------------------------------------------
851 
852 void ScNavigatorDlg::DoResize()
853 {
854     Size aNewSize = GetOutputSizePixel();
855     long nTotalHeight = aNewSize.Height();
856 
857     //  #41403# bei angedocktem Navigator wird das Fenster evtl. erst klein erzeugt,
858     //  dann kommt ein Resize auf die wirkliche Groesse -> dann Inhalte einschalten
859 
860     sal_Bool bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL );
861     if ( !bSmall && bFirstBig )
862     {
863         //  Inhalte laut Config wieder einschalten
864 
865         bFirstBig = sal_False;
866         NavListMode eNavMode = NAV_LMODE_AREAS;
867         ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
868         NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
869         if ( eLastMode == NAV_LMODE_SCENARIOS )
870             eNavMode = NAV_LMODE_SCENARIOS;
871         SetListMode( eNavMode, sal_False );         // FALSE: Groesse des Float nicht setzen
872     }
873 
874     //  auch wenn die Inhalte nicht sichtbar sind, die Groessen anpassen,
875     //  damit die Breite stimmt
876 
877     //@@ 03.11.97 changes begin
878     Point aEntryPos = aLbEntries.GetPosPixel();
879     Point aListPos = aLbDocuments.GetPosPixel();
880     aNewSize.Width() -= 2*nBorderOffset;
881     Size aDocSize = aLbDocuments.GetSizePixel();
882     aDocSize.Width() = aNewSize.Width();
883 
884     if(!bSmall)
885     {
886 
887         long nListHeight = aLbDocuments.GetSizePixel().Height();
888         aNewSize.Height() -= ( aEntryPos.Y() + nListHeight + 2*nBorderOffset );
889         if(aNewSize.Height()<0) aNewSize.Height()=0;
890 
891         aListPos.Y() = aEntryPos.Y() + aNewSize.Height() + nBorderOffset;
892 
893         if(aListPos.Y() > aLbEntries.GetPosPixel().Y())
894                             aLbDocuments.SetPosPixel( aListPos );
895 
896     }
897     aLbEntries.SetSizePixel( aNewSize );
898     aWndScenarios.SetSizePixel( aNewSize );
899     aLbDocuments.SetSizePixel( aDocSize );
900 
901     //@@ 03.11.97 end
902 
903     sal_Bool bListMode = (eListMode != NAV_LMODE_NONE);
904     FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
905     if ( pFloat && bListMode )
906         nListModeHeight = nTotalHeight;
907 }
908 
909 //------------------------------------------------------------------------
910 
911 void __EXPORT ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint )
912 {
913     if ( rHint.ISA(SfxSimpleHint) )
914     {
915         sal_uLong nHintId = ((SfxSimpleHint&)rHint).GetId();
916 
917         if ( nHintId == SC_HINT_DOCNAME_CHANGED )
918         {
919             aLbEntries.ActiveDocChanged();
920         }
921         else if ( NAV_LMODE_NONE == eListMode )
922         {
923             //  Tabellen hier nicht mehr
924         }
925         else
926         {
927             switch ( nHintId )
928             {
929                 case SC_HINT_TABLES_CHANGED:
930                     aLbEntries.Refresh( SC_CONTENT_TABLE );
931                     break;
932 
933                 case SC_HINT_DBAREAS_CHANGED:
934                     aLbEntries.Refresh( SC_CONTENT_DBAREA );
935                     break;
936 
937                 case SC_HINT_AREAS_CHANGED:
938                     aLbEntries.Refresh( SC_CONTENT_RANGENAME );
939                     break;
940 
941                 case SC_HINT_DRAW_CHANGED:
942                     aLbEntries.Refresh( SC_CONTENT_GRAPHIC );
943                     aLbEntries.Refresh( SC_CONTENT_OLEOBJECT );
944                     aLbEntries.Refresh( SC_CONTENT_DRAWING );
945                     break;
946 
947                 case SC_HINT_AREALINKS_CHANGED:
948                     aLbEntries.Refresh( SC_CONTENT_AREALINK );
949                     break;
950 
951                 //  SFX_HINT_DOCCHANGED kommt nicht nur bei Dokument-Wechsel
952 
953                 case SC_HINT_NAVIGATOR_UPDATEALL:
954                     UpdateAll();
955                     break;
956 
957                 case FID_DATACHANGED:
958                 case FID_ANYDATACHANGED:
959                     aContentTimer.Start();      // Notizen nicht sofort suchen
960                     break;
961 
962                 default:
963                     break;
964             }
965         }
966     }
967     else if ( rHint.ISA(SfxEventHint) )
968     {
969         sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId();
970         if ( nEventId == SFX_EVENT_ACTIVATEDOC )
971         {
972             aLbEntries.ActiveDocChanged();
973             UpdateAll();
974         }
975     }
976 }
977 
978 //------------------------------------------------------------------------
979 
980 IMPL_LINK( ScNavigatorDlg, TimeHdl, Timer*, pTimer )
981 {
982     if ( pTimer != &aContentTimer )
983         return 0;
984 
985     aLbEntries.Refresh( SC_CONTENT_NOTE );
986     return 0;
987 }
988 
989 //------------------------------------------------------------------------
990 
991 void ScNavigatorDlg::SetDropMode(sal_uInt16 nNew)
992 {
993     nDropMode = nNew;
994     aTbxCmd.UpdateButtons();
995 
996     ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
997     rCfg.SetDragMode(nDropMode);
998 }
999 
1000 //------------------------------------------------------------------------
1001 
1002 void ScNavigatorDlg::CursorPosChanged()
1003 {
1004     //! Eintraege selektieren ???
1005 
1006 //  if ( GetDBAtCursor( aStrDbName ) )
1007 //  if ( GetAreaAtCursor( aStrAreaName ) )
1008 }
1009 
1010 //------------------------------------------------------------------------
1011 
1012 void ScNavigatorDlg::SetCurrentCell( SCCOL nColNo, SCROW nRowNo )
1013 {
1014     if ( (nColNo+1 != nCurCol) || (nRowNo+1 != nCurRow) )
1015     {
1016         // SID_CURRENTCELL == Item #0 Cache leeren, damit das Setzen der
1017         // aktuellen Zelle auch in zusammengefassten Bereichen funktioniert.
1018         ppBoundItems[0]->ClearCache();
1019 
1020         ScAddress aScAddress( nColNo, nRowNo, 0 );
1021         String  aAddr;
1022         aScAddress.Format( aAddr, SCA_ABS );
1023 
1024         sal_Bool bUnmark = sal_False;
1025         if ( GetViewData() )
1026             bUnmark = !pViewData->GetMarkData().IsCellMarked( nColNo, nRowNo );
1027 
1028         SfxStringItem   aPosItem( SID_CURRENTCELL, aAddr );
1029         SfxBoolItem     aUnmarkItem( FN_PARAM_1, bUnmark );     // ggf. Selektion aufheben
1030 
1031         rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
1032                                   SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1033                                   &aPosItem, &aUnmarkItem, 0L );
1034     }
1035 }
1036 
1037 void ScNavigatorDlg::SetCurrentCellStr( const String rName )
1038 {
1039     ppBoundItems[0]->ClearCache();
1040     SfxStringItem   aNameItem( SID_CURRENTCELL, rName );
1041 
1042     rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
1043                               SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1044                               &aNameItem, 0L );
1045 }
1046 
1047 //------------------------------------------------------------------------
1048 
1049 void ScNavigatorDlg::SetCurrentTable( SCTAB nTabNo )
1050 {
1051     if ( nTabNo != nCurTab )
1052     {
1053         //  Tabelle fuer Basic ist 1-basiert
1054         SfxUInt16Item aTabItem( SID_CURRENTTAB, static_cast<sal_uInt16>(nTabNo) + 1 );
1055         rBindings.GetDispatcher()->Execute( SID_CURRENTTAB,
1056                                   SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1057                                   &aTabItem, 0L );
1058     }
1059 }
1060 
1061 void ScNavigatorDlg::SetCurrentTableStr( const String rName )
1062 {
1063     if (!GetViewData()) return;
1064 
1065     ScDocument* pDoc = pViewData->GetDocument();
1066     SCTAB nCount     = pDoc->GetTableCount();
1067     String aTabName;
1068 
1069     for ( SCTAB i=0; i<nCount; i++ )
1070     {
1071         pDoc->GetName( i, aTabName );
1072         if ( aTabName == rName )
1073         {
1074             SetCurrentTable( i );
1075             return;
1076         }
1077     }
1078 
1079     Sound::Beep();                  // Tabelle nicht gefunden
1080 }
1081 
1082 //------------------------------------------------------------------------
1083 
1084 void ScNavigatorDlg::SetCurrentObject( const String rName )
1085 {
1086     SfxStringItem aNameItem( SID_CURRENTOBJECT, rName );
1087     rBindings.GetDispatcher()->Execute( SID_CURRENTOBJECT,
1088                               SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1089                               &aNameItem, 0L );
1090 }
1091 
1092 //------------------------------------------------------------------------
1093 
1094 void ScNavigatorDlg::SetCurrentDoc( const String& rDocName )        // aktivieren
1095 {
1096     SfxStringItem aDocItem( SID_CURRENTDOC, rDocName );
1097     rBindings.GetDispatcher()->Execute( SID_CURRENTDOC,
1098                               SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1099                               &aDocItem, 0L );
1100 }
1101 
1102 //------------------------------------------------------------------------
1103 
1104 ScTabViewShell* ScNavigatorDlg::GetTabViewShell() const
1105 {
1106     return PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
1107 }
1108 
1109 //------------------------------------------------------------------------
1110 
1111 ScNavigatorSettings* ScNavigatorDlg::GetNavigatorSettings()
1112 {
1113     //  #95791# Don't store the settings pointer here, because the settings belong to
1114     //  the view, and the view may be closed while the navigator is open (reload).
1115     //  If the pointer is cached here again later for performance reasons, it has to
1116     //  be forgotten when the view is closed.
1117 
1118     ScTabViewShell* pViewSh = GetTabViewShell();
1119     return pViewSh ? pViewSh->GetNavigatorSettings() : NULL;
1120 }
1121 
1122 //------------------------------------------------------------------------
1123 
1124 sal_Bool ScNavigatorDlg::GetViewData()
1125 {
1126     ScTabViewShell* pViewSh = GetTabViewShell();
1127     pViewData = pViewSh ? pViewSh->GetViewData() : NULL;
1128 
1129     return ( pViewData != NULL );
1130 }
1131 
1132 //------------------------------------------------------------------------
1133 
1134 void ScNavigatorDlg::UpdateColumn( const SCCOL* pCol )
1135 {
1136     if ( pCol )
1137         nCurCol = *pCol;
1138     else if ( GetViewData() )
1139         nCurCol = pViewData->GetCurX() + 1;
1140 
1141     aEdCol.SetCol( nCurCol );
1142     CheckDataArea();
1143 }
1144 
1145 //------------------------------------------------------------------------
1146 
1147 void ScNavigatorDlg::UpdateRow( const SCROW* pRow )
1148 {
1149     if ( pRow )
1150         nCurRow = *pRow;
1151     else if ( GetViewData() )
1152         nCurRow = pViewData->GetCurY() + 1;
1153 
1154     aEdRow.SetRow( nCurRow );
1155     CheckDataArea();
1156 }
1157 
1158 //------------------------------------------------------------------------
1159 
1160 void ScNavigatorDlg::UpdateTable( const SCTAB* pTab )
1161 {
1162     if ( pTab )
1163         nCurTab = *pTab;
1164     else if ( GetViewData() )
1165         nCurTab = pViewData->GetTabNo();
1166 
1167 //  aLbTables.SetTab( nCurTab );
1168     CheckDataArea();
1169 }
1170 
1171 //------------------------------------------------------------------------
1172 
1173 void ScNavigatorDlg::UpdateAll()
1174 {
1175     switch ( eListMode )
1176     {
1177         case NAV_LMODE_DOCS:
1178         case NAV_LMODE_DBAREAS:
1179         case NAV_LMODE_AREAS:
1180             aLbEntries.Refresh();
1181             break;
1182 
1183         case NAV_LMODE_NONE:
1184             //! ???
1185             break;
1186 
1187         default:
1188             break;
1189     }
1190 
1191     aContentTimer.Stop();       // dann nicht nochmal
1192 }
1193 
1194 //------------------------------------------------------------------------
1195 
1196 void ScNavigatorDlg::SetListMode( NavListMode eMode, sal_Bool bSetSize )
1197 {
1198     if ( eMode != eListMode )
1199     {
1200         if ( eMode != NAV_LMODE_NONE )
1201             bFirstBig = sal_False;              // nicht mehr automatisch umschalten
1202 
1203         eListMode = eMode;
1204 
1205         switch ( eMode )
1206         {
1207             case NAV_LMODE_NONE:
1208                 ShowList( sal_False, bSetSize );
1209                 break;
1210 
1211             case NAV_LMODE_AREAS:
1212             case NAV_LMODE_DBAREAS:
1213             case NAV_LMODE_DOCS:
1214                 aLbEntries.Refresh();
1215                 ShowList( sal_True, bSetSize );
1216                 break;
1217 
1218             case NAV_LMODE_SCENARIOS:
1219                 ShowScenarios( sal_True, bSetSize );
1220                 break;
1221         }
1222 
1223         aTbxCmd.UpdateButtons();
1224 
1225         if ( eMode != NAV_LMODE_NONE )
1226         {
1227             ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
1228             rCfg.SetListMode( (sal_uInt16) eMode );
1229         }
1230     }
1231 
1232     if ( pMarkArea )
1233         UnmarkDataArea();
1234 }
1235 
1236 //------------------------------------------------------------------------
1237 
1238 void ScNavigatorDlg::ShowList( sal_Bool bShow, sal_Bool bSetSize )
1239 {
1240     FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
1241     Size aSize = GetParent()->GetOutputSizePixel();
1242 
1243     if ( bShow )
1244     {
1245         Size aMinSize = aInitSize;
1246 
1247         aMinSize.Height() += nInitListHeight;
1248         if ( pFloat )
1249             pFloat->SetMinOutputSizePixel( aMinSize );
1250         aSize.Height() = nListModeHeight;
1251         aLbEntries.Show();
1252         aLbDocuments.Show();
1253     }
1254     else
1255     {
1256         if ( pFloat )
1257         {
1258             pFloat->SetMinOutputSizePixel( aInitSize );
1259             nListModeHeight = aSize.Height();
1260         }
1261         aSize.Height() = aInitSize.Height();
1262         aLbEntries.Hide();
1263         aLbDocuments.Hide();
1264     }
1265     aWndScenarios.Hide();
1266 
1267     if ( pFloat )
1268     {
1269         if ( bSetSize )
1270             pFloat->SetOutputSizePixel( aSize );
1271     }
1272     else
1273     {
1274         SfxNavigator* pNav = (SfxNavigator*)GetParent();
1275         Size aFloating = pNav->GetFloatingSize();
1276         aFloating.Height() = aSize.Height();
1277         pNav->SetFloatingSize( aFloating );
1278     }
1279 }
1280 
1281 //------------------------------------------------------------------------
1282 
1283 void ScNavigatorDlg::ShowScenarios( sal_Bool bShow, sal_Bool bSetSize )
1284 {
1285     FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
1286     Size aSize = GetParent()->GetOutputSizePixel();
1287 
1288     if ( bShow )
1289     {
1290         Size aMinSize = aInitSize;
1291         aMinSize.Height() += nInitListHeight;
1292         if ( pFloat )
1293             pFloat->SetMinOutputSizePixel( aMinSize );
1294         aSize.Height() = nListModeHeight;
1295 
1296         rBindings.Invalidate( SID_SELECT_SCENARIO );
1297         rBindings.Update( SID_SELECT_SCENARIO );
1298 
1299         aWndScenarios.Show();
1300         aLbDocuments.Show();
1301     }
1302     else
1303     {
1304         if ( pFloat )
1305         {
1306             pFloat->SetMinOutputSizePixel( aInitSize );
1307             nListModeHeight = aSize.Height();
1308         }
1309         aSize.Height() = aInitSize.Height();
1310         aWndScenarios.Hide();
1311         aLbDocuments.Hide();
1312     }
1313     aLbEntries.Hide();
1314 
1315     if ( pFloat )
1316     {
1317         if ( bSetSize )
1318             pFloat->SetOutputSizePixel( aSize );
1319     }
1320     else
1321     {
1322         SfxNavigator* pNav = (SfxNavigator*)GetParent();
1323         Size aFloating = pNav->GetFloatingSize();
1324         aFloating.Height() = aSize.Height();
1325         pNav->SetFloatingSize( aFloating );
1326     }
1327 }
1328 
1329 
1330 //------------------------------------------------------------------------
1331 //
1332 //      Dokumente fuer Dropdown-Listbox
1333 //
1334 //------------------------------------------------------------------------
1335 
1336 void ScNavigatorDlg::GetDocNames( const String* pManualSel )
1337 {
1338     aLbDocuments.Clear();
1339     aLbDocuments.SetUpdateMode( sal_False );
1340 
1341     ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
1342 
1343     String aSelEntry;
1344     SfxObjectShell* pSh = SfxObjectShell::GetFirst();
1345     while ( pSh )
1346     {
1347         if ( pSh->ISA(ScDocShell) )
1348         {
1349             String aName = pSh->GetTitle();
1350             String aEntry = aName;
1351             if (pSh == pCurrentSh)
1352                 aEntry += aStrActive;
1353             else
1354                 aEntry += aStrNotActive;
1355             aLbDocuments.InsertEntry( aEntry );
1356 
1357             if ( pManualSel ? ( aName == *pManualSel )
1358                             : ( pSh == pCurrentSh ) )
1359                 aSelEntry = aEntry;                     // kompletter Eintrag zum Selektieren
1360         }
1361 
1362         pSh = SfxObjectShell::GetNext( *pSh );
1363     }
1364 
1365     aLbDocuments.InsertEntry( aStrActiveWin );
1366 
1367     String aHidden =  aLbEntries.GetHiddenTitle();
1368     if (aHidden.Len())
1369     {
1370         String aEntry = aHidden;
1371         aEntry += aStrHidden;
1372         aLbDocuments.InsertEntry( aEntry );
1373 
1374         if ( pManualSel && aHidden == *pManualSel )
1375             aSelEntry = aEntry;
1376     }
1377 
1378     aLbDocuments.SetUpdateMode( sal_True );
1379 
1380     aLbDocuments.SelectEntry( aSelEntry );
1381 }
1382 
1383 //------------------------------------------------------------------------
1384 
1385 void ScNavigatorDlg::MarkDataArea()
1386 {
1387     ScTabViewShell* pViewSh = GetTabViewShell();
1388 
1389     if ( pViewSh )
1390     {
1391         if ( !pMarkArea )
1392             pMarkArea = new ScArea;
1393 
1394         pViewSh->MarkDataArea();
1395         ScRange aMarkRange;
1396         pViewSh->GetViewData()->GetMarkData().GetMarkArea(aMarkRange);
1397         pMarkArea->nColStart = aMarkRange.aStart.Col();
1398         pMarkArea->nRowStart = aMarkRange.aStart.Row();
1399         pMarkArea->nColEnd = aMarkRange.aEnd.Col();
1400         pMarkArea->nRowEnd = aMarkRange.aEnd.Row();
1401         pMarkArea->nTab = aMarkRange.aStart.Tab();
1402     }
1403 }
1404 
1405 //------------------------------------------------------------------------
1406 
1407 void ScNavigatorDlg::UnmarkDataArea()
1408 {
1409     ScTabViewShell* pViewSh = GetTabViewShell();
1410 
1411     if ( pViewSh )
1412     {
1413         pViewSh->Unmark();
1414         DELETEZ( pMarkArea );
1415     }
1416 }
1417 
1418 //------------------------------------------------------------------------
1419 
1420 void ScNavigatorDlg::CheckDataArea()
1421 {
1422     if ( aTbxCmd.IsItemChecked( IID_DATA ) && pMarkArea )
1423     {
1424         if (   nCurTab   != pMarkArea->nTab
1425             || nCurCol <  pMarkArea->nColStart+1
1426             || nCurCol >  pMarkArea->nColEnd+1
1427             || nCurRow <  pMarkArea->nRowStart+1
1428             || nCurRow >  pMarkArea->nRowEnd+1 )
1429         {
1430             aTbxCmd.SetItemState( IID_DATA, TriState(STATE_CHECK) );
1431             aTbxCmd.Select( IID_DATA );
1432         }
1433     }
1434 }
1435 
1436 //------------------------------------------------------------------------
1437 
1438 void ScNavigatorDlg::StartOfDataArea()
1439 {
1440     //  pMarkArea auswerten ???
1441 
1442     if ( GetViewData() )
1443     {
1444         ScMarkData& rMark = pViewData->GetMarkData();
1445         ScRange aMarkRange;
1446         rMark.GetMarkArea( aMarkRange );
1447 
1448         SCCOL nCol = aMarkRange.aStart.Col();
1449         SCROW nRow = aMarkRange.aStart.Row();
1450 
1451         if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
1452             SetCurrentCell( nCol, nRow );
1453     }
1454 }
1455 
1456 //------------------------------------------------------------------------
1457 
1458 void ScNavigatorDlg::EndOfDataArea()
1459 {
1460     //  pMarkArea auswerten ???
1461 
1462     if ( GetViewData() )
1463     {
1464         ScMarkData& rMark = pViewData->GetMarkData();
1465         ScRange aMarkRange;
1466         rMark.GetMarkArea( aMarkRange );
1467 
1468         SCCOL nCol = aMarkRange.aEnd.Col();
1469         SCROW nRow = aMarkRange.aEnd.Row();
1470 
1471         if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
1472             SetCurrentCell( nCol, nRow );
1473     }
1474 }
1475 
1476 //------------------------------------------------------------------------
1477 
1478 SfxChildAlignment __EXPORT ScNavigatorDlg::CheckAlignment(
1479                             SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
1480 {
1481     SfxChildAlignment eRetAlign;
1482 
1483     //! kein Andocken, wenn Listbox nicht da ???
1484 
1485     switch (eAlign)
1486     {
1487         case SFX_ALIGN_TOP:
1488         case SFX_ALIGN_HIGHESTTOP:
1489         case SFX_ALIGN_LOWESTTOP:
1490         case SFX_ALIGN_BOTTOM:
1491         case SFX_ALIGN_LOWESTBOTTOM:
1492         case SFX_ALIGN_HIGHESTBOTTOM:
1493             eRetAlign = eActAlign;              // nicht erlaubt
1494             break;
1495 
1496         case SFX_ALIGN_LEFT:
1497         case SFX_ALIGN_RIGHT:
1498         case SFX_ALIGN_FIRSTLEFT:
1499         case SFX_ALIGN_LASTLEFT:
1500         case SFX_ALIGN_FIRSTRIGHT:
1501         case SFX_ALIGN_LASTRIGHT:
1502             eRetAlign = eAlign;                 // erlaubt
1503             break;
1504 
1505         default:
1506             eRetAlign = eAlign;
1507             break;
1508     }
1509     return eRetAlign;
1510 }
1511 
1512 //------------------------------------------------------------------------
1513 //
1514 //  Drop auf den Navigator - andere Datei laden (File oder Bookmark)
1515 //
1516 //------------------------------------------------------------------------
1517 
1518 #if 0
1519 sal_Bool __EXPORT ScNavigatorDlg::Drop( const DropEvent& rEvt )
1520 {
1521     sal_Bool bReturn = sal_False;
1522 
1523     if ( !aLbEntries.IsInDrag() )       // kein Verschieben innerhalb der TreeListBox
1524     {
1525         String aFileName;
1526 
1527         SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
1528 
1529         sal_uLong nFormat = INetBookmark::HasFormat(*pObject);
1530         INetBookmark aBookmark;
1531         if (aBookmark.Paste(*pObject,nFormat))
1532             aFileName = aBookmark.GetURL();
1533         else
1534         {
1535             //  FORMAT_FILE direkt aus DragServer
1536 
1537             sal_uInt16 nCount = DragServer::GetItemCount();
1538             for ( sal_uInt16 i = 0; i < nCount && !aFileName.Len(); ++i )
1539                 if (DragServer::HasFormat( i, FORMAT_FILE ))
1540                     aFileName = DragServer::PasteFile( i );
1541         }
1542 
1543         if ( aFileName.Len() )
1544             bReturn = aLbEntries.LoadFile( aFileName );
1545     }
1546     return bReturn;
1547 }
1548 
1549 sal_Bool __EXPORT ScNavigatorDlg::QueryDrop( DropEvent& rEvt )
1550 {
1551     sal_Bool bReturn = sal_False;
1552 
1553     if ( !aLbEntries.IsInDrag() )       // kein Verschieben innerhalb der TreeListBox
1554     {
1555         SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
1556         if ( pObject->HasFormat(FORMAT_FILE)
1557             || INetBookmark::HasFormat(*pObject) )
1558         {
1559             rEvt.SetAction(DROP_COPY);      // Kopier-Cursor anzeigen
1560             bReturn = sal_True;
1561         }
1562     }
1563 
1564     return bReturn;
1565 }
1566 #endif
1567 
1568 
1569 
1570