1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sc.hxx"
26
27 #include <vcl/outdev.hxx>
28 #include <vcl/window.hxx>
29 #include <vcl/decoview.hxx>
30 #include <vcl/svapp.hxx>
31 #include "cbutton.hxx"
32
33 //========================================================================
34 // class ScDDComboBoxButton
35 //========================================================================
36
ScDDComboBoxButton(OutputDevice * pOutputDevice)37 ScDDComboBoxButton::ScDDComboBoxButton( OutputDevice* pOutputDevice )
38 : pOut( pOutputDevice )
39 {
40 SetOptSizePixel();
41 }
42
43 // -------------------------------------------------------------------------
44
~ScDDComboBoxButton()45 __EXPORT ScDDComboBoxButton::~ScDDComboBoxButton()
46 {
47 }
48
49 // -------------------------------------------------------------------------
50
SetOutputDevice(OutputDevice * pOutputDevice)51 void ScDDComboBoxButton::SetOutputDevice( OutputDevice* pOutputDevice )
52 {
53 pOut = pOutputDevice;
54 }
55
56 // -------------------------------------------------------------------------
57
SetOptSizePixel()58 void ScDDComboBoxButton::SetOptSizePixel()
59 {
60 aBtnSize = pOut->LogicToPixel( Size(0,11), MAP_APPFONT );
61 //aBtnSize.Width() = GetSystemMetrics( SM_CXVSCROLL ) - 1; // Win SDK-Funktion
62 aBtnSize.Width() = pOut->GetSettings().GetStyleSettings().GetScrollBarSize();
63 }
64
65 // -------------------------------------------------------------------------
66
Draw(const Point & rAt,const Size & rSize,sal_Bool bState,sal_Bool bBtnIn)67 void ScDDComboBoxButton::Draw( const Point& rAt,
68 const Size& rSize,
69 sal_Bool bState,
70 sal_Bool bBtnIn /* = sal_False */ )
71 {
72 if ( rSize.Width() == 0 || rSize.Height() == 0 )
73 return; // #i43092# rectangle with size 0 would have RECT_EMPTY as end position
74
75 // save old state
76 sal_Bool bHadFill = pOut->IsFillColor();
77 Color aOldFill = pOut->GetFillColor();
78 sal_Bool bHadLine = pOut->IsLineColor();
79 Color aOldLine = pOut->GetLineColor();
80 sal_Bool bOldEnable = pOut->IsMapModeEnabled();
81
82 Size aLogPix( 1, 1 );
83 Rectangle aBtnRect( rAt, rSize );
84 Rectangle aInnerRect = aBtnRect;
85
86 pOut->EnableMapMode( sal_False );
87
88 DecorationView aDecoView( pOut);
89
90 sal_uInt16 nButtonStyle = BUTTON_DRAW_DEFAULT;
91 if( bBtnIn ) // gedrueckt?
92 {
93 nButtonStyle = BUTTON_DRAW_PRESSED;
94 }
95
96 aInnerRect=aDecoView.DrawButton( aBtnRect, nButtonStyle );
97
98
99 aInnerRect.Left() += 1;
100 aInnerRect.Top() += 1;
101 aInnerRect.Right() -= 1;
102 aInnerRect.Bottom() -= 1;
103
104 Size aInnerSize = aInnerRect.GetSize();
105 Point aInnerCenter = aInnerRect.Center();
106
107 aInnerRect.Top() = aInnerCenter.Y() - (aInnerSize.Width()>>1);
108 aInnerRect.Bottom()= aInnerCenter.Y() + (aInnerSize.Width()>>1);
109
110 ImpDrawArrow( aInnerRect, bState );
111
112
113 // restore old state
114 pOut->EnableMapMode( bOldEnable );
115 if (bHadLine)
116 pOut->SetLineColor(aOldLine);
117 else
118 pOut->SetLineColor();
119 if (bHadFill)
120 pOut->SetFillColor(aOldFill);
121 else
122 pOut->SetFillColor();
123 }
124
125 //------------------------------------------------------------------------
126
ImpDrawArrow(const Rectangle & rRect,sal_Bool bState)127 void ScDDComboBoxButton::ImpDrawArrow( const Rectangle& rRect,
128 sal_Bool bState )
129 {
130 // no need to save old line and fill color here (is restored after the call)
131
132 Rectangle aPixRect = rRect;
133 Point aCenter = aPixRect.Center();
134 Size aSize = aPixRect.GetSize();
135
136 Size aSize3;
137 aSize3.Width() = aSize.Width() >> 1;
138 aSize3.Height() = aSize.Height() >> 1;
139
140 Size aSize4;
141 aSize4.Width() = aSize.Width() >> 2;
142 aSize4.Height() = aSize.Height() >> 2;
143
144 Rectangle aTempRect = aPixRect;
145
146 const StyleSettings& rSett = Application::GetSettings().GetStyleSettings();
147 Color aColor( bState ? COL_LIGHTBLUE : rSett.GetButtonTextColor().GetColor() );
148 pOut->SetFillColor( aColor );
149 pOut->SetLineColor( aColor );
150
151 aTempRect.Left() = aCenter.X() - aSize4.Width();
152 aTempRect.Right() = aCenter.X() + aSize4.Width();
153 aTempRect.Top() = aCenter.Y() - aSize3.Height();
154 aTempRect.Bottom() = aCenter.Y() - 1;
155
156 pOut->DrawRect( aTempRect );
157
158 Point aPos1( aCenter.X()-aSize3.Width(), aCenter.Y() );
159 Point aPos2( aCenter.X()+aSize3.Width(), aCenter.Y() );
160 while( aPos1.X() <= aPos2.X() )
161 {
162 pOut->DrawLine( aPos1, aPos2 );
163 aPos1.X()++; aPos2.X()--;
164 aPos1.Y()++; aPos2.Y()++;
165 }
166
167 pOut->DrawLine( Point( aCenter.X() - aSize3.Width(), aPos1.Y()+1 ),
168 Point( aCenter.X() + aSize3.Width(), aPos1.Y()+1 ) );
169 }
170
171
172
173
174
175