Home | History | Annotate | Download | only in controls
      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   ////////////////////////////////////////////////////////////////////////////
     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   ////////////////////////////////////////////////////////////////////////////
    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 
    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   ////////////////////////////////////////////////////////////////////////////
    149   public final Image getImage() {
    150     return m_image;
    151   }
    152 
    153   public void setImage(Image image) {
    154     m_image = image;
    155   }
    156 
    157   public void setSelected(boolean selected) {
    158     m_selected = selected;
    159   }
    160 }
    161