• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*******************************************************************************
2  * Copyright (c) 2011 Google, Inc.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *    Google, Inc. - initial API and implementation
10  *******************************************************************************/
11 package org.eclipse.wb.core.controls;
12 
13 import org.eclipse.wb.draw2d.IColorConstants;
14 import org.eclipse.wb.internal.core.utils.ui.DrawUtils;
15 
16 import org.eclipse.swt.SWT;
17 import org.eclipse.swt.events.PaintEvent;
18 import org.eclipse.swt.events.PaintListener;
19 import org.eclipse.swt.graphics.Color;
20 import org.eclipse.swt.graphics.GC;
21 import org.eclipse.swt.graphics.Image;
22 import org.eclipse.swt.graphics.Rectangle;
23 import org.eclipse.swt.widgets.Canvas;
24 import org.eclipse.swt.widgets.Composite;
25 import org.eclipse.swt.widgets.Event;
26 import org.eclipse.swt.widgets.Listener;
27 
28 /**
29  * Class representing flat push button as it looks in Mac OSX.
30  *
31  * It doesn't draw text, not need for now. ;-)
32  *
33  * @author mitin_aa
34  */
35 public final class CFlatButton extends Canvas {
36   // colors
37   private static final Color COLOR_FACE = DrawUtils.getShiftedColor(IColorConstants.button, 12);
38   private static final Color COLOR_FACE_SELECTED = IColorConstants.buttonDarker;
39   private static final Color COLOR_BORDER_GRADIENT1 = DrawUtils.getShiftedColor(
40       IColorConstants.button,
41       -12);
42   private static final Color COLOR_BORDER_GRADIENT1_SELECTED = DrawUtils.getShiftedColor(
43       IColorConstants.buttonDarker,
44       64);
45   private static final Color COLOR_BORDER_GRADIENT2 = DrawUtils.getShiftedColor(COLOR_FACE, -8);
46   private static final Color COLOR_BORDER_GRADIENT2_SELECTED = DrawUtils.getShiftedColor(
47       COLOR_FACE_SELECTED,
48       -8);
49   // fields
50   private Image m_image;
51   private boolean m_down;
52   private boolean m_selected;
53 
54   ////////////////////////////////////////////////////////////////////////////
55   //
56   // Constructor
57   //
58   ////////////////////////////////////////////////////////////////////////////
CFlatButton(Composite parent, int style)59   public CFlatButton(Composite parent, int style) {
60     super(parent, style);
61     addPaintListener(new PaintListener() {
62       public void paintControl(PaintEvent e) {
63         boolean isSelected = m_down | m_selected;
64         Color faceColor = isSelected ? COLOR_FACE_SELECTED : COLOR_FACE;
65         Color borderGradientColor1 =
66             isSelected ? COLOR_BORDER_GRADIENT1_SELECTED : COLOR_BORDER_GRADIENT1;
67         Color borderGradientColor2 =
68             isSelected ? COLOR_BORDER_GRADIENT2_SELECTED : COLOR_BORDER_GRADIENT2;
69         GC gc = e.gc;
70         Rectangle ca = getClientArea();
71         // draw client area
72         // dark border
73         gc.setForeground(IColorConstants.buttonDarker);
74         gc.drawRectangle(ca.x, ca.y, ca.width - 1, ca.height - 1);
75         cropClientArea(ca);
76         // gradient border
77         gc.setForeground(borderGradientColor1);
78         gc.setBackground(borderGradientColor2);
79         gc.fillGradientRectangle(ca.x, ca.y, ca.width, ca.height, true);
80         cropClientArea(ca);
81         // fill background
82         gc.setBackground(faceColor);
83         gc.fillRectangle(ca);
84         // draw face upper-half gradient
85         Rectangle ca1 = getClientArea();
86         cropClientArea(ca1);
87         gc.setForeground(faceColor);
88         gc.setBackground(borderGradientColor1);
89         gc.fillGradientRectangle(ca1.x, ca1.y, ca1.width, ca1.height / 4, true);
90         // draw face down-half gradient
91         ca1.x += 1;
92         ca1.width -= 2;
93         gc.setForeground(borderGradientColor1);
94         gc.setBackground(faceColor);
95         gc.fillGradientRectangle(ca1.x, ca1.y + ca1.height / 4 - 1, ca1.width, ca1.height / 2, true);
96         // draw image
97         Image image = getImage();
98         if (image != null) {
99           Rectangle imageBounds = image.getBounds();
100           // center it in client area
101           int x = ca.x + (ca.width - imageBounds.width) / 2;
102           int y = ca.y + (ca.height - imageBounds.height) / 2;
103           gc.drawImage(image, x, y);
104         }
105       }
106     });
107     addListener(SWT.MouseDown, new Listener() {
108       public void handleEvent(Event e) {
109         m_down = true;
110         redraw();
111       }
112     });
113     addListener(SWT.MouseUp, new Listener() {
114       public void handleEvent(Event e) {
115         m_down = false;
116         redraw();
117         update();
118         if (getClientArea().contains(e.x, e.y)) {
119           fireSelectionEvent(e.time, e.stateMask);
120         }
121       }
122     });
123   }
124 
125   ////////////////////////////////////////////////////////////////////////////
126   //
127   // Utils
128   //
129   ////////////////////////////////////////////////////////////////////////////
fireSelectionEvent(int time, int stateMask)130   private void fireSelectionEvent(int time, int stateMask) {
131     Event event = new Event();
132     event.time = time;
133     event.stateMask = stateMask;
134     notifyListeners(SWT.Selection, event);
135   }
136 
cropClientArea(Rectangle ca)137   private void cropClientArea(Rectangle ca) {
138     ca.x += 1;
139     ca.y += 1;
140     ca.width -= 2;
141     ca.height -= 2;
142   }
143 
144   ////////////////////////////////////////////////////////////////////////////
145   //
146   // Access
147   //
148   ////////////////////////////////////////////////////////////////////////////
getImage()149   public final Image getImage() {
150     return m_image;
151   }
152 
setImage(Image image)153   public void setImage(Image image) {
154     m_image = image;
155   }
156 
setSelected(boolean selected)157   public void setSelected(boolean selected) {
158     m_selected = selected;
159   }
160 }
161