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