include/vcl/contexttabctrl.hxx | 39 -- include/vcl/notebookbar.hxx | 4 include/vcl/tabctrl.hxx | 30 +- sc/uiconfig/scalc/ui/notebookbar.ui | 2 sd/uiconfig/simpress/ui/notebookbar.ui | 2 sfx2/uiconfig/ui/notebookbar.ui | 2 sw/uiconfig/swriter/ui/notebookbar.ui | 2 vcl/Library_vcl.mk | 1 vcl/source/control/contexttabctrl.cxx | 54 ---- vcl/source/control/tabctrl.cxx | 435 +++++++++++++++++++++++++++++++-- 10 files changed, 446 insertions(+), 125 deletions(-)
New commits: commit 1d3ee7663da5f9f2ab2e2b8181cf2f6be5d6e524 Author: Szymon KÅos <eszka...@gmail.com> Date: Wed Jul 13 15:14:02 2016 +0200 GSoC notebookbar: don't show empty space for hidden tabs Change-Id: Ia00f64c1cb5d990e852cc297b6b7bd76df4b1b05 Reviewed-on: https://gerrit.libreoffice.org/27191 Tested-by: Jenkins <c...@libreoffice.org> Reviewed-by: Samuel Mehrbrodt <samuel.mehrbr...@cib.de> diff --git a/include/vcl/contexttabctrl.hxx b/include/vcl/contexttabctrl.hxx deleted file mode 100644 index 452d9f3..0000000 --- a/include/vcl/contexttabctrl.hxx +++ /dev/null @@ -1,39 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 regarding copyright - * ownership. The ASF licenses this file 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 . - */ - -#ifndef INCLUDED_VCL_CONTEXTTABCTRL_HXX -#define INCLUDED_VCL_CONTEXTTABCTRL_HXX - -#include <vcl/EnumContext.hxx> -#include <vcl/tabctrl.hxx> - -class VCL_DLLPUBLIC ContextTabControl : public TabControl -{ -public: - ContextTabControl( vcl::Window* pParent, WinBits nStyle = WB_STDTABCONTROL ); - - void SetContext( vcl::EnumContext::Context eContext ); - -private: - vcl::EnumContext::Context eLastContext; -}; - -#endif // INCLUDED_VCL_TABCTRL_HXX - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/vcl/notebookbar.hxx b/include/vcl/notebookbar.hxx index 128bf8f..05c91a8 100644 --- a/include/vcl/notebookbar.hxx +++ b/include/vcl/notebookbar.hxx @@ -12,7 +12,7 @@ #include <vcl/builder.hxx> #include <vcl/ctrl.hxx> -#include <vcl/contexttabctrl.hxx> +#include <vcl/tabctrl.hxx> #include <vcl/EnumContext.hxx> #include <com/sun/star/ui/XContextChangeEventListener.hpp> @@ -33,7 +33,7 @@ public: const css::uno::Reference<css::ui::XContextChangeEventListener>& getContextChangeEventListener() const { return m_pEventListener; } private: css::uno::Reference<css::ui::XContextChangeEventListener> m_pEventListener; - VclPtr<ContextTabControl> m_pTabControl; + VclPtr<NotebookbarTabControl> m_pTabControl; }; diff --git a/include/vcl/tabctrl.hxx b/include/vcl/tabctrl.hxx index 410cb2b..a708161 100644 --- a/include/vcl/tabctrl.hxx +++ b/include/vcl/tabctrl.hxx @@ -22,6 +22,7 @@ #include <vcl/dllapi.h> #include <vcl/ctrl.hxx> +#include <vcl/EnumContext.hxx> struct ImplTabItem; struct ImplTabCtrlData; @@ -45,7 +46,7 @@ class ListBox; class VCL_DLLPUBLIC TabControl : public Control { -private: +protected: ImplTabCtrlData* mpTabCtrlData; long mnLastWidth; long mnLastHeight; @@ -56,7 +57,6 @@ private: bool mbRestoreHelpId; bool mbSmallInvalidate; bool mbLayoutDirty; - bool mbHideDisabledTabs; Link<TabControl*,void> maActivateHdl; Link<TabControl*,bool> maDeactivateHdl; @@ -64,7 +64,6 @@ private: SAL_DLLPRIVATE void ImplInitSettings( bool bFont, bool bForeground, bool bBackground ); SAL_DLLPRIVATE ImplTabItem* ImplGetItem( sal_uInt16 nId ) const; SAL_DLLPRIVATE Size ImplGetItemSize( ImplTabItem* pItem, long nMaxWidth ); - SAL_DLLPRIVATE bool ImplPlaceTabs( long nWidth ); SAL_DLLPRIVATE Rectangle ImplGetTabRect( sal_uInt16 nPos, long nWidth = -1, long nHeight = -1 ); SAL_DLLPRIVATE void ImplChangeTabPage( sal_uInt16 nId, sal_uInt16 nOldId ); SAL_DLLPRIVATE bool ImplPosCurTabPage(); @@ -73,15 +72,12 @@ private: SAL_DLLPRIVATE void ImplDrawItem(vcl::RenderContext& rRenderContext, ImplTabItem* pItem, const Rectangle& rCurRect, bool bFirstInGroup = false, bool bLastInGroup = false, bool bIsCurrentItem = false); - SAL_DLLPRIVATE void ImplPaint(vcl::RenderContext& rRenderContext, const Rectangle& rRect); SAL_DLLPRIVATE void ImplFreeLayoutData(); SAL_DLLPRIVATE bool ImplHandleKeyEvent( const KeyEvent& rKeyEvent ); DECL_DLLPRIVATE_LINK_TYPED( ImplListBoxSelectHdl, ListBox&, void ); DECL_DLLPRIVATE_LINK_TYPED( ImplWindowEventListener, VclWindowEvent&, void ); - -protected: using Window::ImplInit; SAL_DLLPRIVATE void ImplInit( vcl::Window* pParent, WinBits nStyle ); @@ -89,6 +85,8 @@ protected: virtual const vcl::Font& GetCanonicalFont( const StyleSettings& _rStyle ) const override; virtual const Color& GetCanonicalTextColor( const StyleSettings& _rStyle ) const override; SAL_DLLPRIVATE Rectangle* ImplFindPartRect( const Point& rPt ); + virtual bool ImplPlaceTabs( long nWidth ); + virtual void ImplPaint(vcl::RenderContext& rRenderContext, const Rectangle& rRect); public: TabControl( vcl::Window* pParent, @@ -126,12 +124,11 @@ public: void RemovePage( sal_uInt16 nPageId ); void Clear(); void EnablePage( sal_uInt16 nPageId, bool bEnable = true ); - void HideDisabledTabs(bool bHide = true); sal_uInt16 GetPagePos( sal_uInt16 nPageId ) const; sal_uInt16 GetPageCount() const; sal_uInt16 GetPageId( sal_uInt16 nPos ) const; - sal_uInt16 GetPageId( const Point& rPos ) const; + virtual sal_uInt16 GetPageId( const Point& rPos ) const; sal_uInt16 GetPageId( const TabPage& rPage ) const; sal_uInt16 GetPageId( const OString& rName ) const; @@ -197,6 +194,23 @@ public: virtual void queue_resize(StateChangedType eReason = StateChangedType::Layout) override; }; +class VCL_DLLPUBLIC NotebookbarTabControl : public TabControl +{ +public: + NotebookbarTabControl( vcl::Window* pParent, WinBits nStyle = WB_STDTABCONTROL ); + + void SetContext( vcl::EnumContext::Context eContext ); + + virtual sal_uInt16 GetPageId( const Point& rPos ) const override; + +protected: + virtual bool ImplPlaceTabs( long nWidth ) override; + virtual void ImplPaint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) override; + +private: + vcl::EnumContext::Context eLastContext; +}; + #endif // INCLUDED_VCL_TABCTRL_HXX /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sc/uiconfig/scalc/ui/notebookbar.ui b/sc/uiconfig/scalc/ui/notebookbar.ui index 28f1e28..f0b8693 100644 --- a/sc/uiconfig/scalc/ui/notebookbar.ui +++ b/sc/uiconfig/scalc/ui/notebookbar.ui @@ -192,7 +192,7 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="vcllo-ContextTabControl" id="notebook1"> + <object class="vcllo-NotebookbarTabControl" id="notebook1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> diff --git a/sd/uiconfig/simpress/ui/notebookbar.ui b/sd/uiconfig/simpress/ui/notebookbar.ui index 0ceafc1..6b53d7c 100644 --- a/sd/uiconfig/simpress/ui/notebookbar.ui +++ b/sd/uiconfig/simpress/ui/notebookbar.ui @@ -182,7 +182,7 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="vcllo-ContextTabControl" id="notebook1"> + <object class="vcllo-NotebookbarTabControl" id="notebook1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> diff --git a/sfx2/uiconfig/ui/notebookbar.ui b/sfx2/uiconfig/ui/notebookbar.ui index a0aa02e..1e8885b 100644 --- a/sfx2/uiconfig/ui/notebookbar.ui +++ b/sfx2/uiconfig/ui/notebookbar.ui @@ -11,7 +11,7 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="vcllo-ContextTabControl" id="notebook1"> + <object class="vcllo-NotebookbarTabControl" id="notebook1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> diff --git a/sw/uiconfig/swriter/ui/notebookbar.ui b/sw/uiconfig/swriter/ui/notebookbar.ui index b912273..5558495 100644 --- a/sw/uiconfig/swriter/ui/notebookbar.ui +++ b/sw/uiconfig/swriter/ui/notebookbar.ui @@ -213,7 +213,7 @@ <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="vcllo-ContextTabControl" id="notebook1"> + <object class="vcllo-NotebookbarTabControl" id="notebook1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hexpand">True</property> diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index 56a4d2b..0b26fdf 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -193,7 +193,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/window/EnumContext \ vcl/source/control/button \ vcl/source/control/combobox \ - vcl/source/control/contexttabctrl \ vcl/source/control/ctrl \ vcl/source/control/edit \ vcl/source/control/field2 \ diff --git a/vcl/source/control/contexttabctrl.cxx b/vcl/source/control/contexttabctrl.cxx deleted file mode 100644 index 5fa526a..0000000 --- a/vcl/source/control/contexttabctrl.cxx +++ /dev/null @@ -1,54 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/* - * This file is part of the LibreOffice project. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. - * - * This file incorporates work covered by the following license notice: - * - * 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 regarding copyright - * ownership. The ASF licenses this file 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 . - */ - -#include <vcl/builderfactory.hxx> -#include <vcl/contexttabctrl.hxx> -#include <vcl/tabpage.hxx> - -VCL_BUILDER_FACTORY(ContextTabControl); - -ContextTabControl::ContextTabControl( vcl::Window* pParent, WinBits nStyle ) : - TabControl( pParent, nStyle ) - , eLastContext(vcl::EnumContext::Context::Context_Any) -{ - HideDisabledTabs(); -} - -void ContextTabControl::SetContext( vcl::EnumContext::Context eContext ) -{ - if (eLastContext != eContext) - { - for (int nChild = 0; nChild < GetChildCount(); ++nChild) - { - TabPage* pPage = static_cast<TabPage*>(GetChild(nChild)); - - if (pPage->HasContext(eContext) || pPage->HasContext(vcl::EnumContext::Context::Context_Any)) - EnablePage(nChild + 1); - else - EnablePage(nChild + 1, false); - - if (pPage->HasContext(eContext) && eContext != vcl::EnumContext::Context::Context_Any) - SetCurPageId(nChild + 1); - } - - eLastContext = eContext; - } -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/control/tabctrl.cxx b/vcl/source/control/tabctrl.cxx index 6420817..d532a5e 100644 --- a/vcl/source/control/tabctrl.cxx +++ b/vcl/source/control/tabctrl.cxx @@ -32,6 +32,7 @@ #include <vcl/lstbox.hxx> #include <vcl/settings.hxx> #include <vcl/uitest/uiobject.hxx> +#include <vcl/builderfactory.hxx> #include "controldata.hxx" #include "svdata.hxx" @@ -96,7 +97,6 @@ void TabControl::ImplInit( vcl::Window* pParent, WinBits nStyle ) mbSmallInvalidate = false; mpTabCtrlData = new ImplTabCtrlData; mpTabCtrlData->mpListBox = nullptr; - mbHideDisabledTabs = false; ImplInitSettings( true, true, true ); @@ -1199,19 +1199,16 @@ void TabControl::ImplPaint(vcl::RenderContext& rRenderContext, const Rectangle& { ImplTabItem* pItem = &mpTabCtrlData->maItemList[idx]; - if(!mbHideDisabledTabs || (mbHideDisabledTabs && pItem->mbEnabled)) + if (pItem != pCurItem) { - if (pItem != pCurItem) + vcl::Region aClipRgn(rRenderContext.GetActiveClipRegion()); + aClipRgn.Intersect(pItem->maRect); + if (!rRect.IsEmpty()) + aClipRgn.Intersect(rRect); + if (!aClipRgn.IsEmpty()) { - vcl::Region aClipRgn(rRenderContext.GetActiveClipRegion()); - aClipRgn.Intersect(pItem->maRect); - if (!rRect.IsEmpty()) - aClipRgn.Intersect(rRect); - if (!aClipRgn.IsEmpty()) - { - ImplDrawItem(rRenderContext, pItem, aCurRect, false/*bLayout*/, - pItem == pFirstTab, pItem == pLastTab); - } + ImplDrawItem(rRenderContext, pItem, aCurRect, false/*bLayout*/, + pItem == pFirstTab, pItem == pLastTab); } } @@ -1762,11 +1759,6 @@ void TabControl::EnablePage( sal_uInt16 i_nPageId, bool i_bEnable ) } } -void TabControl::HideDisabledTabs(bool bHide) -{ - mbHideDisabledTabs = bHide; -} - sal_uInt16 TabControl::GetPageCount() const { return (sal_uInt16)mpTabCtrlData->maItemList.size(); @@ -2208,4 +2200,413 @@ FactoryFunction TabControl::GetUITestFactory() const return TabControlUIObject::create; } +VCL_BUILDER_FACTORY(NotebookbarTabControl); + +NotebookbarTabControl::NotebookbarTabControl(vcl::Window* pParent, WinBits nStyle) + : TabControl(pParent, nStyle) + , eLastContext( vcl::EnumContext::Context::Context_Any ) +{ +} + +void NotebookbarTabControl::SetContext( vcl::EnumContext::Context eContext ) +{ + if (eLastContext != eContext) + { + for (int nChild = 0; nChild < GetChildCount(); ++nChild) + { + TabPage* pPage = static_cast<TabPage*>(GetChild(nChild)); + + if (pPage->HasContext(eContext) || pPage->HasContext(vcl::EnumContext::Context::Context_Any)) + EnablePage(nChild + 1); + else + EnablePage(nChild + 1, false); + + if (pPage->HasContext(eContext) && eContext != vcl::EnumContext::Context::Context_Any) + SetCurPageId(nChild + 1); + } + + eLastContext = eContext; + } +} + +sal_uInt16 NotebookbarTabControl::GetPageId( const Point& rPos ) const +{ + for( size_t i = 0; i < mpTabCtrlData->maItemList.size(); ++i ) + { + if ( const_cast<NotebookbarTabControl*>(this)->ImplGetTabRect( static_cast<sal_uInt16>(i) ).IsInside( rPos ) ) + if ( mpTabCtrlData->maItemList[ i ].mbEnabled ) + return mpTabCtrlData->maItemList[ i ].mnId; + } + + return 0; +} + +bool NotebookbarTabControl::ImplPlaceTabs( long nWidth ) +{ + if ( nWidth <= 0 ) + return false; + if ( mpTabCtrlData->maItemList.empty() ) + return false; + + long nMaxWidth = nWidth; + + const long nOffsetX = 2 + GetItemsOffset().X(); + const long nOffsetY = 2 + GetItemsOffset().Y(); + + //fdo#66435 throw Knuth/Tex minimum raggedness algorithm at the problem + //of ugly bare tabs on lines of their own + + //collect widths + std::vector<sal_Int32> aWidths; + for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it ) + { + aWidths.push_back(ImplGetItemSize( &(*it), nMaxWidth ).Width()); + } + + //aBreakIndexes will contain the indexes of the last tab on each row + std::deque<size_t> aBreakIndexes(MinimumRaggednessWrap::GetEndOfLineIndexes(aWidths, nMaxWidth - nOffsetX - 2)); + + if ( (mnMaxPageWidth > 0) && (mnMaxPageWidth < nMaxWidth) ) + nMaxWidth = mnMaxPageWidth; + nMaxWidth -= GetItemsOffset().X(); + + long nX = nOffsetX; + long nY = nOffsetY; + + sal_uInt16 nLines = 0; + sal_uInt16 nCurLine = 0; + + long nLineWidthAry[100]; + sal_uInt16 nLinePosAry[101]; + nLineWidthAry[0] = 0; + nLinePosAry[0] = 0; + + size_t nIndex = 0; + sal_uInt16 nPos = 0; + sal_uInt16 nHiddenWidth = 0; + + for( std::vector<ImplTabItem>::iterator it = mpTabCtrlData->maItemList.begin(); + it != mpTabCtrlData->maItemList.end(); ++it, ++nIndex ) + { + Size aSize = ImplGetItemSize( &(*it), nMaxWidth ); + + bool bNewLine = false; + if (!aBreakIndexes.empty() && nIndex > aBreakIndexes.front()) + { + aBreakIndexes.pop_front(); + bNewLine = true; + } + + if ( bNewLine && (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 = false; + + // don't show empty space when tab is hidden, move next tabs to the left + if ( it->mpTabPage && !it->mpTabPage->HasContext(vcl::EnumContext::Context_Any) ) + { + aNewRect.setX(aNewRect.getX() - nHiddenWidth); + nHiddenWidth += aNewRect.getWidth(); + } + + it->maRect = aNewRect; + it->mnLine = nLines; + it->mbFullVisible = true; + + nLineWidthAry[nLines] += aSize.Width(); + nX += aSize.Width(); + + if ( it->mnId == mnCurPageId ) + nCurLine = nLines; + + nPos++; + } + + if ( nLines ) + { // two or more lines + long nLineHeightAry[100]; + long nIH = mpTabCtrlData->maItemList[0].maRect.Bottom()-2; + + for ( sal_uInt16 i = 0; i < nLines+1; i++ ) + { + if ( i <= nCurLine ) + nLineHeightAry[i] = nIH*(nLines-(nCurLine-i)) + GetItemsOffset().Y(); + else + nLineHeightAry[i] = nIH*(i-nCurLine-1) + GetItemsOffset().Y(); + } + + nLinePosAry[nLines+1] = (sal_uInt16)mpTabCtrlData->maItemList.size(); + + long nDX = 0; + long nModDX = 0; + long nIDX = 0; + + sal_uInt16 i = 0; + sal_uInt16 n = 0; + 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 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() += nRightSpace / 2; + it->maRect.Right() += nRightSpace / 2; + } + } + } + + return true; +} + +void NotebookbarTabControl::ImplPaint(vcl::RenderContext& rRenderContext, const Rectangle& rRect) +{ + HideFocus(); + + // reformat if needed + Rectangle aRect = ImplGetTabRect(TAB_PAGERECT); + + // find current item + ImplTabItem* pCurItem = nullptr; + 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 = rRenderContext.GetSettings().GetStyleSettings(); + Rectangle aCurRect; + 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) + bool bNoTabPage = false; + TabPage* pCurPage = pCurItem ? pCurItem->mpTabPage.get() : nullptr; + if (!pCurPage || !pCurPage->IsVisible()) + { + bNoTabPage = true; + aRect.Left() -= 10; + aRect.Right() += 10; + } + + if (rRenderContext.IsNativeControlSupported(ControlType::TabPane, ControlPart::Entire)) + { + const ImplControlValue aControlValue; + + ControlState nState = ControlState::ENABLED; + if (!IsEnabled()) + nState &= ~ControlState::ENABLED; + if (HasFocus()) + nState |= ControlState::FOCUSED; + + vcl::Region aClipRgn(rRenderContext.GetActiveClipRegion()); + aClipRgn.Intersect(aRect); + if (!rRect.IsEmpty()) + aClipRgn.Intersect(rRect); + + if (!aClipRgn.IsEmpty()) + { + rRenderContext.DrawNativeControl(ControlType::TabPane, ControlPart::Entire, + aRect, nState, aControlValue, OUString()); + } + + if (rRenderContext.IsNativeControlSupported(ControlType::TabHeader, ControlPart::Entire)) + { + Rectangle aHeaderRect(aRect.Left(), 0, aRect.Right(), aRect.Top()); + + aClipRgn = rRenderContext.GetActiveClipRegion(); + aClipRgn.Intersect(aHeaderRect); + if (!rRect.IsEmpty()) + aClipRgn.Intersect(rRect); + + if (!aClipRgn.IsEmpty()) + { + rRenderContext.DrawNativeControl(ControlType::TabHeader, ControlPart::Entire, + aHeaderRect, nState, aControlValue, OUString()); + } + } + } + else + { + long nTopOff = 1; + if (!(rStyleSettings.GetOptions() & StyleSettingsOptions::Mono)) + rRenderContext.SetLineColor(rStyleSettings.GetLightColor()); + else + rRenderContext.SetLineColor(Color(COL_BLACK)); + if (pCurItem && !pCurItem->maRect.IsEmpty()) + { + aCurRect = pCurItem->maRect; + rRenderContext.DrawLine(aRect.TopLeft(), Point(aCurRect.Left() - 2, aRect.Top())); + if (aCurRect.Right() + 1 < aRect.Right()) + { + rRenderContext.DrawLine(Point(aCurRect.Right(), aRect.Top()), aRect.TopRight()); + } + else + { + nTopOff = 0; + } + } + else + rRenderContext.DrawLine(aRect.TopLeft(), aRect.TopRight()); + + rRenderContext.DrawLine(aRect.TopLeft(), aRect.BottomLeft()); + + if (!(rStyleSettings.GetOptions() & StyleSettingsOptions::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) + rRenderContext.SetLineColor(rStyleSettings.GetDialogColor()); + else + rRenderContext.SetLineColor(rStyleSettings.GetShadowColor()); + rRenderContext.DrawLine(Point(1, aRect.Bottom() - 1), Point(aRect.Right() - 1, aRect.Bottom() - 1)); + rRenderContext.DrawLine(Point(aRect.Right() - 1, aRect.Top() + nTopOff), Point(aRect.Right() - 1, aRect.Bottom() - 1)); + if (bNoTabPage) + rRenderContext.SetLineColor(rStyleSettings.GetDialogColor()); + else + rRenderContext.SetLineColor(rStyleSettings.GetDarkShadowColor()); + rRenderContext.DrawLine(Point(0, aRect.Bottom()), Point(aRect.Right(), aRect.Bottom())); + rRenderContext.DrawLine(Point(aRect.Right(), aRect.Top() + nTopOff), Point(aRect.Right(), aRect.Bottom())); + } + else + { + rRenderContext.DrawLine(aRect.TopRight(), aRect.BottomRight()); + rRenderContext.DrawLine(aRect.BottomLeft(), aRect.BottomRight()); + } + } + + if (!mpTabCtrlData->maItemList.empty() && mpTabCtrlData->mpListBox == nullptr) + { + // Some native toolkits (GTK+) draw tabs right-to-left, with an + // overlap between adjacent tabs + bool bDrawTabsRTL = rRenderContext.IsNativeControlSupported(ControlType::TabItem, ControlPart::TabsDrawRtl); + ImplTabItem* pFirstTab = nullptr; + ImplTabItem* pLastTab = nullptr; + 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) && (pItem->mbEnabled)) + { + vcl::Region aClipRgn(rRenderContext.GetActiveClipRegion()); + aClipRgn.Intersect(pItem->maRect); + if (!rRect.IsEmpty()) + aClipRgn.Intersect(rRect); + if (!aClipRgn.IsEmpty()) + { + ImplDrawItem(rRenderContext, pItem, aCurRect, false/*bLayout*/, + pItem == pFirstTab, pItem == pLastTab); + } + } + + if (bDrawTabsRTL) + idx--; + else + idx++; + } + + if (pCurItem) + { + vcl::Region aClipRgn(rRenderContext.GetActiveClipRegion()); + aClipRgn.Intersect(pCurItem->maRect); + if (!rRect.IsEmpty()) + aClipRgn.Intersect(rRect); + if (!aClipRgn.IsEmpty()) + { + ImplDrawItem(rRenderContext, pCurItem, aCurRect, + pCurItem == pFirstTab, pCurItem == pLastTab, true); + } + } + } + + if (HasFocus()) + ImplShowFocus(); + + mbSmallInvalidate = true; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits