diff options
Diffstat (limited to 'sd/source/ui/toolpanel/TitleBar.cxx')
-rwxr-xr-x | sd/source/ui/toolpanel/TitleBar.cxx | 585 |
1 files changed, 585 insertions, 0 deletions
diff --git a/sd/source/ui/toolpanel/TitleBar.cxx b/sd/source/ui/toolpanel/TitleBar.cxx new file mode 100755 index 000000000000..de49b7a6abb5 --- /dev/null +++ b/sd/source/ui/toolpanel/TitleBar.cxx @@ -0,0 +1,585 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sd.hxx" + +#include "taskpane/TitleBar.hxx" + +#include "ControlContainerDescriptor.hxx" +#include "tools/IconCache.hxx" +#include "AccessibleTreeNode.hxx" +#include <vcl/decoview.hxx> +#include <vcl/window.hxx> +#include <vcl/virdev.hxx> +#include <vos/mutex.hxx> +#include <vcl/svapp.hxx> +#include "sdresid.hxx" +#include <vcl/bitmap.hxx> +#include <vcl/lineinfo.hxx> +#include <vcl/bitmapex.hxx> +#include <tools/color.hxx> +#include <svx/xdash.hxx> +#include <svl/itemset.hxx> +#include <svx/xlndsit.hxx> +#include <svx/xlineit0.hxx> +#include <svx/svdobj.hxx> +#include <svx/svdpool.hxx> +#include <svtools/colorcfg.hxx> +#include <svx/xlnclit.hxx> +#include <svx/xfillit0.hxx> +#include "res_bmp.hrc" + + +namespace sd { namespace toolpanel { + +const int TitleBar::snIndentationWidth = 16; + +TitleBar::TitleBar ( ::Window* pParent, const String& rsTitle, TitleBarType eType, bool bIsExpandable) +: ::Window (pParent, WB_TABSTOP) +, TreeNode(this) +, meType(eType) +, msTitle(rsTitle) +, mbExpanded(false) +, mbFocused(false) +, mpDevice(new VirtualDevice (*this)) +, mbIsExpandable (bIsExpandable) +{ + EnableMapMode (FALSE); + + SetBackground (Wallpaper()); + + // Change the mouse pointer shape so that it acts as a mouse over effect. + switch (meType) + { + case TBT_SUB_CONTROL_HEADLINE: + if (mbIsExpandable) + SetPointer (POINTER_REFHAND); + break; + } +} + + + + +TitleBar::~TitleBar (void) +{ +} + + + + +Size TitleBar::GetPreferredSize (void) +{ + int nWidth = GetOutputSizePixel().Width(); + Rectangle aTitleBarBox ( + CalculateTitleBarBox( + CalculateTextBoundingBox(nWidth, true), + nWidth)); + + return aTitleBarBox.GetSize(); +} + + + + +sal_Int32 TitleBar::GetPreferredWidth (sal_Int32 ) +{ + Rectangle aTitleBarBox ( + CalculateTitleBarBox( + CalculateTextBoundingBox(0, true), + 0)); + return aTitleBarBox.GetWidth(); +} + + + + +sal_Int32 TitleBar::GetPreferredHeight (sal_Int32 nWidth) +{ + Rectangle aTitleBarBox ( + CalculateTitleBarBox( + CalculateTextBoundingBox(nWidth, true), + nWidth)); + + return aTitleBarBox.GetHeight(); +} + + + + +bool TitleBar::IsResizable (void) +{ + return true; +} + + + + +::Window* TitleBar::GetWindow (void) +{ + return this; +} + + + + +sal_Int32 TitleBar::GetMinimumWidth (void) +{ + return 20; +} + + + + +void TitleBar::Paint (const Rectangle& rBoundingBox) +{ + mpDevice->SetMapMode(GetMapMode()); + mpDevice->SetOutputSize (GetOutputSizePixel()); + mpDevice->SetSettings(GetSettings()); + mpDevice->SetDrawMode(GetDrawMode()); + + switch (meType) + { + case TBT_SUB_CONTROL_HEADLINE: + PaintSubPanelHeadLineBar (); + break; + } + + DrawOutDev ( + Point(0,0), + GetOutputSizePixel(), + Point(0,0), + GetOutputSizePixel(), + *mpDevice); + + ::Window::Paint (rBoundingBox); +} + + + + +bool TitleBar::Expand (bool bFlag) +{ + bool bExpansionStateChanged (bFlag!=IsExpanded()); + mbExpanded = bFlag; + Invalidate (); + return bExpansionStateChanged; +} + + + + +bool TitleBar::IsExpanded (void) const +{ + return mbExpanded; +} + + +void TitleBar::SetEnabledState(bool bFlag) +{ + if(bFlag) + Enable(); + else + Disable(); + Invalidate (); +} + + + + +void TitleBar::GetFocus() +{ + mbFocused = true; + Invalidate(); +} + + + + +void TitleBar::LoseFocus() +{ + mbFocused = false; + Invalidate(); +} + + + + +bool TitleBar::HasExpansionIndicator (void) const +{ + bool bHasExpansionIndicator (false); + if (mbIsExpandable) + { + switch (meType) + { + case TBT_SUB_CONTROL_HEADLINE: + bHasExpansionIndicator = true; + break; + } + } + return bHasExpansionIndicator; +} + + + + +Image TitleBar::GetExpansionIndicator (void) const +{ + Image aIndicator; + bool bHighContrastMode (GetSettings().GetStyleSettings().GetHighContrastMode() != 0); + if (mbIsExpandable) + { + USHORT nResourceId = 0; + switch (meType) + { + case TBT_SUB_CONTROL_HEADLINE: + if (mbExpanded) + if (bHighContrastMode) + nResourceId = BMP_COLLAPSE_H; + else + nResourceId = BMP_COLLAPSE; + else + if (bHighContrastMode) + nResourceId = BMP_EXPAND_H; + else + nResourceId = BMP_EXPAND; + + aIndicator = IconCache::Instance().GetIcon(nResourceId); + break; + } + } + + return aIndicator; +} + + + + +void TitleBar::PaintSubPanelHeadLineBar (void) +{ + int nWidth (GetOutputSizePixel().Width()); + Rectangle aTextBox (CalculateTextBoundingBox (nWidth, true)); + + Rectangle aTitleBarBox (CalculateTitleBarBox(aTextBox, nWidth)); + int nVerticalOffset = -aTitleBarBox.Top(); + aTitleBarBox.Top() += nVerticalOffset; + aTitleBarBox.Bottom() += nVerticalOffset; + aTextBox.Top() += nVerticalOffset; + aTextBox.Bottom() += nVerticalOffset; + + PaintBackground (aTitleBarBox); + Rectangle aFocusBox (PaintExpansionIndicator (aTextBox)); + PaintText (aTextBox); + + aFocusBox.Union (aTextBox); + aFocusBox.Left() -= 2; + aFocusBox.Right() += 1; + PaintFocusIndicator (aFocusBox); +} + + + + +void TitleBar::PaintFocusIndicator (const Rectangle& rTextBox) +{ + if (mbFocused) + { + Rectangle aTextPixelBox (mpDevice->LogicToPixel (rTextBox)); + mpDevice->EnableMapMode (FALSE); + Rectangle aBox (rTextBox); + aBox.Top() -= 1; + aBox.Bottom() += 1; + + mpDevice->SetFillColor (); + + mpDevice->DrawRect (aTextPixelBox); + + LineInfo aDottedStyle (LINE_DASH); + aDottedStyle.SetDashCount (0); + aDottedStyle.SetDotCount (1); + aDottedStyle.SetDotLen (1); + aDottedStyle.SetDistance (1); + + mpDevice->SetLineColor (COL_BLACK); + mpDevice->DrawPolyLine (Polygon(aTextPixelBox), aDottedStyle); + mpDevice->EnableMapMode (FALSE); + } + else + HideFocus (); +} + + + + +Rectangle TitleBar::PaintExpansionIndicator (const Rectangle& rTextBox) +{ + Rectangle aExpansionIndicatorArea; + + if (HasExpansionIndicator()) + { + Image aImage = GetExpansionIndicator(); + int nHeight (aImage.GetSizePixel().Height()); + if (nHeight > 0) + { + Point aPosition ( + 0, + rTextBox.Top() + (GetTextHeight() - nHeight) / 2); + if (meType == TBT_SUB_CONTROL_HEADLINE) + aPosition.X() += 3; + mpDevice->DrawImage (aPosition, aImage); + + aExpansionIndicatorArea = Rectangle ( + aPosition, aImage.GetSizePixel()); + } + } + + return aExpansionIndicatorArea; +} + + + + +void TitleBar::PaintText (const Rectangle& rTextBox) +{ + mpDevice->DrawText (rTextBox, msTitle, GetTextStyle()); +} + + + + +USHORT TitleBar::GetTextStyle (void) +{ + if(IsEnabled()) + { + return TEXT_DRAW_LEFT + | TEXT_DRAW_TOP + | TEXT_DRAW_MULTILINE + | TEXT_DRAW_WORDBREAK; + } + else + { + return TEXT_DRAW_DISABLE; + } +} + + + +void TitleBar::PaintBackground (const Rectangle& rTitleBarBox) +{ + // Fill a slightly rounded rectangle. + Color aFillColor (GetFillColor()); + Color aLineColor (GetLineColor()); + + switch (meType) + { + case TBT_SUB_CONTROL_HEADLINE: + { + Color aColor (GetSettings().GetStyleSettings().GetDialogColor()); + if (mbExpanded) + { + // Make the color a little bit darker. + aColor.SetRed(UINT8(((UINT16)aColor.GetRed()) * 8 / 10)); + aColor.SetGreen(UINT8(((UINT16)aColor.GetGreen()) * 8 / 10)); + aColor.SetBlue(UINT8(((UINT16)aColor.GetBlue()) * 8 / 10)); + } + + mpDevice->SetFillColor (aColor); + mpDevice->SetLineColor (); + mpDevice->DrawRect (rTitleBarBox); + + // Erase the four corner pixels to make the rectangle appear + // rounded. + mpDevice->SetLineColor ( + GetSettings().GetStyleSettings().GetWindowColor()); + mpDevice->DrawPixel ( + rTitleBarBox.TopLeft()); + mpDevice->DrawPixel ( + Point(rTitleBarBox.Right(), rTitleBarBox.Top())); + mpDevice->DrawPixel ( + Point(rTitleBarBox.Left(), rTitleBarBox.Bottom())); + mpDevice->DrawPixel ( + Point(rTitleBarBox.Right(), rTitleBarBox.Bottom())); + } + break; + } +} + + + + +Rectangle TitleBar::CalculateTextBoundingBox ( + int nAvailableWidth, + bool bEmphasizeExpanded) +{ + // Show the title of expanded controls in bold font. + const Font& rOriginalFont (GetFont()); + Font aFont (rOriginalFont); + if (bEmphasizeExpanded && mbExpanded) + aFont.SetWeight (WEIGHT_BOLD); + else + aFont.SetWeight (WEIGHT_NORMAL); + mpDevice->SetFont (aFont); + + // Use the natural width of the text when no width is given. + if (nAvailableWidth == 0) + nAvailableWidth = GetTextWidth (msTitle); + + Rectangle aTextBox ( + Point(0,0), + Size (nAvailableWidth, + GetSettings().GetStyleSettings().GetTitleHeight())); + aTextBox.Top() += (aTextBox.GetHeight() - GetTextHeight()) / 2; + if (HasExpansionIndicator()) + aTextBox.Left() += snIndentationWidth; + else + aTextBox.Left() += 3; + aTextBox.Right() -= 1; + + aTextBox = mpDevice->GetTextRect (aTextBox, msTitle, GetTextStyle()); + + return aTextBox; +} + + + + +Rectangle TitleBar::CalculateTitleBarBox ( + const Rectangle& rTextBox, + int nWidth) +{ + Rectangle aTitleBarBox (rTextBox); + + switch (meType) + { + case TBT_SUB_CONTROL_HEADLINE: + aTitleBarBox.Top() -= 3; + aTitleBarBox.Bottom() += 3; + break; + + } + aTitleBarBox.Left() = 0; + if (aTitleBarBox.GetWidth() < nWidth) + aTitleBarBox.Right() = nWidth-1; + + return aTitleBarBox; +} + + + + +void TitleBar::MouseMove (const MouseEvent& ) +{ +} + + + + +void TitleBar::MouseButtonDown (const MouseEvent& ) +{ + // Do not forward to parent window so that the mouse button handler of + // the docking window is not invoked. +} + + + + +void TitleBar::MouseButtonUp (const MouseEvent& ) +{ + // Do not forward to parent window so that the mouse button handler of + // the docking window is not invoked. +} + + + + +void TitleBar::DataChanged (const DataChangedEvent& rEvent) +{ + ::Window::DataChanged (rEvent); + + switch (rEvent.GetType()) + { + case DATACHANGED_SETTINGS: + if ((rEvent.GetFlags() & SETTINGS_STYLE) == 0) + break; + SetSettings(Application::GetSettings()); + mpDevice.reset(new VirtualDevice (*this)); + + // fall through. + + case DATACHANGED_FONTS: + case DATACHANGED_FONTSUBSTITUTION: + { + const StyleSettings& rStyleSettings (GetSettings().GetStyleSettings()); + + // Font. + Font aFont = rStyleSettings.GetAppFont(); + if (IsControlFont()) + aFont.Merge(GetControlFont()); + SetZoomedPointFont(aFont); + + // Color. + Color aColor; + if (IsControlForeground()) + aColor = GetControlForeground(); + else + aColor = rStyleSettings.GetButtonTextColor(); + SetTextColor(aColor); + SetTextFillColor(); + + Resize(); + Invalidate(); + } + break; + } +} + + + + +String TitleBar::GetTitle (void) const +{ + return msTitle; +} + + + + +::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible > TitleBar::CreateAccessibleObject ( + const ::com::sun::star::uno::Reference< + ::com::sun::star::accessibility::XAccessible>& ) +{ + return new ::accessibility::AccessibleTreeNode( + *this, + GetTitle(), + GetTitle(), + ::com::sun::star::accessibility::AccessibleRole::LABEL); +} + + +} } // end of namespace ::sd::toolpanel |