1*b1cdbd2cSJim Jagielski /************************************************************** 2*b1cdbd2cSJim Jagielski * 3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one 4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file 5*b1cdbd2cSJim Jagielski * distributed with this work for additional information 6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file 7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the 8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance 9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at 10*b1cdbd2cSJim Jagielski * 11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0 12*b1cdbd2cSJim Jagielski * 13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing, 14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an 15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the 17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations 18*b1cdbd2cSJim Jagielski * under the License. 19*b1cdbd2cSJim Jagielski * 20*b1cdbd2cSJim Jagielski *************************************************************/ 21*b1cdbd2cSJim Jagielski 22*b1cdbd2cSJim Jagielski 23*b1cdbd2cSJim Jagielski 24*b1cdbd2cSJim Jagielski #include "precompiled_svtools.hxx" 25*b1cdbd2cSJim Jagielski 26*b1cdbd2cSJim Jagielski #include "svtools/toolpanel/tablayouter.hxx" 27*b1cdbd2cSJim Jagielski #include "svtools/toolpanel/toolpaneldeck.hxx" 28*b1cdbd2cSJim Jagielski #include "svtools/toolpanel/paneltabbar.hxx" 29*b1cdbd2cSJim Jagielski #include "svtaccessiblefactory.hxx" 30*b1cdbd2cSJim Jagielski 31*b1cdbd2cSJim Jagielski #include <tools/gen.hxx> 32*b1cdbd2cSJim Jagielski #include <tools/diagnose_ex.h> 33*b1cdbd2cSJim Jagielski 34*b1cdbd2cSJim Jagielski //........................................................................ 35*b1cdbd2cSJim Jagielski namespace svt 36*b1cdbd2cSJim Jagielski { 37*b1cdbd2cSJim Jagielski //........................................................................ 38*b1cdbd2cSJim Jagielski 39*b1cdbd2cSJim Jagielski using ::com::sun::star::uno::Reference; 40*b1cdbd2cSJim Jagielski using ::com::sun::star::accessibility::XAccessible; 41*b1cdbd2cSJim Jagielski 42*b1cdbd2cSJim Jagielski //==================================================================== 43*b1cdbd2cSJim Jagielski //= TabDeckLayouter_Data 44*b1cdbd2cSJim Jagielski //==================================================================== 45*b1cdbd2cSJim Jagielski struct TabDeckLayouter_Data 46*b1cdbd2cSJim Jagielski { 47*b1cdbd2cSJim Jagielski TabAlignment eAlignment; 48*b1cdbd2cSJim Jagielski IToolPanelDeck& rPanels; 49*b1cdbd2cSJim Jagielski ::std::auto_ptr< PanelTabBar > pTabBar; 50*b1cdbd2cSJim Jagielski AccessibleFactoryAccess aAccessibleFactory; 51*b1cdbd2cSJim Jagielski TabDeckLayouter_Datasvt::TabDeckLayouter_Data52*b1cdbd2cSJim Jagielski TabDeckLayouter_Data( Window& i_rParent, IToolPanelDeck& i_rPanels, 53*b1cdbd2cSJim Jagielski const TabAlignment i_eAlignment, const TabItemContent i_eItemContent ) 54*b1cdbd2cSJim Jagielski :eAlignment( i_eAlignment ) 55*b1cdbd2cSJim Jagielski ,rPanels( i_rPanels ) 56*b1cdbd2cSJim Jagielski ,pTabBar( new PanelTabBar( i_rParent, i_rPanels, i_eAlignment, i_eItemContent ) ) 57*b1cdbd2cSJim Jagielski { 58*b1cdbd2cSJim Jagielski pTabBar->Show(); 59*b1cdbd2cSJim Jagielski } 60*b1cdbd2cSJim Jagielski }; 61*b1cdbd2cSJim Jagielski 62*b1cdbd2cSJim Jagielski //==================================================================== 63*b1cdbd2cSJim Jagielski //= helper 64*b1cdbd2cSJim Jagielski //==================================================================== 65*b1cdbd2cSJim Jagielski namespace 66*b1cdbd2cSJim Jagielski { lcl_isVerticalTabBar(const TabAlignment i_eAlignment)67*b1cdbd2cSJim Jagielski static bool lcl_isVerticalTabBar( const TabAlignment i_eAlignment ) 68*b1cdbd2cSJim Jagielski { 69*b1cdbd2cSJim Jagielski return ( i_eAlignment == TABS_RIGHT ) 70*b1cdbd2cSJim Jagielski || ( i_eAlignment == TABS_LEFT ); 71*b1cdbd2cSJim Jagielski } 72*b1cdbd2cSJim Jagielski lcl_checkDisposed(const TabDeckLayouter_Data & i_rData)73*b1cdbd2cSJim Jagielski static bool lcl_checkDisposed( const TabDeckLayouter_Data& i_rData ) 74*b1cdbd2cSJim Jagielski { 75*b1cdbd2cSJim Jagielski if ( !i_rData.pTabBar.get() ) 76*b1cdbd2cSJim Jagielski { 77*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "lcl_checkDisposed: already disposed!" ); 78*b1cdbd2cSJim Jagielski return true; 79*b1cdbd2cSJim Jagielski } 80*b1cdbd2cSJim Jagielski return false; 81*b1cdbd2cSJim Jagielski } 82*b1cdbd2cSJim Jagielski } 83*b1cdbd2cSJim Jagielski 84*b1cdbd2cSJim Jagielski //==================================================================== 85*b1cdbd2cSJim Jagielski //= TabDeckLayouter 86*b1cdbd2cSJim Jagielski //==================================================================== 87*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- TabDeckLayouter(Window & i_rParent,IToolPanelDeck & i_rPanels,const TabAlignment i_eAlignment,const TabItemContent i_eItemContent)88*b1cdbd2cSJim Jagielski TabDeckLayouter::TabDeckLayouter( Window& i_rParent, IToolPanelDeck& i_rPanels, 89*b1cdbd2cSJim Jagielski const TabAlignment i_eAlignment, const TabItemContent i_eItemContent ) 90*b1cdbd2cSJim Jagielski :m_pData( new TabDeckLayouter_Data( i_rParent, i_rPanels, i_eAlignment, i_eItemContent ) ) 91*b1cdbd2cSJim Jagielski { 92*b1cdbd2cSJim Jagielski } 93*b1cdbd2cSJim Jagielski 94*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- ~TabDeckLayouter()95*b1cdbd2cSJim Jagielski TabDeckLayouter::~TabDeckLayouter() 96*b1cdbd2cSJim Jagielski { 97*b1cdbd2cSJim Jagielski } 98*b1cdbd2cSJim Jagielski 99*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- IMPLEMENT_IREFERENCE(TabDeckLayouter)100*b1cdbd2cSJim Jagielski IMPLEMENT_IREFERENCE( TabDeckLayouter ) 101*b1cdbd2cSJim Jagielski 102*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- 103*b1cdbd2cSJim Jagielski TabItemContent TabDeckLayouter::GetTabItemContent() const 104*b1cdbd2cSJim Jagielski { 105*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 106*b1cdbd2cSJim Jagielski return TABITEM_IMAGE_AND_TEXT; 107*b1cdbd2cSJim Jagielski return m_pData->pTabBar->GetTabItemContent(); 108*b1cdbd2cSJim Jagielski } 109*b1cdbd2cSJim Jagielski 110*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- SetTabItemContent(const TabItemContent & i_eItemContent)111*b1cdbd2cSJim Jagielski void TabDeckLayouter::SetTabItemContent( const TabItemContent& i_eItemContent ) 112*b1cdbd2cSJim Jagielski { 113*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 114*b1cdbd2cSJim Jagielski return; 115*b1cdbd2cSJim Jagielski m_pData->pTabBar->SetTabItemContent( i_eItemContent ); 116*b1cdbd2cSJim Jagielski } 117*b1cdbd2cSJim Jagielski 118*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetTabAlignment() const119*b1cdbd2cSJim Jagielski TabAlignment TabDeckLayouter::GetTabAlignment() const 120*b1cdbd2cSJim Jagielski { 121*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 122*b1cdbd2cSJim Jagielski return TABS_RIGHT; 123*b1cdbd2cSJim Jagielski return m_pData->eAlignment; 124*b1cdbd2cSJim Jagielski } 125*b1cdbd2cSJim Jagielski 126*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetFocusedPanelItem() const127*b1cdbd2cSJim Jagielski ::boost::optional< size_t > TabDeckLayouter::GetFocusedPanelItem() const 128*b1cdbd2cSJim Jagielski { 129*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 130*b1cdbd2cSJim Jagielski return ::boost::optional< size_t >(); 131*b1cdbd2cSJim Jagielski return m_pData->pTabBar->GetFocusedPanelItem(); 132*b1cdbd2cSJim Jagielski } 133*b1cdbd2cSJim Jagielski 134*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- FocusPanelItem(const size_t i_nItemPos)135*b1cdbd2cSJim Jagielski void TabDeckLayouter::FocusPanelItem( const size_t i_nItemPos ) 136*b1cdbd2cSJim Jagielski { 137*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 138*b1cdbd2cSJim Jagielski return; 139*b1cdbd2cSJim Jagielski m_pData->pTabBar->FocusPanelItem( i_nItemPos ); 140*b1cdbd2cSJim Jagielski } 141*b1cdbd2cSJim Jagielski 142*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- IsPanelSelectorEnabled() const143*b1cdbd2cSJim Jagielski bool TabDeckLayouter::IsPanelSelectorEnabled() const 144*b1cdbd2cSJim Jagielski { 145*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 146*b1cdbd2cSJim Jagielski return false; 147*b1cdbd2cSJim Jagielski return m_pData->pTabBar->IsEnabled(); 148*b1cdbd2cSJim Jagielski } 149*b1cdbd2cSJim Jagielski 150*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- IsPanelSelectorVisible() const151*b1cdbd2cSJim Jagielski bool TabDeckLayouter::IsPanelSelectorVisible() const 152*b1cdbd2cSJim Jagielski { 153*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 154*b1cdbd2cSJim Jagielski return false; 155*b1cdbd2cSJim Jagielski return m_pData->pTabBar->IsVisible(); 156*b1cdbd2cSJim Jagielski } 157*b1cdbd2cSJim Jagielski 158*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetItemScreenRect(const size_t i_nItemPos) const159*b1cdbd2cSJim Jagielski Rectangle TabDeckLayouter::GetItemScreenRect( const size_t i_nItemPos ) const 160*b1cdbd2cSJim Jagielski { 161*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 162*b1cdbd2cSJim Jagielski return Rectangle(); 163*b1cdbd2cSJim Jagielski return m_pData->pTabBar->GetItemScreenRect( i_nItemPos ); 164*b1cdbd2cSJim Jagielski } 165*b1cdbd2cSJim Jagielski 166*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Layout(const Rectangle & i_rDeckPlayground)167*b1cdbd2cSJim Jagielski Rectangle TabDeckLayouter::Layout( const Rectangle& i_rDeckPlayground ) 168*b1cdbd2cSJim Jagielski { 169*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 170*b1cdbd2cSJim Jagielski return i_rDeckPlayground; 171*b1cdbd2cSJim Jagielski 172*b1cdbd2cSJim Jagielski const Size aPreferredSize( m_pData->pTabBar->GetOptimalSize( WINDOWSIZE_PREFERRED ) ); 173*b1cdbd2cSJim Jagielski if ( lcl_isVerticalTabBar( m_pData->eAlignment ) ) 174*b1cdbd2cSJim Jagielski { 175*b1cdbd2cSJim Jagielski Size aTabBarSize = ( aPreferredSize.Width() < i_rDeckPlayground.GetWidth() ) 176*b1cdbd2cSJim Jagielski ? aPreferredSize 177*b1cdbd2cSJim Jagielski : m_pData->pTabBar->GetOptimalSize( WINDOWSIZE_MINIMUM ); 178*b1cdbd2cSJim Jagielski aTabBarSize.Height() = i_rDeckPlayground.GetHeight(); 179*b1cdbd2cSJim Jagielski 180*b1cdbd2cSJim Jagielski Rectangle aPanelRect( i_rDeckPlayground ); 181*b1cdbd2cSJim Jagielski if ( m_pData->eAlignment == TABS_RIGHT ) 182*b1cdbd2cSJim Jagielski { 183*b1cdbd2cSJim Jagielski aPanelRect.Right() -= aTabBarSize.Width(); 184*b1cdbd2cSJim Jagielski Point aTabBarTopLeft( aPanelRect.TopRight() ); 185*b1cdbd2cSJim Jagielski aTabBarTopLeft.X() += 1; 186*b1cdbd2cSJim Jagielski m_pData->pTabBar->SetPosSizePixel( aTabBarTopLeft, aTabBarSize ); 187*b1cdbd2cSJim Jagielski } 188*b1cdbd2cSJim Jagielski else 189*b1cdbd2cSJim Jagielski { 190*b1cdbd2cSJim Jagielski m_pData->pTabBar->SetPosSizePixel( aPanelRect.TopLeft(), aTabBarSize ); 191*b1cdbd2cSJim Jagielski aPanelRect.Left() += aTabBarSize.Width(); 192*b1cdbd2cSJim Jagielski } 193*b1cdbd2cSJim Jagielski if ( aPanelRect.Left() >= aPanelRect.Right() ) 194*b1cdbd2cSJim Jagielski aPanelRect = Rectangle(); 195*b1cdbd2cSJim Jagielski 196*b1cdbd2cSJim Jagielski return aPanelRect; 197*b1cdbd2cSJim Jagielski } 198*b1cdbd2cSJim Jagielski 199*b1cdbd2cSJim Jagielski Size aTabBarSize = ( aPreferredSize.Height() < i_rDeckPlayground.GetHeight() ) 200*b1cdbd2cSJim Jagielski ? aPreferredSize 201*b1cdbd2cSJim Jagielski : m_pData->pTabBar->GetOptimalSize( WINDOWSIZE_MINIMUM ); 202*b1cdbd2cSJim Jagielski aTabBarSize.Width() = i_rDeckPlayground.GetWidth(); 203*b1cdbd2cSJim Jagielski 204*b1cdbd2cSJim Jagielski Rectangle aPanelRect( i_rDeckPlayground ); 205*b1cdbd2cSJim Jagielski if ( m_pData->eAlignment == TABS_TOP ) 206*b1cdbd2cSJim Jagielski { 207*b1cdbd2cSJim Jagielski m_pData->pTabBar->SetPosSizePixel( aPanelRect.TopLeft(), aTabBarSize ); 208*b1cdbd2cSJim Jagielski aPanelRect.Top() += aTabBarSize.Height(); 209*b1cdbd2cSJim Jagielski } 210*b1cdbd2cSJim Jagielski else 211*b1cdbd2cSJim Jagielski { 212*b1cdbd2cSJim Jagielski aPanelRect.Bottom() -= aTabBarSize.Height(); 213*b1cdbd2cSJim Jagielski Point aTabBarTopLeft( aPanelRect.BottomLeft() ); 214*b1cdbd2cSJim Jagielski aTabBarTopLeft.Y() -= 1; 215*b1cdbd2cSJim Jagielski m_pData->pTabBar->SetPosSizePixel( aTabBarTopLeft, aTabBarSize ); 216*b1cdbd2cSJim Jagielski } 217*b1cdbd2cSJim Jagielski if ( aPanelRect.Top() >= aPanelRect.Bottom() ) 218*b1cdbd2cSJim Jagielski aPanelRect = Rectangle(); 219*b1cdbd2cSJim Jagielski 220*b1cdbd2cSJim Jagielski return aPanelRect; 221*b1cdbd2cSJim Jagielski } 222*b1cdbd2cSJim Jagielski 223*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- Destroy()224*b1cdbd2cSJim Jagielski void TabDeckLayouter::Destroy() 225*b1cdbd2cSJim Jagielski { 226*b1cdbd2cSJim Jagielski m_pData->pTabBar.reset(); 227*b1cdbd2cSJim Jagielski } 228*b1cdbd2cSJim Jagielski 229*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- SetFocusToPanelSelector()230*b1cdbd2cSJim Jagielski void TabDeckLayouter::SetFocusToPanelSelector() 231*b1cdbd2cSJim Jagielski { 232*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 233*b1cdbd2cSJim Jagielski return; 234*b1cdbd2cSJim Jagielski m_pData->pTabBar->GrabFocus(); 235*b1cdbd2cSJim Jagielski } 236*b1cdbd2cSJim Jagielski 237*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetAccessibleChildCount() const238*b1cdbd2cSJim Jagielski size_t TabDeckLayouter::GetAccessibleChildCount() const 239*b1cdbd2cSJim Jagielski { 240*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 241*b1cdbd2cSJim Jagielski return 0; 242*b1cdbd2cSJim Jagielski 243*b1cdbd2cSJim Jagielski return 1; 244*b1cdbd2cSJim Jagielski } 245*b1cdbd2cSJim Jagielski 246*b1cdbd2cSJim Jagielski //-------------------------------------------------------------------- GetAccessibleChild(const size_t i_nChildIndex,const Reference<XAccessible> & i_rParentAccessible)247*b1cdbd2cSJim Jagielski Reference< XAccessible > TabDeckLayouter::GetAccessibleChild( const size_t i_nChildIndex, const Reference< XAccessible >& i_rParentAccessible ) 248*b1cdbd2cSJim Jagielski { 249*b1cdbd2cSJim Jagielski (void)i_nChildIndex; 250*b1cdbd2cSJim Jagielski (void)i_rParentAccessible; 251*b1cdbd2cSJim Jagielski if ( lcl_checkDisposed( *m_pData ) ) 252*b1cdbd2cSJim Jagielski return NULL; 253*b1cdbd2cSJim Jagielski 254*b1cdbd2cSJim Jagielski return m_pData->pTabBar->GetAccessible( sal_True ); 255*b1cdbd2cSJim Jagielski } 256*b1cdbd2cSJim Jagielski 257*b1cdbd2cSJim Jagielski //........................................................................ 258*b1cdbd2cSJim Jagielski } // namespace svt 259*b1cdbd2cSJim Jagielski //........................................................................ 260