xref: /trunk/main/sc/source/ui/navipi/navipi.cxx (revision 4d7c9de0)
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
ReleaseFocus()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 
ColumnEdit(ScNavigatorDlg * pParent,const ResId & rResId)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 
~ColumnEdit()106 __EXPORT ColumnEdit::~ColumnEdit()
107 {
108 }
109 
110 //------------------------------------------------------------------------
111 
Notify(NotifyEvent & rNEvt)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 
LoseFocus()144 void __EXPORT ColumnEdit::LoseFocus()
145 {
146 	EvalText();
147 }
148 
149 
150 //------------------------------------------------------------------------
151 
Up()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 
Down()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 
First()181 void __EXPORT ColumnEdit::First()
182 {
183     nCol = 1;
184 	SetText( 'A' );
185 }
186 
187 //------------------------------------------------------------------------
188 
Last()189 void __EXPORT ColumnEdit::Last()
190 {
191     String aStr;
192     nCol = NumToAlpha( SCNAV_MAXCOL, aStr );
193     SetText( aStr );
194 }
195 
196 
197 //------------------------------------------------------------------------
198 
EvalText()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 
ExecuteCol()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 
SetCol(SCCOL nColNo)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 
AlphaToNum(String & rStr)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 
NumStrToAlpha(String & rStr)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 
NumToAlpha(SCCOL nColNo,String & rStr)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 
RowEdit(ScNavigatorDlg * pParent,const ResId & rResId)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 
~RowEdit()317 __EXPORT RowEdit::~RowEdit()
318 {
319 }
320 
321 //------------------------------------------------------------------------
322 
Notify(NotifyEvent & rNEvt)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 
LoseFocus()344 void __EXPORT RowEdit::LoseFocus()
345 {
346 }
347 
348 //------------------------------------------------------------------------
349 
ExecuteRow()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 
ScDocListBox(ScNavigatorDlg * pParent,const ResId & rResId)363 ScDocListBox::ScDocListBox( ScNavigatorDlg* pParent, const ResId& rResId )
364 	:	ListBox	( pParent, rResId ),
365 		rDlg	( *pParent )
366 {
367 }
368 
369 //------------------------------------------------------------------------
370 
~ScDocListBox()371 __EXPORT ScDocListBox::~ScDocListBox()
372 {
373 }
374 
375 //------------------------------------------------------------------------
376 
Select()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 
CommandToolBox(ScNavigatorDlg * pParent,const ResId & rResId)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 
~CommandToolBox()404 __EXPORT CommandToolBox::~CommandToolBox()
405 {
406 }
407 
408 //------------------------------------------------------------------------
409 
Select(sal_uInt16 nSelId)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 
Select()456 void __EXPORT CommandToolBox::Select()
457 {
458 	Select( GetCurItemId() );
459 }
460 
461 //------------------------------------------------------------------------
462 
Click()463 void __EXPORT CommandToolBox::Click()
464 {
465 }
466 
467 //------------------------------------------------------------------------
468 
IMPL_LINK(CommandToolBox,ToolBoxDropdownClickHdl,ToolBox *,EMPTYARG)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 
UpdateButtons()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 
InitImageList()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 
DataChanged(const DataChangedEvent & rDCEvt)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 
ScNavigatorSettings()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 
SFX_IMPL_CHILDWINDOWCONTEXT(ScNavigatorDialogWrapper,SID_NAVIGATOR)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 
Resizing(Size & rSize)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 
ScNavigatorDlg(SfxBindings * pB,SfxChildWindowContext * pCW,Window * pParent,const bool bUseStyleSettingsBackground)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 	aLbEntries.SetNavigatorDlgFlag(sal_True);
789 }
790 
791 //------------------------------------------------------------------------
792 
~ScNavigatorDlg()793 __EXPORT ScNavigatorDlg::~ScNavigatorDlg()
794 {
795 	aContentTimer.Stop();
796 
797 	sal_uInt16 i;
798 	for ( i=0; i<CTRL_ITEMS; i++ )
799 		delete ppBoundItems[i];
800 
801 	delete [] ppBoundItems;
802 	delete pMarkArea;
803 
804 	EndListening( *(SFX_APP()) );
805 	EndListening( rBindings );
806 }
807 
808 //------------------------------------------------------------------------
809 
Resizing(Size & rNewSize)810 void __EXPORT ScNavigatorDlg::Resizing( Size& rNewSize )  // Size = Outputsize?
811 {
812 	FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
813 	if ( pFloat )
814 	{
815 		Size aMinOut = pFloat->GetMinOutputSizePixel();
816 
817 		if ( rNewSize.Width() < aMinOut.Width() )
818 			rNewSize.Width() = aMinOut.Width();
819 
820 		if ( eListMode == NAV_LMODE_NONE )
821 			rNewSize.Height() = aInitSize.Height();
822 		else
823 		{
824 			if ( rNewSize.Height() < aMinOut.Height() )
825 				rNewSize.Height() = aMinOut.Height();
826 		}
827 	}
828 //	else
829 //		SfxDockingWindow::Resizing(rNewSize);
830 }
831 
832 
833 
Paint(const Rectangle & rRec)834 void ScNavigatorDlg::Paint( const Rectangle& rRec )
835 {
836     if (mbUseStyleSettingsBackground)
837     {
838         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
839         Color aBgColor = rStyleSettings.GetFaceColor();
840         Wallpaper aBack( aBgColor );
841 
842         SetBackground( aBack );
843         aFtCol.SetBackground( aBack );
844         aFtRow.SetBackground( aBack );
845     }
846     else
847     {
848         aFtCol.SetBackground(Wallpaper());
849         aFtRow.SetBackground(Wallpaper());
850     }
851 
852 	Window::Paint( rRec );
853 }
854 
DataChanged(const DataChangedEvent & rDCEvt)855 void ScNavigatorDlg::DataChanged( const DataChangedEvent& rDCEvt )
856 {
857 	if ( rDCEvt.GetType() == DATACHANGED_SETTINGS && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
858 	{
859 		//	toolbox images are exchanged in CommandToolBox::DataChanged
860 		Invalidate();
861 	}
862 
863     Window::DataChanged( rDCEvt );
864 }
865 
866 //------------------------------------------------------------------------
867 
Resize()868 void __EXPORT ScNavigatorDlg::Resize()
869 {
870 	DoResize();
871 }
872 
873 //------------------------------------------------------------------------
874 
DoResize()875 void ScNavigatorDlg::DoResize()
876 {
877 	Size aNewSize = GetOutputSizePixel();
878 	long nTotalHeight = aNewSize.Height();
879 
880 	//	#41403# bei angedocktem Navigator wird das Fenster evtl. erst klein erzeugt,
881 	//	dann kommt ein Resize auf die wirkliche Groesse -> dann Inhalte einschalten
882 
883 	sal_Bool bSmall = ( nTotalHeight <= aInitSize.Height() + SCNAV_MINTOL );
884 	if ( !bSmall && bFirstBig )
885 	{
886 		//	Inhalte laut Config wieder einschalten
887 
888 		bFirstBig = sal_False;
889 		NavListMode eNavMode = NAV_LMODE_AREAS;
890 		ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
891 		NavListMode eLastMode = (NavListMode) rCfg.GetListMode();
892 		if ( eLastMode == NAV_LMODE_SCENARIOS )
893 			eNavMode = NAV_LMODE_SCENARIOS;
894 		SetListMode( eNavMode, sal_False );			// FALSE: Groesse des Float nicht setzen
895 	}
896 
897 	//	auch wenn die Inhalte nicht sichtbar sind, die Groessen anpassen,
898 	//	damit die Breite stimmt
899 
900 	//@@ 03.11.97 changes begin
901 	Point aEntryPos = aLbEntries.GetPosPixel();
902 	Point aListPos = aLbDocuments.GetPosPixel();
903 	aNewSize.Width() -= 2*nBorderOffset;
904 	Size aDocSize = aLbDocuments.GetSizePixel();
905 	aDocSize.Width() = aNewSize.Width();
906 
907 	if(!bSmall)
908 	{
909 
910 		long nListHeight = aLbDocuments.GetSizePixel().Height();
911 		aNewSize.Height() -= ( aEntryPos.Y() + nListHeight + 2*nBorderOffset );
912 		if(aNewSize.Height()<0)	aNewSize.Height()=0;
913 
914 		aListPos.Y() = aEntryPos.Y() + aNewSize.Height() + nBorderOffset;
915 
916 		if(aListPos.Y() > aLbEntries.GetPosPixel().Y())
917 							aLbDocuments.SetPosPixel( aListPos );
918 
919 	}
920 	aLbEntries.SetSizePixel( aNewSize );
921 	aWndScenarios.SetSizePixel( aNewSize );
922 	aLbDocuments.SetSizePixel( aDocSize );
923 
924 	//@@ 03.11.97 end
925 
926 	sal_Bool bListMode = (eListMode != NAV_LMODE_NONE);
927     if (pContextWin != NULL)
928     {
929         FloatingWindow* pFloat = pContextWin->GetFloatingWindow();
930         if ( pFloat && bListMode )
931             nListModeHeight = nTotalHeight;
932     }
933 }
934 
935 //------------------------------------------------------------------------
936 
Notify(SfxBroadcaster &,const SfxHint & rHint)937 void __EXPORT ScNavigatorDlg::Notify( SfxBroadcaster&, const SfxHint& rHint )
938 {
939 	if ( rHint.ISA(SfxSimpleHint) )
940 	{
941 		sal_uLong nHintId = ((SfxSimpleHint&)rHint).GetId();
942 
943 		if ( nHintId == SC_HINT_DOCNAME_CHANGED )
944 		{
945 			aLbEntries.ActiveDocChanged();
946 		}
947 		else if ( NAV_LMODE_NONE == eListMode )
948 		{
949 			//	Tabellen hier nicht mehr
950 		}
951 		else
952 		{
953 			switch ( nHintId )
954 			{
955 				case SC_HINT_TABLES_CHANGED:
956 					aLbEntries.Refresh( SC_CONTENT_TABLE );
957 					break;
958 
959 				case SC_HINT_DBAREAS_CHANGED:
960 					aLbEntries.Refresh( SC_CONTENT_DBAREA );
961 					break;
962 
963 				case SC_HINT_AREAS_CHANGED:
964 					aLbEntries.Refresh( SC_CONTENT_RANGENAME );
965 					break;
966 
967 				case SC_HINT_DRAW_CHANGED:
968 					aLbEntries.Refresh( SC_CONTENT_GRAPHIC );
969 					aLbEntries.Refresh( SC_CONTENT_OLEOBJECT );
970 					aLbEntries.Refresh( SC_CONTENT_DRAWING );
971 					break;
972 
973 				case SC_HINT_AREALINKS_CHANGED:
974 					aLbEntries.Refresh( SC_CONTENT_AREALINK );
975 					break;
976 
977 				//	SFX_HINT_DOCCHANGED kommt nicht nur bei Dokument-Wechsel
978 
979 				case SC_HINT_NAVIGATOR_UPDATEALL:
980 					UpdateAll();
981 					break;
982 
983 				case FID_DATACHANGED:
984 				case FID_ANYDATACHANGED:
985 					aContentTimer.Start();		// Notizen nicht sofort suchen
986 					break;
987 				case FID_KILLEDITVIEW:
988 					aLbEntries.ObjectFresh( SC_CONTENT_OLEOBJECT );
989 					aLbEntries.ObjectFresh( SC_CONTENT_DRAWING );
990 					aLbEntries.ObjectFresh( SC_CONTENT_GRAPHIC );
991 				      break;
992 				default:
993 					break;
994 			}
995 		}
996 	}
997 	else if ( rHint.ISA(SfxEventHint) )
998 	{
999 		sal_uLong nEventId = ((SfxEventHint&)rHint).GetEventId();
1000 		if ( nEventId == SFX_EVENT_ACTIVATEDOC )
1001 		{
1002 			aLbEntries.ActiveDocChanged();
1003 			UpdateAll();
1004 		}
1005 	}
1006 }
1007 
1008 //------------------------------------------------------------------------
1009 
IMPL_LINK(ScNavigatorDlg,TimeHdl,Timer *,pTimer)1010 IMPL_LINK( ScNavigatorDlg, TimeHdl, Timer*, pTimer )
1011 {
1012 	if ( pTimer != &aContentTimer )
1013 		return 0;
1014 
1015 	aLbEntries.Refresh( SC_CONTENT_NOTE );
1016 	return 0;
1017 }
1018 
1019 //------------------------------------------------------------------------
1020 
SetDropMode(sal_uInt16 nNew)1021 void ScNavigatorDlg::SetDropMode(sal_uInt16 nNew)
1022 {
1023 	nDropMode = nNew;
1024 	aTbxCmd.UpdateButtons();
1025 
1026 	ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
1027 	rCfg.SetDragMode(nDropMode);
1028 }
1029 
1030 //------------------------------------------------------------------------
1031 
CursorPosChanged()1032 void ScNavigatorDlg::CursorPosChanged()
1033 {
1034 	//!	Eintraege selektieren ???
1035 
1036 //	if ( GetDBAtCursor( aStrDbName ) )
1037 //	if ( GetAreaAtCursor( aStrAreaName ) )
1038 }
1039 
1040 //------------------------------------------------------------------------
1041 
SetCurrentCell(SCCOL nColNo,SCROW nRowNo)1042 void ScNavigatorDlg::SetCurrentCell( SCCOL nColNo, SCROW nRowNo )
1043 {
1044 	if ( (nColNo+1 != nCurCol) || (nRowNo+1 != nCurRow) )
1045 	{
1046 		// SID_CURRENTCELL == Item #0 Cache leeren, damit das Setzen der
1047 		// aktuellen Zelle auch in zusammengefassten Bereichen funktioniert.
1048 		ppBoundItems[0]->ClearCache();
1049 
1050 		ScAddress aScAddress( nColNo, nRowNo, 0 );
1051 		String	aAddr;
1052 		aScAddress.Format( aAddr, SCA_ABS );
1053 
1054 		sal_Bool bUnmark = sal_False;
1055 		if ( GetViewData() )
1056 			bUnmark = !pViewData->GetMarkData().IsCellMarked( nColNo, nRowNo );
1057 
1058 		SfxStringItem	aPosItem( SID_CURRENTCELL, aAddr );
1059 		SfxBoolItem		aUnmarkItem( FN_PARAM_1, bUnmark );		// ggf. Selektion aufheben
1060 
1061 		rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
1062 								  SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1063 								  &aPosItem, &aUnmarkItem, 0L );
1064 	}
1065 }
1066 
SetCurrentCellStr(const String rName)1067 void ScNavigatorDlg::SetCurrentCellStr( const String rName )
1068 {
1069 	ppBoundItems[0]->ClearCache();
1070 	SfxStringItem	aNameItem( SID_CURRENTCELL, rName );
1071 
1072 	rBindings.GetDispatcher()->Execute( SID_CURRENTCELL,
1073 							  SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1074 							  &aNameItem, 0L );
1075 }
1076 
1077 //------------------------------------------------------------------------
1078 
SetCurrentTable(SCTAB nTabNo)1079 void ScNavigatorDlg::SetCurrentTable( SCTAB nTabNo )
1080 {
1081 	if ( nTabNo != nCurTab )
1082 	{
1083 		//	Tabelle fuer Basic ist 1-basiert
1084 		SfxUInt16Item aTabItem( SID_CURRENTTAB, static_cast<sal_uInt16>(nTabNo) + 1 );
1085 		rBindings.GetDispatcher()->Execute( SID_CURRENTTAB,
1086 								  SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1087 								  &aTabItem, 0L );
1088 	}
1089 }
1090 
SetCurrentTableStr(const String rName)1091 void ScNavigatorDlg::SetCurrentTableStr( const String rName )
1092 {
1093 	if (!GetViewData()) return;
1094 
1095 	ScDocument* pDoc = pViewData->GetDocument();
1096 	SCTAB nCount	 = pDoc->GetTableCount();
1097 	String aTabName;
1098 
1099 	for ( SCTAB i=0; i<nCount; i++ )
1100 	{
1101 		pDoc->GetName( i, aTabName );
1102 		if ( aTabName == rName )
1103 		{
1104 			SetCurrentTable( i );
1105 			return;
1106 		}
1107 	}
1108 
1109 	Sound::Beep();					// Tabelle nicht gefunden
1110 }
1111 
1112 //------------------------------------------------------------------------
1113 
SetCurrentObject(const String rName)1114 void ScNavigatorDlg::SetCurrentObject( const String rName )
1115 {
1116 	SfxStringItem aNameItem( SID_CURRENTOBJECT, rName );
1117 	rBindings.GetDispatcher()->Execute( SID_CURRENTOBJECT,
1118 							  SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1119 							  &aNameItem, 0L );
1120 }
1121 
1122 //------------------------------------------------------------------------
1123 
SetCurrentDoc(const String & rDocName)1124 void ScNavigatorDlg::SetCurrentDoc( const String& rDocName )		// aktivieren
1125 {
1126 	SfxStringItem aDocItem( SID_CURRENTDOC, rDocName );
1127 	rBindings.GetDispatcher()->Execute( SID_CURRENTDOC,
1128 							  SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD,
1129 							  &aDocItem, 0L );
1130 }
1131 
1132 //------------------------------------------------------------------------
1133 
GetTabViewShell() const1134 ScTabViewShell* ScNavigatorDlg::GetTabViewShell() const
1135 {
1136     return PTR_CAST( ScTabViewShell, SfxViewShell::Current() );
1137 }
1138 
1139 //------------------------------------------------------------------------
1140 
GetNavigatorSettings()1141 ScNavigatorSettings* ScNavigatorDlg::GetNavigatorSettings()
1142 {
1143     //  #95791# Don't store the settings pointer here, because the settings belong to
1144     //  the view, and the view may be closed while the navigator is open (reload).
1145     //  If the pointer is cached here again later for performance reasons, it has to
1146     //  be forgotten when the view is closed.
1147 
1148     ScTabViewShell* pViewSh = GetTabViewShell();
1149     return pViewSh ? pViewSh->GetNavigatorSettings() : NULL;
1150 }
1151 
1152 //------------------------------------------------------------------------
1153 
GetViewData()1154 sal_Bool ScNavigatorDlg::GetViewData()
1155 {
1156     ScTabViewShell* pViewSh = GetTabViewShell();
1157 	pViewData = pViewSh ? pViewSh->GetViewData() : NULL;
1158 
1159 	return ( pViewData != NULL );
1160 }
1161 
1162 //------------------------------------------------------------------------
1163 
UpdateColumn(const SCCOL * pCol)1164 void ScNavigatorDlg::UpdateColumn( const SCCOL* pCol )
1165 {
1166 	if ( pCol )
1167 		nCurCol = *pCol;
1168 	else if ( GetViewData() )
1169 		nCurCol = pViewData->GetCurX() + 1;
1170 
1171 	aEdCol.SetCol( nCurCol );
1172 	CheckDataArea();
1173 }
1174 
1175 //------------------------------------------------------------------------
1176 
UpdateRow(const SCROW * pRow)1177 void ScNavigatorDlg::UpdateRow( const SCROW* pRow )
1178 {
1179 	if ( pRow )
1180 		nCurRow = *pRow;
1181 	else if ( GetViewData() )
1182 		nCurRow = pViewData->GetCurY() + 1;
1183 
1184 	aEdRow.SetRow( nCurRow );
1185 	CheckDataArea();
1186 }
1187 
1188 //------------------------------------------------------------------------
1189 
UpdateTable(const SCTAB * pTab)1190 void ScNavigatorDlg::UpdateTable( const SCTAB* pTab )
1191 {
1192 	if ( pTab )
1193 		nCurTab = *pTab;
1194 	else if ( GetViewData() )
1195 		nCurTab = pViewData->GetTabNo();
1196 
1197 //	aLbTables.SetTab( nCurTab );
1198 	CheckDataArea();
1199 }
1200 
1201 //------------------------------------------------------------------------
1202 
UpdateAll()1203 void ScNavigatorDlg::UpdateAll()
1204 {
1205 	switch ( eListMode )
1206 	{
1207 		case NAV_LMODE_DOCS:
1208 		case NAV_LMODE_DBAREAS:
1209 		case NAV_LMODE_AREAS:
1210             aLbEntries.Refresh();
1211 			break;
1212 
1213 		case NAV_LMODE_NONE:
1214 			//!	???
1215 			break;
1216 
1217 		default:
1218 			break;
1219 	}
1220 
1221 	aContentTimer.Stop();		// dann nicht nochmal
1222 }
1223 
1224 //------------------------------------------------------------------------
1225 
SetListMode(NavListMode eMode,sal_Bool bSetSize)1226 void ScNavigatorDlg::SetListMode( NavListMode eMode, sal_Bool bSetSize )
1227 {
1228 	if ( eMode != eListMode )
1229 	{
1230 		if ( eMode != NAV_LMODE_NONE )
1231 			bFirstBig = sal_False;				// nicht mehr automatisch umschalten
1232 
1233 		eListMode = eMode;
1234 
1235 		switch ( eMode )
1236 		{
1237 			case NAV_LMODE_NONE:
1238                 ShowList( sal_False, bSetSize );
1239 				break;
1240 
1241 			case NAV_LMODE_AREAS:
1242 			case NAV_LMODE_DBAREAS:
1243 			case NAV_LMODE_DOCS:
1244 				aLbEntries.Refresh();
1245                 ShowList( sal_True, bSetSize );
1246 				break;
1247 
1248 			case NAV_LMODE_SCENARIOS:
1249                 ShowScenarios( sal_True, bSetSize );
1250 				break;
1251 		}
1252 
1253 		aTbxCmd.UpdateButtons();
1254 
1255 		if ( eMode != NAV_LMODE_NONE )
1256 		{
1257             ScNavipiCfg& rCfg = SC_MOD()->GetNavipiCfg();
1258             rCfg.SetListMode( (sal_uInt16) eMode );
1259 		}
1260 	}
1261 
1262 	if ( pMarkArea )
1263 		UnmarkDataArea();
1264 }
1265 
1266 //------------------------------------------------------------------------
1267 
ShowList(sal_Bool bShow,sal_Bool bSetSize)1268 void ScNavigatorDlg::ShowList( sal_Bool bShow, sal_Bool bSetSize )
1269 {
1270 	FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
1271 	Size aSize = GetParent()->GetOutputSizePixel();
1272 
1273 	if ( bShow )
1274 	{
1275 		Size aMinSize = aInitSize;
1276 
1277 		aMinSize.Height() += nInitListHeight;
1278 		if ( pFloat )
1279 			pFloat->SetMinOutputSizePixel( aMinSize );
1280 		aSize.Height() = nListModeHeight;
1281 		aLbEntries.Show();
1282         aLbDocuments.Show();
1283 	}
1284 	else
1285 	{
1286 		if ( pFloat )
1287 		{
1288 			pFloat->SetMinOutputSizePixel( aInitSize );
1289 			nListModeHeight = aSize.Height();
1290 		}
1291 		aSize.Height() = aInitSize.Height();
1292 		aLbEntries.Hide();
1293 		aLbDocuments.Hide();
1294 	}
1295 	aWndScenarios.Hide();
1296 
1297 	if ( pFloat )
1298 	{
1299 		if ( bSetSize )
1300 			pFloat->SetOutputSizePixel( aSize );
1301 	}
1302 	else
1303 	{
1304 		SfxNavigator* pNav = dynamic_cast<SfxNavigator*>(GetParent());
1305         if (pNav != NULL)
1306         {
1307             Size aFloating = pNav->GetFloatingSize();
1308             aFloating.Height() = aSize.Height();
1309             pNav->SetFloatingSize( aFloating );
1310         }
1311 	}
1312 }
1313 
1314 //------------------------------------------------------------------------
1315 
ShowScenarios(sal_Bool bShow,sal_Bool bSetSize)1316 void ScNavigatorDlg::ShowScenarios( sal_Bool bShow, sal_Bool bSetSize )
1317 {
1318 	FloatingWindow* pFloat = pContextWin!=NULL ? pContextWin->GetFloatingWindow() : NULL;
1319 	Size aSize = GetParent()->GetOutputSizePixel();
1320 
1321 	if ( bShow )
1322 	{
1323 		Size aMinSize = aInitSize;
1324 		aMinSize.Height() += nInitListHeight;
1325 		if ( pFloat )
1326 			pFloat->SetMinOutputSizePixel( aMinSize );
1327 		aSize.Height() = nListModeHeight;
1328 
1329 		rBindings.Invalidate( SID_SELECT_SCENARIO );
1330 		rBindings.Update( SID_SELECT_SCENARIO );
1331 
1332 		aWndScenarios.Show();
1333 		aLbDocuments.Show();
1334 	}
1335 	else
1336 	{
1337 		if ( pFloat )
1338 		{
1339 			pFloat->SetMinOutputSizePixel( aInitSize );
1340 			nListModeHeight = aSize.Height();
1341 		}
1342 		aSize.Height() = aInitSize.Height();
1343 		aWndScenarios.Hide();
1344 		aLbDocuments.Hide();
1345 	}
1346 	aLbEntries.Hide();
1347 
1348 	if ( pFloat )
1349 	{
1350 		if ( bSetSize )
1351 			pFloat->SetOutputSizePixel( aSize );
1352 	}
1353 	else
1354 	{
1355 		SfxNavigator* pNav = (SfxNavigator*)GetParent();
1356 		Size aFloating = pNav->GetFloatingSize();
1357 		aFloating.Height() = aSize.Height();
1358 		pNav->SetFloatingSize( aFloating );
1359 	}
1360 }
1361 
1362 
1363 //------------------------------------------------------------------------
1364 //
1365 //		Dokumente fuer Dropdown-Listbox
1366 //
1367 //------------------------------------------------------------------------
1368 
GetDocNames(const String * pManualSel)1369 void ScNavigatorDlg::GetDocNames( const String* pManualSel )
1370 {
1371 	aLbDocuments.Clear();
1372 	aLbDocuments.SetUpdateMode( sal_False );
1373 
1374 	ScDocShell* pCurrentSh = PTR_CAST( ScDocShell, SfxObjectShell::Current() );
1375 
1376 	String aSelEntry;
1377 	SfxObjectShell* pSh = SfxObjectShell::GetFirst();
1378 	while ( pSh )
1379 	{
1380 		if ( pSh->ISA(ScDocShell) )
1381 		{
1382 			String aName = pSh->GetTitle();
1383 			String aEntry = aName;
1384 			if (pSh == pCurrentSh)
1385 				aEntry += aStrActive;
1386 			else
1387 				aEntry += aStrNotActive;
1388 			aLbDocuments.InsertEntry( aEntry );
1389 
1390 			if ( pManualSel ? ( aName == *pManualSel )
1391 							: ( pSh == pCurrentSh ) )
1392 				aSelEntry = aEntry;						// kompletter Eintrag zum Selektieren
1393 		}
1394 
1395 		pSh = SfxObjectShell::GetNext( *pSh );
1396 	}
1397 
1398 	aLbDocuments.InsertEntry( aStrActiveWin );
1399 
1400 	String aHidden =  aLbEntries.GetHiddenTitle();
1401 	if (aHidden.Len())
1402 	{
1403 		String aEntry = aHidden;
1404 		aEntry += aStrHidden;
1405 		aLbDocuments.InsertEntry( aEntry );
1406 
1407 		if ( pManualSel && aHidden == *pManualSel )
1408 			aSelEntry = aEntry;
1409 	}
1410 
1411 	aLbDocuments.SetUpdateMode( sal_True );
1412 
1413 	aLbDocuments.SelectEntry( aSelEntry );
1414 }
1415 
1416 //------------------------------------------------------------------------
1417 
MarkDataArea()1418 void ScNavigatorDlg::MarkDataArea()
1419 {
1420     ScTabViewShell* pViewSh = GetTabViewShell();
1421 
1422 	if ( pViewSh )
1423 	{
1424 		if ( !pMarkArea )
1425 			pMarkArea = new	ScArea;
1426 
1427 		pViewSh->MarkDataArea();
1428 		ScRange aMarkRange;
1429 		pViewSh->GetViewData()->GetMarkData().GetMarkArea(aMarkRange);
1430 		pMarkArea->nColStart = aMarkRange.aStart.Col();
1431 		pMarkArea->nRowStart = aMarkRange.aStart.Row();
1432 		pMarkArea->nColEnd = aMarkRange.aEnd.Col();
1433 		pMarkArea->nRowEnd = aMarkRange.aEnd.Row();
1434 		pMarkArea->nTab = aMarkRange.aStart.Tab();
1435 	}
1436 }
1437 
1438 //------------------------------------------------------------------------
1439 
UnmarkDataArea()1440 void ScNavigatorDlg::UnmarkDataArea()
1441 {
1442     ScTabViewShell* pViewSh = GetTabViewShell();
1443 
1444 	if ( pViewSh )
1445 	{
1446 		pViewSh->Unmark();
1447 		DELETEZ( pMarkArea );
1448 	}
1449 }
1450 
1451 //------------------------------------------------------------------------
1452 
CheckDataArea()1453 void ScNavigatorDlg::CheckDataArea()
1454 {
1455 	if ( aTbxCmd.IsItemChecked( IID_DATA ) && pMarkArea )
1456 	{
1457 		if (   nCurTab   != pMarkArea->nTab
1458 			|| nCurCol <  pMarkArea->nColStart+1
1459 			|| nCurCol >  pMarkArea->nColEnd+1
1460 			|| nCurRow <  pMarkArea->nRowStart+1
1461 			|| nCurRow >  pMarkArea->nRowEnd+1 )
1462 		{
1463 			aTbxCmd.SetItemState( IID_DATA, TriState(STATE_CHECK) );
1464 			aTbxCmd.Select( IID_DATA );
1465 		}
1466 	}
1467 }
1468 
1469 //------------------------------------------------------------------------
1470 
StartOfDataArea()1471 void ScNavigatorDlg::StartOfDataArea()
1472 {
1473 	//	pMarkArea auswerten ???
1474 
1475 	if ( GetViewData() )
1476 	{
1477 		ScMarkData& rMark = pViewData->GetMarkData();
1478 		ScRange aMarkRange;
1479 		rMark.GetMarkArea( aMarkRange );
1480 
1481 		SCCOL nCol = aMarkRange.aStart.Col();
1482 		SCROW nRow = aMarkRange.aStart.Row();
1483 
1484 		if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
1485 			SetCurrentCell( nCol, nRow );
1486 	}
1487 }
1488 
1489 //------------------------------------------------------------------------
1490 
EndOfDataArea()1491 void ScNavigatorDlg::EndOfDataArea()
1492 {
1493 	//	pMarkArea auswerten ???
1494 
1495 	if ( GetViewData() )
1496 	{
1497 		ScMarkData& rMark = pViewData->GetMarkData();
1498 		ScRange aMarkRange;
1499 		rMark.GetMarkArea( aMarkRange );
1500 
1501 		SCCOL nCol = aMarkRange.aEnd.Col();
1502 		SCROW nRow = aMarkRange.aEnd.Row();
1503 
1504 		if ( (nCol+1 != aEdCol.GetCol()) || (nRow+1 != aEdRow.GetRow()) )
1505 			SetCurrentCell( nCol, nRow );
1506 	}
1507 }
1508 
1509 //------------------------------------------------------------------------
1510 
CheckAlignment(SfxChildAlignment eActAlign,SfxChildAlignment eAlign)1511 SfxChildAlignment __EXPORT ScNavigatorDlg::CheckAlignment(
1512 							SfxChildAlignment eActAlign, SfxChildAlignment eAlign )
1513 {
1514 	SfxChildAlignment eRetAlign;
1515 
1516 	//!	kein Andocken, wenn Listbox nicht da ???
1517 
1518 	switch (eAlign)
1519 	{
1520 		case SFX_ALIGN_TOP:
1521 		case SFX_ALIGN_HIGHESTTOP:
1522 		case SFX_ALIGN_LOWESTTOP:
1523 		case SFX_ALIGN_BOTTOM:
1524 		case SFX_ALIGN_LOWESTBOTTOM:
1525 		case SFX_ALIGN_HIGHESTBOTTOM:
1526 			eRetAlign = eActAlign;				// nicht erlaubt
1527 			break;
1528 
1529 		case SFX_ALIGN_LEFT:
1530 		case SFX_ALIGN_RIGHT:
1531 		case SFX_ALIGN_FIRSTLEFT:
1532 		case SFX_ALIGN_LASTLEFT:
1533 		case SFX_ALIGN_FIRSTRIGHT:
1534 		case SFX_ALIGN_LASTRIGHT:
1535 			eRetAlign = eAlign;					// erlaubt
1536 			break;
1537 
1538 		default:
1539 			eRetAlign = eAlign;
1540 			break;
1541 	}
1542 	return eRetAlign;
1543 }
1544 
1545 //------------------------------------------------------------------------
1546 //
1547 //	Drop auf den Navigator - andere Datei laden (File oder Bookmark)
1548 //
1549 //------------------------------------------------------------------------
1550 
1551 #if 0
1552 sal_Bool __EXPORT ScNavigatorDlg::Drop( const DropEvent& rEvt )
1553 {
1554 	sal_Bool bReturn = sal_False;
1555 
1556 	if ( !aLbEntries.IsInDrag() )		// kein Verschieben innerhalb der TreeListBox
1557 	{
1558 		String aFileName;
1559 
1560 		SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
1561 
1562 		sal_uLong nFormat = INetBookmark::HasFormat(*pObject);
1563 		INetBookmark aBookmark;
1564 		if (aBookmark.Paste(*pObject,nFormat))
1565 			aFileName = aBookmark.GetURL();
1566 		else
1567 		{
1568 			//	FORMAT_FILE direkt aus DragServer
1569 
1570 			sal_uInt16 nCount = DragServer::GetItemCount();
1571 			for ( sal_uInt16 i = 0; i < nCount && !aFileName.Len(); ++i )
1572 				if (DragServer::HasFormat( i, FORMAT_FILE ))
1573 					aFileName = DragServer::PasteFile( i );
1574 		}
1575 
1576 		if ( aFileName.Len() )
1577 			bReturn = aLbEntries.LoadFile( aFileName );
1578 	}
1579 	return bReturn;
1580 }
1581 
1582 sal_Bool __EXPORT ScNavigatorDlg::QueryDrop( DropEvent& rEvt )
1583 {
1584 	sal_Bool bReturn = sal_False;
1585 
1586 	if ( !aLbEntries.IsInDrag() )		// kein Verschieben innerhalb der TreeListBox
1587 	{
1588 		SvScDataObjectRef pObject = SvScDataObject::PasteDragServer(rEvt);
1589 		if ( pObject->HasFormat(FORMAT_FILE)
1590 			|| INetBookmark::HasFormat(*pObject) )
1591 		{
1592 			rEvt.SetAction(DROP_COPY);		// Kopier-Cursor anzeigen
1593 			bReturn = sal_True;
1594 		}
1595 	}
1596 
1597 	return bReturn;
1598 }
1599 #endif
1600 
1601 
1602 
1603