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
10*5900e8ecSAndrew Rist  *
11*5900e8ecSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*5900e8ecSAndrew Rist  *
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.
19*5900e8ecSAndrew Rist  *
20*5900e8ecSAndrew Rist  *************************************************************/
21*5900e8ecSAndrew Rist 
22*5900e8ecSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir #include "precompiled_svtools.hxx"
25cdf0e10cSrcweir 
26cdf0e10cSrcweir #include "svtools/toolpanel/tablayouter.hxx"
27cdf0e10cSrcweir #include "svtools/toolpanel/toolpaneldeck.hxx"
28cdf0e10cSrcweir #include "svtools/toolpanel/paneltabbar.hxx"
29cdf0e10cSrcweir #include "svtaccessiblefactory.hxx"
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #include <tools/gen.hxx>
32cdf0e10cSrcweir #include <tools/diagnose_ex.h>
33cdf0e10cSrcweir 
34cdf0e10cSrcweir //........................................................................
35cdf0e10cSrcweir namespace svt
36cdf0e10cSrcweir {
37cdf0e10cSrcweir //........................................................................
38cdf0e10cSrcweir 
39cdf0e10cSrcweir     using ::com::sun::star::uno::Reference;
40cdf0e10cSrcweir     using ::com::sun::star::accessibility::XAccessible;
41cdf0e10cSrcweir 
42cdf0e10cSrcweir 	//====================================================================
43cdf0e10cSrcweir 	//= TabDeckLayouter_Data
44cdf0e10cSrcweir 	//====================================================================
45cdf0e10cSrcweir     struct TabDeckLayouter_Data
46cdf0e10cSrcweir     {
47cdf0e10cSrcweir         TabAlignment                    eAlignment;
48cdf0e10cSrcweir         IToolPanelDeck&                 rPanels;
49cdf0e10cSrcweir         ::std::auto_ptr< PanelTabBar >  pTabBar;
50cdf0e10cSrcweir         AccessibleFactoryAccess         aAccessibleFactory;
51cdf0e10cSrcweir 
TabDeckLayouter_Datasvt::TabDeckLayouter_Data52cdf0e10cSrcweir         TabDeckLayouter_Data( Window& i_rParent, IToolPanelDeck& i_rPanels,
53cdf0e10cSrcweir                 const TabAlignment i_eAlignment, const TabItemContent i_eItemContent )
54cdf0e10cSrcweir             :eAlignment( i_eAlignment )
55cdf0e10cSrcweir             ,rPanels( i_rPanels )
56cdf0e10cSrcweir             ,pTabBar( new PanelTabBar( i_rParent, i_rPanels, i_eAlignment, i_eItemContent ) )
57cdf0e10cSrcweir         {
58cdf0e10cSrcweir             pTabBar->Show();
59cdf0e10cSrcweir         }
60cdf0e10cSrcweir     };
61cdf0e10cSrcweir 
62cdf0e10cSrcweir 	//====================================================================
63cdf0e10cSrcweir 	//= helper
64cdf0e10cSrcweir 	//====================================================================
65cdf0e10cSrcweir     namespace
66cdf0e10cSrcweir     {
lcl_isVerticalTabBar(const TabAlignment i_eAlignment)67cdf0e10cSrcweir         static bool lcl_isVerticalTabBar( const TabAlignment i_eAlignment )
68cdf0e10cSrcweir         {
69cdf0e10cSrcweir             return  ( i_eAlignment == TABS_RIGHT )
70cdf0e10cSrcweir                 ||  ( i_eAlignment == TABS_LEFT );
71cdf0e10cSrcweir         }
72cdf0e10cSrcweir 
lcl_checkDisposed(const TabDeckLayouter_Data & i_rData)73cdf0e10cSrcweir         static bool lcl_checkDisposed( const TabDeckLayouter_Data& i_rData )
74cdf0e10cSrcweir         {
75cdf0e10cSrcweir             if ( !i_rData.pTabBar.get() )
76cdf0e10cSrcweir             {
77cdf0e10cSrcweir                 OSL_ENSURE( false, "lcl_checkDisposed: already disposed!" );
78cdf0e10cSrcweir                 return true;
79cdf0e10cSrcweir             }
80cdf0e10cSrcweir             return false;
81cdf0e10cSrcweir         }
82cdf0e10cSrcweir     }
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	//====================================================================
85cdf0e10cSrcweir 	//= TabDeckLayouter
86cdf0e10cSrcweir 	//====================================================================
87cdf0e10cSrcweir 	//--------------------------------------------------------------------
TabDeckLayouter(Window & i_rParent,IToolPanelDeck & i_rPanels,const TabAlignment i_eAlignment,const TabItemContent i_eItemContent)88cdf0e10cSrcweir     TabDeckLayouter::TabDeckLayouter( Window& i_rParent, IToolPanelDeck& i_rPanels,
89cdf0e10cSrcweir             const TabAlignment i_eAlignment, const TabItemContent i_eItemContent )
90cdf0e10cSrcweir         :m_pData( new TabDeckLayouter_Data( i_rParent, i_rPanels, i_eAlignment, i_eItemContent ) )
91cdf0e10cSrcweir     {
92cdf0e10cSrcweir     }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	//--------------------------------------------------------------------
~TabDeckLayouter()95cdf0e10cSrcweir     TabDeckLayouter::~TabDeckLayouter()
96cdf0e10cSrcweir     {
97cdf0e10cSrcweir     }
98cdf0e10cSrcweir 
99cdf0e10cSrcweir 	//--------------------------------------------------------------------
IMPLEMENT_IREFERENCE(TabDeckLayouter)100cdf0e10cSrcweir     IMPLEMENT_IREFERENCE( TabDeckLayouter )
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	//--------------------------------------------------------------------
103cdf0e10cSrcweir     TabItemContent TabDeckLayouter::GetTabItemContent() const
104cdf0e10cSrcweir     {
105cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
106cdf0e10cSrcweir             return TABITEM_IMAGE_AND_TEXT;
107cdf0e10cSrcweir         return m_pData->pTabBar->GetTabItemContent();
108cdf0e10cSrcweir     }
109cdf0e10cSrcweir 
110cdf0e10cSrcweir 	//--------------------------------------------------------------------
SetTabItemContent(const TabItemContent & i_eItemContent)111cdf0e10cSrcweir     void TabDeckLayouter::SetTabItemContent( const TabItemContent& i_eItemContent )
112cdf0e10cSrcweir     {
113cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
114cdf0e10cSrcweir             return;
115cdf0e10cSrcweir         m_pData->pTabBar->SetTabItemContent( i_eItemContent );
116cdf0e10cSrcweir     }
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	//--------------------------------------------------------------------
GetTabAlignment() const119cdf0e10cSrcweir     TabAlignment TabDeckLayouter::GetTabAlignment() const
120cdf0e10cSrcweir     {
121cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
122cdf0e10cSrcweir             return TABS_RIGHT;
123cdf0e10cSrcweir         return m_pData->eAlignment;
124cdf0e10cSrcweir     }
125cdf0e10cSrcweir 
126cdf0e10cSrcweir 	//--------------------------------------------------------------------
GetFocusedPanelItem() const127cdf0e10cSrcweir     ::boost::optional< size_t > TabDeckLayouter::GetFocusedPanelItem() const
128cdf0e10cSrcweir     {
129cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
130cdf0e10cSrcweir             return ::boost::optional< size_t >();
131cdf0e10cSrcweir         return m_pData->pTabBar->GetFocusedPanelItem();
132cdf0e10cSrcweir     }
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	//--------------------------------------------------------------------
FocusPanelItem(const size_t i_nItemPos)135cdf0e10cSrcweir     void TabDeckLayouter::FocusPanelItem( const size_t i_nItemPos )
136cdf0e10cSrcweir     {
137cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
138cdf0e10cSrcweir             return;
139cdf0e10cSrcweir         m_pData->pTabBar->FocusPanelItem( i_nItemPos );
140cdf0e10cSrcweir     }
141cdf0e10cSrcweir 
142cdf0e10cSrcweir 	//--------------------------------------------------------------------
IsPanelSelectorEnabled() const143cdf0e10cSrcweir     bool TabDeckLayouter::IsPanelSelectorEnabled() const
144cdf0e10cSrcweir     {
145cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
146cdf0e10cSrcweir             return false;
147cdf0e10cSrcweir         return m_pData->pTabBar->IsEnabled();
148cdf0e10cSrcweir     }
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 	//--------------------------------------------------------------------
IsPanelSelectorVisible() const151cdf0e10cSrcweir     bool TabDeckLayouter::IsPanelSelectorVisible() const
152cdf0e10cSrcweir     {
153cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
154cdf0e10cSrcweir             return false;
155cdf0e10cSrcweir         return m_pData->pTabBar->IsVisible();
156cdf0e10cSrcweir     }
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 	//--------------------------------------------------------------------
GetItemScreenRect(const size_t i_nItemPos) const159cdf0e10cSrcweir     Rectangle TabDeckLayouter::GetItemScreenRect( const size_t i_nItemPos ) const
160cdf0e10cSrcweir     {
161cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
162cdf0e10cSrcweir             return Rectangle();
163cdf0e10cSrcweir         return m_pData->pTabBar->GetItemScreenRect( i_nItemPos );
164cdf0e10cSrcweir     }
165cdf0e10cSrcweir 
166cdf0e10cSrcweir 	//--------------------------------------------------------------------
Layout(const Rectangle & i_rDeckPlayground)167cdf0e10cSrcweir     Rectangle TabDeckLayouter::Layout( const Rectangle& i_rDeckPlayground )
168cdf0e10cSrcweir     {
169cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
170cdf0e10cSrcweir             return i_rDeckPlayground;
171cdf0e10cSrcweir 
172cdf0e10cSrcweir         const Size aPreferredSize( m_pData->pTabBar->GetOptimalSize( WINDOWSIZE_PREFERRED ) );
173cdf0e10cSrcweir         if ( lcl_isVerticalTabBar( m_pData->eAlignment ) )
174cdf0e10cSrcweir         {
175cdf0e10cSrcweir             Size aTabBarSize =  ( aPreferredSize.Width() < i_rDeckPlayground.GetWidth() )
176cdf0e10cSrcweir                             ?   aPreferredSize
177cdf0e10cSrcweir                             :   m_pData->pTabBar->GetOptimalSize( WINDOWSIZE_MINIMUM );
178cdf0e10cSrcweir             aTabBarSize.Height() = i_rDeckPlayground.GetHeight();
179cdf0e10cSrcweir 
180cdf0e10cSrcweir             Rectangle aPanelRect( i_rDeckPlayground );
181cdf0e10cSrcweir             if ( m_pData->eAlignment == TABS_RIGHT )
182cdf0e10cSrcweir             {
183cdf0e10cSrcweir                 aPanelRect.Right() -= aTabBarSize.Width();
184cdf0e10cSrcweir                 Point aTabBarTopLeft( aPanelRect.TopRight() );
185cdf0e10cSrcweir                 aTabBarTopLeft.X() += 1;
186cdf0e10cSrcweir                 m_pData->pTabBar->SetPosSizePixel( aTabBarTopLeft, aTabBarSize );
187cdf0e10cSrcweir             }
188cdf0e10cSrcweir             else
189cdf0e10cSrcweir             {
190cdf0e10cSrcweir                 m_pData->pTabBar->SetPosSizePixel( aPanelRect.TopLeft(), aTabBarSize );
191cdf0e10cSrcweir                 aPanelRect.Left() += aTabBarSize.Width();
192cdf0e10cSrcweir             }
193cdf0e10cSrcweir             if ( aPanelRect.Left() >= aPanelRect.Right() )
194cdf0e10cSrcweir                 aPanelRect = Rectangle();
195cdf0e10cSrcweir 
196cdf0e10cSrcweir             return aPanelRect;
197cdf0e10cSrcweir         }
198cdf0e10cSrcweir 
199cdf0e10cSrcweir         Size aTabBarSize =  ( aPreferredSize.Height() < i_rDeckPlayground.GetHeight() )
200cdf0e10cSrcweir                         ?   aPreferredSize
201cdf0e10cSrcweir                         :   m_pData->pTabBar->GetOptimalSize( WINDOWSIZE_MINIMUM );
202cdf0e10cSrcweir         aTabBarSize.Width() = i_rDeckPlayground.GetWidth();
203cdf0e10cSrcweir 
204cdf0e10cSrcweir         Rectangle aPanelRect( i_rDeckPlayground );
205cdf0e10cSrcweir         if ( m_pData->eAlignment == TABS_TOP )
206cdf0e10cSrcweir         {
207cdf0e10cSrcweir             m_pData->pTabBar->SetPosSizePixel( aPanelRect.TopLeft(), aTabBarSize );
208cdf0e10cSrcweir             aPanelRect.Top() += aTabBarSize.Height();
209cdf0e10cSrcweir         }
210cdf0e10cSrcweir         else
211cdf0e10cSrcweir         {
212cdf0e10cSrcweir             aPanelRect.Bottom() -= aTabBarSize.Height();
213cdf0e10cSrcweir             Point aTabBarTopLeft( aPanelRect.BottomLeft() );
214cdf0e10cSrcweir             aTabBarTopLeft.Y() -= 1;
215cdf0e10cSrcweir             m_pData->pTabBar->SetPosSizePixel( aTabBarTopLeft, aTabBarSize );
216cdf0e10cSrcweir         }
217cdf0e10cSrcweir         if ( aPanelRect.Top() >= aPanelRect.Bottom() )
218cdf0e10cSrcweir             aPanelRect = Rectangle();
219cdf0e10cSrcweir 
220cdf0e10cSrcweir         return aPanelRect;
221cdf0e10cSrcweir     }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir 	//--------------------------------------------------------------------
Destroy()224cdf0e10cSrcweir     void TabDeckLayouter::Destroy()
225cdf0e10cSrcweir     {
226cdf0e10cSrcweir         m_pData->pTabBar.reset();
227cdf0e10cSrcweir     }
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 	//--------------------------------------------------------------------
SetFocusToPanelSelector()230cdf0e10cSrcweir     void TabDeckLayouter::SetFocusToPanelSelector()
231cdf0e10cSrcweir     {
232cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
233cdf0e10cSrcweir             return;
234cdf0e10cSrcweir         m_pData->pTabBar->GrabFocus();
235cdf0e10cSrcweir     }
236cdf0e10cSrcweir 
237cdf0e10cSrcweir 	//--------------------------------------------------------------------
GetAccessibleChildCount() const238cdf0e10cSrcweir     size_t TabDeckLayouter::GetAccessibleChildCount() const
239cdf0e10cSrcweir     {
240cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
241cdf0e10cSrcweir             return 0;
242cdf0e10cSrcweir 
243cdf0e10cSrcweir         return 1;
244cdf0e10cSrcweir     }
245cdf0e10cSrcweir 
246cdf0e10cSrcweir     //--------------------------------------------------------------------
GetAccessibleChild(const size_t i_nChildIndex,const Reference<XAccessible> & i_rParentAccessible)247cdf0e10cSrcweir     Reference< XAccessible > TabDeckLayouter::GetAccessibleChild( const size_t i_nChildIndex, const Reference< XAccessible >& i_rParentAccessible )
248cdf0e10cSrcweir     {
249cdf0e10cSrcweir         (void)i_nChildIndex;
250cdf0e10cSrcweir         (void)i_rParentAccessible;
251cdf0e10cSrcweir         if ( lcl_checkDisposed( *m_pData ) )
252cdf0e10cSrcweir             return NULL;
253cdf0e10cSrcweir 
254cdf0e10cSrcweir         return m_pData->pTabBar->GetAccessible( sal_True );
255cdf0e10cSrcweir     }
256cdf0e10cSrcweir 
257cdf0e10cSrcweir //........................................................................
258cdf0e10cSrcweir } // namespace svt
259cdf0e10cSrcweir //........................................................................
260