xref: /trunk/main/sc/source/ui/cctrl/cbuttonw.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sc.hxx"
30 
31 #include <vcl/outdev.hxx>
32 #include <vcl/window.hxx>
33 #include <vcl/decoview.hxx>
34 #include <vcl/svapp.hxx>
35 #include "cbutton.hxx"
36 
37 //========================================================================
38 //  class ScDDComboBoxButton
39 //========================================================================
40 
41 ScDDComboBoxButton::ScDDComboBoxButton( OutputDevice* pOutputDevice )
42     :   pOut( pOutputDevice )
43 {
44     SetOptSizePixel();
45 }
46 
47 // -------------------------------------------------------------------------
48 
49 __EXPORT ScDDComboBoxButton::~ScDDComboBoxButton()
50 {
51 }
52 
53 // -------------------------------------------------------------------------
54 
55 void ScDDComboBoxButton::SetOutputDevice( OutputDevice* pOutputDevice )
56 {
57     pOut = pOutputDevice;
58 }
59 
60 // -------------------------------------------------------------------------
61 
62 void ScDDComboBoxButton::SetOptSizePixel()
63 {
64     aBtnSize = pOut->LogicToPixel( Size(0,11), MAP_APPFONT );
65     //aBtnSize.Width() = GetSystemMetrics( SM_CXVSCROLL ) - 1; // Win SDK-Funktion
66     aBtnSize.Width() = pOut->GetSettings().GetStyleSettings().GetScrollBarSize();
67 }
68 
69 // -------------------------------------------------------------------------
70 
71 void ScDDComboBoxButton::Draw( const Point& rAt,
72                                const Size&  rSize,
73                                sal_Bool         bState,
74                                sal_Bool         bBtnIn  /* = sal_False */ )
75 {
76     if ( rSize.Width() == 0 || rSize.Height() == 0 )
77         return;     // #i43092# rectangle with size 0 would have RECT_EMPTY as end position
78 
79     // save old state
80     sal_Bool        bHadFill   = pOut->IsFillColor();
81     Color       aOldFill   = pOut->GetFillColor();
82     sal_Bool        bHadLine   = pOut->IsLineColor();
83     Color       aOldLine   = pOut->GetLineColor();
84     sal_Bool        bOldEnable = pOut->IsMapModeEnabled();
85 
86     Size        aLogPix( 1, 1 );
87     Rectangle   aBtnRect( rAt, rSize );
88     Rectangle   aInnerRect = aBtnRect;
89 
90     pOut->EnableMapMode( sal_False );
91 
92     DecorationView aDecoView( pOut);
93 
94     sal_uInt16 nButtonStyle = BUTTON_DRAW_DEFAULT;
95     if( bBtnIn )    // gedrueckt?
96     {
97         nButtonStyle = BUTTON_DRAW_PRESSED;
98     }
99 
100     aInnerRect=aDecoView.DrawButton( aBtnRect, nButtonStyle );
101 
102 
103     aInnerRect.Left()   += 1;
104     aInnerRect.Top()    += 1;
105     aInnerRect.Right()  -= 1;
106     aInnerRect.Bottom() -= 1;
107 
108     Size  aInnerSize   = aInnerRect.GetSize();
109     Point aInnerCenter = aInnerRect.Center();
110 
111     aInnerRect.Top()   = aInnerCenter.Y() - (aInnerSize.Width()>>1);
112     aInnerRect.Bottom()= aInnerCenter.Y() + (aInnerSize.Width()>>1);
113 
114     ImpDrawArrow( aInnerRect, bState );
115 
116 
117     // restore old state
118     pOut->EnableMapMode( bOldEnable );
119     if (bHadLine)
120         pOut->SetLineColor(aOldLine);
121     else
122         pOut->SetLineColor();
123     if (bHadFill)
124         pOut->SetFillColor(aOldFill);
125     else
126         pOut->SetFillColor();
127 }
128 
129 //------------------------------------------------------------------------
130 
131 void ScDDComboBoxButton::ImpDrawArrow( const Rectangle& rRect,
132                                        sal_Bool             bState )
133 {
134     // no need to save old line and fill color here (is restored after the call)
135 
136     Rectangle   aPixRect = rRect;
137     Point       aCenter  = aPixRect.Center();
138     Size        aSize    = aPixRect.GetSize();
139 
140     Size aSize3;
141     aSize3.Width() = aSize.Width() >> 1;
142     aSize3.Height() = aSize.Height() >> 1;
143 
144     Size aSize4;
145     aSize4.Width() = aSize.Width() >> 2;
146     aSize4.Height() = aSize.Height() >> 2;
147 
148     Rectangle aTempRect = aPixRect;
149 
150     const StyleSettings& rSett = Application::GetSettings().GetStyleSettings();
151     Color aColor( bState ? COL_LIGHTBLUE : rSett.GetButtonTextColor().GetColor() );
152     pOut->SetFillColor( aColor );
153     pOut->SetLineColor( aColor );
154 
155     aTempRect.Left()   = aCenter.X() - aSize4.Width();
156     aTempRect.Right()  = aCenter.X() + aSize4.Width();
157     aTempRect.Top()    = aCenter.Y() - aSize3.Height();
158     aTempRect.Bottom() = aCenter.Y() - 1;
159 
160     pOut->DrawRect( aTempRect );
161 
162     Point aPos1( aCenter.X()-aSize3.Width(), aCenter.Y() );
163     Point aPos2( aCenter.X()+aSize3.Width(), aCenter.Y() );
164     while( aPos1.X() <= aPos2.X() )
165     {
166         pOut->DrawLine( aPos1, aPos2 );
167         aPos1.X()++; aPos2.X()--;
168         aPos1.Y()++; aPos2.Y()++;
169     }
170 
171     pOut->DrawLine( Point( aCenter.X() - aSize3.Width(), aPos1.Y()+1 ),
172                     Point( aCenter.X() + aSize3.Width(), aPos1.Y()+1 ) );
173 }
174 
175 
176 
177 
178 
179