1*5900e8ecSAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*5900e8ecSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*5900e8ecSAndrew Rist * or more contributor license agreements. See the NOTICE file 5*5900e8ecSAndrew Rist * distributed with this work for additional information 6*5900e8ecSAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*5900e8ecSAndrew Rist * to you under the Apache License, Version 2.0 (the 8*5900e8ecSAndrew Rist * "License"); you may not use this file except in compliance 9*5900e8ecSAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11*5900e8ecSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13*5900e8ecSAndrew Rist * Unless required by applicable law or agreed to in writing, 14*5900e8ecSAndrew Rist * software distributed under the License is distributed on an 15*5900e8ecSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5900e8ecSAndrew Rist * KIND, either express or implied. See the License for the 17*5900e8ecSAndrew Rist * specific language governing permissions and limitations 18*5900e8ecSAndrew Rist * under the License. 19cdf0e10cSrcweir * 20*5900e8ecSAndrew Rist *************************************************************/ 21*5900e8ecSAndrew Rist 22*5900e8ecSAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #include "precompiled_svtools.hxx" 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "toolpanelcollection.hxx" 27cdf0e10cSrcweir #include "paneldecklisteners.hxx" 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <tools/diagnose_ex.h> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <vector> 32cdf0e10cSrcweir 33cdf0e10cSrcweir //........................................................................ 34cdf0e10cSrcweir namespace svt 35cdf0e10cSrcweir { 36cdf0e10cSrcweir //........................................................................ 37cdf0e10cSrcweir 38cdf0e10cSrcweir //==================================================================== 39cdf0e10cSrcweir //= ToolPanelCollection_Data 40cdf0e10cSrcweir //==================================================================== 41cdf0e10cSrcweir struct ToolPanelCollection_Data 42cdf0e10cSrcweir { 43cdf0e10cSrcweir ::std::vector< PToolPanel > aPanels; 44cdf0e10cSrcweir ::boost::optional< size_t > aActivePanel; 45cdf0e10cSrcweir PanelDeckListeners aListeners; 46cdf0e10cSrcweir }; 47cdf0e10cSrcweir 48cdf0e10cSrcweir //==================================================================== 49cdf0e10cSrcweir //= ToolPanelCollection 50cdf0e10cSrcweir //==================================================================== 51cdf0e10cSrcweir //-------------------------------------------------------------------- ToolPanelCollection()52cdf0e10cSrcweir ToolPanelCollection::ToolPanelCollection() 53cdf0e10cSrcweir :m_pData( new ToolPanelCollection_Data ) 54cdf0e10cSrcweir { 55cdf0e10cSrcweir } 56cdf0e10cSrcweir 57cdf0e10cSrcweir //-------------------------------------------------------------------- ~ToolPanelCollection()58cdf0e10cSrcweir ToolPanelCollection::~ToolPanelCollection() 59cdf0e10cSrcweir { 60cdf0e10cSrcweir m_pData->aListeners.Dying(); 61cdf0e10cSrcweir } 62cdf0e10cSrcweir 63cdf0e10cSrcweir //-------------------------------------------------------------------- GetPanelCount() const64cdf0e10cSrcweir size_t ToolPanelCollection::GetPanelCount() const 65cdf0e10cSrcweir { 66cdf0e10cSrcweir return m_pData->aPanels.size(); 67cdf0e10cSrcweir } 68cdf0e10cSrcweir 69cdf0e10cSrcweir //-------------------------------------------------------------------- GetActivePanel() const70cdf0e10cSrcweir ::boost::optional< size_t > ToolPanelCollection::GetActivePanel() const 71cdf0e10cSrcweir { 72cdf0e10cSrcweir return m_pData->aActivePanel; 73cdf0e10cSrcweir } 74cdf0e10cSrcweir 75cdf0e10cSrcweir //-------------------------------------------------------------------- ActivatePanel(const::boost::optional<size_t> & i_rPanel)76cdf0e10cSrcweir void ToolPanelCollection::ActivatePanel( const ::boost::optional< size_t >& i_rPanel ) 77cdf0e10cSrcweir { 78cdf0e10cSrcweir if ( !!i_rPanel ) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir OSL_ENSURE( *i_rPanel < GetPanelCount(), "ToolPanelCollection::ActivatePanel: illegal panel no.!" ); 81cdf0e10cSrcweir if ( *i_rPanel >= GetPanelCount() ) 82cdf0e10cSrcweir return; 83cdf0e10cSrcweir } 84cdf0e10cSrcweir 85cdf0e10cSrcweir if ( m_pData->aActivePanel == i_rPanel ) 86cdf0e10cSrcweir return; 87cdf0e10cSrcweir 88cdf0e10cSrcweir const ::boost::optional< size_t > aOldPanel( m_pData->aActivePanel ); 89cdf0e10cSrcweir m_pData->aActivePanel = i_rPanel; 90cdf0e10cSrcweir 91cdf0e10cSrcweir // notify listeners 92cdf0e10cSrcweir m_pData->aListeners.ActivePanelChanged( aOldPanel, m_pData->aActivePanel ); 93cdf0e10cSrcweir } 94cdf0e10cSrcweir 95cdf0e10cSrcweir //-------------------------------------------------------------------- GetPanel(const size_t i_nPos) const96cdf0e10cSrcweir PToolPanel ToolPanelCollection::GetPanel( const size_t i_nPos ) const 97cdf0e10cSrcweir { 98cdf0e10cSrcweir OSL_ENSURE( i_nPos < m_pData->aPanels.size(), "ToolPanelCollection::GetPanel: illegal position!" ); 99cdf0e10cSrcweir if ( i_nPos >= m_pData->aPanels.size() ) 100cdf0e10cSrcweir return PToolPanel(); 101cdf0e10cSrcweir return m_pData->aPanels[ i_nPos ]; 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir //-------------------------------------------------------------------- InsertPanel(const PToolPanel & i_pPanel,const size_t i_nPosition)105cdf0e10cSrcweir size_t ToolPanelCollection::InsertPanel( const PToolPanel& i_pPanel, const size_t i_nPosition ) 106cdf0e10cSrcweir { 107cdf0e10cSrcweir OSL_ENSURE( i_pPanel.get(), "ToolPanelCollection::InsertPanel: illegal panel!" ); 108cdf0e10cSrcweir if ( !i_pPanel.get() ) 109cdf0e10cSrcweir return 0; 110cdf0e10cSrcweir 111cdf0e10cSrcweir // insert 112cdf0e10cSrcweir const size_t position = i_nPosition < m_pData->aPanels.size() ? i_nPosition : m_pData->aPanels.size(); 113cdf0e10cSrcweir m_pData->aPanels.insert( m_pData->aPanels.begin() + position, i_pPanel ); 114cdf0e10cSrcweir 115cdf0e10cSrcweir // update active panel 116cdf0e10cSrcweir if ( !!m_pData->aActivePanel ) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir if ( i_nPosition <= *m_pData->aActivePanel ) 119cdf0e10cSrcweir ++*m_pData->aActivePanel; 120cdf0e10cSrcweir } 121cdf0e10cSrcweir 122cdf0e10cSrcweir // notifications 123cdf0e10cSrcweir m_pData->aListeners.PanelInserted( i_pPanel, i_nPosition ); 124cdf0e10cSrcweir 125cdf0e10cSrcweir return position; 126cdf0e10cSrcweir } 127cdf0e10cSrcweir 128cdf0e10cSrcweir //-------------------------------------------------------------------- RemovePanel(const size_t i_nPosition)129cdf0e10cSrcweir PToolPanel ToolPanelCollection::RemovePanel( const size_t i_nPosition ) 130cdf0e10cSrcweir { 131cdf0e10cSrcweir OSL_ENSURE( i_nPosition < m_pData->aPanels.size(), "ToolPanelCollection::RemovePanel: illegal position!" ); 132cdf0e10cSrcweir if ( i_nPosition >= m_pData->aPanels.size() ) 133cdf0e10cSrcweir return NULL; 134cdf0e10cSrcweir 135cdf0e10cSrcweir // if the active panel is going to be removed, activate another one (before the actual removal) 136cdf0e10cSrcweir if ( m_pData->aActivePanel == i_nPosition ) 137cdf0e10cSrcweir { 138cdf0e10cSrcweir const ::boost::optional< size_t > aOldActive( m_pData->aActivePanel ); 139cdf0e10cSrcweir 140cdf0e10cSrcweir if ( i_nPosition + 1 < GetPanelCount() ) 141cdf0e10cSrcweir { 142cdf0e10cSrcweir ++*m_pData->aActivePanel; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir else if ( i_nPosition > 0 ) 145cdf0e10cSrcweir { 146cdf0e10cSrcweir --*m_pData->aActivePanel; 147cdf0e10cSrcweir } 148cdf0e10cSrcweir else 149cdf0e10cSrcweir { 150cdf0e10cSrcweir m_pData->aActivePanel.reset(); 151cdf0e10cSrcweir } 152cdf0e10cSrcweir 153cdf0e10cSrcweir m_pData->aListeners.ActivePanelChanged( aOldActive, m_pData->aActivePanel ); 154cdf0e10cSrcweir } 155cdf0e10cSrcweir 156cdf0e10cSrcweir // remember the removed panel for the aller 157cdf0e10cSrcweir PToolPanel pRemovedPanel( m_pData->aPanels[ i_nPosition ] ); 158cdf0e10cSrcweir 159cdf0e10cSrcweir // actually remove 160cdf0e10cSrcweir m_pData->aPanels.erase( m_pData->aPanels.begin() + i_nPosition ); 161cdf0e10cSrcweir 162cdf0e10cSrcweir if ( !!m_pData->aActivePanel ) 163cdf0e10cSrcweir { 164cdf0e10cSrcweir if ( i_nPosition < *m_pData->aActivePanel ) 165cdf0e10cSrcweir { 166cdf0e10cSrcweir --*m_pData->aActivePanel; 167cdf0e10cSrcweir } 168cdf0e10cSrcweir } 169cdf0e10cSrcweir 170cdf0e10cSrcweir // notify removed panel 171cdf0e10cSrcweir m_pData->aListeners.PanelRemoved( i_nPosition ); 172cdf0e10cSrcweir 173cdf0e10cSrcweir return pRemovedPanel; 174cdf0e10cSrcweir } 175cdf0e10cSrcweir 176cdf0e10cSrcweir //-------------------------------------------------------------------- AddListener(IToolPanelDeckListener & i_rListener)177cdf0e10cSrcweir void ToolPanelCollection::AddListener( IToolPanelDeckListener& i_rListener ) 178cdf0e10cSrcweir { 179cdf0e10cSrcweir m_pData->aListeners.AddListener( i_rListener ); 180cdf0e10cSrcweir } 181cdf0e10cSrcweir 182cdf0e10cSrcweir //-------------------------------------------------------------------- RemoveListener(IToolPanelDeckListener & i_rListener)183cdf0e10cSrcweir void ToolPanelCollection::RemoveListener( IToolPanelDeckListener& i_rListener ) 184cdf0e10cSrcweir { 185cdf0e10cSrcweir m_pData->aListeners.RemoveListener( i_rListener ); 186cdf0e10cSrcweir } 187cdf0e10cSrcweir 188cdf0e10cSrcweir //........................................................................ 189cdf0e10cSrcweir } // namespace svt 190cdf0e10cSrcweir //........................................................................ 191