| /******************************************************************************* |
| * Copyright (c) 2011 Google, Inc. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Google, Inc. - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.wb.core.controls; |
| |
| import org.eclipse.wb.draw2d.IColorConstants; |
| import org.eclipse.wb.internal.core.utils.ui.DrawUtils; |
| |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.events.PaintEvent; |
| import org.eclipse.swt.events.PaintListener; |
| import org.eclipse.swt.graphics.Color; |
| import org.eclipse.swt.graphics.GC; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.swt.graphics.Rectangle; |
| import org.eclipse.swt.widgets.Canvas; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.swt.widgets.Event; |
| import org.eclipse.swt.widgets.Listener; |
| |
| /** |
| * Class representing flat push button as it looks in Mac OSX. |
| * |
| * It doesn't draw text, not need for now. ;-) |
| * |
| * @author mitin_aa |
| */ |
| public final class CFlatButton extends Canvas { |
| // colors |
| private static final Color COLOR_FACE = DrawUtils.getShiftedColor(IColorConstants.button, 12); |
| private static final Color COLOR_FACE_SELECTED = IColorConstants.buttonDarker; |
| private static final Color COLOR_BORDER_GRADIENT1 = DrawUtils.getShiftedColor( |
| IColorConstants.button, |
| -12); |
| private static final Color COLOR_BORDER_GRADIENT1_SELECTED = DrawUtils.getShiftedColor( |
| IColorConstants.buttonDarker, |
| 64); |
| private static final Color COLOR_BORDER_GRADIENT2 = DrawUtils.getShiftedColor(COLOR_FACE, -8); |
| private static final Color COLOR_BORDER_GRADIENT2_SELECTED = DrawUtils.getShiftedColor( |
| COLOR_FACE_SELECTED, |
| -8); |
| // fields |
| private Image m_image; |
| private boolean m_down; |
| private boolean m_selected; |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // |
| // Constructor |
| // |
| //////////////////////////////////////////////////////////////////////////// |
| public CFlatButton(Composite parent, int style) { |
| super(parent, style); |
| addPaintListener(new PaintListener() { |
| public void paintControl(PaintEvent e) { |
| boolean isSelected = m_down | m_selected; |
| Color faceColor = isSelected ? COLOR_FACE_SELECTED : COLOR_FACE; |
| Color borderGradientColor1 = |
| isSelected ? COLOR_BORDER_GRADIENT1_SELECTED : COLOR_BORDER_GRADIENT1; |
| Color borderGradientColor2 = |
| isSelected ? COLOR_BORDER_GRADIENT2_SELECTED : COLOR_BORDER_GRADIENT2; |
| GC gc = e.gc; |
| Rectangle ca = getClientArea(); |
| // draw client area |
| // dark border |
| gc.setForeground(IColorConstants.buttonDarker); |
| gc.drawRectangle(ca.x, ca.y, ca.width - 1, ca.height - 1); |
| cropClientArea(ca); |
| // gradient border |
| gc.setForeground(borderGradientColor1); |
| gc.setBackground(borderGradientColor2); |
| gc.fillGradientRectangle(ca.x, ca.y, ca.width, ca.height, true); |
| cropClientArea(ca); |
| // fill background |
| gc.setBackground(faceColor); |
| gc.fillRectangle(ca); |
| // draw face upper-half gradient |
| Rectangle ca1 = getClientArea(); |
| cropClientArea(ca1); |
| gc.setForeground(faceColor); |
| gc.setBackground(borderGradientColor1); |
| gc.fillGradientRectangle(ca1.x, ca1.y, ca1.width, ca1.height / 4, true); |
| // draw face down-half gradient |
| ca1.x += 1; |
| ca1.width -= 2; |
| gc.setForeground(borderGradientColor1); |
| gc.setBackground(faceColor); |
| gc.fillGradientRectangle(ca1.x, ca1.y + ca1.height / 4 - 1, ca1.width, ca1.height / 2, true); |
| // draw image |
| Image image = getImage(); |
| if (image != null) { |
| Rectangle imageBounds = image.getBounds(); |
| // center it in client area |
| int x = ca.x + (ca.width - imageBounds.width) / 2; |
| int y = ca.y + (ca.height - imageBounds.height) / 2; |
| gc.drawImage(image, x, y); |
| } |
| } |
| }); |
| addListener(SWT.MouseDown, new Listener() { |
| public void handleEvent(Event e) { |
| m_down = true; |
| redraw(); |
| } |
| }); |
| addListener(SWT.MouseUp, new Listener() { |
| public void handleEvent(Event e) { |
| m_down = false; |
| redraw(); |
| update(); |
| if (getClientArea().contains(e.x, e.y)) { |
| fireSelectionEvent(e.time, e.stateMask); |
| } |
| } |
| }); |
| } |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // |
| // Utils |
| // |
| //////////////////////////////////////////////////////////////////////////// |
| private void fireSelectionEvent(int time, int stateMask) { |
| Event event = new Event(); |
| event.time = time; |
| event.stateMask = stateMask; |
| notifyListeners(SWT.Selection, event); |
| } |
| |
| private void cropClientArea(Rectangle ca) { |
| ca.x += 1; |
| ca.y += 1; |
| ca.width -= 2; |
| ca.height -= 2; |
| } |
| |
| //////////////////////////////////////////////////////////////////////////// |
| // |
| // Access |
| // |
| //////////////////////////////////////////////////////////////////////////// |
| public final Image getImage() { |
| return m_image; |
| } |
| |
| public void setImage(Image image) { |
| m_image = image; |
| } |
| |
| public void setSelected(boolean selected) { |
| m_selected = selected; |
| } |
| } |