blob: f28f479353662b335bba59c4a658b8cfa5e74d65 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010 Hiroyuki Inaba and others.
* 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:
* Hiroyuki Inaba - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.commons.ui;
import java.lang.reflect.Method;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.Clipboard;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.FontDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.swt.widgets.Widget;
/**
* @author Hiroyuki Inaba
*/
public class SelectToolAction extends Action implements IMenuCreator {
public static final int CAPTURE_DROP_DOWN_MENU = 1;
public static final int ZOOM_DROP_DOWN_MENU = 2;
public static final int DRAWLINE_TOOLBAR = 3;
public static final int DRAWARROW_TOOLBAR = 4;
public static final int DRAWBOX_TOOLBAR = 5;
public static final int DRAWTEXT_TOOLBAR = 6;
public static final int LINETYPE_TOOLBAR = 7;
public static final int LINEBOLD_TOOLBAR = 8;
public static final int COLOR_TOOLBAR = 9;
public SelectToolAction(Composite parent, int tool) {
this(parent, "", tool); //$NON-NLS-1$
}
public SelectToolAction(String label, int tool) {
this(null, label, tool);
}
public SelectToolAction(Composite parent, String label, int tool) {
super(label, AS_DROP_DOWN_MENU);
setMenuCreator(this);
showMenuAlways = true;
this.parent = parent;
setToolAction(tool);
}
private void setToolAction(int tool) {
if (tool == CAPTURE_DROP_DOWN_MENU) {
selectedItemID = CAPTURE_DESKTOP;
initMenu(
tool,
new ToolActionItem[] {
new ToolActionItem(CAPTURE_DESKTOP, Messages.SelectToolAction_Desktop,
ScreenshotImages.MONITOR_OBJ), //
new ToolActionItem(CAPTURE_CLIPBOARD, Messages.SelectToolAction_Clipboard,
ScreenshotImages.CLIPBOARD_OBJ), //
new ToolActionItem(CAPTURE_FILE, Messages.SelectToolAction_File, ScreenshotImages.FILE_OBJ),
new ToolActionItem(CAPTURE_RECTANGLE, Messages.SelectToolAction_Selected_Rectangle,
ScreenshotImages.SEL_RECT) });
return;
}
if (tool == ZOOM_DROP_DOWN_MENU) {
selectedItemID = ZOOM_FIT;
initMenu(tool, new ToolActionItem[] { new ToolActionItem(ZOOM_FIT, Messages.SelectToolAction_Fit, null),
new ToolActionItem(50, Messages.SelectToolAction_ZoomHalf, null),
new ToolActionItem(100, Messages.SelectToolAction_Zoom1X, null),
new ToolActionItem(200, Messages.SelectToolAction_Zoom2X, null),
new ToolActionItem(400, Messages.SelectToolAction_Zoom4X, null),
new ToolActionItem(800, Messages.SelectToolAction_Zoom8X, null) });
return;
}
if (tool == LINETYPE_TOOLBAR) {
selectedItemID = SWT.LINE_SOLID;
initBar(tool,
new ToolActionItem[] {
new ToolActionItem(SWT.LINE_SOLID, Messages.SelectToolAction_Solid_Line,
ScreenshotImages.LINE_SOLD),
new ToolActionItem(SWT.LINE_DOT, Messages.SelectToolAction_Dotted_Line,
ScreenshotImages.LINE_DOT),
new ToolActionItem(SWT.LINE_DASH, Messages.SelectToolAction_Dashed_Line,
ScreenshotImages.LINE_DASH),
new ToolActionItem(SWT.LINE_DASHDOT, Messages.SelectToolAction_Dashed_Line_1_dot,
ScreenshotImages.LINE_DASH1D),
new ToolActionItem(SWT.LINE_DASHDOTDOT, Messages.SelectToolAction_Dashed_Line_2_dots,
ScreenshotImages.LINE_DASH2D) });
return;
}
if (tool == DRAWLINE_TOOLBAR) {
showSelection = true;
selectedItemID = DRAW_FREE;
initBar(tool, new ToolActionItem[] {
new ToolActionItem(DRAW_FREE, Messages.SelectToolAction_Free, ScreenshotImages.EDIT_FREE),
new ToolActionItem(DRAW_LINE, Messages.SelectToolAction_Line, ScreenshotImages.EDIT_LINE) });
return;
}
if (tool == DRAWARROW_TOOLBAR) {
showSelection = true;
selectedItemID = DRAW_ARROW1;
initBar(tool, new ToolActionItem[] {
new ToolActionItem(DRAW_ARROW1, Messages.SelectToolAction_Single_Side_Arrow,
ScreenshotImages.EDIT_ARROW1),
new ToolActionItem(DRAW_ARROW2, Messages.SelectToolAction_Both_Side_Arrow,
ScreenshotImages.EDIT_ARROW2) });
selectedItemID = -1;
return;
}
if (tool == DRAWBOX_TOOLBAR) {
showSelection = true;
selectedItemID = DRAW_RBOX;
initBar(
tool,
new ToolActionItem[] {
new ToolActionItem(DRAW_BOX, Messages.SelectToolAction_Rectangle, ScreenshotImages.EDIT_BOX),
new ToolActionItem(DRAW_RBOX, Messages.SelectToolAction_Round_Rectangle,
ScreenshotImages.EDIT_RBOX),
new ToolActionItem(DRAW_OVAL, Messages.SelectToolAction_Oval, ScreenshotImages.EDIT_OVAL),
new ToolActionItem(DRAW_FILL_BOX, Messages.SelectToolAction_Fill_Rectangle,
ScreenshotImages.EDIT_FILL_BOX),
new ToolActionItem(DRAW_FILL_RBOX, Messages.SelectToolAction_Fill_Round_Rectangle,
ScreenshotImages.EDIT_FILL_RBOX),
new ToolActionItem(DRAW_FILL_OVAL, Messages.SelectToolAction_Fill_Oval,
ScreenshotImages.EDIT_FILL_OVAL) });
selectedItemID = -1;
return;
}
if (tool == DRAWTEXT_TOOLBAR) {
showSelection = true;
selectedItemID = DRAW_TEXT;
// Bug:266123 Set initial font as HEADER_FONT
FontData fontData = JFaceResources.getFont(JFaceResources.HEADER_FONT).getFontData()[0];
stringCustom = fontData.toString();
intgerCustom = rgb2int(255, 0, 0);
selectedItemID = intgerCustom;
initFont(tool);
selectedItemID = -1;
return;
}
if (tool == LINEBOLD_TOOLBAR) {
selectedItemID = 4;
initBar(tool, new ToolActionItem[] {
new ToolActionItem(1, Messages.SelectToolAction_1dot, ScreenshotImages.LINE_BOLD1),
new ToolActionItem(2, Messages.SelectToolAction_2dots, ScreenshotImages.LINE_BOLD2),
new ToolActionItem(4, Messages.SelectToolAction_4dots, ScreenshotImages.LINE_BOLD4),
new ToolActionItem(8, Messages.SelectToolAction_8dots, ScreenshotImages.LINE_BOLD8) });
return;
}
if (tool == COLOR_TOOLBAR) {
intgerCustom = rgb2int(255, 85, 85);
selectedItemID = intgerCustom;
initColor(tool);
return;
}
}
private void initBar(int tool, ToolActionItem[] items) {
this.items = items;
setId(tool + ""); //$NON-NLS-1$
toolButton = new ToolComposite(parent, SWT.CASCADE) {
@Override
public void clickBody() {
selectAndRun(getToolTipText(), null);
}
@Override
public void clickMenu(int x, int y) {
dropDownMenu = new Menu(parent.getShell(), SWT.POP_UP);
addActionsToMenu();
Point p = parent.toDisplay(x, y);
dropDownMenu.setLocation(p.x, p.y);
dropDownMenu.setVisible(true);
dropDownMenu = null;
}
@Override
public boolean isSelect() {
return (selectedItemID >= 0);
}
};
if (items != null) {
for (ToolActionItem actionItem : items) {
if (actionItem.id == selectedItemID) {
toolButton.setImage(actionItem.image.createImage());
toolButton.setToolTipText(actionItem.label);
}
}
}
}
private void initFont(int tool) {
this.items = null;
setId(tool + ""); //$NON-NLS-1$
toolButton = new ToolComposite(parent, SWT.CASCADE) {
@Override
public void clickBody() {
selectedItemID = DRAW_TEXT;
if (toolButton != null) {
FontData fontData = new FontData(stringCustom);
toolButton.setImage(createFontImage(fontData, int2rgb(intgerCustom), true));
toolButton.redraw();
}
run();
}
@Override
public void clickMenu(int x, int y) {
if (Platform.getWS().equalsIgnoreCase(Platform.WS_WIN32)
|| Platform.getWS().equalsIgnoreCase(Platform.WS_WPF)) {
invokeFontDialog();
} else {
Menu rightClickMenu = new Menu(parent.getShell(), SWT.POP_UP);
MenuItem menuItem = new MenuItem(rightClickMenu, SWT.PUSH);
menuItem.setText(Messages.SelectToolAction_Font_);
menuItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(final Event event) {
invokeFontDialog();
}
});
menuItem = new MenuItem(rightClickMenu, SWT.PUSH);
menuItem.setText(Messages.SelectToolAction_Color_);
menuItem.addListener(SWT.Selection, new Listener() {
public void handleEvent(final Event event) {
invokeColorDialog();
}
});
Point p = parent.toDisplay(x, y);
rightClickMenu.setLocation(p.x, p.y);
rightClickMenu.setVisible(true);
}
}
@Override
public boolean isSelect() {
return (selectedItemID >= 0);
}
public void invokeFontDialog() {
FontData fontData = new FontData(stringCustom);
FontDialog fontWindow = new FontDialog(parent.getShell());
fontWindow.setFontList(new FontData[] { fontData });
fontWindow.setRGB(int2rgb(intgerCustom));
fontData = fontWindow.open();
if (fontData != null) {
intgerCustom = rgb2int(fontWindow.getRGB());
stringCustom = fontData.toString();
toolButton.setToolTipText(font2string(fontData));
clickBody();
}
}
public void invokeColorDialog() {
ColorDialog colorWindow = new ColorDialog(parent.getShell());
colorWindow.setRGB(int2rgb(intgerCustom));
RGB rgb = colorWindow.open();
if (rgb != null) {
intgerCustom = rgb2int(rgb);
clickBody();
}
}
};
FontData fontData = new FontData(stringCustom);
toolButton.setToolTipText(font2string(fontData));
toolButton.setImage(createFontImage(fontData, int2rgb(intgerCustom), false));
}
private void initColor(int tool) {
this.items = null;
setId(tool + ""); //$NON-NLS-1$
toolButton = new ToolComposite(parent, SWT.NONE) {
@Override
public void clickMenu(int x, int y) {
ColorDialog colorWindow = new ColorDialog(parent.getShell());
colorWindow.setRGB(int2rgb(intgerCustom));
RGB rgb = colorWindow.open();
if (rgb != null) {
intgerCustom = rgb2int(rgb);
selectedItemID = intgerCustom;
toolButton.setImage(createColorImage(int2rgb(intgerCustom)));
toolButton.redraw();
}
}
};
toolButton.setToolTipText(""); //$NON-NLS-1$
toolButton.setImage(createColorImage(int2rgb(intgerCustom)));
}
private Image createColorImage(RGB rgb) {
Display display = parent.getDisplay();
Color BACKGROUND = display.getSystemColor(SWT.COLOR_WIDGET_BACKGROUND);
Color DARK_GRAY = display.getSystemColor(SWT.COLOR_DARK_GRAY);
int x = 16, y = 16;
Image image = new Image(display, x, y);
GC gc = new GC(image);
gc.setForeground(DARK_GRAY);
gc.setBackground(BACKGROUND);
gc.fillRectangle(0, 0, x, y);
gc.setBackground(new Color(display, rgb));
gc.fillRectangle(1, 2, x - 2, y - 4);
gc.drawRectangle(1, 2, x - 3, y - 5);
gc.dispose();
return image;
}
private Image createFontImage(FontData fontData, RGB rgb, boolean select) {
Display display = parent.getDisplay();
Color ButtonFace = display.getSystemColor((select) ? SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW
: SWT.COLOR_WIDGET_BACKGROUND);
int x = 16, y = 16;
Image image = new Image(display, x, y);
GC gc = new GC(image);
gc.setBackground(ButtonFace);
gc.fillRectangle(0, 0, x, y);
String label = "A"; //$NON-NLS-1$
gc.setFont(new Font(display, new FontData(fontData.getName(), 11, fontData.getStyle())));
gc.setForeground(new Color(display, rgb));
Point sz = gc.textExtent(label);
gc.drawText(label, (x - sz.x) / 2, (y - sz.y) / 2 + 1, true);
gc.dispose();
return image;
}
private void initMenu(int tool, ToolActionItem[] items) {
this.items = items;
setId(tool + ""); //$NON-NLS-1$
if (items != null) {
setImageDescriptor(items[0].image);
setToolTipText(items[0].label);
selectedItemID = items[0].id;
}
}
private class ToolActionItem {
int id;
String label;
ImageDescriptor image;
ToolActionItem(int id, String label, ImageDescriptor image) {
this.id = id;
this.label = label;
this.image = image;
}
}
private class ToolComposite extends Composite {
private Image image;
private final boolean bMenu;
private boolean bMouse;
private static final int S = 1; // Border for Selected rectangle
private static final int B = 2; // Border for Shadow rectangle
private static final int G = 3; // Gap
private static final int M = 4; // Image width for Sub menu
private final Point iconSize = new Point(S + B + 16 + B + S, S + B + 16 + B + S);
private final Point maxSize = new Point(iconSize.x + G + M + G, iconSize.y);
public ToolComposite(Composite parent, int style) {
super(parent, style);
bMenu = (style & SWT.CASCADE) != 0;
addListener(SWT.Paint, new Listener() {
public void handleEvent(Event e) {
Color background = e.gc.getBackground();
Color foreground = e.gc.getForeground();
Display display = e.widget.getDisplay();
Color NORMAL_SHADOW = display.getSystemColor(SWT.COLOR_WIDGET_NORMAL_SHADOW);
boolean enabled = getEnabled();
if (bMouse && enabled) {
e.gc.setForeground(NORMAL_SHADOW);
if (bMenu) {
e.gc.drawRectangle(0, 0, maxSize.x - 1, maxSize.y - 1);
e.gc.drawLine(iconSize.x, 0, iconSize.x, maxSize.y);
} else {
e.gc.drawRectangle(0, 0, iconSize.x - 1, iconSize.y - 1);
}
}
if (showSelection && isSelect() && enabled) {
Color HIGHLIGHT_SHADOW = display.getSystemColor(SWT.COLOR_WIDGET_HIGHLIGHT_SHADOW);
Color LIGHT_SHADOW = display.getSystemColor(SWT.COLOR_WIDGET_LIGHT_SHADOW);
Color SELECTION = display.getSystemColor(SWT.COLOR_LIST_SELECTION);
e.gc.setBackground(HIGHLIGHT_SHADOW);
e.gc.fillRectangle(0, 0, iconSize.x, iconSize.y);
e.gc.setForeground(NORMAL_SHADOW);
e.gc.drawLine(S, S, iconSize.x - S - 1, S);
e.gc.drawLine(S + 1, S + 1, iconSize.x - S - 2, S + 1);
e.gc.drawLine(S, S, S, iconSize.y - S - 1);
e.gc.drawLine(S + 1, S + 1, S + 1, iconSize.y - S - 2);
e.gc.setForeground(HIGHLIGHT_SHADOW);
e.gc.drawLine(iconSize.x - S - 1, S + 1, iconSize.x - S - 1, iconSize.y - S - 1);
e.gc.drawLine(S, iconSize.y - S - 1, iconSize.x - S - 1, iconSize.y - S - 1);
e.gc.setForeground(LIGHT_SHADOW);
e.gc.drawLine(iconSize.x - S - 2, S + 2, iconSize.x - S - 2, iconSize.y - S - 2);
e.gc.drawLine(S + 1, iconSize.x - S - 2, iconSize.x - S - 2, iconSize.y - S - 2);
e.gc.setForeground(SELECTION);
e.gc.drawRectangle(0, 0, iconSize.x - 1, iconSize.y - 1);
}
if (getEnabled()) {
e.gc.drawImage(image, S + B, S + B);
} else {
Image disabled = new Image(display, image, SWT.IMAGE_DISABLE);
e.gc.drawImage(disabled, S + B, S + B);
}
if (bMenu) {
if (Platform.getWS().equalsIgnoreCase(Platform.WS_WIN32)
|| Platform.getWS().equalsIgnoreCase(Platform.WS_WPF)) {
Color FOREGROUND = display.getSystemColor((getEnabled()) ? SWT.COLOR_WIDGET_FOREGROUND
: SWT.COLOR_WIDGET_DARK_SHADOW);
e.gc.setForeground(FOREGROUND);
int x = iconSize.x + G;
int y = S + B + M;
int h = 6;
while (h >= 0) {
e.gc.drawLine(x, y, x, y + h);
x++;
y++;
h -= 2;
}
} else {
Color FOREGROUND = display.getSystemColor((getEnabled()) ? SWT.COLOR_WIDGET_DARK_SHADOW
: SWT.COLOR_WIDGET_NORMAL_SHADOW);
e.gc.setForeground(FOREGROUND);
int x = iconSize.x + G;
int y = S + B + M;
int h = 4;
e.gc.drawLine(x, y, x + h / 2 + 1, y + h / 2 + 1);
e.gc.drawLine(x, y + 1, x + h / 2, y + h / 2 + 1);
e.gc.drawLine(x, y + h + 1, x + h / 2, y + h / 2 + 1);
e.gc.drawLine(x, y + h + 2, x + h / 2, y + h / 2 + 2);
}
}
e.gc.setBackground(background);
e.gc.setForeground(foreground);
//System.out.println(e.toString());
}
});
addMouseListener(new MouseAdapter() {
@Override
public void mouseDown(MouseEvent e) {
if (e.x < iconSize.x && e.y < iconSize.y) {
if (showSelection) {
clickBody();
return;
} else {
invokeMenu((Composite) e.widget);
}
} else {
invokeMenu((Composite) e.widget);
}
}
private void invokeMenu(Composite widget) {
Rectangle b = widget.getBounds();
Point p = widget.getLocation();
p.x += b.width + 3;
bMouse = false;
redraw();
clickMenu(p.x, p.y);
}
});
addListener(SWT.MouseEnter, new Listener() {
public void handleEvent(Event event) {
if (getEnabled()) {
bMouse = true;
redraw();
}
}
});
addListener(SWT.MouseMove, new Listener() {
public void handleEvent(Event event) {
if (getEnabled()) {
bMouse = true;
redraw();
}
}
});
addListener(SWT.MouseExit, new Listener() {
public void handleEvent(Event event) {
if (getEnabled()) {
bMouse = false;
redraw();
}
}
});
}
@Override
public Point computeSize(int wHint, int hHint, boolean changed) {
if (!getVisible()) {
return new Point(0, 0);
}
return maxSize;
}
public void setImage(Image image) {
this.image = image;
}
public void clickBody() {
}
public void clickMenu(int x, int y) {
}
public boolean isSelect() {
return false;
}
}
private ToolActionItem[] items;
private int selectedItemID;
private ToolComposite toolButton;
private Menu dropDownMenu;
private int intgerCustom;
private String stringCustom;
private boolean showMenuAlways;
public boolean isShowMenuAlways() {
return showMenuAlways;
}
public void setShowMenuAlways(boolean showMenuAlways) {
this.showMenuAlways = showMenuAlways;
}
@Override
public void runWithEvent(Event event) {
if (showMenuAlways) {
IMenuCreator mc = getMenuCreator();
if (mc != null) {
Widget item = event.widget;
ToolItem ti = (ToolItem) item;
Menu m = mc.getMenu(ti.getParent());
if (m != null) {
// position the menu below the drop down item
Rectangle itemBounds = ti.getBounds();
Point point = ti.getParent().toDisplay(itemBounds.x, itemBounds.y + itemBounds.height);
m.setLocation(point.x, point.y); // waiting for SWT
m.setVisible(true);
return; // we don't fire the action
}
}
}
super.runWithEvent(event);
}
public static final int ZOOM_FIT = 0;
public static final int DRAW_FREE = 0;
public static final int DRAW_LINE = 1;
public static final int DRAW_ARROW1 = 2;
public static final int DRAW_ARROW2 = 3;
public static final int DRAW_BOX = 10;
public static final int DRAW_RBOX = 11;
public static final int DRAW_FILL_BOX = 12;
public static final int DRAW_FILL_RBOX = 13;
public static final int DRAW_OVAL = 20;
public static final int DRAW_FILL_OVAL = 21;
public static final int DRAW_TEXT = 30;
public static final int CAPTURE_DESKTOP = 0;
public static final int CAPTURE_CLIPBOARD = 1;
public static final int CAPTURE_FILE = 2;
public static final int CAPTURE_RECTANGLE = 3;
public int getSelect() {
return selectedItemID;
}
public boolean setSelect(int select) {
if (items != null) {
for (ToolActionItem actionItem : items) {
if (select == actionItem.id) {
selectItem(actionItem.label, null);
return true;
}
}
} else {
if (getId().equals(DRAWTEXT_TOOLBAR + "")) { //$NON-NLS-1$
toolButton.clickBody();
return true;
}
}
return false;
}
public void setUnselect() {
selectedItemID = -1;
if (toolButton != null) {
if (getId().equals(DRAWTEXT_TOOLBAR + "")) { //$NON-NLS-1$
FontData fontData = new FontData(stringCustom);
toolButton.setImage(createFontImage(fontData, int2rgb(intgerCustom), false));
}
toolButton.redraw();
}
}
public int getIntgerCustom() {
return intgerCustom;
}
public String getStringCustom() {
return stringCustom;
}
protected void selectAndRun(String label, ImageDescriptor image) {
if (selectItem(label, image)) {
if (getId().equals(CAPTURE_DROP_DOWN_MENU + "")) { //$NON-NLS-1$
if (selectedItemID == CAPTURE_FILE) {
FileDialog dialog = new FileDialog(parent.getShell());
dialog.setFileName(stringCustom);
dialog.setFilterExtensions(new String[] { "*.bmp;*.jpg;*.png", "*.*" }); //$NON-NLS-1$ //$NON-NLS-2$
String result = dialog.open();
if (result != null && result.length() > 0) {
stringCustom = result;
run();
}
} else {
run();
}
selectedItemID = CAPTURE_DESKTOP;
} else {
run();
}
}
}
protected boolean selectItem(String label, ImageDescriptor image) {
for (ToolActionItem actionItem : items) {
if (actionItem.label.equals(label)) {
selectedItemID = actionItem.id;
if (getId().equals(CAPTURE_DROP_DOWN_MENU + "")) { //$NON-NLS-1$
// NONE
} else {
setToolTipText(label);
if (image != null) {
setImageDescriptor(image);
}
if (toolButton != null) {
toolButton.setToolTipText(label);
if (image != null) {
toolButton.setImage(image.createImage());
}
toolButton.redraw();
}
}
return true;
}
}
return false;
}
private void addActionsToMenu() {
for (ToolActionItem actionItem : items) {
Action action = new Action() {
@Override
public void run() {
selectAndRun(getText(), getImageDescriptor());
}
};
action.setText(actionItem.label);
if (actionItem.image != null) {
action.setImageDescriptor(actionItem.image);
}
updateAction(action, actionItem.id);
ActionContributionItem contributionItem = new ActionContributionItem(action);
contributionItem.fill(dropDownMenu, -1);
}
}
private void updateAction(Action action, int id) {
action.setChecked(id == selectedItemID);
if (getId().equals(CAPTURE_DROP_DOWN_MENU + "")) { //$NON-NLS-1$
if (id == CAPTURE_CLIPBOARD) {
action.setEnabled(existImageOnClipboard());
} else if (id == CAPTURE_RECTANGLE) {
action.setEnabled(isEnableRectangle());
}
}
}
protected boolean isEnableRectangle() {
return false;
}
public void dispose() {
if (toolButton != null) {
toolButton.dispose();
toolButton = null;
}
if (dropDownMenu != null) {
dropDownMenu.dispose();
dropDownMenu = null;
}
}
public Menu getMenu(Control parent) {
if (dropDownMenu != null) {
dropDownMenu.dispose();
}
dropDownMenu = new Menu(parent);
addActionsToMenu();
return dropDownMenu;
}
public Menu getMenu(Menu parent) {
if (dropDownMenu != null) {
dropDownMenu.dispose();
}
dropDownMenu = new Menu(parent);
addActionsToMenu();
return dropDownMenu;
}
private final Composite parent;
private boolean showSelection;
public boolean getVisible() {
if (toolButton != null) {
return toolButton.getVisible();
}
return false;
}
public void setVisible(boolean visible) {
if (toolButton != null) {
toolButton.setVisible(visible);
toolButton.redraw();
}
}
public boolean getEnabled() {
if (toolButton != null) {
return toolButton.getEnabled();
}
return false;
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (toolButton != null) {
toolButton.setEnabled(enabled);
toolButton.redraw();
}
}
public Image getFileImage() {
try {
Image image = new Image(parent.getShell().getDisplay(), stringCustom);
return image;
} catch (Exception e) {
// None
}
return null;
}
private Transfer getImageTransfer() {
try {
Class<?> clazz = Class.forName("org.eclipse.swt.dnd.ImageTransfer"); //$NON-NLS-1$
Method method = clazz.getMethod("getInstance"); //$NON-NLS-1$
if (method != null) {
return (Transfer) method.invoke(null);
}
} catch (Exception e) {
// ignore
} catch (LinkageError e) {
// ignore
}
return null;
}
public Image getClipboardImage() {
Clipboard clipboard = new Clipboard(parent.getShell().getDisplay());
Transfer imageTransfer = getImageTransfer();
if (imageTransfer != null) {
Object data = clipboard.getContents(imageTransfer);
if (data instanceof ImageData) {
Image image = new Image(parent.getShell().getDisplay(), (ImageData) data);
return image;
}
}
return null;
}
private boolean existImageOnClipboard() {
Clipboard clipboard = new Clipboard(parent.getShell().getDisplay());
Transfer imageTransfer = getImageTransfer();
if (imageTransfer != null) {
Object data = clipboard.getContents(imageTransfer);
if (data instanceof ImageData) {
return true;
}
}
return false;
}
public static int rgb2int(RGB rgb) {
return rgb2int(rgb.red, rgb.green, rgb.blue);
}
public static int rgb2int(int r, int g, int b) {
return (r << 16) + (g << 8) + b;
}
public static RGB int2rgb(int rgb) {
return new RGB(rgb >> 16, (rgb >> 8) & 0x00ff, rgb & 0x00ff);
}
private String font2string(FontData fontData) {
String info = NLS.bind(Messages.SelectToolAction_Font_Name_Size, //
new Object[] { fontData.getName(), fontData.getHeight() + "" }); //$NON-NLS-1$
int style = fontData.getStyle();
if ((style & SWT.BOLD) != 0) {
info = info + Messages.SelectToolAction_Font_Bold;
}
if ((style & SWT.ITALIC) != 0) {
info = info + Messages.SelectToolAction_Font_Italic;
}
return info;
}
}