1765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/*******************************************************************************
2765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Copyright (c) 2011 Google, Inc.
3765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * All rights reserved. This program and the accompanying materials
4765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * are made available under the terms of the Eclipse Public License v1.0
5765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * which accompanies this distribution, and is available at
6765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * http://www.eclipse.org/legal/epl-v10.html
7765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
8765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Contributors:
9765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *    Google, Inc. - initial API and implementation
10765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *******************************************************************************/
11765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepackage org.eclipse.wb.core.controls;
12765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
13765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.draw2d.IColorConstants;
14765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.wb.internal.core.utils.ui.DrawUtils;
15765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
16765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.SWT;
17765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.PaintEvent;
18765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.events.PaintListener;
19765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Color;
20765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.GC;
21765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Image;
22765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.graphics.Rectangle;
23765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Canvas;
24765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Composite;
25765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Event;
26765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyeimport org.eclipse.swt.widgets.Listener;
27765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
28765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye/**
29765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * Class representing flat push button as it looks in Mac OSX.
30765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
31765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * It doesn't draw text, not need for now. ;-)
32765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye *
33765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye * @author mitin_aa
34765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye */
35765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbyepublic final class CFlatButton extends Canvas {
36765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // colors
37765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final Color COLOR_FACE = DrawUtils.getShiftedColor(IColorConstants.button, 12);
38765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final Color COLOR_FACE_SELECTED = IColorConstants.buttonDarker;
39765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final Color COLOR_BORDER_GRADIENT1 = DrawUtils.getShiftedColor(
40765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      IColorConstants.button,
41765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      -12);
42765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final Color COLOR_BORDER_GRADIENT1_SELECTED = DrawUtils.getShiftedColor(
43765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      IColorConstants.buttonDarker,
44765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      64);
45765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final Color COLOR_BORDER_GRADIENT2 = DrawUtils.getShiftedColor(COLOR_FACE, -8);
46765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private static final Color COLOR_BORDER_GRADIENT2_SELECTED = DrawUtils.getShiftedColor(
47765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      COLOR_FACE_SELECTED,
48765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      -8);
49765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // fields
50765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private Image m_image;
51765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private boolean m_down;
52765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private boolean m_selected;
53765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
54765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
55765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
56765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Constructor
57765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
58765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
59765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public CFlatButton(Composite parent, int style) {
60765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    super(parent, style);
61765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    addPaintListener(new PaintListener() {
62765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      public void paintControl(PaintEvent e) {
63765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        boolean isSelected = m_down | m_selected;
64765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Color faceColor = isSelected ? COLOR_FACE_SELECTED : COLOR_FACE;
65765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Color borderGradientColor1 =
66765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            isSelected ? COLOR_BORDER_GRADIENT1_SELECTED : COLOR_BORDER_GRADIENT1;
67765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Color borderGradientColor2 =
68765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye            isSelected ? COLOR_BORDER_GRADIENT2_SELECTED : COLOR_BORDER_GRADIENT2;
69765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        GC gc = e.gc;
70765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Rectangle ca = getClientArea();
71765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // draw client area
72765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // dark border
73765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setForeground(IColorConstants.buttonDarker);
74765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.drawRectangle(ca.x, ca.y, ca.width - 1, ca.height - 1);
75765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        cropClientArea(ca);
76765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // gradient border
77765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setForeground(borderGradientColor1);
78765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setBackground(borderGradientColor2);
79765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.fillGradientRectangle(ca.x, ca.y, ca.width, ca.height, true);
80765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        cropClientArea(ca);
81765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // fill background
82765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setBackground(faceColor);
83765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.fillRectangle(ca);
84765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // draw face upper-half gradient
85765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Rectangle ca1 = getClientArea();
86765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        cropClientArea(ca1);
87765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setForeground(faceColor);
88765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setBackground(borderGradientColor1);
89765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.fillGradientRectangle(ca1.x, ca1.y, ca1.width, ca1.height / 4, true);
90765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // draw face down-half gradient
91765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        ca1.x += 1;
92765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        ca1.width -= 2;
93765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setForeground(borderGradientColor1);
94765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.setBackground(faceColor);
95765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        gc.fillGradientRectangle(ca1.x, ca1.y + ca1.height / 4 - 1, ca1.width, ca1.height / 2, true);
96765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        // draw image
97765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        Image image = getImage();
98765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        if (image != null) {
99765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          Rectangle imageBounds = image.getBounds();
100765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          // center it in client area
101765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          int x = ca.x + (ca.width - imageBounds.width) / 2;
102765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          int y = ca.y + (ca.height - imageBounds.height) / 2;
103765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          gc.drawImage(image, x, y);
104765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
105765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
106765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    });
107765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    addListener(SWT.MouseDown, new Listener() {
108765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      public void handleEvent(Event e) {
109765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        m_down = true;
110765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        redraw();
111765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
112765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    });
113765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    addListener(SWT.MouseUp, new Listener() {
114765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      public void handleEvent(Event e) {
115765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        m_down = false;
116765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        redraw();
117765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        update();
118765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        if (getClientArea().contains(e.x, e.y)) {
119765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye          fireSelectionEvent(e.time, e.stateMask);
120765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye        }
121765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye      }
122765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    });
123765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
124765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
125765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
126765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
127765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Utils
128765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
129765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
130765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private void fireSelectionEvent(int time, int stateMask) {
131765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    Event event = new Event();
132765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    event.time = time;
133765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    event.stateMask = stateMask;
134765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    notifyListeners(SWT.Selection, event);
135765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
136765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
137765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  private void cropClientArea(Rectangle ca) {
138765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    ca.x += 1;
139765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    ca.y += 1;
140765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    ca.width -= 2;
141765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    ca.height -= 2;
142765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
143765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
144765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
145765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
146765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  // Access
147765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  //
148765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  ////////////////////////////////////////////////////////////////////////////
149765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public final Image getImage() {
150765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    return m_image;
151765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
152765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
153765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void setImage(Image image) {
154765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_image = image;
155765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
156765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye
157765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  public void setSelected(boolean selected) {
158765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye    m_selected = selected;
159765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye  }
160765e52e2d30d0754625b8c7af6c36e93612f15beTor Norbye}
161