| /************************************************************** |
| * |
| * 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 |
| * |
| * 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_sc.hxx" |
| |
| #include <vcl/outdev.hxx> |
| #include <vcl/window.hxx> |
| #include <vcl/decoview.hxx> |
| #include <vcl/svapp.hxx> |
| #include "cbutton.hxx" |
| |
| //======================================================================== |
| // class ScDDComboBoxButton |
| //======================================================================== |
| |
| ScDDComboBoxButton::ScDDComboBoxButton( OutputDevice* pOutputDevice ) |
| : pOut( pOutputDevice ) |
| { |
| SetOptSizePixel(); |
| } |
| |
| // ------------------------------------------------------------------------- |
| |
| __EXPORT ScDDComboBoxButton::~ScDDComboBoxButton() |
| { |
| } |
| |
| // ------------------------------------------------------------------------- |
| |
| void ScDDComboBoxButton::SetOutputDevice( OutputDevice* pOutputDevice ) |
| { |
| pOut = pOutputDevice; |
| } |
| |
| // ------------------------------------------------------------------------- |
| |
| void ScDDComboBoxButton::SetOptSizePixel() |
| { |
| aBtnSize = pOut->LogicToPixel( Size(0,11), MAP_APPFONT ); |
| //aBtnSize.Width() = GetSystemMetrics( SM_CXVSCROLL ) - 1; // Win SDK-Funktion |
| aBtnSize.Width() = pOut->GetSettings().GetStyleSettings().GetScrollBarSize(); |
| } |
| |
| // ------------------------------------------------------------------------- |
| |
| void ScDDComboBoxButton::Draw( const Point& rAt, |
| const Size& rSize, |
| sal_Bool bState, |
| sal_Bool bBtnIn /* = sal_False */ ) |
| { |
| if ( rSize.Width() == 0 || rSize.Height() == 0 ) |
| return; // #i43092# rectangle with size 0 would have RECT_EMPTY as end position |
| |
| // save old state |
| sal_Bool bHadFill = pOut->IsFillColor(); |
| Color aOldFill = pOut->GetFillColor(); |
| sal_Bool bHadLine = pOut->IsLineColor(); |
| Color aOldLine = pOut->GetLineColor(); |
| sal_Bool bOldEnable = pOut->IsMapModeEnabled(); |
| |
| Size aLogPix( 1, 1 ); |
| Rectangle aBtnRect( rAt, rSize ); |
| Rectangle aInnerRect = aBtnRect; |
| |
| pOut->EnableMapMode( sal_False ); |
| |
| DecorationView aDecoView( pOut); |
| |
| sal_uInt16 nButtonStyle = BUTTON_DRAW_DEFAULT; |
| if( bBtnIn ) // gedrueckt? |
| { |
| nButtonStyle = BUTTON_DRAW_PRESSED; |
| } |
| |
| aInnerRect=aDecoView.DrawButton( aBtnRect, nButtonStyle ); |
| |
| |
| aInnerRect.Left() += 1; |
| aInnerRect.Top() += 1; |
| aInnerRect.Right() -= 1; |
| aInnerRect.Bottom() -= 1; |
| |
| Size aInnerSize = aInnerRect.GetSize(); |
| Point aInnerCenter = aInnerRect.Center(); |
| |
| aInnerRect.Top() = aInnerCenter.Y() - (aInnerSize.Width()>>1); |
| aInnerRect.Bottom()= aInnerCenter.Y() + (aInnerSize.Width()>>1); |
| |
| ImpDrawArrow( aInnerRect, bState ); |
| |
| |
| // restore old state |
| pOut->EnableMapMode( bOldEnable ); |
| if (bHadLine) |
| pOut->SetLineColor(aOldLine); |
| else |
| pOut->SetLineColor(); |
| if (bHadFill) |
| pOut->SetFillColor(aOldFill); |
| else |
| pOut->SetFillColor(); |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| void ScDDComboBoxButton::ImpDrawArrow( const Rectangle& rRect, |
| sal_Bool bState ) |
| { |
| // no need to save old line and fill color here (is restored after the call) |
| |
| Rectangle aPixRect = rRect; |
| Point aCenter = aPixRect.Center(); |
| Size aSize = aPixRect.GetSize(); |
| |
| Size aSize3; |
| aSize3.Width() = aSize.Width() >> 1; |
| aSize3.Height() = aSize.Height() >> 1; |
| |
| Size aSize4; |
| aSize4.Width() = aSize.Width() >> 2; |
| aSize4.Height() = aSize.Height() >> 2; |
| |
| Rectangle aTempRect = aPixRect; |
| |
| const StyleSettings& rSett = Application::GetSettings().GetStyleSettings(); |
| Color aColor( bState ? COL_LIGHTBLUE : rSett.GetButtonTextColor().GetColor() ); |
| pOut->SetFillColor( aColor ); |
| pOut->SetLineColor( aColor ); |
| |
| aTempRect.Left() = aCenter.X() - aSize4.Width(); |
| aTempRect.Right() = aCenter.X() + aSize4.Width(); |
| aTempRect.Top() = aCenter.Y() - aSize3.Height(); |
| aTempRect.Bottom() = aCenter.Y() - 1; |
| |
| pOut->DrawRect( aTempRect ); |
| |
| Point aPos1( aCenter.X()-aSize3.Width(), aCenter.Y() ); |
| Point aPos2( aCenter.X()+aSize3.Width(), aCenter.Y() ); |
| while( aPos1.X() <= aPos2.X() ) |
| { |
| pOut->DrawLine( aPos1, aPos2 ); |
| aPos1.X()++; aPos2.X()--; |
| aPos1.Y()++; aPos2.Y()++; |
| } |
| |
| pOut->DrawLine( Point( aCenter.X() - aSize3.Width(), aPos1.Y()+1 ), |
| Point( aCenter.X() + aSize3.Width(), aPos1.Y()+1 ) ); |
| } |
| |
| |
| |
| |
| |