xref: /AOO41X/main/svtools/source/toolpanel/toolpanelcollection.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
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