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