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