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