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 <roadmap.hxx>
21 :
22 : #include <vector>
23 : #include <algorithm>
24 : #include <vcl/bitmap.hxx>
25 : #include <vcl/settings.hxx>
26 : #include <tools/color.hxx>
27 : #include <rtl/ustring.hxx>
28 : #include <boost/scoped_ptr.hpp>
29 :
30 : #define ROADMAP_INDENT_X 4
31 : #define ROADMAP_INDENT_Y 27
32 : #define ROADMAP_ITEM_DISTANCE_Y 6
33 :
34 : namespace svt
35 : {
36 :
37 : typedef std::vector< RoadmapItem* > HL_Vector;
38 :
39 : //= ColorChanger
40 :
41 0 : class IDLabel : public FixedText
42 : {
43 : public:
44 : IDLabel( vcl::Window* _pParent, WinBits _nWinStyle = 0 );
45 : virtual void DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
46 : };
47 :
48 : class RoadmapItem : public RoadmapTypes
49 : {
50 : private:
51 : VclPtr<IDLabel> mpID;
52 : VclPtr<HyperLabel> mpDescription;
53 : const Size m_aItemPlayground;
54 :
55 : public:
56 : RoadmapItem( ORoadmap& _rParent, const Size& _rItemPlayground );
57 : ~RoadmapItem();
58 :
59 : void SetID( sal_Int16 _ID );
60 : sal_Int16 GetID() const;
61 :
62 : void SetIndex( ItemIndex _Index );
63 : ItemIndex GetIndex() const;
64 :
65 : void Update( ItemIndex _RMIndex, const OUString& _rText );
66 :
67 : void SetPosition( RoadmapItem* OldHyperLabel );
68 :
69 : void ToggleBackgroundColor( const Color& _rGBColor );
70 : void SetInteractive( bool _bInteractive );
71 :
72 : void SetClickHdl( const Link<>& rLink );
73 : void Enable( bool bEnable = true);
74 : bool IsEnabled() const;
75 : void GrabFocus();
76 :
77 : bool Contains( const vcl::Window* _pWindow ) const;
78 :
79 0 : HyperLabel* GetDescriptionHyperLabel() const { return mpDescription; }
80 :
81 : private:
82 : void ImplUpdateIndex( const ItemIndex _nIndex );
83 : void ImplUpdatePosSize();
84 : };
85 :
86 : //= RoadmapImpl
87 :
88 0 : class RoadmapImpl : public RoadmapTypes
89 : {
90 : protected:
91 : const ORoadmap& m_rAntiImpl;
92 : Link<> m_aSelectHdl;
93 : BitmapEx m_aPicture;
94 : HL_Vector m_aRoadmapSteps;
95 : ItemId m_iCurItemID;
96 : bool m_bInteractive : 1;
97 : bool m_bComplete : 1;
98 : Size m_aItemSizePixel;
99 : public:
100 : bool m_bPaintInitialized : 1;
101 :
102 : public:
103 0 : explicit RoadmapImpl(const ORoadmap& rAntiImpl)
104 : : m_rAntiImpl(rAntiImpl)
105 : , m_iCurItemID(-1)
106 : , m_bInteractive(true)
107 : , m_bComplete(true)
108 : , m_bPaintInitialized(false)
109 0 : , InCompleteHyperLabel(NULL)
110 0 : {}
111 :
112 : RoadmapItem* InCompleteHyperLabel;
113 :
114 0 : HL_Vector& getHyperLabels()
115 : {
116 0 : return m_aRoadmapSteps;
117 : }
118 :
119 0 : void insertHyperLabel(ItemIndex _Index, RoadmapItem* _rRoadmapStep)
120 : {
121 0 : m_aRoadmapSteps.insert(m_aRoadmapSteps.begin() + _Index, _rRoadmapStep);
122 0 : }
123 :
124 0 : ItemIndex getItemCount() const
125 : {
126 0 : return m_aRoadmapSteps.size();
127 : }
128 :
129 0 : void setCurItemID(ItemId i)
130 : {
131 0 : m_iCurItemID = i;
132 0 : }
133 0 : ItemId getCurItemID() const
134 : {
135 0 : return m_iCurItemID;
136 : }
137 :
138 0 : void setInteractive(const bool _bInteractive)
139 : {
140 0 : m_bInteractive = _bInteractive;
141 0 : }
142 0 : bool isInteractive() const
143 : {
144 0 : return m_bInteractive;
145 : }
146 :
147 0 : void setComplete(const bool _bComplete)
148 : {
149 0 : m_bComplete = _bComplete;
150 0 : }
151 0 : bool isComplete() const
152 : {
153 0 : return m_bComplete;
154 : }
155 :
156 0 : void setPicture(const BitmapEx& _rPic)
157 : {
158 0 : m_aPicture = _rPic;
159 0 : }
160 0 : const BitmapEx& getPicture() const
161 : {
162 0 : return m_aPicture;
163 : }
164 :
165 0 : void setSelectHdl(const Link<>& _rHdl)
166 : {
167 0 : m_aSelectHdl = _rHdl;
168 0 : }
169 0 : const Link<>& getSelectHdl() const
170 : {
171 0 : return m_aSelectHdl;
172 : }
173 :
174 : void initItemSize();
175 0 : const Size& getItemSize() const
176 : {
177 0 : return m_aItemSizePixel;
178 : }
179 :
180 0 : void removeHyperLabel(ItemIndex _Index)
181 : {
182 0 : if ((_Index > -1) && (_Index < getItemCount()))
183 : {
184 0 : delete m_aRoadmapSteps[_Index];
185 0 : m_aRoadmapSteps.erase(m_aRoadmapSteps.begin() + _Index);
186 : }
187 0 : }
188 : };
189 :
190 0 : void RoadmapImpl::initItemSize()
191 : {
192 0 : Size aLabelSize( m_rAntiImpl.GetOutputSizePixel() );
193 0 : aLabelSize.Height() = m_rAntiImpl.LogicToPixel( Size( 0, LABELBASEMAPHEIGHT ), MAP_APPFONT ).Height();
194 0 : aLabelSize.Width() -= m_rAntiImpl.LogicToPixel( Size( 2 * ROADMAP_INDENT_X, 0 ), MAP_APPFONT ).Width();
195 0 : m_aItemSizePixel = aLabelSize;
196 0 : }
197 :
198 : //= Roadmap
199 :
200 0 : ORoadmap::ORoadmap(vcl::Window* _pParent, WinBits _nWinStyle)
201 : : Control(_pParent, _nWinStyle)
202 0 : , m_pImpl(new RoadmapImpl(*this))
203 : {
204 0 : }
205 :
206 0 : void ORoadmap::implInit(vcl::RenderContext& rRenderContext)
207 : {
208 0 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
209 0 : Color aTextColor = rStyleSettings.GetFieldTextColor();
210 0 : vcl::Font aFont = rRenderContext.GetFont();
211 0 : aFont.SetColor(aTextColor);
212 0 : aFont.SetWeight(WEIGHT_BOLD);
213 0 : aFont.SetUnderline(UNDERLINE_SINGLE);
214 0 : rRenderContext.SetFont(aFont);
215 0 : rRenderContext.SetBackground(Wallpaper(rStyleSettings.GetFieldColor()));
216 0 : m_pImpl->InCompleteHyperLabel = NULL;
217 0 : m_pImpl->setCurItemID(-1);
218 0 : m_pImpl->setComplete(true);
219 0 : m_pImpl->m_bPaintInitialized = true;
220 :
221 : // Roadmap control should be reachable as one unit with a Tab key
222 : // the next Tab key should spring out of the control.
223 : // To reach it the control itself should get focus and set it
224 : // on entries. The entries themself should not be reachable with
225 : // the Tab key directly. So each entry should have WB_NOTABSTOP.
226 :
227 : // In other words the creator should create the control with the following
228 : // flags:
229 : // SetStyle( ( GetStyle() | WB_TABSTOP ) & ~WB_DIALOGCONTROL );
230 :
231 : // TODO: if somebody sets a new font from outside (OutputDevice::SetFont), we would have to react
232 : // on this with calculating a new bold font.
233 : // Unfortunately, the OutputDevice does not offer a notify mechanism for a changed font.
234 : // So settings the font from outside is simply a forbidded scenario at the moment
235 0 : rRenderContext.EnableMapMode(false);
236 0 : }
237 :
238 0 : ORoadmap::~ORoadmap()
239 : {
240 0 : disposeOnce();
241 0 : }
242 :
243 0 : void ORoadmap::dispose()
244 : {
245 0 : HL_Vector aItemsCopy = m_pImpl->getHyperLabels();
246 0 : m_pImpl->getHyperLabels().clear();
247 0 : for ( HL_Vector::iterator i = aItemsCopy.begin(); i != aItemsCopy.end(); ++i )
248 : {
249 0 : delete *i;
250 : }
251 0 : if ( ! m_pImpl->isComplete() )
252 0 : delete m_pImpl->InCompleteHyperLabel;
253 0 : delete m_pImpl;
254 0 : m_pImpl = NULL;
255 0 : Control::dispose();
256 0 : }
257 :
258 0 : RoadmapTypes::ItemId ORoadmap::GetCurrentRoadmapItemID() const
259 : {
260 0 : return m_pImpl->getCurItemID();
261 : }
262 :
263 0 : RoadmapItem* ORoadmap::GetPreviousHyperLabel(ItemIndex _Index)
264 : {
265 0 : RoadmapItem* pOldItem = NULL;
266 0 : if ( _Index > 0 )
267 0 : pOldItem = m_pImpl->getHyperLabels().at( _Index - 1 );
268 0 : return pOldItem;
269 : }
270 :
271 0 : RoadmapItem* ORoadmap::InsertHyperLabel(ItemIndex _Index, const OUString& _sLabel, ItemId _RMID, bool _bEnabled, bool _bIncomplete)
272 : {
273 0 : if (m_pImpl->getItemCount() == 0)
274 0 : m_pImpl->initItemSize();
275 :
276 0 : RoadmapItem* pItem = NULL;
277 0 : RoadmapItem* pOldItem = GetPreviousHyperLabel( _Index );
278 :
279 0 : pItem = new RoadmapItem( *this, m_pImpl->getItemSize() );
280 0 : if ( _bIncomplete )
281 : {
282 0 : pItem->SetInteractive( false );
283 : }
284 : else
285 : {
286 0 : pItem->SetInteractive( m_pImpl->isInteractive() );
287 0 : m_pImpl->insertHyperLabel( _Index, pItem );
288 : }
289 0 : pItem->SetPosition( pOldItem );
290 0 : pItem->Update( _Index, _sLabel );
291 0 : pItem->SetClickHdl(LINK( this, ORoadmap, ImplClickHdl ) );
292 0 : pItem->SetID( _RMID );
293 0 : pItem->SetIndex( _Index );
294 0 : if (!_bEnabled)
295 0 : pItem->Enable( _bEnabled );
296 0 : return pItem;
297 : }
298 :
299 0 : void ORoadmap::SetRoadmapBitmap(const BitmapEx& _rBmp, bool _bInvalidate)
300 : {
301 0 : m_pImpl->setPicture( _rBmp );
302 0 : if ( _bInvalidate )
303 0 : Invalidate( );
304 0 : }
305 :
306 0 : void ORoadmap::SetRoadmapInteractive(bool _bInteractive)
307 : {
308 0 : m_pImpl->setInteractive( _bInteractive );
309 :
310 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
311 0 : for ( HL_Vector::const_iterator i = rItems.begin();
312 0 : i != rItems.end();
313 : ++i
314 : )
315 : {
316 0 : (*i)->SetInteractive( _bInteractive );
317 : }
318 0 : }
319 :
320 0 : bool ORoadmap::IsRoadmapInteractive()
321 : {
322 0 : return m_pImpl->isInteractive();
323 : }
324 :
325 0 : void ORoadmap::SetRoadmapComplete(bool _bComplete)
326 : {
327 0 : bool bWasComplete = m_pImpl->isComplete();
328 0 : m_pImpl->setComplete( _bComplete );
329 0 : if (_bComplete)
330 : {
331 0 : if (m_pImpl->InCompleteHyperLabel != NULL)
332 : {
333 0 : delete m_pImpl->InCompleteHyperLabel;
334 0 : m_pImpl->InCompleteHyperLabel = NULL;
335 : }
336 : }
337 0 : else if (bWasComplete)
338 0 : m_pImpl->InCompleteHyperLabel = InsertHyperLabel(m_pImpl->getItemCount(), OUString("..."), -1, true/*bEnabled*/, true/*bIncomplete*/ );
339 0 : }
340 :
341 0 : void ORoadmap::UpdatefollowingHyperLabels(ItemIndex _nIndex)
342 : {
343 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
344 0 : if ( _nIndex < (ItemIndex)rItems.size() )
345 : {
346 0 : for ( HL_Vector::const_iterator i = rItems.begin() + _nIndex;
347 0 : i != rItems.end();
348 : ++i, ++_nIndex
349 : )
350 : {
351 0 : RoadmapItem* pItem = *i;
352 :
353 0 : pItem->SetIndex( _nIndex );
354 0 : pItem->SetPosition( GetPreviousHyperLabel( _nIndex ) );
355 : }
356 : }
357 0 : if ( ! m_pImpl->isComplete() )
358 : {
359 0 : RoadmapItem* pOldItem = GetPreviousHyperLabel( m_pImpl->getItemCount() );
360 0 : m_pImpl->InCompleteHyperLabel->SetPosition( pOldItem );
361 0 : m_pImpl->InCompleteHyperLabel->Update( m_pImpl->getItemCount(), OUString("...") );
362 : }
363 0 : }
364 :
365 0 : void ORoadmap::ReplaceRoadmapItem(ItemIndex _Index, const OUString& _RoadmapItem, ItemId _RMID, bool _bEnabled)
366 : {
367 0 : RoadmapItem* pItem = GetByIndex( _Index);
368 0 : if ( pItem != NULL )
369 : {
370 0 : pItem->Update( _Index, _RoadmapItem );
371 0 : pItem->SetID( _RMID );
372 0 : pItem->Enable( _bEnabled );
373 : }
374 0 : }
375 :
376 0 : RoadmapTypes::ItemIndex ORoadmap::GetItemCount() const
377 : {
378 0 : return m_pImpl->getItemCount();
379 : }
380 :
381 0 : RoadmapTypes::ItemId ORoadmap::GetItemID(ItemIndex _nIndex) const
382 : {
383 0 : const RoadmapItem* pHyperLabel = GetByIndex( _nIndex );
384 0 : if ( pHyperLabel )
385 0 : return pHyperLabel->GetID();
386 0 : return -1;
387 : }
388 :
389 0 : void ORoadmap::InsertRoadmapItem(ItemIndex _Index, const OUString& _RoadmapItem, ItemId _nUniqueId, bool _bEnabled)
390 : {
391 0 : InsertHyperLabel( _Index, _RoadmapItem, _nUniqueId, _bEnabled, false/*bIncomplete*/ );
392 : // TODO YPos is superfluous, if items are always appended
393 0 : UpdatefollowingHyperLabels( _Index + 1 );
394 0 : }
395 :
396 0 : void ORoadmap::DeleteRoadmapItem(ItemIndex _Index)
397 : {
398 0 : if ( m_pImpl->getItemCount() > 0 && ( _Index > -1) && ( _Index < m_pImpl->getItemCount() ) )
399 : {
400 0 : m_pImpl->removeHyperLabel( _Index );
401 0 : UpdatefollowingHyperLabels( _Index );
402 : }
403 0 : }
404 :
405 0 : bool ORoadmap::IsRoadmapComplete() const
406 : {
407 0 : return m_pImpl->isComplete();
408 : }
409 :
410 0 : void ORoadmap::EnableRoadmapItem( ItemId _nItemId, bool _bEnable, ItemIndex _nStartIndex )
411 : {
412 0 : RoadmapItem* pItem = GetByID( _nItemId, _nStartIndex );
413 0 : if ( pItem != NULL )
414 0 : pItem->Enable( _bEnable );
415 0 : }
416 :
417 0 : void ORoadmap::ChangeRoadmapItemLabel( ItemId _nID, const OUString& _sLabel, ItemIndex _nStartIndex )
418 : {
419 0 : RoadmapItem* pItem = GetByID( _nID, _nStartIndex );
420 0 : if ( pItem != NULL )
421 : {
422 0 : pItem->Update( pItem->GetIndex(), _sLabel );
423 :
424 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
425 0 : for ( HL_Vector::const_iterator i = rItems.begin() + _nStartIndex;
426 0 : i != rItems.end();
427 : ++i
428 : )
429 : {
430 0 : (*i)->SetPosition( GetPreviousHyperLabel( i - rItems.begin() ) );
431 : }
432 : }
433 0 : }
434 :
435 0 : void ORoadmap::ChangeRoadmapItemID(ItemId _nID, ItemId _NewID, ItemIndex _nStartIndex)
436 : {
437 0 : RoadmapItem* pItem = GetByID( _nID, _nStartIndex );
438 0 : if ( pItem != NULL )
439 0 : pItem->SetID( _NewID );
440 0 : }
441 :
442 0 : RoadmapItem* ORoadmap::GetByID(ItemId _nID, ItemIndex _nStartIndex)
443 : {
444 0 : ItemId nLocID = 0;
445 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
446 0 : for ( HL_Vector::const_iterator i = rItems.begin() + _nStartIndex;
447 0 : i != rItems.end();
448 : ++i
449 : )
450 : {
451 0 : nLocID = (*i)->GetID();
452 0 : if ( nLocID == _nID )
453 0 : return *i;
454 : }
455 0 : return NULL;
456 : }
457 :
458 0 : const RoadmapItem* ORoadmap::GetByID(ItemId _nID, ItemIndex _nStartIndex) const
459 : {
460 0 : return const_cast< ORoadmap* >( this )->GetByID( _nID, _nStartIndex );
461 : }
462 :
463 0 : RoadmapItem* ORoadmap::GetByIndex(ItemIndex _nItemIndex)
464 : {
465 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
466 0 : if ( ( _nItemIndex > -1 ) && ( _nItemIndex < (ItemIndex)rItems.size() ) )
467 : {
468 0 : return rItems.at( _nItemIndex );
469 : }
470 0 : return NULL;
471 : }
472 :
473 0 : const RoadmapItem* ORoadmap::GetByIndex(ItemIndex _nItemIndex) const
474 : {
475 0 : return const_cast< ORoadmap* >( this )->GetByIndex( _nItemIndex );
476 : }
477 :
478 0 : RoadmapTypes::ItemId ORoadmap::GetNextAvailableItemId(ItemIndex _nNewIndex)
479 : {
480 0 : ItemIndex searchIndex = ++_nNewIndex;
481 0 : while ( searchIndex < m_pImpl->getItemCount() )
482 : {
483 0 : RoadmapItem* pItem = GetByIndex( searchIndex );
484 0 : if ( pItem->IsEnabled() )
485 0 : return pItem->GetID( );
486 :
487 0 : ++searchIndex;
488 : }
489 0 : return -1;
490 : }
491 :
492 0 : RoadmapTypes::ItemId ORoadmap::GetPreviousAvailableItemId(ItemIndex _nNewIndex)
493 : {
494 0 : ItemIndex searchIndex = --_nNewIndex;
495 0 : while ( searchIndex > -1 )
496 : {
497 0 : RoadmapItem* pItem = GetByIndex( searchIndex );
498 0 : if ( pItem->IsEnabled() )
499 0 : return pItem->GetID( );
500 :
501 0 : searchIndex--;
502 : }
503 0 : return -1;
504 : }
505 :
506 0 : void ORoadmap::DeselectOldRoadmapItems()
507 : {
508 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
509 0 : for ( HL_Vector::const_iterator i = rItems.begin();
510 0 : i != rItems.end();
511 : ++i
512 : )
513 : {
514 0 : (*i)->ToggleBackgroundColor( COL_TRANSPARENT );
515 : }
516 0 : }
517 :
518 0 : void ORoadmap::SetItemSelectHdl(const Link<>& _rHdl)
519 : {
520 0 : m_pImpl->setSelectHdl(_rHdl);
521 0 : }
522 :
523 0 : Link<> ORoadmap::GetItemSelectHdl() const
524 : {
525 0 : return m_pImpl->getSelectHdl();
526 : }
527 :
528 0 : void ORoadmap::Select()
529 : {
530 0 : GetItemSelectHdl().Call( this );
531 0 : CallEventListeners( VCLEVENT_ROADMAP_ITEMSELECTED );
532 0 : }
533 :
534 0 : void ORoadmap::GetFocus()
535 : {
536 0 : RoadmapItem* pCurHyperLabel = GetByID( GetCurrentRoadmapItemID() );
537 0 : if ( pCurHyperLabel != NULL )
538 0 : pCurHyperLabel->GrabFocus();
539 0 : }
540 :
541 0 : bool ORoadmap::SelectRoadmapItemByID( ItemId _nNewID )
542 : {
543 0 : DeselectOldRoadmapItems();
544 0 : RoadmapItem* pItem = GetByID( _nNewID );
545 0 : if ( pItem != NULL )
546 : {
547 0 : if ( pItem->IsEnabled() )
548 : {
549 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
550 0 : pItem->ToggleBackgroundColor( rStyleSettings.GetHighlightColor() ); //HighlightColor
551 :
552 0 : pItem->GrabFocus();
553 0 : m_pImpl->setCurItemID(_nNewID);
554 :
555 0 : Select();
556 0 : return true;
557 : }
558 : }
559 0 : return false;
560 : }
561 :
562 0 : void ORoadmap::Paint(vcl::RenderContext& rRenderContext, const Rectangle& _rRect)
563 : {
564 0 : if (!m_pImpl->m_bPaintInitialized)
565 0 : implInit(rRenderContext);
566 0 : Control::Paint(rRenderContext, _rRect);
567 :
568 : // draw the bitmap
569 0 : if (!!m_pImpl->getPicture())
570 : {
571 0 : Size aBitmapSize = m_pImpl->getPicture().GetSizePixel();
572 0 : Size aMySize = rRenderContext.GetOutputSizePixel();
573 :
574 0 : Point aBitmapPos(aMySize.Width() - aBitmapSize.Width(), aMySize.Height() - aBitmapSize.Height());
575 :
576 : // draw it
577 0 : rRenderContext.DrawBitmapEx( aBitmapPos, m_pImpl->getPicture() );
578 : }
579 :
580 : // draw the headline
581 0 : DrawHeadline(rRenderContext);
582 0 : }
583 :
584 0 : void ORoadmap::DrawHeadline(vcl::RenderContext& rRenderContext)
585 : {
586 0 : Point aTextPos = LogicToPixel(Point(ROADMAP_INDENT_X, 8), MAP_APPFONT);
587 :
588 0 : Size aOutputSize(rRenderContext.GetOutputSizePixel());
589 :
590 : // draw it
591 0 : rRenderContext.DrawText(Rectangle(aTextPos, aOutputSize), GetText(),
592 0 : DrawTextFlags::Left | DrawTextFlags::Top | DrawTextFlags::MultiLine | DrawTextFlags::WordBreak);
593 0 : rRenderContext.DrawTextLine(aTextPos, aOutputSize.Width(), STRIKEOUT_NONE, UNDERLINE_SINGLE, UNDERLINE_NONE, false);
594 0 : const StyleSettings& rStyleSettings = rRenderContext.GetSettings().GetStyleSettings();
595 0 : rRenderContext.SetLineColor(rStyleSettings.GetFieldTextColor());
596 0 : rRenderContext.SetTextColor(rStyleSettings.GetFieldTextColor());
597 0 : }
598 :
599 0 : RoadmapItem* ORoadmap::GetByPointer(vcl::Window* pWindow)
600 : {
601 0 : const HL_Vector& rItems = m_pImpl->getHyperLabels();
602 0 : for ( HL_Vector::const_iterator i = rItems.begin();
603 0 : i != rItems.end();
604 : ++i
605 : )
606 : {
607 0 : if ( (*i)->Contains( pWindow ) )
608 0 : return *i;
609 : }
610 0 : return NULL;
611 : }
612 :
613 0 : bool ORoadmap::PreNotify(NotifyEvent& _rNEvt)
614 : {
615 : // capture KeyEvents for taskpane cycling
616 0 : if ( _rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
617 : {
618 0 : vcl::Window* pWindow = _rNEvt.GetWindow();
619 0 : RoadmapItem* pItem = GetByPointer( pWindow );
620 0 : if ( pItem != NULL )
621 : {
622 0 : sal_Int16 nKeyCode = _rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
623 0 : switch( nKeyCode )
624 : {
625 : case KEY_UP:
626 : { // Note: Performancewise this is not optimal, because we search for an ID in the labels
627 : // and afterwards we search again for a label with the appropriate ID ->
628 : // unnecessarily we search twice!!!
629 0 : ItemId nPrevItemID = GetPreviousAvailableItemId( pItem->GetIndex() );
630 0 : if ( nPrevItemID != -1 )
631 0 : return SelectRoadmapItemByID( nPrevItemID );
632 : }
633 0 : break;
634 : case KEY_DOWN:
635 : {
636 0 : ItemId nNextItemID = GetNextAvailableItemId( pItem->GetIndex() );
637 0 : if ( nNextItemID != -1 )
638 0 : return SelectRoadmapItemByID( nNextItemID );
639 : }
640 0 : break;
641 : case KEY_SPACE:
642 0 : return SelectRoadmapItemByID( pItem->GetID() );
643 : }
644 : }
645 : }
646 0 : return Window::PreNotify( _rNEvt );
647 : }
648 :
649 0 : IMPL_LINK(ORoadmap, ImplClickHdl, HyperLabel*, _CurHyperLabel)
650 : {
651 0 : return SelectRoadmapItemByID( _CurHyperLabel->GetID() ) ? 1 : 0;
652 : }
653 :
654 0 : void ORoadmap::DataChanged(const DataChangedEvent& rDCEvt)
655 : {
656 0 : if ((( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) ||
657 0 : ( rDCEvt.GetType() == DataChangedEventType::DISPLAY )) &&
658 0 : ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ))
659 : {
660 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
661 0 : SetBackground( Wallpaper( rStyleSettings.GetFieldColor() ) );
662 0 : Color aTextColor = rStyleSettings.GetFieldTextColor();
663 0 : vcl::Font aFont = GetFont();
664 0 : aFont.SetColor( aTextColor );
665 0 : SetFont( aFont );
666 0 : RoadmapTypes::ItemId curItemID = GetCurrentRoadmapItemID();
667 0 : RoadmapItem* pLabelItem = GetByID( curItemID );
668 0 : if (pLabelItem != NULL)
669 : {
670 0 : pLabelItem->ToggleBackgroundColor(rStyleSettings.GetHighlightColor());
671 : }
672 0 : Invalidate();
673 : }
674 0 : }
675 :
676 0 : RoadmapItem::RoadmapItem(ORoadmap& _rParent, const Size& _rItemPlayground)
677 0 : : m_aItemPlayground(_rItemPlayground)
678 : {
679 0 : mpID = VclPtr<IDLabel>::Create( &_rParent, WB_WORDBREAK );
680 0 : mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) );
681 0 : mpID->Show();
682 0 : mpDescription = VclPtr<HyperLabel>::Create( &_rParent, WB_NOTABSTOP | WB_WORDBREAK );
683 0 : mpDescription->Show();
684 0 : }
685 :
686 0 : RoadmapItem::~RoadmapItem()
687 : {
688 0 : mpID.disposeAndClear();
689 0 : mpDescription.disposeAndClear();
690 0 : }
691 :
692 0 : bool RoadmapItem::Contains(const vcl::Window* _pWindow) const
693 : {
694 0 : return ( mpID == _pWindow ) || ( mpDescription == _pWindow );
695 : }
696 :
697 0 : void RoadmapItem::GrabFocus()
698 : {
699 0 : if ( mpDescription )
700 0 : mpDescription->GrabFocus();
701 0 : }
702 :
703 0 : void RoadmapItem::SetInteractive(bool _bInteractive)
704 : {
705 0 : if ( mpDescription )
706 0 : mpDescription->SetInteractive(_bInteractive);
707 0 : }
708 :
709 0 : void RoadmapItem::SetID(sal_Int16 _ID)
710 : {
711 0 : if ( mpDescription )
712 0 : mpDescription->SetID(_ID);
713 0 : }
714 :
715 0 : sal_Int16 RoadmapItem::GetID() const
716 : {
717 0 : return mpDescription ? mpDescription->GetID() : sal_Int16(-1);
718 : }
719 :
720 0 : void RoadmapItem::ImplUpdateIndex(const ItemIndex _nIndex)
721 : {
722 0 : mpDescription->SetIndex( _nIndex );
723 :
724 0 : OUString aIDText = OUString::number( _nIndex + 1 ) + ".";
725 0 : mpID->SetText( aIDText );
726 :
727 : // update the geometry of both controls
728 0 : ImplUpdatePosSize();
729 0 : }
730 :
731 0 : void RoadmapItem::SetIndex(ItemIndex _Index)
732 : {
733 0 : ImplUpdateIndex(_Index);
734 0 : }
735 :
736 0 : RoadmapTypes::ItemIndex RoadmapItem::GetIndex() const
737 : {
738 0 : return mpDescription ? mpDescription->GetIndex() : ItemIndex(-1);
739 : }
740 :
741 0 : void RoadmapItem::SetPosition(RoadmapItem* _pOldItem)
742 : {
743 0 : Point aIDPos;
744 0 : if ( _pOldItem == NULL )
745 : {
746 0 : aIDPos = mpID->LogicToPixel( Point( ROADMAP_INDENT_X, ROADMAP_INDENT_Y ), MAP_APPFONT );
747 : }
748 : else
749 : {
750 0 : Size aOldSize = _pOldItem->GetDescriptionHyperLabel()->GetSizePixel();
751 :
752 0 : aIDPos = _pOldItem->mpID->GetPosPixel();
753 0 : aIDPos.Y() += aOldSize.Height();
754 0 : aIDPos.Y() += mpID->GetParent()->LogicToPixel( Size( 0, ROADMAP_ITEM_DISTANCE_Y ) ).Height();
755 : }
756 0 : mpID->SetPosPixel( aIDPos );
757 :
758 0 : sal_Int32 nDescPos = aIDPos.X() + mpID->GetSizePixel().Width();
759 0 : mpDescription->SetPosPixel( Point( nDescPos, aIDPos.Y() ) );
760 0 : }
761 :
762 0 : void RoadmapItem::Enable(bool _bEnable)
763 : {
764 0 : mpID->Enable(_bEnable);
765 0 : mpDescription->Enable(_bEnable);
766 0 : }
767 :
768 0 : bool RoadmapItem::IsEnabled() const
769 : {
770 0 : return mpID->IsEnabled();
771 : }
772 :
773 0 : void RoadmapItem::ToggleBackgroundColor(const Color& _rGBColor)
774 : {
775 0 : if (_rGBColor == COL_TRANSPARENT)
776 : {
777 0 : mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetFieldTextColor( ) );
778 0 : mpID->SetControlBackground( COL_TRANSPARENT );
779 : }
780 : else
781 : {
782 0 : mpID->SetControlBackground( mpID->GetSettings().GetStyleSettings().GetHighlightColor() );
783 0 : mpID->SetTextColor( mpID->GetSettings().GetStyleSettings().GetHighlightTextColor( ) );
784 : }
785 0 : mpDescription->ToggleBackgroundColor(_rGBColor);
786 0 : }
787 :
788 0 : void RoadmapItem::ImplUpdatePosSize()
789 : {
790 : // calculate widths
791 0 : long nIDWidth = mpID->GetTextWidth( mpID->GetText() );
792 0 : long nMaxIDWidth = mpID->GetTextWidth( OUString( "100." ) );
793 0 : nIDWidth = ::std::min( nIDWidth, nMaxIDWidth );
794 :
795 : // check how many space the description would need
796 0 : Size aDescriptionSize = mpDescription->CalcMinimumSize( m_aItemPlayground.Width() - nIDWidth );
797 :
798 : // position and size both controls
799 0 : Size aIDSize( nIDWidth, aDescriptionSize.Height() );
800 0 : mpID->SetSizePixel( aIDSize );
801 :
802 0 : Point aIDPos = mpID->GetPosPixel();
803 0 : mpDescription->SetPosPixel( Point( aIDPos.X() + nIDWidth, aIDPos.Y() ) );
804 0 : mpDescription->SetSizePixel( aDescriptionSize );
805 0 : }
806 :
807 0 : void RoadmapItem::Update(ItemIndex _RMIndex, const OUString& _rText)
808 : {
809 : // update description label
810 0 : mpDescription->SetLabel( _rText );
811 :
812 : // update the index in both controls, which triggers updating the geometry of both
813 0 : ImplUpdateIndex( _RMIndex );
814 0 : }
815 :
816 0 : void RoadmapItem::SetClickHdl(const Link<>& rLink)
817 : {
818 0 : if ( mpDescription )
819 0 : mpDescription->SetClickHdl( rLink);
820 0 : }
821 :
822 0 : IDLabel::IDLabel(vcl::Window* _pParent, WinBits _nWinStyle)
823 0 : : FixedText(_pParent, _nWinStyle)
824 : {
825 0 : }
826 :
827 0 : void IDLabel::DataChanged(const DataChangedEvent& rDCEvt)
828 : {
829 0 : const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
830 0 : FixedText::DataChanged( rDCEvt );
831 0 : if ((( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) ||
832 0 : ( rDCEvt.GetType() == DataChangedEventType::DISPLAY )) &&
833 0 : ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ))
834 : {
835 0 : const Color& rGBColor = GetControlBackground();
836 0 : if (rGBColor == COL_TRANSPARENT)
837 0 : SetTextColor( rStyleSettings.GetFieldTextColor( ) );
838 : else
839 : {
840 0 : SetControlBackground(rStyleSettings.GetHighlightColor());
841 0 : SetTextColor( rStyleSettings.GetHighlightTextColor( ) );
842 : }
843 0 : Invalidate();
844 : }
845 0 : }
846 :
847 798 : } // namespace svt
848 :
849 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|