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