This is an automated email from the ASF dual-hosted git repository. mseidel pushed a commit to branch AOO42X in repository https://gitbox.apache.org/repos/asf/openoffice.git
The following commit(s) were added to refs/heads/AOO42X by this push: new 6485cf7b38 Fixed typos, removed whitespace 6485cf7b38 is described below commit 6485cf7b3877c588beeaeeaaa283722984d1c651 Author: mseidel <msei...@apache.org> AuthorDate: Sat Jan 6 23:56:53 2024 +0100 Fixed typos, removed whitespace (cherry picked from commit 520e75ba70bcd5f3bccaace624e4e4d1dad991a9) --- .../ui/framework/factories/FullScreenPane.cxx | 359 +-- main/vcl/source/control/tabctrl.cxx | 3352 ++++++++++---------- 2 files changed, 1844 insertions(+), 1867 deletions(-) diff --git a/main/sd/source/ui/framework/factories/FullScreenPane.cxx b/main/sd/source/ui/framework/factories/FullScreenPane.cxx index f3ee32fd3e..af5b6fee1a 100644 --- a/main/sd/source/ui/framework/factories/FullScreenPane.cxx +++ b/main/sd/source/ui/framework/factories/FullScreenPane.cxx @@ -1,5 +1,5 @@ /************************************************************** - * + * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -7,20 +7,18 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * + * *************************************************************/ - - #include "precompiled_sd.hxx" #include "FullScreenPane.hxx" @@ -47,244 +45,227 @@ using ::rtl::OUString; namespace sd { namespace framework { FullScreenPane::FullScreenPane ( - const Reference<XComponentContext>& rxComponentContext, - const Reference<XResourceId>& rxPaneId, - const ::Window* pViewShellWindow) - : FrameWindowPane(rxPaneId,NULL), - mxComponentContext(rxComponentContext), - mpWorkWindow(NULL) + const Reference<XComponentContext>& rxComponentContext, + const Reference<XResourceId>& rxPaneId, + const ::Window* pViewShellWindow) + :FrameWindowPane(rxPaneId,NULL), + mxComponentContext(rxComponentContext), + mpWorkWindow(NULL) { - ::Window* pParent = NULL; - mpWorkWindow.reset(new WorkWindow( - pParent, - 0)); // For debugging (non-fullscreen) use WB_BORDER | WB_MOVEABLE | WB_SIZEABLE)); - - if ( ! rxPaneId.is()) - throw lang::IllegalArgumentException(); - - sal_Int32 nScreenNumber = 1; - ExtractArguments(rxPaneId, nScreenNumber); - - if (mpWorkWindow.get() == NULL) - return; - - // Create a new top-leve window that is displayed full screen. - mpWorkWindow->ShowFullScreenMode(sal_True, nScreenNumber); - // For debugging (non-fullscreen) use mpWorkWindow->SetScreenNumber(nScreenNumber); - mpWorkWindow->SetMenuBarMode(MENUBAR_MODE_HIDE); - mpWorkWindow->SetBorderStyle(WINDOW_BORDER_REMOVEBORDER); - mpWorkWindow->SetBackground(Wallpaper()); - // Don't show the window right now in order to allow the setting of an - // accessibility object: accessibility objects are typically - // requested by AT-tools when the window is shown. Chaning it - // afterwards may or may not work. - - // Add resize listener at the work window. - Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler)); - mpWorkWindow->AddEventListener(aWindowEventHandler); - - // Set title and icon of the new window to those of the current window - // of the view shell. - if (pViewShellWindow != NULL) - { - const SystemWindow* pSystemWindow = pViewShellWindow->GetSystemWindow(); - mpWorkWindow->SetText(pSystemWindow->GetText()); - mpWorkWindow->SetIcon(pSystemWindow->GetIcon()); - } - - // For some reason the VCL canvas can not paint into a WorkWindow. - // Therefore a child window is created that covers the WorkWindow - // completely. - mpWindow = new ::Window(mpWorkWindow.get()); - mpWindow->SetPosSizePixel(Point(0,0), mpWorkWindow->GetSizePixel()); - mpWindow->SetBackground(Wallpaper()); - mxWindow = VCLUnoHelper::GetInterface(mpWindow); - - // Create the canvas. - mxCanvas = CreateCanvas(); - - mpWindow->GrabFocus(); + ::Window* pParent = NULL; + mpWorkWindow.reset(new WorkWindow( + pParent, + 0)); // For debugging (non-fullscreen) use WB_BORDER | WB_MOVEABLE | WB_SIZEABLE)); + + if ( ! rxPaneId.is()) + throw lang::IllegalArgumentException(); + + sal_Int32 nScreenNumber = 1; + ExtractArguments(rxPaneId, nScreenNumber); + + if (mpWorkWindow.get() == NULL) + return; + + // Create a new top-level window that is displayed full screen. + mpWorkWindow->ShowFullScreenMode(sal_True, nScreenNumber); + // For debugging (non-fullscreen) use mpWorkWindow->SetScreenNumber(nScreenNumber); + mpWorkWindow->SetMenuBarMode(MENUBAR_MODE_HIDE); + mpWorkWindow->SetBorderStyle(WINDOW_BORDER_REMOVEBORDER); + mpWorkWindow->SetBackground(Wallpaper()); + // Don't show the window right now in order to allow the setting of an + // accessibility object: accessibility objects are typically + // requested by AT-tools when the window is shown. Changing it + // afterwards may or may not work. + + // Add resize listener at the work window. + Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler)); + mpWorkWindow->AddEventListener(aWindowEventHandler); + + // Set title and icon of the new window to those of the current window + // of the view shell. + if (pViewShellWindow != NULL) + { + const SystemWindow* pSystemWindow = pViewShellWindow->GetSystemWindow(); + mpWorkWindow->SetText(pSystemWindow->GetText()); + mpWorkWindow->SetIcon(pSystemWindow->GetIcon()); + } + + // For some reason the VCL canvas can not paint into a WorkWindow. + // Therefore a child window is created that covers the WorkWindow + // completely. + mpWindow = new ::Window(mpWorkWindow.get()); + mpWindow->SetPosSizePixel(Point(0,0), mpWorkWindow->GetSizePixel()); + mpWindow->SetBackground(Wallpaper()); + mxWindow = VCLUnoHelper::GetInterface(mpWindow); + + // Create the canvas. + mxCanvas = CreateCanvas(); + + mpWindow->GrabFocus(); } - - FullScreenPane::~FullScreenPane (void) throw() { } - - void SAL_CALL FullScreenPane::disposing (void) { - // We have created the window pointed to by mpWindow, we delete it. - if (mpWindow != NULL) - { - delete mpWindow; - } - - if (mpWorkWindow.get() != NULL) - { - Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler)); - mpWorkWindow->RemoveEventListener(aWindowEventHandler); - mpWorkWindow.reset(); - } - - - FrameWindowPane::disposing(); -} + // We have created the window pointed to by mpWindow, we delete it. + if (mpWindow != NULL) + { + delete mpWindow; + } + + if (mpWorkWindow.get() != NULL) + { + Link aWindowEventHandler (LINK(this, FullScreenPane, WindowEventHandler)); + mpWorkWindow->RemoveEventListener(aWindowEventHandler); + mpWorkWindow.reset(); + } + FrameWindowPane::disposing(); +} //----- XPane ----------------------------------------------------------------- sal_Bool SAL_CALL FullScreenPane::isVisible (void) - throw (RuntimeException) + throw (RuntimeException) { - ThrowIfDisposed(); + ThrowIfDisposed(); - if (mpWindow != NULL) - return mpWindow->IsReallyVisible(); - else - return false; + if (mpWindow != NULL) + return mpWindow->IsReallyVisible(); + else + return false; } - - void SAL_CALL FullScreenPane::setVisible (const sal_Bool bIsVisible) - throw (RuntimeException) + throw (RuntimeException) { - ThrowIfDisposed(); + ThrowIfDisposed(); - if (mpWindow != NULL) - mpWindow->Show(bIsVisible); - if( bool(mpWorkWindow)) - mpWorkWindow->Show(bIsVisible); + if (mpWindow != NULL) + mpWindow->Show(bIsVisible); + if( bool(mpWorkWindow)) + mpWorkWindow->Show(bIsVisible); } - - Reference<accessibility::XAccessible> SAL_CALL FullScreenPane::getAccessible (void) - throw (RuntimeException) + throw (RuntimeException) { - ThrowIfDisposed(); + ThrowIfDisposed(); - if( bool(mpWorkWindow)) - return mpWorkWindow->GetAccessible(sal_False); - else - return NULL; + if( bool(mpWorkWindow)) + return mpWorkWindow->GetAccessible(sal_False); + else + return NULL; } - - void SAL_CALL FullScreenPane::setAccessible ( - const Reference<accessibility::XAccessible>& rxAccessible) - throw (RuntimeException) + const Reference<accessibility::XAccessible>& rxAccessible) + throw (RuntimeException) { - ThrowIfDisposed(); - - if (mpWindow != NULL) - { - Reference<lang::XInitialization> xInitializable (rxAccessible, UNO_QUERY); - if (xInitializable.is()) - { - ::Window* pParentWindow = mpWindow->GetParent(); - Reference<accessibility::XAccessible> xAccessibleParent; - if (pParentWindow != NULL) - xAccessibleParent = pParentWindow->GetAccessible(); - Sequence<Any> aArguments (1); - aArguments[0] = Any(xAccessibleParent); - xInitializable->initialize(aArguments); - } - GetWindow()->SetAccessible(rxAccessible); - } + ThrowIfDisposed(); + + if (mpWindow != NULL) + { + Reference<lang::XInitialization> xInitializable (rxAccessible, UNO_QUERY); + if (xInitializable.is()) + { + ::Window* pParentWindow = mpWindow->GetParent(); + Reference<accessibility::XAccessible> xAccessibleParent; + if (pParentWindow != NULL) + xAccessibleParent = pParentWindow->GetAccessible(); + Sequence<Any> aArguments (1); + aArguments[0] = Any(xAccessibleParent); + xInitializable->initialize(aArguments); + } + GetWindow()->SetAccessible(rxAccessible); + } } - - //----------------------------------------------------------------------------- IMPL_LINK(FullScreenPane, WindowEventHandler, VclWindowEvent*, pEvent) { switch (pEvent->GetId()) - { - case VCLEVENT_WINDOW_RESIZE: - GetWindow()->SetPosPixel(Point(0,0)); - GetWindow()->SetSizePixel(Size( - mpWorkWindow->GetSizePixel().Width(), - mpWorkWindow->GetSizePixel().Height())); - break; - - case VCLEVENT_OBJECT_DYING: - mpWorkWindow.reset(); - break; - } - return 1; + { + case VCLEVENT_WINDOW_RESIZE: + GetWindow()->SetPosPixel(Point(0,0)); + GetWindow()->SetSizePixel(Size( + mpWorkWindow->GetSizePixel().Width(), + mpWorkWindow->GetSizePixel().Height())); + break; + + case VCLEVENT_OBJECT_DYING: + mpWorkWindow.reset(); + break; + } + return 1; } - - Reference<rendering::XCanvas> FullScreenPane::CreateCanvas (void) - throw (RuntimeException) + throw (RuntimeException) { - ::Window* pWindow = VCLUnoHelper::GetWindow(mxWindow); - if (pWindow != NULL) - { - Sequence<Any> aArg (5); - - // common: first any is VCL pointer to window (for VCL canvas) - aArg[0] = makeAny(reinterpret_cast<sal_Int64>(pWindow)); - aArg[1] = Any(); - aArg[2] = makeAny(::com::sun::star::awt::Rectangle()); - aArg[3] = makeAny(sal_False); - aArg[4] = makeAny(mxWindow); - - Reference<lang::XMultiServiceFactory> xFactory ( - mxComponentContext->getServiceManager(), UNO_QUERY_THROW); - return Reference<rendering::XCanvas>( - xFactory->createInstanceWithArguments( - OUString::createFromAscii("com.sun.star.rendering.SpriteCanvas.VCL"), - aArg), - UNO_QUERY); - } - else - throw RuntimeException(); + ::Window* pWindow = VCLUnoHelper::GetWindow(mxWindow); + if (pWindow != NULL) + { + Sequence<Any> aArg (5); + + // common: first any is VCL pointer to window (for VCL canvas) + aArg[0] = makeAny(reinterpret_cast<sal_Int64>(pWindow)); + aArg[1] = Any(); + aArg[2] = makeAny(::com::sun::star::awt::Rectangle()); + aArg[3] = makeAny(sal_False); + aArg[4] = makeAny(mxWindow); + + Reference<lang::XMultiServiceFactory> xFactory ( + mxComponentContext->getServiceManager(), UNO_QUERY_THROW); + return Reference<rendering::XCanvas>( + xFactory->createInstanceWithArguments( + OUString::createFromAscii("com.sun.star.rendering.SpriteCanvas.VCL"), + aArg), + UNO_QUERY); + } + else + throw RuntimeException(); } - - void FullScreenPane::ExtractArguments ( - const Reference<XResourceId>& rxPaneId, - sal_Int32& rnScreenNumberReturnValue) + const Reference<XResourceId>& rxPaneId, + sal_Int32& rnScreenNumberReturnValue) { - // Extract arguments from the resource URL. - const util::URL aURL = rxPaneId->getFullResourceURL(); - sal_Int32 nIndex = 0; - while (nIndex >= 0) - { - const OUString aToken = aURL.Arguments.getToken(0, '&', nIndex); - if (aToken.getLength() > 0) - { - // Split at the first '='. - const sal_Int32 nAssign = aToken.indexOf('='); - const OUString sKey = aToken.copy(0, nAssign); - const OUString sValue = aToken.copy(nAssign+1); - - if (sKey.compareToAscii("ScreenNumber") == 0) - { - rnScreenNumberReturnValue = sValue.toInt32(); - } - } - } + // Extract arguments from the resource URL. + const util::URL aURL = rxPaneId->getFullResourceURL(); + sal_Int32 nIndex = 0; + while (nIndex >= 0) + { + const OUString aToken = aURL.Arguments.getToken(0, '&', nIndex); + if (aToken.getLength() > 0) + { + // Split at the first '='. + const sal_Int32 nAssign = aToken.indexOf('='); + const OUString sKey = aToken.copy(0, nAssign); + const OUString sValue = aToken.copy(nAssign+1); + + if (sKey.compareToAscii("ScreenNumber") == 0) + { + rnScreenNumberReturnValue = sValue.toInt32(); + } + } + } } - } } // end of namespace sd::framework + +/* vim: set noet sw=4 ts=4: */ diff --git a/main/vcl/source/control/tabctrl.cxx b/main/vcl/source/control/tabctrl.cxx index e019e0bea7..24cb0efb8f 100644 --- a/main/vcl/source/control/tabctrl.cxx +++ b/main/vcl/source/control/tabctrl.cxx @@ -1,5 +1,5 @@ /************************************************************** - * + * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -7,20 +7,18 @@ * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. - * + * *************************************************************/ - - // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_vcl.hxx" @@ -49,939 +47,939 @@ struct ImplTabItem { - sal_uInt16 mnId; - sal_uInt16 mnTabPageResId; - TabPage* mpTabPage; - String maText; - String maFormatText; - String maHelpText; - rtl::OString maHelpId; - Rectangle maRect; - sal_uInt16 mnLine; - bool mbFullVisible; - bool mbEnabled; - Image maTabImage; - - ImplTabItem() - : mnId( 0 ), mnTabPageResId( 0 ), mpTabPage( NULL ), - mnLine( 0 ), mbFullVisible( sal_False ), mbEnabled( true ) - {} + sal_uInt16 mnId; + sal_uInt16 mnTabPageResId; + TabPage* mpTabPage; + String maText; + String maFormatText; + String maHelpText; + rtl::OString maHelpId; + Rectangle maRect; + sal_uInt16 mnLine; + bool mbFullVisible; + bool mbEnabled; + Image maTabImage; + + ImplTabItem() + : mnId( 0 ), mnTabPageResId( 0 ), mpTabPage( NULL ), + mnLine( 0 ), mbFullVisible( sal_False ), mbEnabled( true ) + {} }; // ----------------------------------------------------------------------- struct ImplTabCtrlData { - std::hash_map< int, int > maLayoutPageIdToLine; - std::hash_map< int, int > maLayoutLineToPageId; - std::vector< Rectangle > maTabRectangles; - Point maItemsOffset; // offset of the tabitems - std::vector< ImplTabItem > maItemList; - ListBox* mpListBox; - Size maMinSize; + std::hash_map< int, int > maLayoutPageIdToLine; + std::hash_map< int, int > maLayoutLineToPageId; + std::vector< Rectangle > maTabRectangles; + Point maItemsOffset; // offset of the tabitems + std::vector< ImplTabItem > maItemList; + ListBox* mpListBox; + Size maMinSize; }; // ----------------------------------------------------------------------- -#define TAB_OFFSET 3 -#define TAB_TABOFFSET_X 3 -#define TAB_TABOFFSET_Y 3 -#define TAB_EXTRASPACE_X 6 -#define TAB_BORDER_LEFT 1 -#define TAB_BORDER_TOP 1 -#define TAB_BORDER_RIGHT 2 -#define TAB_BORDER_BOTTOM 2 +#define TAB_OFFSET 3 +#define TAB_TABOFFSET_X 3 +#define TAB_TABOFFSET_Y 3 +#define TAB_EXTRASPACE_X 6 +#define TAB_BORDER_LEFT 1 +#define TAB_BORDER_TOP 1 +#define TAB_BORDER_RIGHT 2 +#define TAB_BORDER_BOTTOM 2 // Fuer die Ermittlung von den Tab-Positionen -#define TAB_PAGERECT 0xFFFF +#define TAB_PAGERECT 0xFFFF // ======================================================================= void TabControl::ImplInit( Window* pParent, WinBits nStyle ) { - if ( !(nStyle & WB_NOTABSTOP) ) - nStyle |= WB_TABSTOP; - if ( !(nStyle & WB_NOGROUP) ) - nStyle |= WB_GROUP; - if ( !(nStyle & WB_NODIALOGCONTROL) ) - nStyle |= WB_DIALOGCONTROL; - - Control::ImplInit( pParent, nStyle, NULL ); - - mnLastWidth = 0; - mnLastHeight = 0; - mnBtnSize = 0; - mnMaxPageWidth = 0; - mnActPageId = 0; - mnCurPageId = 0; - mbFormat = sal_True; - mbRestoreHelpId = sal_False; - mbRestoreUnqId = sal_False; - mbSmallInvalidate = sal_False; - mbExtraSpace = sal_False; - mpTabCtrlData = new ImplTabCtrlData; - mpTabCtrlData->mpListBox = NULL; - - - ImplInitSettings( sal_True, sal_True, sal_True ); - - if( (nStyle & WB_DROPDOWN) ) - { - mpTabCtrlData->mpListBox = new ListBox( this, WB_DROPDOWN ); - mpTabCtrlData->mpListBox->SetPosSizePixel( Point( 0, 0 ), Size( 200, 20 ) ); - mpTabCtrlData->mpListBox->SetSelectHdl( LINK( this, TabControl, ImplListBoxSelectHdl ) ); - mpTabCtrlData->mpListBox->Show(); - } - - // if the tabcontrol is drawn (ie filled) by a native widget, make sure all contols will have transparent background - // otherwise they will paint with a wrong background - if( IsNativeControlSupported(CTRL_TAB_PANE, PART_ENTIRE_CONTROL) ) - EnableChildTransparentMode( sal_True ); - - if ( pParent->IsDialog() ) - pParent->AddChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) ); + if ( !(nStyle & WB_NOTABSTOP) ) + nStyle |= WB_TABSTOP; + if ( !(nStyle & WB_NOGROUP) ) + nStyle |= WB_GROUP; + if ( !(nStyle & WB_NODIALOGCONTROL) ) + nStyle |= WB_DIALOGCONTROL; + + Control::ImplInit( pParent, nStyle, NULL ); + + mnLastWidth = 0; + mnLastHeight = 0; + mnBtnSize = 0; + mnMaxPageWidth = 0; + mnActPageId = 0; + mnCurPageId = 0; + mbFormat = sal_True; + mbRestoreHelpId = sal_False; + mbRestoreUnqId = sal_False; + mbSmallInvalidate = sal_False; + mbExtraSpace = sal_False; + mpTabCtrlData = new ImplTabCtrlData; + mpTabCtrlData->mpListBox = NULL; + + + ImplInitSettings( sal_True, sal_True, sal_True ); + + if( (nStyle & WB_DROPDOWN) ) + { + mpTabCtrlData->mpListBox = new ListBox( this, WB_DROPDOWN ); + mpTabCtrlData->mpListBox->SetPosSizePixel( Point( 0, 0 ), Size( 200, 20 ) ); + mpTabCtrlData->mpListBox->SetSelectHdl( LINK( this, TabControl, ImplListBoxSelectHdl ) ); + mpTabCtrlData->mpListBox->Show(); + } + + // if the tabcontrol is drawn (i.e. filled) by a native widget, make sure all controls will have transparent background + // otherwise they will paint with a wrong background + if( IsNativeControlSupported(CTRL_TAB_PANE, PART_ENTIRE_CONTROL) ) + EnableChildTransparentMode( sal_True ); + + if ( pParent->IsDialog() ) + pParent->AddChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) ); } // ----------------------------------------------------------------- const Font& TabControl::GetCanonicalFont( const StyleSettings& _rStyle ) const { - return _rStyle.GetAppFont(); + return _rStyle.GetAppFont(); } // ----------------------------------------------------------------- const Color& TabControl::GetCanonicalTextColor( const StyleSettings& _rStyle ) const { - return _rStyle.GetButtonTextColor(); + return _rStyle.GetButtonTextColor(); } // ----------------------------------------------------------------------- void TabControl::ImplInitSettings( sal_Bool bFont, - sal_Bool bForeground, sal_Bool bBackground ) -{ - Control::ImplInitSettings( bFont, bForeground ); - - if ( bBackground ) - { - Window* pParent = GetParent(); - if ( !IsControlBackground() && - (pParent->IsChildTransparentModeEnabled() - || IsNativeControlSupported(CTRL_TAB_PANE, PART_ENTIRE_CONTROL) - || IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL) ) ) - - { - // set transparent mode for NWF tabcontrols to have - // the background always cleared properly - EnableChildTransparentMode( sal_True ); - SetParentClipMode( PARENTCLIPMODE_NOCLIP ); - SetPaintTransparent( sal_True ); - SetBackground(); - ImplGetWindowImpl()->mbUseNativeFocus = ImplGetSVData()->maNWFData.mbNoFocusRects; - } - else - { - EnableChildTransparentMode( sal_False ); - SetParentClipMode( 0 ); - SetPaintTransparent( sal_False ); - - if ( IsControlBackground() ) - SetBackground( GetControlBackground() ); - else - SetBackground( pParent->GetBackground() ); - } - } + sal_Bool bForeground, sal_Bool bBackground ) +{ + Control::ImplInitSettings( bFont, bForeground ); + + if ( bBackground ) + { + Window* pParent = GetParent(); + if ( !IsControlBackground() && + (pParent->IsChildTransparentModeEnabled() + || IsNativeControlSupported(CTRL_TAB_PANE, PART_ENTIRE_CONTROL) + || IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL) ) ) + + { + // set transparent mode for NWF tabcontrols to have + // the background always cleared properly + EnableChildTransparentMode( sal_True ); + SetParentClipMode( PARENTCLIPMODE_NOCLIP ); + SetPaintTransparent( sal_True ); + SetBackground(); + ImplGetWindowImpl()->mbUseNativeFocus = ImplGetSVData()->maNWFData.mbNoFocusRects; + } + else + { + EnableChildTransparentMode( sal_False ); + SetParentClipMode( 0 ); + SetPaintTransparent( sal_False ); + + if ( IsControlBackground() ) + SetBackground( GetControlBackground() ); + else + SetBackground( pParent->GetBackground() ); + } + } } // ----------------------------------------------------------------------- void TabControl::ImplFreeLayoutData() { - if( HasLayoutData() ) - { - ImplClearLayoutData(); - mpTabCtrlData->maLayoutPageIdToLine.clear(); - mpTabCtrlData->maLayoutLineToPageId.clear(); - } + if( HasLayoutData() ) + { + ImplClearLayoutData(); + mpTabCtrlData->maLayoutPageIdToLine.clear(); + mpTabCtrlData->maLayoutLineToPageId.clear(); + } } // ----------------------------------------------------------------------- TabControl::TabControl( Window* pParent, WinBits nStyle ) : - Control( WINDOW_TABCONTROL ) + Control( WINDOW_TABCONTROL ) { - ImplInit( pParent, nStyle ); + ImplInit( pParent, nStyle ); } // ----------------------------------------------------------------------- TabControl::TabControl( Window* pParent, const ResId& rResId ) : - Control( WINDOW_TABCONTROL ) + Control( WINDOW_TABCONTROL ) { - rResId.SetRT( RSC_TABCONTROL ); - WinBits nStyle = ImplInitRes( rResId ); - ImplInit( pParent, nStyle ); - ImplLoadRes( rResId ); + rResId.SetRT( RSC_TABCONTROL ); + WinBits nStyle = ImplInitRes( rResId ); + ImplInit( pParent, nStyle ); + ImplLoadRes( rResId ); - if ( !(nStyle & WB_HIDE) ) - Show(); + if ( !(nStyle & WB_HIDE) ) + Show(); } // ----------------------------------------------------------------------- void TabControl::ImplLoadRes( const ResId& rResId ) { - Control::ImplLoadRes( rResId ); + Control::ImplLoadRes( rResId ); - sal_uLong nObjMask = ReadLongRes(); + sal_uLong nObjMask = ReadLongRes(); - if ( nObjMask & RSC_TABCONTROL_ITEMLIST ) - { - sal_uLong nEle = ReadLongRes(); - - // Item hinzufuegen - for( sal_uLong i = 0; i < nEle; i++ ) - { - InsertPage( ResId( (RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr() ) ); - IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) ); - } - } + if ( nObjMask & RSC_TABCONTROL_ITEMLIST ) + { + sal_uLong nEle = ReadLongRes(); + + // add item + for( sal_uLong i = 0; i < nEle; i++ ) + { + InsertPage( ResId( (RSHEADER_TYPE *)GetClassRes(), *rResId.GetResMgr() ) ); + IncrementRes( GetObjSizeRes( (RSHEADER_TYPE *)GetClassRes() ) ); + } + } } // ----------------------------------------------------------------------- TabControl::~TabControl() { - if ( GetParent()->IsDialog() ) - GetParent()->RemoveChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) ); + if ( GetParent()->IsDialog() ) + GetParent()->RemoveChildEventListener( LINK( this, TabControl, ImplWindowEventListener ) ); - ImplFreeLayoutData(); + ImplFreeLayoutData(); - // TabCtrl-Daten loeschen - if ( mpTabCtrlData ) - { - if( mpTabCtrlData->mpListBox ) - delete mpTabCtrlData->mpListBox; - delete mpTabCtrlData; - } + // TabCtrl-Daten loeschen + if ( mpTabCtrlData ) + { + if( mpTabCtrlData->mpListBox ) + delete mpTabCtrlData->mpListBox; + delete mpTabCtrlData; + } } // ----------------------------------------------------------------------- ImplTabItem* TabControl::ImplGetItem( sal_uInt16 nId ) const { - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if( it->mnId == nId ) - return &(*it); - } + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if( it->mnId == nId ) + return &(*it); + } - return NULL; + return NULL; } // ----------------------------------------------------------------------- Size TabControl::ImplGetItemSize( ImplTabItem* pItem, long nMaxWidth ) { - pItem->maFormatText = pItem->maText; - Size aSize( GetCtrlTextWidth( pItem->maFormatText ), GetTextHeight() ); - Size aImageSize( 0, 0 ); - if( !!pItem->maTabImage ) - { - aImageSize = pItem->maTabImage.GetSizePixel(); - if( pItem->maFormatText.Len() ) - aImageSize.Width() += GetTextHeight()/4; - } - aSize.Width() += aImageSize.Width(); - if( aImageSize.Height() > aSize.Height() ) - aSize.Height() = aImageSize.Height(); - - aSize.Width() += TAB_TABOFFSET_X*2; - aSize.Height() += TAB_TABOFFSET_Y*2; - - Rectangle aCtrlRegion( Point( 0, 0 ), aSize ); - Rectangle aBoundingRgn, aContentRgn; - const ImplControlValue aControlValue; - if(GetNativeControlRegion( CTRL_TAB_ITEM, PART_ENTIRE_CONTROL, aCtrlRegion, - CTRL_STATE_ENABLED, aControlValue, rtl::OUString(), - aBoundingRgn, aContentRgn ) ) - { - return aContentRgn.GetSize(); - } - - // For systems without synthetic bold support - if ( mbExtraSpace ) - aSize.Width() += TAB_EXTRASPACE_X; - // For languages with short names (e.g. Chinese), because the space is - // normally only one pixel per char - else if ( pItem->maFormatText.Len() < TAB_EXTRASPACE_X ) - aSize.Width() += TAB_EXTRASPACE_X-pItem->maFormatText.Len(); - - // Evt. den Text kuerzen - if ( aSize.Width()+4 >= nMaxWidth ) - { - XubString aAppendStr( RTL_CONSTASCII_USTRINGPARAM( "..." ) ); - pItem->maFormatText += aAppendStr; - do - { - pItem->maFormatText.Erase( pItem->maFormatText.Len()-aAppendStr.Len()-1, 1 ); - aSize.Width() = GetCtrlTextWidth( pItem->maFormatText ); - aSize.Width() += aImageSize.Width(); - aSize.Width() += TAB_TABOFFSET_X*2; - } - while ( (aSize.Width()+4 >= nMaxWidth) && (pItem->maFormatText.Len() > aAppendStr.Len()) ); - if ( aSize.Width()+4 >= nMaxWidth ) - { - pItem->maFormatText.Assign( '.' ); - aSize.Width() = 1; - } - } - - if( pItem->maFormatText.Len() == 0 ) - { - if( aSize.Height() < aImageSize.Height()+4 ) //leave space for focus rect - aSize.Height() = aImageSize.Height()+4; - } - - return aSize; + pItem->maFormatText = pItem->maText; + Size aSize( GetCtrlTextWidth( pItem->maFormatText ), GetTextHeight() ); + Size aImageSize( 0, 0 ); + if( !!pItem->maTabImage ) + { + aImageSize = pItem->maTabImage.GetSizePixel(); + if( pItem->maFormatText.Len() ) + aImageSize.Width() += GetTextHeight()/4; + } + aSize.Width() += aImageSize.Width(); + if( aImageSize.Height() > aSize.Height() ) + aSize.Height() = aImageSize.Height(); + + aSize.Width() += TAB_TABOFFSET_X*2; + aSize.Height() += TAB_TABOFFSET_Y*2; + + Rectangle aCtrlRegion( Point( 0, 0 ), aSize ); + Rectangle aBoundingRgn, aContentRgn; + const ImplControlValue aControlValue; + if(GetNativeControlRegion( CTRL_TAB_ITEM, PART_ENTIRE_CONTROL, aCtrlRegion, + CTRL_STATE_ENABLED, aControlValue, rtl::OUString(), + aBoundingRgn, aContentRgn ) ) + { + return aContentRgn.GetSize(); + } + + // For systems without synthetic bold support + if ( mbExtraSpace ) + aSize.Width() += TAB_EXTRASPACE_X; + // For languages with short names (e.g. Chinese), because the space is + // normally only one pixel per char + else if ( pItem->maFormatText.Len() < TAB_EXTRASPACE_X ) + aSize.Width() += TAB_EXTRASPACE_X-pItem->maFormatText.Len(); + + // Evtl. den Text kuerzen + if ( aSize.Width()+4 >= nMaxWidth ) + { + XubString aAppendStr( RTL_CONSTASCII_USTRINGPARAM( "..." ) ); + pItem->maFormatText += aAppendStr; + do + { + pItem->maFormatText.Erase( pItem->maFormatText.Len()-aAppendStr.Len()-1, 1 ); + aSize.Width() = GetCtrlTextWidth( pItem->maFormatText ); + aSize.Width() += aImageSize.Width(); + aSize.Width() += TAB_TABOFFSET_X*2; + } + while ( (aSize.Width()+4 >= nMaxWidth) && (pItem->maFormatText.Len() > aAppendStr.Len()) ); + if ( aSize.Width()+4 >= nMaxWidth ) + { + pItem->maFormatText.Assign( '.' ); + aSize.Width() = 1; + } + } + + if( pItem->maFormatText.Len() == 0 ) + { + if( aSize.Height() < aImageSize.Height()+4 ) // leave space for focus rect + aSize.Height() = aImageSize.Height()+4; + } + + return aSize; } // ----------------------------------------------------------------------- Rectangle TabControl::ImplGetTabRect( sal_uInt16 nItemPos, long nWidth, long nHeight ) { - Size aWinSize = Control::GetOutputSizePixel(); - if ( nWidth < 0 ) - nWidth = aWinSize.Width(); - if ( nHeight < 0 ) - nHeight = aWinSize.Height(); - - if ( mpTabCtrlData->maItemList.empty() ) - { - long nW = nWidth-TAB_OFFSET*2; - long nH = nHeight-TAB_OFFSET*2; - return (nW > 0 && nH > 0) - ? Rectangle( Point( TAB_OFFSET, TAB_OFFSET ), Size( nW, nH ) ) - : Rectangle(); - } - - if ( nItemPos == TAB_PAGERECT ) - { - sal_uInt16 nLastPos; - if ( mnCurPageId ) - nLastPos = GetPagePos( mnCurPageId ); - else - nLastPos = 0; - - Rectangle aRect = ImplGetTabRect( nLastPos, nWidth, nHeight ); - long nW = nWidth-TAB_OFFSET*2; - long nH = nHeight-aRect.Bottom()-TAB_OFFSET*2; - aRect = (nW > 0 && nH > 0) - ? Rectangle( Point( TAB_OFFSET, aRect.Bottom()+TAB_OFFSET ), Size( nW, nH ) ) - : Rectangle(); - return aRect; - } - - nWidth -= 1; - - if ( (nWidth <= 0) || (nHeight <= 0) ) - return Rectangle(); - - if ( mbFormat || (mnLastWidth != nWidth) || (mnLastHeight != nHeight) ) - { - Font aFont( GetFont() ); - Font aLightFont = aFont; - aFont.SetTransparent( sal_True ); - aFont.SetWeight( (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus) ? WEIGHT_BOLD : WEIGHT_LIGHT ); - aLightFont.SetTransparent( sal_True ); - aLightFont.SetWeight( WEIGHT_LIGHT ); - - // If Bold and none Bold strings have the same width, we - // add in the calcultion extra space, so that the tabs - // looks better. The could be the case on systems without - // an bold UI font and without synthetic bold support - XubString aTestStr( RTL_CONSTASCII_USTRINGPARAM( "Abc." ) ); - SetFont( aLightFont ); - long nTextWidth1 = GetTextWidth( aTestStr ); - SetFont( aFont ); - long nTextWidth2 = GetTextWidth( aTestStr ); - mbExtraSpace = (nTextWidth1 == nTextWidth2); - - Size aSize; - const long nOffsetX = 2 + GetItemsOffset().X(); - const long nOffsetY = 2 + GetItemsOffset().Y(); - long nX = nOffsetX; - long nY = nOffsetY; - long nMaxWidth = nWidth; - sal_uInt16 nPos = 0; - - if ( (mnMaxPageWidth > 0) && (mnMaxPageWidth < nMaxWidth) ) - nMaxWidth = mnMaxPageWidth; - nMaxWidth -= GetItemsOffset().X(); - - sal_uInt16 nLines = 0; - sal_uInt16 nCurLine = 0; - long nLineWidthAry[100]; - sal_uInt16 nLinePosAry[101]; - - nLineWidthAry[0] = 0; - nLinePosAry[0] = 0; - for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - aSize = ImplGetItemSize( &(*it), nMaxWidth ); - - if ( ((nX+aSize.Width()) > nWidth - 2) && (nWidth > 2+nOffsetX) ) - { - if ( nLines == 99 ) - break; - - nX = nOffsetX; - nY += aSize.Height(); - nLines++; - nLineWidthAry[nLines] = 0; - nLinePosAry[nLines] = nPos; - } - - Rectangle aNewRect( Point( nX, nY ), aSize ); - if ( mbSmallInvalidate && (it->maRect != aNewRect) ) - mbSmallInvalidate = sal_False; - it->maRect = aNewRect; - it->mnLine = nLines; - it->mbFullVisible = sal_True; - - nLineWidthAry[nLines] += aSize.Width(); - nX += aSize.Width(); - - if ( it->mnId == mnCurPageId ) - nCurLine = nLines; - - nPos++; - } - - if ( nLines && !mpTabCtrlData->maItemList.empty() ) - { - long nDX = 0; - long nModDX = 0; - long nIDX = 0; - sal_uInt16 i; - sal_uInt16 n; - long nLineHeightAry[100]; - long nIH = mpTabCtrlData->maItemList[0].maRect.Bottom()-2; - - i = 0; - while ( i < nLines+1 ) - { - if ( i <= nCurLine ) - nLineHeightAry[i] = nIH*(nLines-(nCurLine-i)) + GetItemsOffset().Y(); - else - nLineHeightAry[i] = nIH*(i-nCurLine-1) + GetItemsOffset().Y(); - i++; - } - - i = 0; - n = 0; - nLinePosAry[nLines+1] = (sal_uInt16)mpTabCtrlData->maItemList.size(); - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if ( i == nLinePosAry[n] ) - { - if ( n == nLines+1 ) - break; - - nIDX = 0; - if( nLinePosAry[n+1]-i > 0 ) - { - nDX = (nWidth-nOffsetX-nLineWidthAry[n]) / (nLinePosAry[n+1]-i); - nModDX = (nWidth-nOffsetX-nLineWidthAry[n]) % (nLinePosAry[n+1]-i); - } - else - { - // FIXME: this is a bad case of tabctrl way too small - nDX = 0; - nModDX = 0; - } - n++; - } - - it->maRect.Left() += nIDX; - it->maRect.Right() += nIDX+nDX; - it->maRect.Top() = nLineHeightAry[n-1]; - it->maRect.Bottom() = nLineHeightAry[n-1]+nIH; - nIDX += nDX; - - if ( nModDX ) - { - nIDX++; - it->maRect.Right()++; - nModDX--; - } - - i++; - } - } - else - {//only one line - if(ImplGetSVData()->maNWFData.mbCenteredTabs) - { - int nRightSpace=nMaxWidth;//space left on the right by the tabs - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - nRightSpace-=it->maRect.Right()-it->maRect.Left(); - } - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - it->maRect.Left()+=(int) (nRightSpace/2); - it->maRect.Right()+=(int) (nRightSpace/2); - } - } - } - - mnLastWidth = nWidth; - mnLastHeight = nHeight; - mbFormat = sal_False; - } - - return size_t(nItemPos) < mpTabCtrlData->maItemList.size() ? mpTabCtrlData->maItemList[nItemPos].maRect : Rectangle(); + Size aWinSize = Control::GetOutputSizePixel(); + if ( nWidth < 0 ) + nWidth = aWinSize.Width(); + if ( nHeight < 0 ) + nHeight = aWinSize.Height(); + + if ( mpTabCtrlData->maItemList.empty() ) + { + long nW = nWidth-TAB_OFFSET*2; + long nH = nHeight-TAB_OFFSET*2; + return (nW > 0 && nH > 0) + ? Rectangle( Point( TAB_OFFSET, TAB_OFFSET ), Size( nW, nH ) ) + : Rectangle(); + } + + if ( nItemPos == TAB_PAGERECT ) + { + sal_uInt16 nLastPos; + if ( mnCurPageId ) + nLastPos = GetPagePos( mnCurPageId ); + else + nLastPos = 0; + + Rectangle aRect = ImplGetTabRect( nLastPos, nWidth, nHeight ); + long nW = nWidth-TAB_OFFSET*2; + long nH = nHeight-aRect.Bottom()-TAB_OFFSET*2; + aRect = (nW > 0 && nH > 0) + ? Rectangle( Point( TAB_OFFSET, aRect.Bottom()+TAB_OFFSET ), Size( nW, nH ) ) + : Rectangle(); + return aRect; + } + + nWidth -= 1; + + if ( (nWidth <= 0) || (nHeight <= 0) ) + return Rectangle(); + + if ( mbFormat || (mnLastWidth != nWidth) || (mnLastHeight != nHeight) ) + { + Font aFont( GetFont() ); + Font aLightFont = aFont; + aFont.SetTransparent( sal_True ); + aFont.SetWeight( (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus) ? WEIGHT_BOLD : WEIGHT_LIGHT ); + aLightFont.SetTransparent( sal_True ); + aLightFont.SetWeight( WEIGHT_LIGHT ); + + // If Bold and none Bold strings have the same width, we + // add in the calculation extra space, so that the tabs + // looks better. This could be the case on systems without + // an bold UI font and without synthetic bold support + XubString aTestStr( RTL_CONSTASCII_USTRINGPARAM( "Abc." ) ); + SetFont( aLightFont ); + long nTextWidth1 = GetTextWidth( aTestStr ); + SetFont( aFont ); + long nTextWidth2 = GetTextWidth( aTestStr ); + mbExtraSpace = (nTextWidth1 == nTextWidth2); + + Size aSize; + const long nOffsetX = 2 + GetItemsOffset().X(); + const long nOffsetY = 2 + GetItemsOffset().Y(); + long nX = nOffsetX; + long nY = nOffsetY; + long nMaxWidth = nWidth; + sal_uInt16 nPos = 0; + + if ( (mnMaxPageWidth > 0) && (mnMaxPageWidth < nMaxWidth) ) + nMaxWidth = mnMaxPageWidth; + nMaxWidth -= GetItemsOffset().X(); + + sal_uInt16 nLines = 0; + sal_uInt16 nCurLine = 0; + long nLineWidthAry[100]; + sal_uInt16 nLinePosAry[101]; + + nLineWidthAry[0] = 0; + nLinePosAry[0] = 0; + for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + aSize = ImplGetItemSize( &(*it), nMaxWidth ); + + if ( ((nX+aSize.Width()) > nWidth - 2) && (nWidth > 2+nOffsetX) ) + { + if ( nLines == 99 ) + break; + + nX = nOffsetX; + nY += aSize.Height(); + nLines++; + nLineWidthAry[nLines] = 0; + nLinePosAry[nLines] = nPos; + } + + Rectangle aNewRect( Point( nX, nY ), aSize ); + if ( mbSmallInvalidate && (it->maRect != aNewRect) ) + mbSmallInvalidate = sal_False; + it->maRect = aNewRect; + it->mnLine = nLines; + it->mbFullVisible = sal_True; + + nLineWidthAry[nLines] += aSize.Width(); + nX += aSize.Width(); + + if ( it->mnId == mnCurPageId ) + nCurLine = nLines; + + nPos++; + } + + if ( nLines && !mpTabCtrlData->maItemList.empty() ) + { + long nDX = 0; + long nModDX = 0; + long nIDX = 0; + sal_uInt16 i; + sal_uInt16 n; + long nLineHeightAry[100]; + long nIH = mpTabCtrlData->maItemList[0].maRect.Bottom()-2; + + i = 0; + while ( i < nLines+1 ) + { + if ( i <= nCurLine ) + nLineHeightAry[i] = nIH*(nLines-(nCurLine-i)) + GetItemsOffset().Y(); + else + nLineHeightAry[i] = nIH*(i-nCurLine-1) + GetItemsOffset().Y(); + i++; + } + + i = 0; + n = 0; + nLinePosAry[nLines+1] = (sal_uInt16)mpTabCtrlData->maItemList.size(); + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if ( i == nLinePosAry[n] ) + { + if ( n == nLines+1 ) + break; + + nIDX = 0; + if( nLinePosAry[n+1]-i > 0 ) + { + nDX = (nWidth-nOffsetX-nLineWidthAry[n]) / (nLinePosAry[n+1]-i); + nModDX = (nWidth-nOffsetX-nLineWidthAry[n]) % (nLinePosAry[n+1]-i); + } + else + { + // FIXME: this is a bad case of tabctrl way too small + nDX = 0; + nModDX = 0; + } + n++; + } + + it->maRect.Left() += nIDX; + it->maRect.Right() += nIDX+nDX; + it->maRect.Top() = nLineHeightAry[n-1]; + it->maRect.Bottom() = nLineHeightAry[n-1]+nIH; + nIDX += nDX; + + if ( nModDX ) + { + nIDX++; + it->maRect.Right()++; + nModDX--; + } + + i++; + } + } + else + {// only one line + if(ImplGetSVData()->maNWFData.mbCenteredTabs) + { + int nRightSpace=nMaxWidth;// space left on the right by the tabs + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + nRightSpace-=it->maRect.Right()-it->maRect.Left(); + } + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + it->maRect.Left()+=(int) (nRightSpace/2); + it->maRect.Right()+=(int) (nRightSpace/2); + } + } + } + + mnLastWidth = nWidth; + mnLastHeight = nHeight; + mbFormat = sal_False; + } + + return size_t(nItemPos) < mpTabCtrlData->maItemList.size() ? mpTabCtrlData->maItemList[nItemPos].maRect : Rectangle(); } // ----------------------------------------------------------------------- void TabControl::ImplChangeTabPage( sal_uInt16 nId, sal_uInt16 nOldId ) { - ImplFreeLayoutData(); - - ImplTabItem* pOldItem = ImplGetItem( nOldId ); - ImplTabItem* pItem = ImplGetItem( nId ); - TabPage* pOldPage = (pOldItem) ? pOldItem->mpTabPage : NULL; - TabPage* pPage = (pItem) ? pItem->mpTabPage : NULL; - Window* pCtrlParent = GetParent(); - - if ( IsReallyVisible() && IsUpdateMode() ) - { - sal_uInt16 nPos = GetPagePos( nId ); - Rectangle aRect = ImplGetTabRect( nPos ); - - if ( !pOldItem || (pOldItem->mnLine != pItem->mnLine) ) - { - aRect.Left() = 0; - aRect.Top() = 0; - aRect.Right() = Control::GetOutputSizePixel().Width(); - } - else - { - aRect.Left() -= 3; - aRect.Top() -= 2; - aRect.Right() += 3; - Invalidate( aRect ); - nPos = GetPagePos( nOldId ); - aRect = ImplGetTabRect( nPos ); - aRect.Left() -= 3; - aRect.Top() -= 2; - aRect.Right() += 3; - } - Invalidate( aRect ); - } - - if ( pOldPage == pPage ) - return; - - Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); - - if ( pOldPage ) - { - if ( mbRestoreHelpId ) - pCtrlParent->SetHelpId( rtl::OString() ); - if ( mbRestoreUnqId ) - pCtrlParent->SetUniqueId( rtl::OString() ); - pOldPage->DeactivatePage(); - } - - if ( pPage ) - { - pPage->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() ); - - // activate page here so the conbtrols can be switched - // also set the help id of the parent window to that of the tab page - if ( !GetHelpId().getLength() ) - { - mbRestoreHelpId = sal_True; - pCtrlParent->SetHelpId( pPage->GetHelpId() ); - } - if ( !pCtrlParent->GetUniqueId().getLength() ) - { - mbRestoreUnqId = sal_True; - pCtrlParent->SetUniqueId( pPage->GetUniqueId() ); - } - - pPage->ActivatePage(); - pPage->Show(); + ImplFreeLayoutData(); + + ImplTabItem* pOldItem = ImplGetItem( nOldId ); + ImplTabItem* pItem = ImplGetItem( nId ); + TabPage* pOldPage = (pOldItem) ? pOldItem->mpTabPage : NULL; + TabPage* pPage = (pItem) ? pItem->mpTabPage : NULL; + Window* pCtrlParent = GetParent(); + + if ( IsReallyVisible() && IsUpdateMode() ) + { + sal_uInt16 nPos = GetPagePos( nId ); + Rectangle aRect = ImplGetTabRect( nPos ); + + if ( !pOldItem || (pOldItem->mnLine != pItem->mnLine) ) + { + aRect.Left() = 0; + aRect.Top() = 0; + aRect.Right() = Control::GetOutputSizePixel().Width(); + } + else + { + aRect.Left() -= 3; + aRect.Top() -= 2; + aRect.Right() += 3; + Invalidate( aRect ); + nPos = GetPagePos( nOldId ); + aRect = ImplGetTabRect( nPos ); + aRect.Left() -= 3; + aRect.Top() -= 2; + aRect.Right() += 3; + } + Invalidate( aRect ); + } + + if ( pOldPage == pPage ) + return; + + Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); - if ( pOldPage && pOldPage->HasChildPathFocus() ) - { - sal_uInt16 n = 0; - Window* pFirstChild = pPage->ImplGetDlgWindow( n, DLGWINDOW_FIRST ); - if ( pFirstChild ) - pFirstChild->ImplControlFocus( GETFOCUS_INIT ); - else - GrabFocus(); - } + if ( pOldPage ) + { + if ( mbRestoreHelpId ) + pCtrlParent->SetHelpId( rtl::OString() ); + if ( mbRestoreUnqId ) + pCtrlParent->SetUniqueId( rtl::OString() ); + pOldPage->DeactivatePage(); + } - // pPage->Show(); - } + if ( pPage ) + { + pPage->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() ); + + // activate page here so the controls can be switched + // also set the help id of the parent window to that of the tab page + if ( !GetHelpId().getLength() ) + { + mbRestoreHelpId = sal_True; + pCtrlParent->SetHelpId( pPage->GetHelpId() ); + } + if ( !pCtrlParent->GetUniqueId().getLength() ) + { + mbRestoreUnqId = sal_True; + pCtrlParent->SetUniqueId( pPage->GetUniqueId() ); + } + + pPage->ActivatePage(); + pPage->Show(); - if ( pOldPage ) - pOldPage->Hide(); + if ( pOldPage && pOldPage->HasChildPathFocus() ) + { + sal_uInt16 n = 0; + Window* pFirstChild = pPage->ImplGetDlgWindow( n, DLGWINDOW_FIRST ); + if ( pFirstChild ) + pFirstChild->ImplControlFocus( GETFOCUS_INIT ); + else + GrabFocus(); + } + + // pPage->Show(); + } - // Invalidate the same region that will be send to NWF - // to always allow for bitmap caching - // see Window::DrawNativeControl() - if( IsNativeControlSupported( CTRL_TAB_PANE, PART_ENTIRE_CONTROL ) ) - { - aRect.Left() -= TAB_OFFSET; - aRect.Top() -= TAB_OFFSET; - aRect.Right() += TAB_OFFSET; - aRect.Bottom() += TAB_OFFSET; - } + if ( pOldPage ) + pOldPage->Hide(); - Invalidate( aRect ); + // Invalidate the same region that will be send to NWF + // to always allow for bitmap caching + // see Window::DrawNativeControl() + if( IsNativeControlSupported( CTRL_TAB_PANE, PART_ENTIRE_CONTROL ) ) + { + aRect.Left() -= TAB_OFFSET; + aRect.Top() -= TAB_OFFSET; + aRect.Right() += TAB_OFFSET; + aRect.Bottom() += TAB_OFFSET; + } + + Invalidate( aRect ); } // ----------------------------------------------------------------------- sal_Bool TabControl::ImplPosCurTabPage() { - // Aktuelle TabPage resizen/positionieren - ImplTabItem* pItem = ImplGetItem( GetCurPageId() ); - if ( pItem && pItem->mpTabPage ) - { - Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); - pItem->mpTabPage->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() ); - return sal_True; - } + // Aktuelle TabPage resizen/positionieren + ImplTabItem* pItem = ImplGetItem( GetCurPageId() ); + if ( pItem && pItem->mpTabPage ) + { + Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); + pItem->mpTabPage->SetPosSizePixel( aRect.TopLeft(), aRect.GetSize() ); + return sal_True; + } - return sal_False; + return sal_False; } // ----------------------------------------------------------------------- void TabControl::ImplActivateTabPage( sal_Bool bNext ) { - sal_uInt16 nCurPos = GetPagePos( GetCurPageId() ); + sal_uInt16 nCurPos = GetPagePos( GetCurPageId() ); - if ( bNext ) - nCurPos = (nCurPos + 1) % GetPageCount(); - else - { - if ( !nCurPos ) - nCurPos = GetPageCount()-1; - else - nCurPos--; - } + if ( bNext ) + nCurPos = (nCurPos + 1) % GetPageCount(); + else + { + if ( !nCurPos ) + nCurPos = GetPageCount()-1; + else + nCurPos--; + } - SelectTabPage( GetPageId( nCurPos ) ); + SelectTabPage( GetPageId( nCurPos ) ); } // ----------------------------------------------------------------------- void TabControl::ImplShowFocus() { - if ( !GetPageCount() || mpTabCtrlData->mpListBox ) - return; - - // make sure the focussed item rect is computed using a bold font - // the font may have changed meanwhile due to mouse over - - Font aOldFont( GetFont() ); - Font aFont( aOldFont ); - aFont.SetWeight( (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus) ? WEIGHT_BOLD : WEIGHT_LIGHT ); - SetFont( aFont ); - - sal_uInt16 nCurPos = GetPagePos( mnCurPageId ); - Rectangle aRect = ImplGetTabRect( nCurPos ); - const ImplTabItem& rItem = mpTabCtrlData->maItemList[ nCurPos ]; - Size aTabSize = aRect.GetSize(); - Size aImageSize( 0, 0 ); - long nTextHeight = GetTextHeight(); - long nTextWidth = GetCtrlTextWidth( rItem.maFormatText ); - sal_uInt16 nOff; - - if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_MONO) ) - nOff = 1; - else - nOff = 0; - - if( !! rItem.maTabImage ) - { - aImageSize = rItem.maTabImage.GetSizePixel(); - if( rItem.maFormatText.Len() ) - aImageSize.Width() += GetTextHeight()/4; - } - - if( rItem.maFormatText.Len() ) - { - // show focus around text - aRect.Left() = aRect.Left()+aImageSize.Width()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-1-1; - aRect.Top() = aRect.Top()+((aTabSize.Height()-nTextHeight)/2)-1-1; - aRect.Right() = aRect.Left()+nTextWidth+2; - aRect.Bottom() = aRect.Top()+nTextHeight+2; - } - else - { - // show focus around image - long nXPos = aRect.Left()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-1; - long nYPos = aRect.Top(); - if( aImageSize.Height() < aRect.GetHeight() ) - nYPos += (aRect.GetHeight() - aImageSize.Height())/2; - - aRect.Left() = nXPos - 2; - aRect.Top() = nYPos - 2; - aRect.Right() = aRect.Left() + aImageSize.Width() + 4; - aRect.Bottom() = aRect.Top() + aImageSize.Height() + 4; - } - ShowFocus( aRect ); - - SetFont( aOldFont ); + if ( !GetPageCount() || mpTabCtrlData->mpListBox ) + return; + + // make sure the focused item rect is computed using a bold font + // the font may have changed meanwhile due to mouse over + + Font aOldFont( GetFont() ); + Font aFont( aOldFont ); + aFont.SetWeight( (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus) ? WEIGHT_BOLD : WEIGHT_LIGHT ); + SetFont( aFont ); + + sal_uInt16 nCurPos = GetPagePos( mnCurPageId ); + Rectangle aRect = ImplGetTabRect( nCurPos ); + const ImplTabItem& rItem = mpTabCtrlData->maItemList[ nCurPos ]; + Size aTabSize = aRect.GetSize(); + Size aImageSize( 0, 0 ); + long nTextHeight = GetTextHeight(); + long nTextWidth = GetCtrlTextWidth( rItem.maFormatText ); + sal_uInt16 nOff; + + if ( !(GetSettings().GetStyleSettings().GetOptions() & STYLE_OPTION_MONO) ) + nOff = 1; + else + nOff = 0; + + if( !! rItem.maTabImage ) + { + aImageSize = rItem.maTabImage.GetSizePixel(); + if( rItem.maFormatText.Len() ) + aImageSize.Width() += GetTextHeight()/4; + } + + if( rItem.maFormatText.Len() ) + { + // show focus around text + aRect.Left() = aRect.Left()+aImageSize.Width()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-1-1; + aRect.Top() = aRect.Top()+((aTabSize.Height()-nTextHeight)/2)-1-1; + aRect.Right() = aRect.Left()+nTextWidth+2; + aRect.Bottom() = aRect.Top()+nTextHeight+2; + } + else + { + // show focus around image + long nXPos = aRect.Left()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-1; + long nYPos = aRect.Top(); + if( aImageSize.Height() < aRect.GetHeight() ) + nYPos += (aRect.GetHeight() - aImageSize.Height())/2; + + aRect.Left() = nXPos - 2; + aRect.Top() = nYPos - 2; + aRect.Right() = aRect.Left() + aImageSize.Width() + 4; + aRect.Bottom() = aRect.Top() + aImageSize.Height() + 4; + } + ShowFocus( aRect ); + + SetFont( aOldFont ); } // ----------------------------------------------------------------------- void TabControl::ImplDrawItem( ImplTabItem* pItem, const Rectangle& rCurRect, bool bLayout, bool bFirstInGroup, bool bLastInGroup, bool bIsCurrentItem ) { - if ( pItem->maRect.IsEmpty() ) - return; - - if( bLayout ) - { - if( !HasLayoutData() ) - { - mpControlData->mpLayoutData = new vcl::ControlLayoutData(); - mpTabCtrlData->maLayoutLineToPageId.clear(); - mpTabCtrlData->maLayoutPageIdToLine.clear(); - mpTabCtrlData->maTabRectangles.clear(); - } - } - - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - Rectangle aRect = pItem->maRect; - long nLeftBottom = aRect.Bottom(); - long nRightBottom = aRect.Bottom(); - sal_Bool bLeftBorder = sal_True; - sal_Bool bRightBorder = sal_True; - sal_uInt16 nOff; - sal_Bool bNativeOK = sal_False; - - sal_uInt16 nOff2 = 0; - sal_uInt16 nOff3 = 0; - - if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) - nOff = 1; - else - nOff = 0; - - // Wenn wir die aktuelle Page sind, muessen wir etwas mehr zeichnen - if ( pItem->mnId == mnCurPageId ) - { - nOff2 = 2; - if( ! ImplGetSVData()->maNWFData.mbNoActiveTabTextRaise ) - nOff3 = 1; - } - else - { - Point aLeftTestPos = aRect.BottomLeft(); - Point aRightTestPos = aRect.BottomRight(); - if ( aLeftTestPos.Y() == rCurRect.Bottom() ) - { - aLeftTestPos.X() -= 2; - if ( rCurRect.IsInside( aLeftTestPos ) ) - bLeftBorder = sal_False; - aRightTestPos.X() += 2; - if ( rCurRect.IsInside( aRightTestPos ) ) - bRightBorder = sal_False; - } - else - { - if ( rCurRect.IsInside( aLeftTestPos ) ) - nLeftBottom -= 2; - if ( rCurRect.IsInside( aRightTestPos ) ) - nRightBottom -= 2; - } - } - - if( !bLayout && (bNativeOK = IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL)) == sal_True ) - { - Rectangle aCtrlRegion( pItem->maRect ); - ControlState nState = 0; - - if( pItem->mnId == mnCurPageId ) - { - nState |= CTRL_STATE_SELECTED; - // only the selected item can be focussed - if ( HasFocus() ) - nState |= CTRL_STATE_FOCUSED; - } - if ( IsEnabled() ) - nState |= CTRL_STATE_ENABLED; - if( IsMouseOver() && pItem->maRect.IsInside( GetPointerPosPixel() ) ) - { - nState |= CTRL_STATE_ROLLOVER; - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if( (&(*it) != pItem) && (it->maRect.IsInside( GetPointerPosPixel() ) ) ) - { - nState &= ~CTRL_STATE_ROLLOVER; // avoid multiple highlighted tabs - break; - } - } - } - - TabitemValue tiValue; - if(pItem->maRect.Left() < 5) - tiValue.mnAlignment |= TABITEM_LEFTALIGNED; - if(pItem->maRect.Right() > mnLastWidth - 5) - tiValue.mnAlignment |= TABITEM_RIGHTALIGNED; - if ( bFirstInGroup ) - tiValue.mnAlignment |= TABITEM_FIRST_IN_GROUP; - if ( bLastInGroup ) - tiValue.mnAlignment |= TABITEM_LAST_IN_GROUP; - - bNativeOK = DrawNativeControl( CTRL_TAB_ITEM, PART_ENTIRE_CONTROL, aCtrlRegion, nState, - tiValue, rtl::OUString() ); - } - - if( ! bLayout && !bNativeOK ) - { - if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) - { - SetLineColor( rStyleSettings.GetLightColor() ); - DrawPixel( Point( aRect.Left()+1-nOff2, aRect.Top()+1-nOff2 ) ); // diagonally indented top-left pixel - if ( bLeftBorder ) - { - DrawLine( Point( aRect.Left()-nOff2, aRect.Top()+2-nOff2 ), - Point( aRect.Left()-nOff2, nLeftBottom-1 ) ); - } - DrawLine( Point( aRect.Left()+2-nOff2, aRect.Top()-nOff2 ), // top line starting 2px from left border - Point( aRect.Right()+nOff2-3, aRect.Top()-nOff2 ) ); // ending 3px from right border - - if ( bRightBorder ) - { - SetLineColor( rStyleSettings.GetShadowColor() ); - DrawLine( Point( aRect.Right()+nOff2-2, aRect.Top()+1-nOff2 ), - Point( aRect.Right()+nOff2-2, nRightBottom-1 ) ); - - SetLineColor( rStyleSettings.GetDarkShadowColor() ); - DrawLine( Point( aRect.Right()+nOff2-1, aRect.Top()+3-nOff2 ), - Point( aRect.Right()+nOff2-1, nRightBottom-1 ) ); - } - } - else - { - SetLineColor( Color( COL_BLACK ) ); - DrawPixel( Point( aRect.Left()+1-nOff2, aRect.Top()+1-nOff2 ) ); - DrawPixel( Point( aRect.Right()+nOff2-2, aRect.Top()+1-nOff2 ) ); - if ( bLeftBorder ) - { - DrawLine( Point( aRect.Left()-nOff2, aRect.Top()+2-nOff2 ), - Point( aRect.Left()-nOff2, nLeftBottom-1 ) ); - } - DrawLine( Point( aRect.Left()+2-nOff2, aRect.Top()-nOff2 ), - Point( aRect.Right()-3, aRect.Top()-nOff2 ) ); - if ( bRightBorder ) - { - DrawLine( Point( aRect.Right()+nOff2-1, aRect.Top()+2-nOff2 ), - Point( aRect.Right()+nOff2-1, nRightBottom-1 ) ); - } - } - } - - if( bLayout ) - { - int nLine = mpControlData->mpLayoutData->m_aLineIndices.size(); - mpControlData->mpLayoutData->m_aLineIndices.push_back( mpControlData->mpLayoutData->m_aDisplayText.Len() ); - mpTabCtrlData->maLayoutPageIdToLine[ (int)pItem->mnId ] = nLine; - mpTabCtrlData->maLayoutLineToPageId[ nLine ] = (int)pItem->mnId; - mpTabCtrlData->maTabRectangles.push_back( aRect ); - } - - // set font accordingly, current item is painted bold - // we set the font attributes always before drawing to be re-entrant (DrawNativeControl may trigger additional paints) - Font aFont( GetFont() ); - aFont.SetTransparent( sal_True ); - aFont.SetWeight( ((bIsCurrentItem) && (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus)) ? WEIGHT_BOLD : WEIGHT_LIGHT ); - SetFont( aFont ); - - Size aTabSize = aRect.GetSize(); - Size aImageSize( 0, 0 ); - long nTextHeight = GetTextHeight(); - long nTextWidth = GetCtrlTextWidth( pItem->maFormatText ); - if( !! pItem->maTabImage ) - { - aImageSize = pItem->maTabImage.GetSizePixel(); - if( pItem->maFormatText.Len() ) - aImageSize.Width() += GetTextHeight()/4; - } - long nXPos = aRect.Left()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-nOff3; - long nYPos = aRect.Top()+((aTabSize.Height()-nTextHeight)/2)-nOff3; - if( pItem->maFormatText.Len() ) - { - sal_uInt16 nStyle = TEXT_DRAW_MNEMONIC; - if( ! pItem->mbEnabled ) - nStyle |= TEXT_DRAW_DISABLE; - DrawCtrlText( Point( nXPos + aImageSize.Width(), nYPos ), - pItem->maFormatText, - 0, STRING_LEN, nStyle, - bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL, - bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL - ); - } - - if( !! pItem->maTabImage ) - { - Point aImgTL( nXPos, aRect.Top() ); - if( aImageSize.Height() < aRect.GetHeight() ) - aImgTL.Y() += (aRect.GetHeight() - aImageSize.Height())/2; - DrawImage( aImgTL, pItem->maTabImage, pItem->mbEnabled ? 0 : IMAGE_DRAW_DISABLE ); - } + if ( pItem->maRect.IsEmpty() ) + return; + + if( bLayout ) + { + if( !HasLayoutData() ) + { + mpControlData->mpLayoutData = new vcl::ControlLayoutData(); + mpTabCtrlData->maLayoutLineToPageId.clear(); + mpTabCtrlData->maLayoutPageIdToLine.clear(); + mpTabCtrlData->maTabRectangles.clear(); + } + } + + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + Rectangle aRect = pItem->maRect; + long nLeftBottom = aRect.Bottom(); + long nRightBottom = aRect.Bottom(); + sal_Bool bLeftBorder = sal_True; + sal_Bool bRightBorder = sal_True; + sal_uInt16 nOff; + sal_Bool bNativeOK = sal_False; + + sal_uInt16 nOff2 = 0; + sal_uInt16 nOff3 = 0; + + if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) + nOff = 1; + else + nOff = 0; + + // Wenn wir die aktuelle Page sind, muessen wir etwas mehr zeichnen + if ( pItem->mnId == mnCurPageId ) + { + nOff2 = 2; + if( ! ImplGetSVData()->maNWFData.mbNoActiveTabTextRaise ) + nOff3 = 1; + } + else + { + Point aLeftTestPos = aRect.BottomLeft(); + Point aRightTestPos = aRect.BottomRight(); + if ( aLeftTestPos.Y() == rCurRect.Bottom() ) + { + aLeftTestPos.X() -= 2; + if ( rCurRect.IsInside( aLeftTestPos ) ) + bLeftBorder = sal_False; + aRightTestPos.X() += 2; + if ( rCurRect.IsInside( aRightTestPos ) ) + bRightBorder = sal_False; + } + else + { + if ( rCurRect.IsInside( aLeftTestPos ) ) + nLeftBottom -= 2; + if ( rCurRect.IsInside( aRightTestPos ) ) + nRightBottom -= 2; + } + } + + if( !bLayout && (bNativeOK = IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL)) == sal_True ) + { + Rectangle aCtrlRegion( pItem->maRect ); + ControlState nState = 0; + + if( pItem->mnId == mnCurPageId ) + { + nState |= CTRL_STATE_SELECTED; + // only the selected item can be focused + if ( HasFocus() ) + nState |= CTRL_STATE_FOCUSED; + } + if ( IsEnabled() ) + nState |= CTRL_STATE_ENABLED; + if( IsMouseOver() && pItem->maRect.IsInside( GetPointerPosPixel() ) ) + { + nState |= CTRL_STATE_ROLLOVER; + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if( (&(*it) != pItem) && (it->maRect.IsInside( GetPointerPosPixel() ) ) ) + { + nState &= ~CTRL_STATE_ROLLOVER; // avoid multiple highlighted tabs + break; + } + } + } + + TabitemValue tiValue; + if(pItem->maRect.Left() < 5) + tiValue.mnAlignment |= TABITEM_LEFTALIGNED; + if(pItem->maRect.Right() > mnLastWidth - 5) + tiValue.mnAlignment |= TABITEM_RIGHTALIGNED; + if ( bFirstInGroup ) + tiValue.mnAlignment |= TABITEM_FIRST_IN_GROUP; + if ( bLastInGroup ) + tiValue.mnAlignment |= TABITEM_LAST_IN_GROUP; + + bNativeOK = DrawNativeControl( CTRL_TAB_ITEM, PART_ENTIRE_CONTROL, aCtrlRegion, nState, + tiValue, rtl::OUString() ); + } + + if( ! bLayout && !bNativeOK ) + { + if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) + { + SetLineColor( rStyleSettings.GetLightColor() ); + DrawPixel( Point( aRect.Left()+1-nOff2, aRect.Top()+1-nOff2 ) ); // diagonally indented top-left pixel + if ( bLeftBorder ) + { + DrawLine( Point( aRect.Left()-nOff2, aRect.Top()+2-nOff2 ), + Point( aRect.Left()-nOff2, nLeftBottom-1 ) ); + } + DrawLine( Point( aRect.Left()+2-nOff2, aRect.Top()-nOff2 ), // top line starting 2px from left border + Point( aRect.Right()+nOff2-3, aRect.Top()-nOff2 ) ); // ending 3px from right border + + if ( bRightBorder ) + { + SetLineColor( rStyleSettings.GetShadowColor() ); + DrawLine( Point( aRect.Right()+nOff2-2, aRect.Top()+1-nOff2 ), + Point( aRect.Right()+nOff2-2, nRightBottom-1 ) ); + + SetLineColor( rStyleSettings.GetDarkShadowColor() ); + DrawLine( Point( aRect.Right()+nOff2-1, aRect.Top()+3-nOff2 ), + Point( aRect.Right()+nOff2-1, nRightBottom-1 ) ); + } + } + else + { + SetLineColor( Color( COL_BLACK ) ); + DrawPixel( Point( aRect.Left()+1-nOff2, aRect.Top()+1-nOff2 ) ); + DrawPixel( Point( aRect.Right()+nOff2-2, aRect.Top()+1-nOff2 ) ); + if ( bLeftBorder ) + { + DrawLine( Point( aRect.Left()-nOff2, aRect.Top()+2-nOff2 ), + Point( aRect.Left()-nOff2, nLeftBottom-1 ) ); + } + DrawLine( Point( aRect.Left()+2-nOff2, aRect.Top()-nOff2 ), + Point( aRect.Right()-3, aRect.Top()-nOff2 ) ); + if ( bRightBorder ) + { + DrawLine( Point( aRect.Right()+nOff2-1, aRect.Top()+2-nOff2 ), + Point( aRect.Right()+nOff2-1, nRightBottom-1 ) ); + } + } + } + + if( bLayout ) + { + int nLine = mpControlData->mpLayoutData->m_aLineIndices.size(); + mpControlData->mpLayoutData->m_aLineIndices.push_back( mpControlData->mpLayoutData->m_aDisplayText.Len() ); + mpTabCtrlData->maLayoutPageIdToLine[ (int)pItem->mnId ] = nLine; + mpTabCtrlData->maLayoutLineToPageId[ nLine ] = (int)pItem->mnId; + mpTabCtrlData->maTabRectangles.push_back( aRect ); + } + + // set font accordingly, current item is painted bold + // we set the font attributes always before drawing to be re-entrant (DrawNativeControl may trigger additional paints) + Font aFont( GetFont() ); + aFont.SetTransparent( sal_True ); + aFont.SetWeight( ((bIsCurrentItem) && (!ImplGetSVData()->maNWFData.mbNoBoldTabFocus)) ? WEIGHT_BOLD : WEIGHT_LIGHT ); + SetFont( aFont ); + + Size aTabSize = aRect.GetSize(); + Size aImageSize( 0, 0 ); + long nTextHeight = GetTextHeight(); + long nTextWidth = GetCtrlTextWidth( pItem->maFormatText ); + if( !! pItem->maTabImage ) + { + aImageSize = pItem->maTabImage.GetSizePixel(); + if( pItem->maFormatText.Len() ) + aImageSize.Width() += GetTextHeight()/4; + } + long nXPos = aRect.Left()+((aTabSize.Width()-nTextWidth-aImageSize.Width())/2)-nOff-nOff3; + long nYPos = aRect.Top()+((aTabSize.Height()-nTextHeight)/2)-nOff3; + if( pItem->maFormatText.Len() ) + { + sal_uInt16 nStyle = TEXT_DRAW_MNEMONIC; + if( ! pItem->mbEnabled ) + nStyle |= TEXT_DRAW_DISABLE; + DrawCtrlText( Point( nXPos + aImageSize.Width(), nYPos ), + pItem->maFormatText, + 0, STRING_LEN, nStyle, + bLayout ? &mpControlData->mpLayoutData->m_aUnicodeBoundRects : NULL, + bLayout ? &mpControlData->mpLayoutData->m_aDisplayText : NULL + ); + } + + if( !! pItem->maTabImage ) + { + Point aImgTL( nXPos, aRect.Top() ); + if( aImageSize.Height() < aRect.GetHeight() ) + aImgTL.Y() += (aRect.GetHeight() - aImageSize.Height())/2; + DrawImage( aImgTL, pItem->maTabImage, pItem->mbEnabled ? 0 : IMAGE_DRAW_DISABLE ); + } } // ----------------------------------------------------------------------- long TabControl::ImplHandleKeyEvent( const KeyEvent& rKeyEvent ) { - long nRet = 0; - - if ( GetPageCount() > 1 ) - { - KeyCode aKeyCode = rKeyEvent.GetKeyCode(); - sal_uInt16 nKeyCode = aKeyCode.GetCode(); - - if ( aKeyCode.IsMod1() ) - { - if ( aKeyCode.IsShift() || (nKeyCode == KEY_PAGEUP) ) - { - if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEUP) ) - { - ImplActivateTabPage( sal_False ); - nRet = 1; - } - } - else - { - if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEDOWN) ) - { - ImplActivateTabPage( sal_True ); - nRet = 1; - } - } - } - } - - return nRet; + long nRet = 0; + + if ( GetPageCount() > 1 ) + { + KeyCode aKeyCode = rKeyEvent.GetKeyCode(); + sal_uInt16 nKeyCode = aKeyCode.GetCode(); + + if ( aKeyCode.IsMod1() ) + { + if ( aKeyCode.IsShift() || (nKeyCode == KEY_PAGEUP) ) + { + if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEUP) ) + { + ImplActivateTabPage( sal_False ); + nRet = 1; + } + } + else + { + if ( (nKeyCode == KEY_TAB) || (nKeyCode == KEY_PAGEDOWN) ) + { + ImplActivateTabPage( sal_True ); + nRet = 1; + } + } + } + } + + return nRet; } @@ -989,8 +987,8 @@ long TabControl::ImplHandleKeyEvent( const KeyEvent& rKeyEvent ) IMPL_LINK( TabControl, ImplListBoxSelectHdl, ListBox*, EMPTYARG ) { - SelectTabPage( GetPageId( mpTabCtrlData->mpListBox->GetSelectEntryPos() ) ); - return 0; + SelectTabPage( GetPageId( mpTabCtrlData->mpListBox->GetSelectEntryPos() ) ); + return 0; } // ----------------------------------------------------------------------- @@ -999,13 +997,13 @@ IMPL_LINK( TabControl, ImplWindowEventListener, VclSimpleEvent*, pEvent ) { if ( pEvent && pEvent->ISA( VclWindowEvent ) && (pEvent->GetId() == VCLEVENT_WINDOW_KEYINPUT) ) { - VclWindowEvent* pWindowEvent = static_cast< VclWindowEvent* >(pEvent); - // Do not handle events from TabControl or it's children, which is done in Notify(), where the events can be consumed. - if ( !IsWindowOrChild( pWindowEvent->GetWindow() ) ) - { - KeyEvent* pKeyEvent = static_cast< KeyEvent* >(pWindowEvent->GetData()); - ImplHandleKeyEvent( *pKeyEvent ); - } + VclWindowEvent* pWindowEvent = static_cast< VclWindowEvent* >(pEvent); + // Do not handle events from TabControl or it's children, which is done in Notify(), where the events can be consumed. + if ( !IsWindowOrChild( pWindowEvent->GetWindow() ) ) + { + KeyEvent* pKeyEvent = static_cast< KeyEvent* >(pWindowEvent->GetData()); + ImplHandleKeyEvent( *pKeyEvent ); + } } return 0; } @@ -1015,691 +1013,691 @@ IMPL_LINK( TabControl, ImplWindowEventListener, VclSimpleEvent*, pEvent ) void TabControl::MouseButtonDown( const MouseEvent& rMEvt ) { - if( mpTabCtrlData->mpListBox == NULL ) - { - if( rMEvt.IsLeft() ) - { - sal_uInt16 nPageId = GetPageId( rMEvt.GetPosPixel() ); - ImplTabItem* pItem = ImplGetItem( nPageId ); - if( pItem && pItem->mbEnabled ) - SelectTabPage( nPageId ); - } - } + if( mpTabCtrlData->mpListBox == NULL ) + { + if( rMEvt.IsLeft() ) + { + sal_uInt16 nPageId = GetPageId( rMEvt.GetPosPixel() ); + ImplTabItem* pItem = ImplGetItem( nPageId ); + if( pItem && pItem->mbEnabled ) + SelectTabPage( nPageId ); + } + } } // ----------------------------------------------------------------------- void TabControl::KeyInput( const KeyEvent& rKEvt ) { - if( mpTabCtrlData->mpListBox ) - mpTabCtrlData->mpListBox->KeyInput( rKEvt ); - else if ( GetPageCount() > 1 ) - { - KeyCode aKeyCode = rKEvt.GetKeyCode(); - sal_uInt16 nKeyCode = aKeyCode.GetCode(); - - if ( (nKeyCode == KEY_LEFT) || (nKeyCode == KEY_RIGHT) ) - { - sal_Bool bNext = (nKeyCode == KEY_RIGHT); - ImplActivateTabPage( bNext ); - } - } + if( mpTabCtrlData->mpListBox ) + mpTabCtrlData->mpListBox->KeyInput( rKEvt ); + else if ( GetPageCount() > 1 ) + { + KeyCode aKeyCode = rKEvt.GetKeyCode(); + sal_uInt16 nKeyCode = aKeyCode.GetCode(); + + if ( (nKeyCode == KEY_LEFT) || (nKeyCode == KEY_RIGHT) ) + { + sal_Bool bNext = (nKeyCode == KEY_RIGHT); + ImplActivateTabPage( bNext ); + } + } - Control::KeyInput( rKEvt ); + Control::KeyInput( rKEvt ); } // ----------------------------------------------------------------------- void TabControl::Paint( const Rectangle& rRect ) { - ImplPaint( rRect, false ); + ImplPaint( rRect, false ); } // ----------------------------------------------------------------------- void TabControl::ImplPaint( const Rectangle& rRect, bool bLayout ) { - if( ! bLayout ) - HideFocus(); - - // Hier wird gegebenenfalls auch neu formatiert - Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); - - // find current item - ImplTabItem* pCurItem = NULL; - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if ( it->mnId == mnCurPageId ) - { - pCurItem = &(*it); - break; - } - } - - // Draw the TabPage border - const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); - Rectangle aCurRect; - long nTopOff = 1; - aRect.Left() -= TAB_OFFSET; - aRect.Top() -= TAB_OFFSET; - aRect.Right() += TAB_OFFSET; - aRect.Bottom() += TAB_OFFSET; - - // if we have an invisible tabpage or no tabpage at all the tabpage rect should be - // increased to avoid round corners that might be drawn by a theme - // in this case we're only interested in the top border of the tabpage because the tabitems are used - // standalone (eg impress) - sal_Bool bNoTabPage = sal_False; - TabPage* pCurPage = (pCurItem) ? pCurItem->mpTabPage : NULL; - if( !pCurPage || !pCurPage->IsVisible() ) - { - bNoTabPage = sal_True; - aRect.Left()-=10; - aRect.Right()+=10; - } - - sal_Bool bNativeOK = sal_False; - if( ! bLayout && (bNativeOK = IsNativeControlSupported( CTRL_TAB_PANE, PART_ENTIRE_CONTROL) ) == sal_True ) - { - const ImplControlValue aControlValue; - - ControlState nState = CTRL_STATE_ENABLED; - int part = PART_ENTIRE_CONTROL; - if ( !IsEnabled() ) - nState &= ~CTRL_STATE_ENABLED; - if ( HasFocus() ) - nState |= CTRL_STATE_FOCUSED; - - Region aClipRgn( GetActiveClipRegion() ); - aClipRgn.Intersect( aRect ); - if( !rRect.IsEmpty() ) - aClipRgn.Intersect( rRect ); - - if( !aClipRgn.IsEmpty() ) - bNativeOK = DrawNativeControl( CTRL_TAB_PANE, part, aRect, nState, - aControlValue, rtl::OUString() ); - } - else - { - if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) - SetLineColor( rStyleSettings.GetLightColor() ); - else - SetLineColor( Color( COL_BLACK ) ); - if ( pCurItem && !pCurItem->maRect.IsEmpty() ) - { - aCurRect = pCurItem->maRect; - if( ! bLayout ) - DrawLine( aRect.TopLeft(), Point( aCurRect.Left()-2, aRect.Top() ) ); - if ( aCurRect.Right()+1 < aRect.Right() ) - { - if( ! bLayout ) - DrawLine( Point( aCurRect.Right(), aRect.Top() ), aRect.TopRight() ); - } - else - nTopOff = 0; - } - else - if( ! bLayout ) - DrawLine( aRect.TopLeft(), aRect.TopRight() ); - - if( ! bLayout ) - { - DrawLine( aRect.TopLeft(), aRect.BottomLeft() ); - - if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) - { - // if we have not tab page the bottom line of the tab page - // directly touches the tab items, so choose a color that fits seamlessly - if( bNoTabPage ) - SetLineColor( rStyleSettings.GetDialogColor() ); - else - SetLineColor( rStyleSettings.GetShadowColor() ); - DrawLine( Point( 1, aRect.Bottom()-1 ), - Point( aRect.Right()-1, aRect.Bottom()-1 ) ); - DrawLine( Point( aRect.Right()-1, aRect.Top()+nTopOff ), - Point( aRect.Right()-1, aRect.Bottom()-1 ) ); - if( bNoTabPage ) - SetLineColor( rStyleSettings.GetDialogColor() ); - else - SetLineColor( rStyleSettings.GetDarkShadowColor() ); - DrawLine( Point( 0, aRect.Bottom() ), - Point( aRect.Right(), aRect.Bottom() ) ); - DrawLine( Point( aRect.Right(), aRect.Top()+nTopOff ), - Point( aRect.Right(), aRect.Bottom() ) ); - } - else - { - DrawLine( aRect.TopRight(), aRect.BottomRight() ); - DrawLine( aRect.BottomLeft(), aRect.BottomRight() ); - } - } - } - - if ( !mpTabCtrlData->maItemList.empty() && mpTabCtrlData->mpListBox == NULL ) - { - // Some native toolkits (GTK+) draw tabs right-to-left, with an - // overlap between adjacent tabs - bool bDrawTabsRTL = IsNativeControlSupported( CTRL_TAB_ITEM, PART_TABS_DRAW_RTL ); - ImplTabItem * pFirstTab = NULL; - ImplTabItem * pLastTab = NULL; - size_t idx; - - // Event though there is a tab overlap with GTK+, the first tab is not - // overlapped on the left side. Other tookits ignore this option. - if ( bDrawTabsRTL ) - { - pFirstTab = &mpTabCtrlData->maItemList.front(); - pLastTab = &mpTabCtrlData->maItemList.back(); - idx = mpTabCtrlData->maItemList.size()-1; - } - else - { - pLastTab = &mpTabCtrlData->maItemList.back(); - pFirstTab = &mpTabCtrlData->maItemList.front(); - idx = 0; - } - - while ( idx < mpTabCtrlData->maItemList.size() ) - { - ImplTabItem* pItem = &mpTabCtrlData->maItemList[idx]; - if ( pItem != pCurItem ) - { - Region aClipRgn( GetActiveClipRegion() ); - aClipRgn.Intersect( pItem->maRect ); - if( !rRect.IsEmpty() ) - aClipRgn.Intersect( rRect ); - if( bLayout || !aClipRgn.IsEmpty() ) - ImplDrawItem( pItem, aCurRect, bLayout, (pItem==pFirstTab), (pItem==pLastTab), sal_False ); - } - - if ( bDrawTabsRTL ) - idx--; - else - idx++; - } - - if ( pCurItem ) - { - Region aClipRgn( GetActiveClipRegion() ); - aClipRgn.Intersect( pCurItem->maRect ); - if( !rRect.IsEmpty() ) - aClipRgn.Intersect( rRect ); - if( bLayout || !aClipRgn.IsEmpty() ) - ImplDrawItem( pCurItem, aCurRect, bLayout, (pCurItem==pFirstTab), (pCurItem==pLastTab), sal_True ); - } - } - - if ( !bLayout && HasFocus() ) - ImplShowFocus(); - - if( ! bLayout ) - mbSmallInvalidate = sal_True; + if( ! bLayout ) + HideFocus(); + + // Hier wird gegebenenfalls auch neu formatiert + Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); + + // find current item + ImplTabItem* pCurItem = NULL; + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if ( it->mnId == mnCurPageId ) + { + pCurItem = &(*it); + break; + } + } + + // Draw the TabPage border + const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings(); + Rectangle aCurRect; + long nTopOff = 1; + aRect.Left() -= TAB_OFFSET; + aRect.Top() -= TAB_OFFSET; + aRect.Right() += TAB_OFFSET; + aRect.Bottom() += TAB_OFFSET; + + // if we have an invisible tabpage or no tabpage at all the tabpage rect should be + // increased to avoid round corners that might be drawn by a theme + // in this case we're only interested in the top border of the tabpage because the tabitems are used + // standalone (e.g. Impress) + sal_Bool bNoTabPage = sal_False; + TabPage* pCurPage = (pCurItem) ? pCurItem->mpTabPage : NULL; + if( !pCurPage || !pCurPage->IsVisible() ) + { + bNoTabPage = sal_True; + aRect.Left()-=10; + aRect.Right()+=10; + } + + sal_Bool bNativeOK = sal_False; + if( ! bLayout && (bNativeOK = IsNativeControlSupported( CTRL_TAB_PANE, PART_ENTIRE_CONTROL) ) == sal_True ) + { + const ImplControlValue aControlValue; + + ControlState nState = CTRL_STATE_ENABLED; + int part = PART_ENTIRE_CONTROL; + if ( !IsEnabled() ) + nState &= ~CTRL_STATE_ENABLED; + if ( HasFocus() ) + nState |= CTRL_STATE_FOCUSED; + + Region aClipRgn( GetActiveClipRegion() ); + aClipRgn.Intersect( aRect ); + if( !rRect.IsEmpty() ) + aClipRgn.Intersect( rRect ); + + if( !aClipRgn.IsEmpty() ) + bNativeOK = DrawNativeControl( CTRL_TAB_PANE, part, aRect, nState, + aControlValue, rtl::OUString() ); + } + else + { + if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) + SetLineColor( rStyleSettings.GetLightColor() ); + else + SetLineColor( Color( COL_BLACK ) ); + if ( pCurItem && !pCurItem->maRect.IsEmpty() ) + { + aCurRect = pCurItem->maRect; + if( ! bLayout ) + DrawLine( aRect.TopLeft(), Point( aCurRect.Left()-2, aRect.Top() ) ); + if ( aCurRect.Right()+1 < aRect.Right() ) + { + if( ! bLayout ) + DrawLine( Point( aCurRect.Right(), aRect.Top() ), aRect.TopRight() ); + } + else + nTopOff = 0; + } + else + if( ! bLayout ) + DrawLine( aRect.TopLeft(), aRect.TopRight() ); + + if( ! bLayout ) + { + DrawLine( aRect.TopLeft(), aRect.BottomLeft() ); + + if ( !(rStyleSettings.GetOptions() & STYLE_OPTION_MONO) ) + { + // if we have not tab page the bottom line of the tab page + // directly touches the tab items, so choose a color that fits seamlessly + if( bNoTabPage ) + SetLineColor( rStyleSettings.GetDialogColor() ); + else + SetLineColor( rStyleSettings.GetShadowColor() ); + DrawLine( Point( 1, aRect.Bottom()-1 ), + Point( aRect.Right()-1, aRect.Bottom()-1 ) ); + DrawLine( Point( aRect.Right()-1, aRect.Top()+nTopOff ), + Point( aRect.Right()-1, aRect.Bottom()-1 ) ); + if( bNoTabPage ) + SetLineColor( rStyleSettings.GetDialogColor() ); + else + SetLineColor( rStyleSettings.GetDarkShadowColor() ); + DrawLine( Point( 0, aRect.Bottom() ), + Point( aRect.Right(), aRect.Bottom() ) ); + DrawLine( Point( aRect.Right(), aRect.Top()+nTopOff ), + Point( aRect.Right(), aRect.Bottom() ) ); + } + else + { + DrawLine( aRect.TopRight(), aRect.BottomRight() ); + DrawLine( aRect.BottomLeft(), aRect.BottomRight() ); + } + } + } + + if ( !mpTabCtrlData->maItemList.empty() && mpTabCtrlData->mpListBox == NULL ) + { + // Some native toolkits (GTK+) draw tabs right-to-left, with an + // overlap between adjacent tabs + bool bDrawTabsRTL = IsNativeControlSupported( CTRL_TAB_ITEM, PART_TABS_DRAW_RTL ); + ImplTabItem * pFirstTab = NULL; + ImplTabItem * pLastTab = NULL; + size_t idx; + + // Event though there is a tab overlap with GTK+, the first tab is not + // overlapped on the left side. Other toolkits ignore this option. + if ( bDrawTabsRTL ) + { + pFirstTab = &mpTabCtrlData->maItemList.front(); + pLastTab = &mpTabCtrlData->maItemList.back(); + idx = mpTabCtrlData->maItemList.size()-1; + } + else + { + pLastTab = &mpTabCtrlData->maItemList.back(); + pFirstTab = &mpTabCtrlData->maItemList.front(); + idx = 0; + } + + while ( idx < mpTabCtrlData->maItemList.size() ) + { + ImplTabItem* pItem = &mpTabCtrlData->maItemList[idx]; + if ( pItem != pCurItem ) + { + Region aClipRgn( GetActiveClipRegion() ); + aClipRgn.Intersect( pItem->maRect ); + if( !rRect.IsEmpty() ) + aClipRgn.Intersect( rRect ); + if( bLayout || !aClipRgn.IsEmpty() ) + ImplDrawItem( pItem, aCurRect, bLayout, (pItem==pFirstTab), (pItem==pLastTab), sal_False ); + } + + if ( bDrawTabsRTL ) + idx--; + else + idx++; + } + + if ( pCurItem ) + { + Region aClipRgn( GetActiveClipRegion() ); + aClipRgn.Intersect( pCurItem->maRect ); + if( !rRect.IsEmpty() ) + aClipRgn.Intersect( rRect ); + if( bLayout || !aClipRgn.IsEmpty() ) + ImplDrawItem( pCurItem, aCurRect, bLayout, (pCurItem==pFirstTab), (pCurItem==pLastTab), sal_True ); + } + } + + if ( !bLayout && HasFocus() ) + ImplShowFocus(); + + if( ! bLayout ) + mbSmallInvalidate = sal_True; } // ----------------------------------------------------------------------- void TabControl::Resize() { - ImplFreeLayoutData(); - - if ( !IsReallyShown() ) - return; - - if( mpTabCtrlData->mpListBox ) - { - // get the listbox' preferred size - Size aTabCtrlSize( GetSizePixel() ); - long nPrefWidth = mpTabCtrlData->mpListBox->GetOptimalSize( WINDOWSIZE_PREFERRED ).Width(); - if( nPrefWidth > aTabCtrlSize.Width() ) - nPrefWidth = aTabCtrlSize.Width(); - Size aNewSize( nPrefWidth, LogicToPixel( Size( 12, 12 ), MapMode( MAP_APPFONT ) ).Height() ); - Point aNewPos( (aTabCtrlSize.Width() - nPrefWidth) / 2, 0 ); - mpTabCtrlData->mpListBox->SetPosSizePixel( aNewPos, aNewSize ); - } - - mbFormat = sal_True; - - // Aktuelle TabPage resizen/positionieren - sal_Bool bTabPage = ImplPosCurTabPage(); - // Feststellen, was invalidiert werden muss - Size aNewSize = Control::GetOutputSizePixel(); - long nNewWidth = aNewSize.Width(); - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if ( !it->mbFullVisible || - (it->maRect.Right()-2 >= nNewWidth) ) - { - mbSmallInvalidate = sal_False; - break; - } - } - - if ( mbSmallInvalidate ) - { - Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); - aRect.Left() -= TAB_OFFSET+TAB_BORDER_LEFT; - aRect.Top() -= TAB_OFFSET+TAB_BORDER_TOP; - aRect.Right() += TAB_OFFSET+TAB_BORDER_RIGHT; - aRect.Bottom() += TAB_OFFSET+TAB_BORDER_BOTTOM; - if ( bTabPage ) - Invalidate( aRect, INVALIDATE_NOCHILDREN ); - else - Invalidate( aRect ); - - } - else - { - if ( bTabPage ) - Invalidate( INVALIDATE_NOCHILDREN ); - else - Invalidate(); - } + ImplFreeLayoutData(); + + if ( !IsReallyShown() ) + return; + + if( mpTabCtrlData->mpListBox ) + { + // get the listbox' preferred size + Size aTabCtrlSize( GetSizePixel() ); + long nPrefWidth = mpTabCtrlData->mpListBox->GetOptimalSize( WINDOWSIZE_PREFERRED ).Width(); + if( nPrefWidth > aTabCtrlSize.Width() ) + nPrefWidth = aTabCtrlSize.Width(); + Size aNewSize( nPrefWidth, LogicToPixel( Size( 12, 12 ), MapMode( MAP_APPFONT ) ).Height() ); + Point aNewPos( (aTabCtrlSize.Width() - nPrefWidth) / 2, 0 ); + mpTabCtrlData->mpListBox->SetPosSizePixel( aNewPos, aNewSize ); + } + + mbFormat = sal_True; + + // Aktuelle TabPage resizen/positionieren + sal_Bool bTabPage = ImplPosCurTabPage(); + // Feststellen, was invalidiert werden muss + Size aNewSize = Control::GetOutputSizePixel(); + long nNewWidth = aNewSize.Width(); + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if ( !it->mbFullVisible || + (it->maRect.Right()-2 >= nNewWidth) ) + { + mbSmallInvalidate = sal_False; + break; + } + } + + if ( mbSmallInvalidate ) + { + Rectangle aRect = ImplGetTabRect( TAB_PAGERECT ); + aRect.Left() -= TAB_OFFSET+TAB_BORDER_LEFT; + aRect.Top() -= TAB_OFFSET+TAB_BORDER_TOP; + aRect.Right() += TAB_OFFSET+TAB_BORDER_RIGHT; + aRect.Bottom() += TAB_OFFSET+TAB_BORDER_BOTTOM; + if ( bTabPage ) + Invalidate( aRect, INVALIDATE_NOCHILDREN ); + else + Invalidate( aRect ); + + } + else + { + if ( bTabPage ) + Invalidate( INVALIDATE_NOCHILDREN ); + else + Invalidate(); + } } // ----------------------------------------------------------------------- void TabControl::GetFocus() { - if( ! mpTabCtrlData->mpListBox ) - { - ImplShowFocus(); - SetInputContext( InputContext( GetFont() ) ); - } - else - { - if( mpTabCtrlData->mpListBox->IsReallyVisible() ) - mpTabCtrlData->mpListBox->GrabFocus(); - } - Control::GetFocus(); + if( ! mpTabCtrlData->mpListBox ) + { + ImplShowFocus(); + SetInputContext( InputContext( GetFont() ) ); + } + else + { + if( mpTabCtrlData->mpListBox->IsReallyVisible() ) + mpTabCtrlData->mpListBox->GrabFocus(); + } + Control::GetFocus(); } // ----------------------------------------------------------------------- void TabControl::LoseFocus() { - if( ! mpTabCtrlData->mpListBox ) - HideFocus(); - Control::LoseFocus(); + if( ! mpTabCtrlData->mpListBox ) + HideFocus(); + Control::LoseFocus(); } // ----------------------------------------------------------------------- void TabControl::RequestHelp( const HelpEvent& rHEvt ) { - sal_uInt16 nItemId = rHEvt.KeyboardActivated() ? mnCurPageId : GetPageId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) ); - - if ( nItemId ) - { - if ( rHEvt.GetMode() & HELPMODE_BALLOON ) - { - XubString aStr = GetHelpText( nItemId ); - if ( aStr.Len() ) - { - Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) ); - Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); - aItemRect.Left() = aPt.X(); - aItemRect.Top() = aPt.Y(); - aPt = OutputToScreenPixel( aItemRect.BottomRight() ); - aItemRect.Right() = aPt.X(); - aItemRect.Bottom() = aPt.Y(); - Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr ); - return; - } - } - else if ( rHEvt.GetMode() & HELPMODE_EXTENDED ) - { - rtl::OUString aHelpId( rtl::OStringToOUString( GetHelpId( nItemId ), RTL_TEXTENCODING_UTF8 ) ); - if ( aHelpId.getLength() ) - { - // Wenn eine Hilfe existiert, dann ausloesen - Help* pHelp = Application::GetHelp(); - if ( pHelp ) - pHelp->Start( aHelpId, this ); - return; - } - } - - // Bei Quick- oder Balloon-Help zeigen wir den Text an, - // wenn dieser abgeschnitten ist - if ( rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON) ) - { - ImplTabItem* pItem = ImplGetItem( nItemId ); - const XubString& rStr = pItem->maText; - if ( rStr != pItem->maFormatText ) - { - Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) ); - Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); - aItemRect.Left() = aPt.X(); - aItemRect.Top() = aPt.Y(); - aPt = OutputToScreenPixel( aItemRect.BottomRight() ); - aItemRect.Right() = aPt.X(); - aItemRect.Bottom() = aPt.Y(); - if ( rStr.Len() ) - { - if ( rHEvt.GetMode() & HELPMODE_BALLOON ) - Help::ShowBalloon( this, aItemRect.Center(), aItemRect, rStr ); - else - Help::ShowQuickHelp( this, aItemRect, rStr ); - return; - } - } - } - - if ( rHEvt.GetMode() & HELPMODE_QUICK ) - { - ImplTabItem* pItem = ImplGetItem( nItemId ); - const XubString& rHelpText = pItem->maHelpText; - // show tooltip if not text but image is set and helptext is available - if ( rHelpText.Len() > 0 && pItem->maText.Len() == 0 && !!pItem->maTabImage ) - { - Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) ); - Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); - aItemRect.Left() = aPt.X(); - aItemRect.Top() = aPt.Y(); - aPt = OutputToScreenPixel( aItemRect.BottomRight() ); - aItemRect.Right() = aPt.X(); - aItemRect.Bottom() = aPt.Y(); - Help::ShowQuickHelp( this, aItemRect, rHelpText ); - return; - } - } - } - - Control::RequestHelp( rHEvt ); + sal_uInt16 nItemId = rHEvt.KeyboardActivated() ? mnCurPageId : GetPageId( ScreenToOutputPixel( rHEvt.GetMousePosPixel() ) ); + + if ( nItemId ) + { + if ( rHEvt.GetMode() & HELPMODE_BALLOON ) + { + XubString aStr = GetHelpText( nItemId ); + if ( aStr.Len() ) + { + Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) ); + Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); + aItemRect.Left() = aPt.X(); + aItemRect.Top() = aPt.Y(); + aPt = OutputToScreenPixel( aItemRect.BottomRight() ); + aItemRect.Right() = aPt.X(); + aItemRect.Bottom() = aPt.Y(); + Help::ShowBalloon( this, aItemRect.Center(), aItemRect, aStr ); + return; + } + } + else if ( rHEvt.GetMode() & HELPMODE_EXTENDED ) + { + rtl::OUString aHelpId( rtl::OStringToOUString( GetHelpId( nItemId ), RTL_TEXTENCODING_UTF8 ) ); + if ( aHelpId.getLength() ) + { + // Wenn eine Hilfe existiert, dann ausloesen + Help* pHelp = Application::GetHelp(); + if ( pHelp ) + pHelp->Start( aHelpId, this ); + return; + } + } + + // Bei Quick- oder Balloon-Help zeigen wir den Text an, + // wenn dieser abgeschnitten ist + if ( rHEvt.GetMode() & (HELPMODE_QUICK | HELPMODE_BALLOON) ) + { + ImplTabItem* pItem = ImplGetItem( nItemId ); + const XubString& rStr = pItem->maText; + if ( rStr != pItem->maFormatText ) + { + Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) ); + Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); + aItemRect.Left() = aPt.X(); + aItemRect.Top() = aPt.Y(); + aPt = OutputToScreenPixel( aItemRect.BottomRight() ); + aItemRect.Right() = aPt.X(); + aItemRect.Bottom() = aPt.Y(); + if ( rStr.Len() ) + { + if ( rHEvt.GetMode() & HELPMODE_BALLOON ) + Help::ShowBalloon( this, aItemRect.Center(), aItemRect, rStr ); + else + Help::ShowQuickHelp( this, aItemRect, rStr ); + return; + } + } + } + + if ( rHEvt.GetMode() & HELPMODE_QUICK ) + { + ImplTabItem* pItem = ImplGetItem( nItemId ); + const XubString& rHelpText = pItem->maHelpText; + // show tooltip if not text but image is set and helptext is available + if ( rHelpText.Len() > 0 && pItem->maText.Len() == 0 && !!pItem->maTabImage ) + { + Rectangle aItemRect = ImplGetTabRect( GetPagePos( nItemId ) ); + Point aPt = OutputToScreenPixel( aItemRect.TopLeft() ); + aItemRect.Left() = aPt.X(); + aItemRect.Top() = aPt.Y(); + aPt = OutputToScreenPixel( aItemRect.BottomRight() ); + aItemRect.Right() = aPt.X(); + aItemRect.Bottom() = aPt.Y(); + Help::ShowQuickHelp( this, aItemRect, rHelpText ); + return; + } + } + } + + Control::RequestHelp( rHEvt ); } // ----------------------------------------------------------------------- void TabControl::Command( const CommandEvent& rCEvt ) { - if( (mpTabCtrlData->mpListBox == NULL) && (rCEvt.GetCommand() == COMMAND_CONTEXTMENU) && (GetPageCount() > 1) ) - { - Point aMenuPos; - sal_Bool bMenu; - if ( rCEvt.IsMouseEvent() ) - { - aMenuPos = rCEvt.GetMousePosPixel(); - bMenu = GetPageId( aMenuPos ) != 0; - } - else - { - aMenuPos = ImplGetTabRect( GetPagePos( mnCurPageId ) ).Center(); - bMenu = sal_True; - } - - if ( bMenu ) - { - PopupMenu aMenu; - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - aMenu.InsertItem( it->mnId, it->maText, MIB_CHECKABLE | MIB_RADIOCHECK ); - if ( it->mnId == mnCurPageId ) - aMenu.CheckItem( it->mnId ); - aMenu.SetHelpId( it->mnId, it->maHelpId ); - } - - sal_uInt16 nId = aMenu.Execute( this, aMenuPos ); - if ( nId && (nId != mnCurPageId) ) - SelectTabPage( nId ); - return; - } - } - - Control::Command( rCEvt ); + if( (mpTabCtrlData->mpListBox == NULL) && (rCEvt.GetCommand() == COMMAND_CONTEXTMENU) && (GetPageCount() > 1) ) + { + Point aMenuPos; + sal_Bool bMenu; + if ( rCEvt.IsMouseEvent() ) + { + aMenuPos = rCEvt.GetMousePosPixel(); + bMenu = GetPageId( aMenuPos ) != 0; + } + else + { + aMenuPos = ImplGetTabRect( GetPagePos( mnCurPageId ) ).Center(); + bMenu = sal_True; + } + + if ( bMenu ) + { + PopupMenu aMenu; + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + aMenu.InsertItem( it->mnId, it->maText, MIB_CHECKABLE | MIB_RADIOCHECK ); + if ( it->mnId == mnCurPageId ) + aMenu.CheckItem( it->mnId ); + aMenu.SetHelpId( it->mnId, it->maHelpId ); + } + + sal_uInt16 nId = aMenu.Execute( this, aMenuPos ); + if ( nId && (nId != mnCurPageId) ) + SelectTabPage( nId ); + return; + } + } + + Control::Command( rCEvt ); } // ----------------------------------------------------------------------- void TabControl::StateChanged( StateChangedType nType ) { - Control::StateChanged( nType ); - - if ( nType == STATE_CHANGE_INITSHOW ) - { - ImplPosCurTabPage(); - if( mpTabCtrlData->mpListBox ) - Resize(); - } - else if ( nType == STATE_CHANGE_UPDATEMODE ) - { - if ( IsUpdateMode() ) - Invalidate(); - } - else if ( (nType == STATE_CHANGE_ZOOM) || - (nType == STATE_CHANGE_CONTROLFONT) ) - { - ImplInitSettings( sal_True, sal_False, sal_False ); - Invalidate(); - } - else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) - { - ImplInitSettings( sal_False, sal_True, sal_False ); - Invalidate(); - } - else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) - { - ImplInitSettings( sal_False, sal_False, sal_True ); - Invalidate(); - } + Control::StateChanged( nType ); + + if ( nType == STATE_CHANGE_INITSHOW ) + { + ImplPosCurTabPage(); + if( mpTabCtrlData->mpListBox ) + Resize(); + } + else if ( nType == STATE_CHANGE_UPDATEMODE ) + { + if ( IsUpdateMode() ) + Invalidate(); + } + else if ( (nType == STATE_CHANGE_ZOOM) || + (nType == STATE_CHANGE_CONTROLFONT) ) + { + ImplInitSettings( sal_True, sal_False, sal_False ); + Invalidate(); + } + else if ( nType == STATE_CHANGE_CONTROLFOREGROUND ) + { + ImplInitSettings( sal_False, sal_True, sal_False ); + Invalidate(); + } + else if ( nType == STATE_CHANGE_CONTROLBACKGROUND ) + { + ImplInitSettings( sal_False, sal_False, sal_True ); + Invalidate(); + } } // ----------------------------------------------------------------------- void TabControl::DataChanged( const DataChangedEvent& rDCEvt ) { - Control::DataChanged( rDCEvt ); + Control::DataChanged( rDCEvt ); - if ( (rDCEvt.GetType() == DATACHANGED_FONTS) || - (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) || - ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && - (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) - { - ImplInitSettings( sal_True, sal_True, sal_True ); - Invalidate(); - } + if ( (rDCEvt.GetType() == DATACHANGED_FONTS) || + (rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) || + ((rDCEvt.GetType() == DATACHANGED_SETTINGS) && + (rDCEvt.GetFlags() & SETTINGS_STYLE)) ) + { + ImplInitSettings( sal_True, sal_True, sal_True ); + Invalidate(); + } } // ----------------------------------------------------------------------- Rectangle* TabControl::ImplFindPartRect( const Point& rPt ) { - ImplTabItem* pFoundItem = NULL; - int nFound = 0; - for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if ( it->maRect.IsInside( rPt ) ) - { - // assure that only one tab is highlighted at a time - nFound++; - pFoundItem = &(*it); - } - } - // assure that only one tab is highlighted at a time - return nFound == 1 ? &pFoundItem->maRect : NULL; + ImplTabItem* pFoundItem = NULL; + int nFound = 0; + for( std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if ( it->maRect.IsInside( rPt ) ) + { + // assure that only one tab is highlighted at a time + nFound++; + pFoundItem = &(*it); + } + } + // assure that only one tab is highlighted at a time + return nFound == 1 ? &pFoundItem->maRect : NULL; } long TabControl::PreNotify( NotifyEvent& rNEvt ) { - long nDone = 0; - const MouseEvent* pMouseEvt = NULL; - - if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL ) - { - if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() ) - { - // trigger redraw if mouse over state has changed - if( IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL) ) - { - Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() ); - Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() ); - if( pRect != pLastRect || (pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow()) ) - { - Region aClipRgn; - if( pLastRect ) - { - // allow for slightly bigger tabitems - // as used by gtk - // TODO: query for the correct sizes - Rectangle aRect(*pLastRect); - aRect.nLeft-=2; - aRect.nRight+=2; - aRect.nTop-=3; - aClipRgn.Union( aRect ); - } - if( pRect ) - { - // allow for slightly bigger tabitems - // as used by gtk - // TODO: query for the correct sizes - Rectangle aRect(*pRect); - aRect.nLeft-=2; - aRect.nRight+=2; - aRect.nTop-=3; - aClipRgn.Union( aRect ); - } - if( !aClipRgn.IsEmpty() ) - Invalidate( aClipRgn ); - } - } - } - } - - return nDone ? nDone : Control::PreNotify(rNEvt); + long nDone = 0; + const MouseEvent* pMouseEvt = NULL; + + if( (rNEvt.GetType() == EVENT_MOUSEMOVE) && (pMouseEvt = rNEvt.GetMouseEvent()) != NULL ) + { + if( !pMouseEvt->GetButtons() && !pMouseEvt->IsSynthetic() && !pMouseEvt->IsModifierChanged() ) + { + // trigger redraw if mouse over state has changed + if( IsNativeControlSupported(CTRL_TAB_ITEM, PART_ENTIRE_CONTROL) ) + { + Rectangle* pRect = ImplFindPartRect( GetPointerPosPixel() ); + Rectangle* pLastRect = ImplFindPartRect( GetLastPointerPosPixel() ); + if( pRect != pLastRect || (pMouseEvt->IsLeaveWindow() || pMouseEvt->IsEnterWindow()) ) + { + Region aClipRgn; + if( pLastRect ) + { + // allow for slightly bigger tabitems + // as used by gtk + // TODO: query for the correct sizes + Rectangle aRect(*pLastRect); + aRect.nLeft-=2; + aRect.nRight+=2; + aRect.nTop-=3; + aClipRgn.Union( aRect ); + } + if( pRect ) + { + // allow for slightly bigger tabitems + // as used by gtk + // TODO: query for the correct sizes + Rectangle aRect(*pRect); + aRect.nLeft-=2; + aRect.nRight+=2; + aRect.nTop-=3; + aClipRgn.Union( aRect ); + } + if( !aClipRgn.IsEmpty() ) + Invalidate( aClipRgn ); + } + } + } + } + + return nDone ? nDone : Control::PreNotify(rNEvt); } // ----------------------------------------------------------------------- long TabControl::Notify( NotifyEvent& rNEvt ) { - long nRet = 0; + long nRet = 0; - if ( rNEvt.GetType() == EVENT_KEYINPUT ) - nRet = ImplHandleKeyEvent( *rNEvt.GetKeyEvent() ); + if ( rNEvt.GetType() == EVENT_KEYINPUT ) + nRet = ImplHandleKeyEvent( *rNEvt.GetKeyEvent() ); - return nRet ? nRet : Control::Notify( rNEvt ); + return nRet ? nRet : Control::Notify( rNEvt ); } // ----------------------------------------------------------------------- void TabControl::ActivatePage() { - maActivateHdl.Call( this ); + maActivateHdl.Call( this ); } // ----------------------------------------------------------------------- long TabControl::DeactivatePage() { - if ( maDeactivateHdl.IsSet() ) - return maDeactivateHdl.Call( this ); - else - return sal_True; + if ( maDeactivateHdl.IsSet() ) + return maDeactivateHdl.Call( this ); + else + return sal_True; } // ----------------------------------------------------------------------- void TabControl::SetTabPageSizePixel( const Size& rSize ) { - ImplFreeLayoutData(); + ImplFreeLayoutData(); - Size aNewSize( rSize ); - aNewSize.Width() += TAB_OFFSET*2; - Rectangle aRect = ImplGetTabRect( TAB_PAGERECT, - aNewSize.Width(), aNewSize.Height() ); - aNewSize.Height() += aRect.Top()+TAB_OFFSET; - Window::SetOutputSizePixel( aNewSize ); + Size aNewSize( rSize ); + aNewSize.Width() += TAB_OFFSET*2; + Rectangle aRect = ImplGetTabRect( TAB_PAGERECT, + aNewSize.Width(), aNewSize.Height() ); + aNewSize.Height() += aRect.Top()+TAB_OFFSET; + Window::SetOutputSizePixel( aNewSize ); } // ----------------------------------------------------------------------- Size TabControl::GetTabPageSizePixel() const { - Rectangle aRect = ((TabControl*)this)->ImplGetTabRect( TAB_PAGERECT ); - return aRect.GetSize(); + Rectangle aRect = ((TabControl*)this)->ImplGetTabRect( TAB_PAGERECT ); + return aRect.GetSize(); } // ----------------------------------------------------------------------- void TabControl::InsertPage( const ResId& rResId, sal_uInt16 nPos ) { - GetRes( rResId.SetRT( RSC_TABCONTROLITEM ) ); + GetRes( rResId.SetRT( RSC_TABCONTROLITEM ) ); - sal_uLong nObjMask = ReadLongRes(); - sal_uInt16 nItemId = 1; + sal_uLong nObjMask = ReadLongRes(); + sal_uInt16 nItemId = 1; - // ID - if ( nObjMask & RSC_TABCONTROLITEM_ID ) - nItemId = sal::static_int_cast<sal_uInt16>(ReadLongRes()); + // ID + if ( nObjMask & RSC_TABCONTROLITEM_ID ) + nItemId = sal::static_int_cast<sal_uInt16>(ReadLongRes()); - // Text - XubString aTmpStr; - if( nObjMask & RSC_TABCONTROLITEM_TEXT ) - aTmpStr = ReadStringRes(); - InsertPage( nItemId, aTmpStr, nPos ); + // Text + XubString aTmpStr; + if( nObjMask & RSC_TABCONTROLITEM_TEXT ) + aTmpStr = ReadStringRes(); + InsertPage( nItemId, aTmpStr, nPos ); - // PageResID - if ( nObjMask & RSC_TABCONTROLITEM_PAGERESID ) - { - ImplTabItem& rItem = mpTabCtrlData->maItemList[ GetPagePos( nItemId ) ]; - rItem.mnTabPageResId = sal::static_int_cast<sal_uInt16>(ReadLongRes()); - } + // PageResID + if ( nObjMask & RSC_TABCONTROLITEM_PAGERESID ) + { + ImplTabItem& rItem = mpTabCtrlData->maItemList[ GetPagePos( nItemId ) ]; + rItem.mnTabPageResId = sal::static_int_cast<sal_uInt16>(ReadLongRes()); + } } // ----------------------------------------------------------------------- void TabControl::InsertPage( sal_uInt16 nPageId, const XubString& rText, - sal_uInt16 nPos ) -{ - DBG_ASSERT( nPageId, "TabControl::InsertPage(): PageId == 0" ); - DBG_ASSERT( GetPagePos( nPageId ) == TAB_PAGE_NOTFOUND, - "TabControl::InsertPage(): PageId already exists" ); - - // insert new page item - ImplTabItem* pItem = NULL; - if( nPos == TAB_APPEND || size_t(nPos) >= mpTabCtrlData->maItemList.size() ) - { - mpTabCtrlData->maItemList.push_back( ImplTabItem() ); - pItem = &mpTabCtrlData->maItemList.back(); - if( mpTabCtrlData->mpListBox ) - mpTabCtrlData->mpListBox->InsertEntry( rText ); - } - else - { - std::vector< ImplTabItem >::iterator new_it = - mpTabCtrlData->maItemList.insert( mpTabCtrlData->maItemList.begin() + nPos, ImplTabItem() ); - pItem = &(*new_it); - if( mpTabCtrlData->mpListBox ) - mpTabCtrlData->mpListBox->InsertEntry( rText, nPos); - } - if( mpTabCtrlData->mpListBox ) - { - if( ! mnCurPageId ) - mpTabCtrlData->mpListBox->SelectEntryPos( 0 ); - mpTabCtrlData->mpListBox->SetDropDownLineCount( mpTabCtrlData->mpListBox->GetEntryCount() ); - } - - // set current page id - if ( !mnCurPageId ) - mnCurPageId = nPageId; - - // init new page item - pItem->mnId = nPageId; - pItem->mpTabPage = NULL; - pItem->mnTabPageResId = 0; - pItem->maText = rText; - pItem->mbFullVisible = sal_False; - - mbFormat = sal_True; - if ( IsUpdateMode() ) - Invalidate(); - - ImplFreeLayoutData(); - if( mpTabCtrlData->mpListBox ) // reposition/resize listbox - Resize(); + sal_uInt16 nPos ) +{ + DBG_ASSERT( nPageId, "TabControl::InsertPage(): PageId == 0" ); + DBG_ASSERT( GetPagePos( nPageId ) == TAB_PAGE_NOTFOUND, + "TabControl::InsertPage(): PageId already exists" ); + + // insert new page item + ImplTabItem* pItem = NULL; + if( nPos == TAB_APPEND || size_t(nPos) >= mpTabCtrlData->maItemList.size() ) + { + mpTabCtrlData->maItemList.push_back( ImplTabItem() ); + pItem = &mpTabCtrlData->maItemList.back(); + if( mpTabCtrlData->mpListBox ) + mpTabCtrlData->mpListBox->InsertEntry( rText ); + } + else + { + std::vector< ImplTabItem >::iterator new_it = + mpTabCtrlData->maItemList.insert( mpTabCtrlData->maItemList.begin() + nPos, ImplTabItem() ); + pItem = &(*new_it); + if( mpTabCtrlData->mpListBox ) + mpTabCtrlData->mpListBox->InsertEntry( rText, nPos); + } + if( mpTabCtrlData->mpListBox ) + { + if( ! mnCurPageId ) + mpTabCtrlData->mpListBox->SelectEntryPos( 0 ); + mpTabCtrlData->mpListBox->SetDropDownLineCount( mpTabCtrlData->mpListBox->GetEntryCount() ); + } + + // set current page id + if ( !mnCurPageId ) + mnCurPageId = nPageId; + + // init new page item + pItem->mnId = nPageId; + pItem->mpTabPage = NULL; + pItem->mnTabPageResId = 0; + pItem->maText = rText; + pItem->mbFullVisible = sal_False; + + mbFormat = sal_True; + if ( IsUpdateMode() ) + Invalidate(); + + ImplFreeLayoutData(); + if( mpTabCtrlData->mpListBox ) // reposition/resize listbox + Resize(); ImplCallEventListeners( VCLEVENT_TABPAGE_INSERTED, (void*) (sal_uLong)nPageId ); } @@ -1708,65 +1706,65 @@ void TabControl::InsertPage( sal_uInt16 nPageId, const XubString& rText, void TabControl::RemovePage( sal_uInt16 nPageId ) { - sal_uInt16 nPos = GetPagePos( nPageId ); - - // does the item exist ? - if ( nPos != TAB_PAGE_NOTFOUND ) - { - //remove page item - std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin() + nPos; - bool bIsCurrentPage = (it->mnId == mnCurPageId); - mpTabCtrlData->maItemList.erase( it ); - if( mpTabCtrlData->mpListBox ) - { - mpTabCtrlData->mpListBox->RemoveEntry( nPos ); - mpTabCtrlData->mpListBox->SetDropDownLineCount( mpTabCtrlData->mpListBox->GetEntryCount() ); - } - - // If current page is removed, than first page gets the current page - if ( bIsCurrentPage ) - { - mnCurPageId = 0; - - if( ! mpTabCtrlData->maItemList.empty() ) - { - // don't do this by simply setting mnCurPageId to pFirstItem->mnId - // this leaves a lot of stuff (such trivias as _showing_ the new current page) undone - // instead, call SetCurPageId - // without this, the next (outside) call to SetCurPageId with the id of the first page - // will result in doing nothing (as we assume that nothing changed, then), and the page - // will never be shown. - // 86875 - 05/11/2001 - frank.schoenh...@germany.sun.com - - SetCurPageId( mpTabCtrlData->maItemList[0].mnId ); - } - } - - mbFormat = sal_True; - if ( IsUpdateMode() ) - Invalidate(); - - ImplFreeLayoutData(); + sal_uInt16 nPos = GetPagePos( nPageId ); + + // does the item exist? + if ( nPos != TAB_PAGE_NOTFOUND ) + { + //remove page item + std::vector< ImplTabItem >::iterator it = mpTabCtrlData->maItemList.begin() + nPos; + bool bIsCurrentPage = (it->mnId == mnCurPageId); + mpTabCtrlData->maItemList.erase( it ); + if( mpTabCtrlData->mpListBox ) + { + mpTabCtrlData->mpListBox->RemoveEntry( nPos ); + mpTabCtrlData->mpListBox->SetDropDownLineCount( mpTabCtrlData->mpListBox->GetEntryCount() ); + } + + // If current page is removed, than first page gets the current page + if ( bIsCurrentPage ) + { + mnCurPageId = 0; + + if( ! mpTabCtrlData->maItemList.empty() ) + { + // don't do this by simply setting mnCurPageId to pFirstItem->mnId + // this leaves a lot of stuff (such trivias as _showing_ the new current page) undone + // instead, call SetCurPageId + // without this, the next (outside) call to SetCurPageId with the id of the first page + // will result in doing nothing (as we assume that nothing changed, then), and the page + // will never be shown. + // 86875 - 05/11/2001 - frank.schoenh...@germany.sun.com + + SetCurPageId( mpTabCtrlData->maItemList[0].mnId ); + } + } + + mbFormat = sal_True; + if ( IsUpdateMode() ) + Invalidate(); + + ImplFreeLayoutData(); ImplCallEventListeners( VCLEVENT_TABPAGE_REMOVED, (void*) (sal_uLong) nPageId ); - } + } } // ----------------------------------------------------------------------- void TabControl::Clear() { - // clear item list - mpTabCtrlData->maItemList.clear(); - mnCurPageId = 0; - if( mpTabCtrlData->mpListBox ) - mpTabCtrlData->mpListBox->Clear(); + // clear item list + mpTabCtrlData->maItemList.clear(); + mnCurPageId = 0; + if( mpTabCtrlData->mpListBox ) + mpTabCtrlData->mpListBox->Clear(); - ImplFreeLayoutData(); + ImplFreeLayoutData(); - mbFormat = sal_True; - if ( IsUpdateMode() ) - Invalidate(); + mbFormat = sal_True; + if ( IsUpdateMode() ) + Invalidate(); ImplCallEventListeners( VCLEVENT_TABPAGE_REMOVEDALL ); } @@ -1775,439 +1773,437 @@ void TabControl::Clear() void TabControl::EnablePage( sal_uInt16 i_nPageId, bool i_bEnable ) { - ImplTabItem* pItem = ImplGetItem( i_nPageId ); + ImplTabItem* pItem = ImplGetItem( i_nPageId ); - if ( pItem && pItem->mbEnabled != i_bEnable ) - { - pItem->mbEnabled = i_bEnable; - mbFormat = sal_True; - if( mpTabCtrlData->mpListBox ) - mpTabCtrlData->mpListBox->SetEntryFlags( GetPagePos( i_nPageId ), - i_bEnable ? 0 : (LISTBOX_ENTRY_FLAG_DISABLE_SELECTION | LISTBOX_ENTRY_FLAG_DRAW_DISABLED) ); - if( pItem->mnId == mnCurPageId ) - { - // SetCurPageId will change to an enabled page - SetCurPageId( mnCurPageId ); - } - else if ( IsUpdateMode() ) - Invalidate(); - } + if ( pItem && pItem->mbEnabled != i_bEnable ) + { + pItem->mbEnabled = i_bEnable; + mbFormat = sal_True; + if( mpTabCtrlData->mpListBox ) + mpTabCtrlData->mpListBox->SetEntryFlags( GetPagePos( i_nPageId ), + i_bEnable ? 0 : (LISTBOX_ENTRY_FLAG_DISABLE_SELECTION | LISTBOX_ENTRY_FLAG_DRAW_DISABLED) ); + if( pItem->mnId == mnCurPageId ) + { + // SetCurPageId will change to an enabled page + SetCurPageId( mnCurPageId ); + } + else if ( IsUpdateMode() ) + Invalidate(); + } } // ----------------------------------------------------------------------- sal_uInt16 TabControl::GetPageCount() const { - return (sal_uInt16)mpTabCtrlData->maItemList.size(); + return (sal_uInt16)mpTabCtrlData->maItemList.size(); } // ----------------------------------------------------------------------- sal_uInt16 TabControl::GetPageId( sal_uInt16 nPos ) const { - if( size_t(nPos) < mpTabCtrlData->maItemList.size() ) - return mpTabCtrlData->maItemList[ nPos ].mnId; - return 0; + if( size_t(nPos) < mpTabCtrlData->maItemList.size() ) + return mpTabCtrlData->maItemList[ nPos ].mnId; + return 0; } // ----------------------------------------------------------------------- sal_uInt16 TabControl::GetPagePos( sal_uInt16 nPageId ) const { - for( std::vector< ImplTabItem >::const_iterator it = mpTabCtrlData->maItemList.begin(); - it != mpTabCtrlData->maItemList.end(); ++it ) - { - if ( it->mnId == nPageId ) - return (sal_uInt16)(it - mpTabCtrlData->maItemList.begin()); - } + for( std::vector< ImplTabItem >::const_iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + if ( it->mnId == nPageId ) + return (sal_uInt16)(it - mpTabCtrlData->maItemList.begin()); + } - return TAB_PAGE_NOTFOUND; + return TAB_PAGE_NOTFOUND; } // ----------------------------------------------------------------------- sal_uInt16 TabControl::GetPageId( const Point& rPos ) const { - for( size_t i = 0; i < mpTabCtrlData->maItemList.size(); ++i ) - { - if ( ((TabControl*)this)->ImplGetTabRect( static_cast<sal_uInt16>(i) ).IsInside( rPos ) ) - return mpTabCtrlData->maItemList[ i ].mnId; - } + for( size_t i = 0; i < mpTabCtrlData->maItemList.size(); ++i ) + { + if ( ((TabControl*)this)->ImplGetTabRect( static_cast<sal_uInt16>(i) ).IsInside( rPos ) ) + return mpTabCtrlData->maItemList[ i ].mnId; + } - return 0; + return 0; } // ----------------------------------------------------------------------- void TabControl::SetCurPageId( sal_uInt16 nPageId ) { - sal_uInt16 nPos = GetPagePos( nPageId ); - while( nPos != TAB_PAGE_NOTFOUND && - ! mpTabCtrlData->maItemList[nPos].mbEnabled ) - { - nPos++; - if( size_t(nPos) >= mpTabCtrlData->maItemList.size() ) - nPos = 0; - if( mpTabCtrlData->maItemList[nPos].mnId == nPageId ) - break; - } - - if( nPos != TAB_PAGE_NOTFOUND ) - { - nPageId = mpTabCtrlData->maItemList[nPos].mnId; - if ( nPageId == mnCurPageId ) - { - if ( mnActPageId ) - mnActPageId = nPageId; - return; - } - - if ( mnActPageId ) - mnActPageId = nPageId; - else - { - mbFormat = sal_True; - sal_uInt16 nOldId = mnCurPageId; - mnCurPageId = nPageId; - ImplChangeTabPage( nPageId, nOldId ); - } - } + sal_uInt16 nPos = GetPagePos( nPageId ); + while( nPos != TAB_PAGE_NOTFOUND && + ! mpTabCtrlData->maItemList[nPos].mbEnabled ) + { + nPos++; + if( size_t(nPos) >= mpTabCtrlData->maItemList.size() ) + nPos = 0; + if( mpTabCtrlData->maItemList[nPos].mnId == nPageId ) + break; + } + + if( nPos != TAB_PAGE_NOTFOUND ) + { + nPageId = mpTabCtrlData->maItemList[nPos].mnId; + if ( nPageId == mnCurPageId ) + { + if ( mnActPageId ) + mnActPageId = nPageId; + return; + } + + if ( mnActPageId ) + mnActPageId = nPageId; + else + { + mbFormat = sal_True; + sal_uInt16 nOldId = mnCurPageId; + mnCurPageId = nPageId; + ImplChangeTabPage( nPageId, nOldId ); + } + } } // ----------------------------------------------------------------------- sal_uInt16 TabControl::GetCurPageId() const { - if ( mnActPageId ) - return mnActPageId; - else - return mnCurPageId; + if ( mnActPageId ) + return mnActPageId; + else + return mnCurPageId; } // ----------------------------------------------------------------------- void TabControl::SelectTabPage( sal_uInt16 nPageId ) { - if ( nPageId && (nPageId != mnCurPageId) ) - { - ImplFreeLayoutData(); + if ( nPageId && (nPageId != mnCurPageId) ) + { + ImplFreeLayoutData(); ImplCallEventListeners( VCLEVENT_TABPAGE_DEACTIVATE, (void*) (sal_uLong) mnCurPageId ); - if ( DeactivatePage() ) - { - mnActPageId = nPageId; - ActivatePage(); - // Page koennte im Activate-Handler umgeschaltet wurden sein - nPageId = mnActPageId; - mnActPageId = 0; - SetCurPageId( nPageId ); - if( mpTabCtrlData->mpListBox ) - mpTabCtrlData->mpListBox->SelectEntryPos( GetPagePos( nPageId ) ); + if ( DeactivatePage() ) + { + mnActPageId = nPageId; + ActivatePage(); + // Page könnte im Activate-Handler umgeschaltet wurden sein + nPageId = mnActPageId; + mnActPageId = 0; + SetCurPageId( nPageId ); + if( mpTabCtrlData->mpListBox ) + mpTabCtrlData->mpListBox->SelectEntryPos( GetPagePos( nPageId ) ); ImplCallEventListeners( VCLEVENT_TABPAGE_ACTIVATE, (void*) (sal_uLong) nPageId ); - } - } + } + } } // ----------------------------------------------------------------------- void TabControl::SetTabPage( sal_uInt16 nPageId, TabPage* pTabPage ) { - ImplTabItem* pItem = ImplGetItem( nPageId ); - - if ( pItem && (pItem->mpTabPage != pTabPage) ) - { - if ( pTabPage ) - { - DBG_ASSERT( !pTabPage->IsVisible(), "TabControl::SetTabPage() - Page is visible" ); - - if ( IsDefaultSize() ) - SetTabPageSizePixel( pTabPage->GetSizePixel() ); + ImplTabItem* pItem = ImplGetItem( nPageId ); - // Erst hier setzen, damit Resize nicht TabPage umpositioniert - pItem->mpTabPage = pTabPage; - if ( pItem->mnId == mnCurPageId ) - ImplChangeTabPage( pItem->mnId, 0 ); - } - else - pItem->mpTabPage = NULL; - } + if ( pItem && (pItem->mpTabPage != pTabPage) ) + { + if ( pTabPage ) + { + DBG_ASSERT( !pTabPage->IsVisible(), "TabControl::SetTabPage() - Page is visible" ); + + if ( IsDefaultSize() ) + SetTabPageSizePixel( pTabPage->GetSizePixel() ); + + // Erst hier setzen, damit Resize nicht TabPage umpositioniert + pItem->mpTabPage = pTabPage; + if ( pItem->mnId == mnCurPageId ) + ImplChangeTabPage( pItem->mnId, 0 ); + } + else + pItem->mpTabPage = NULL; + } } // ----------------------------------------------------------------------- TabPage* TabControl::GetTabPage( sal_uInt16 nPageId ) const { - ImplTabItem* pItem = ImplGetItem( nPageId ); + ImplTabItem* pItem = ImplGetItem( nPageId ); - if ( pItem ) - return pItem->mpTabPage; - else - return NULL; + if ( pItem ) + return pItem->mpTabPage; + else + return NULL; } // ----------------------------------------------------------------------- sal_uInt16 TabControl::GetTabPageResId( sal_uInt16 nPageId ) const { - ImplTabItem* pItem = ImplGetItem( nPageId ); + ImplTabItem* pItem = ImplGetItem( nPageId ); - if ( pItem ) - return pItem->mnTabPageResId; - else - return 0; + if ( pItem ) + return pItem->mnTabPageResId; + else + return 0; } // ----------------------------------------------------------------------- void TabControl::SetPageText( sal_uInt16 nPageId, const XubString& rText ) { - ImplTabItem* pItem = ImplGetItem( nPageId ); - - if ( pItem && pItem->maText != rText ) - { - pItem->maText = rText; - mbFormat = sal_True; - if( mpTabCtrlData->mpListBox ) - { - sal_uInt16 nPos = GetPagePos( nPageId ); - mpTabCtrlData->mpListBox->RemoveEntry( nPos ); - mpTabCtrlData->mpListBox->InsertEntry( rText, nPos ); - } - if ( IsUpdateMode() ) - Invalidate(); - ImplFreeLayoutData(); + ImplTabItem* pItem = ImplGetItem( nPageId ); + + if ( pItem && pItem->maText != rText ) + { + pItem->maText = rText; + mbFormat = sal_True; + if( mpTabCtrlData->mpListBox ) + { + sal_uInt16 nPos = GetPagePos( nPageId ); + mpTabCtrlData->mpListBox->RemoveEntry( nPos ); + mpTabCtrlData->mpListBox->InsertEntry( rText, nPos ); + } + if ( IsUpdateMode() ) + Invalidate(); + ImplFreeLayoutData(); ImplCallEventListeners( VCLEVENT_TABPAGE_PAGETEXTCHANGED, (void*) (sal_uLong) nPageId ); - } + } } // ----------------------------------------------------------------------- XubString TabControl::GetPageText( sal_uInt16 nPageId ) const { - ImplTabItem* pItem = ImplGetItem( nPageId ); + ImplTabItem* pItem = ImplGetItem( nPageId ); - if ( pItem ) - return pItem->maText; - else - return ImplGetSVEmptyStr(); + if ( pItem ) + return pItem->maText; + else + return ImplGetSVEmptyStr(); } // ----------------------------------------------------------------------- void TabControl::SetHelpText( sal_uInt16 nPageId, const XubString& rText ) { - ImplTabItem* pItem = ImplGetItem( nPageId ); + ImplTabItem* pItem = ImplGetItem( nPageId ); - if ( pItem ) - pItem->maHelpText = rText; + if ( pItem ) + pItem->maHelpText = rText; } // ----------------------------------------------------------------------- const XubString& TabControl::GetHelpText( sal_uInt16 nPageId ) const { - ImplTabItem* pItem = ImplGetItem( nPageId ); - - if ( pItem ) - { - if ( !pItem->maHelpText.Len() && pItem->maHelpId.getLength() ) - { - Help* pHelp = Application::GetHelp(); - if ( pHelp ) - pItem->maHelpText = pHelp->GetHelpText( rtl::OStringToOUString( pItem->maHelpId, RTL_TEXTENCODING_UTF8 ), this ); - } + ImplTabItem* pItem = ImplGetItem( nPageId ); - return pItem->maHelpText; - } - else - return ImplGetSVEmptyStr(); + if ( pItem ) + { + if ( !pItem->maHelpText.Len() && pItem->maHelpId.getLength() ) + { + Help* pHelp = Application::GetHelp(); + if ( pHelp ) + pItem->maHelpText = pHelp->GetHelpText( rtl::OStringToOUString( pItem->maHelpId, RTL_TEXTENCODING_UTF8 ), this ); + } + + return pItem->maHelpText; + } + else + return ImplGetSVEmptyStr(); } // ----------------------------------------------------------------------- void TabControl::SetHelpId( sal_uInt16 nPageId, const rtl::OString& rHelpId ) { - ImplTabItem* pItem = ImplGetItem( nPageId ); + ImplTabItem* pItem = ImplGetItem( nPageId ); - if ( pItem ) - pItem->maHelpId = rHelpId; + if ( pItem ) + pItem->maHelpId = rHelpId; } // ----------------------------------------------------------------------- rtl::OString TabControl::GetHelpId( sal_uInt16 nPageId ) const { - rtl::OString aRet; - ImplTabItem* pItem = ImplGetItem( nPageId ); + rtl::OString aRet; + ImplTabItem* pItem = ImplGetItem( nPageId ); + + if ( pItem ) + aRet = pItem->maHelpId; - if ( pItem ) - aRet = pItem->maHelpId; - - return aRet; + return aRet; } // ----------------------------------------------------------------------- void TabControl::SetPageImage( sal_uInt16 i_nPageId, const Image& i_rImage ) { - ImplTabItem* pItem = ImplGetItem( i_nPageId ); + ImplTabItem* pItem = ImplGetItem( i_nPageId ); - if ( pItem ) - { - pItem->maTabImage = i_rImage; - mbFormat = sal_True; - if ( IsUpdateMode() ) - Invalidate(); - } + if ( pItem ) + { + pItem->maTabImage = i_rImage; + mbFormat = sal_True; + if ( IsUpdateMode() ) + Invalidate(); + } } // ----------------------------------------------------------------------- const Image* TabControl::GetPageImage( sal_uInt16 i_nPageId ) const { - const ImplTabItem* pItem = ImplGetItem( i_nPageId ); - return pItem ? &pItem->maTabImage : NULL; + const ImplTabItem* pItem = ImplGetItem( i_nPageId ); + return pItem ? &pItem->maTabImage : NULL; } // ----------------------------------------------------------------------- Rectangle TabControl::GetCharacterBounds( sal_uInt16 nPageId, long nIndex ) const { - Rectangle aRet; + Rectangle aRet; - if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) - FillLayoutData(); + if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) + FillLayoutData(); - if( HasLayoutData() ) - { - std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPageId ); - if( it != mpTabCtrlData->maLayoutPageIdToLine.end() ) - { - Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( it->second ); - if( (aPair.B() - aPair.A()) >= nIndex ) - aRet = mpControlData->mpLayoutData->GetCharacterBounds( aPair.A() + nIndex ); - } - } + if( HasLayoutData() ) + { + std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPageId ); + if( it != mpTabCtrlData->maLayoutPageIdToLine.end() ) + { + Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( it->second ); + if( (aPair.B() - aPair.A()) >= nIndex ) + aRet = mpControlData->mpLayoutData->GetCharacterBounds( aPair.A() + nIndex ); + } + } - return aRet; + return aRet; } // ----------------------------------------------------------------------- long TabControl::GetIndexForPoint( const Point& rPoint, sal_uInt16& rPageId ) const { - long nRet = -1; + long nRet = -1; - if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) - FillLayoutData(); + if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) + FillLayoutData(); - if( HasLayoutData() ) - { - int nIndex = mpControlData->mpLayoutData->GetIndexForPoint( rPoint ); - if( nIndex != -1 ) - { - // what line (->pageid) is this index in ? - int nLines = mpControlData->mpLayoutData->GetLineCount(); - int nLine = -1; - while( ++nLine < nLines ) - { - Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( nLine ); - if( aPair.A() <= nIndex && aPair.B() >= nIndex ) - { - nRet = nIndex - aPair.A(); - rPageId = (sal_uInt16)mpTabCtrlData->maLayoutLineToPageId[ nLine ]; - break; - } - } - } - } + if( HasLayoutData() ) + { + int nIndex = mpControlData->mpLayoutData->GetIndexForPoint( rPoint ); + if( nIndex != -1 ) + { + // what line (->pageid) is this index in ? + int nLines = mpControlData->mpLayoutData->GetLineCount(); + int nLine = -1; + while( ++nLine < nLines ) + { + Pair aPair = mpControlData->mpLayoutData->GetLineStartEnd( nLine ); + if( aPair.A() <= nIndex && aPair.B() >= nIndex ) + { + nRet = nIndex - aPair.A(); + rPageId = (sal_uInt16)mpTabCtrlData->maLayoutLineToPageId[ nLine ]; + break; + } + } + } + } - return nRet; + return nRet; } // ----------------------------------------------------------------------- void TabControl::FillLayoutData() const { - mpTabCtrlData->maLayoutLineToPageId.clear(); - mpTabCtrlData->maLayoutPageIdToLine.clear(); - const_cast<TabControl*>(this)->ImplPaint( Rectangle(), true ); + mpTabCtrlData->maLayoutLineToPageId.clear(); + mpTabCtrlData->maLayoutPageIdToLine.clear(); + const_cast<TabControl*>(this)->ImplPaint( Rectangle(), true ); } // ----------------------------------------------------------------------- Rectangle TabControl::GetTabPageBounds( sal_uInt16 nPage ) const { - Rectangle aRet; + Rectangle aRet; - if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) - FillLayoutData(); + if( !HasLayoutData() || ! mpTabCtrlData->maLayoutPageIdToLine.size() ) + FillLayoutData(); - if( HasLayoutData() ) - { - std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPage ); - if( it != mpTabCtrlData->maLayoutPageIdToLine.end() ) - { - if( it->second >= 0 && it->second < static_cast<int>(mpTabCtrlData->maTabRectangles.size()) ) - { - aRet = mpTabCtrlData->maTabRectangles[ it->second ]; - aRet.Union( const_cast<TabControl*>(this)->ImplGetTabRect( TAB_PAGERECT ) ); - } - } - } + if( HasLayoutData() ) + { + std::hash_map< int, int >::const_iterator it = mpTabCtrlData->maLayoutPageIdToLine.find( (int)nPage ); + if( it != mpTabCtrlData->maLayoutPageIdToLine.end() ) + { + if( it->second >= 0 && it->second < static_cast<int>(mpTabCtrlData->maTabRectangles.size()) ) + { + aRet = mpTabCtrlData->maTabRectangles[ it->second ]; + aRet.Union( const_cast<TabControl*>(this)->ImplGetTabRect( TAB_PAGERECT ) ); + } + } + } - return aRet; + return aRet; } // ----------------------------------------------------------------------- Rectangle TabControl::GetTabBounds( sal_uInt16 nPageId ) const { - Rectangle aRet; + Rectangle aRet; - ImplTabItem* pItem = ImplGetItem( nPageId ); - if(pItem) - aRet = pItem->maRect; + ImplTabItem* pItem = ImplGetItem( nPageId ); + if(pItem) + aRet = pItem->maRect; - return aRet; + return aRet; } // ----------------------------------------------------------------------- void TabControl::SetItemsOffset( const Point& rOffs ) { - if( mpTabCtrlData ) - mpTabCtrlData->maItemsOffset = rOffs; + if( mpTabCtrlData ) + mpTabCtrlData->maItemsOffset = rOffs; } Point TabControl::GetItemsOffset() const { - if( mpTabCtrlData ) - return mpTabCtrlData->maItemsOffset; - else - return Point(); + if( mpTabCtrlData ) + return mpTabCtrlData->maItemsOffset; + else + return Point(); } // ----------------------------------------------------------------------- Size TabControl::GetOptimalSize(WindowSizeType eType) const { - switch (eType) { - case WINDOWSIZE_MINIMUM: - return mpTabCtrlData ? mpTabCtrlData->maMinSize : Size(); - default: - return Control::GetOptimalSize( eType ); - } + switch (eType) { + case WINDOWSIZE_MINIMUM: + return mpTabCtrlData ? mpTabCtrlData->maMinSize : Size(); + default: + return Control::GetOptimalSize( eType ); + } } // ----------------------------------------------------------------------- void TabControl::SetMinimumSizePixel( const Size& i_rSize ) { - if( mpTabCtrlData ) - mpTabCtrlData->maMinSize = i_rSize; + if( mpTabCtrlData ) + mpTabCtrlData->maMinSize = i_rSize; } -// ----------------------------------------------------------------------- - - +/* vim: set noet sw=4 ts=4: */