LCOV - code coverage report
Current view: top level - svtools/source/control - roadmap.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 1 419 0.2 %
Date: 2015-06-13 12:38:46 Functions: 2 83 2.4 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11