package org.insightech.er.editor.view.action.edit;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.gef.commands.Command;
import org.eclipse.gef.commands.CompoundCommand;
import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.ColorDialog;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.LabelRetargetAction;
import org.insightech.er.Activator;
import org.insightech.er.ImageKey;
import org.insightech.er.ResourceString;
import org.insightech.er.editor.ERDiagramEditor;
import org.insightech.er.editor.controller.command.common.ChangeBackgroundColorCommand;
import org.insightech.er.editor.controller.editpart.element.node.TableViewEditPart;
import org.insightech.er.editor.controller.editpart.element.node.column.NormalColumnEditPart;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.ERModelUtil;
import org.insightech.er.editor.model.ViewableModel;
import org.insightech.er.editor.model.diagram_contents.element.node.ermodel.ERModel;
public class ChangeBackgroundColorAction extends SelectionAction {
public static final String ID = ChangeBackgroundColorAction.class.getName();
private RGB rgb;
private Image image;
public ChangeBackgroundColorAction(IWorkbenchPart part, ERDiagram diagram) {
super(part, Action.AS_DROP_DOWN_MENU);
this.setId(ID);
this.setText(ResourceString
.getResourceString("action.title.change.background.color"));
this.setToolTipText(ResourceString
.getResourceString("action.title.change.background.color"));
int[] defaultColor = diagram.getDefaultColor();
this.rgb = new RGB(defaultColor[0], defaultColor[1], defaultColor[2]);
this.setColorToImage();
}
private void setColorToImage() {
ImageData imageData = Activator.getImageDescriptor(
ImageKey.CHANGE_BACKGROUND_COLOR).getImageData();
int blackPixel = imageData.palette.getPixel(new RGB(0, 0, 0));
imageData.transparentPixel = imageData.palette.getPixel(new RGB(255,
255, 255));
imageData.palette.colors[blackPixel] = this.rgb;
if (this.image != null) {
// this.image.dispose();
}
this.image = new Image(Display.getCurrent(), imageData);
ImageDescriptor descriptor = ImageDescriptor.createFromImage(image);
this.setImageDescriptor(descriptor);
if (this.getSelection() instanceof StructuredSelection) {
for (Object element : ((StructuredSelection) this.getSelection()).toList()) {
if (element instanceof TableViewEditPart) {
((TableViewEditPart)element).refresh();
((TableViewEditPart)element).refreshVisuals();
}
}
}
}
private void setRGB(RGB rgb) {
this.rgb = rgb;
EditPart editPart = ((ERDiagramEditor) this.getWorkbenchPart())
.getGraphicalViewer().getContents();
if (editPart.getModel() instanceof ERModel) {
// �r���[�̔w�i�F�ύX
ERModel model = (ERModel) editPart.getModel();
model.setDefaultColor(this.rgb.red, this.rgb.green, this.rgb.blue);
} else {
// �S�̃r���[�̔w�i�F�ύX
ERDiagram diagram = ERModelUtil.getDiagram(editPart);
diagram.setDefaultColor(this.rgb.red, this.rgb.green, this.rgb.blue);
}
this.setColorToImage();
}
/**
* {@inheritDoc}
*/
@Override
public void runWithEvent(Event event) {
Command command = this.createCommand(this.getSelectedObjects(), rgb);
this.getCommandStack().execute(command);
}
@SuppressWarnings("unchecked")
@Override
protected List getSelectedObjects() {
List objects = new ArrayList(super.getSelectedObjects());
for (Iterator iter = objects.iterator(); iter.hasNext();) {
if (iter.next() instanceof NormalColumnEditPart) {
iter.remove();
}
}
return objects;
}
/**
* {@inheritDoc}
*/
@Override
protected boolean calculateEnabled() {
List objects = this.getSelectedObjects();
if (objects.isEmpty()) {
return false;
}
if (!(objects.get(0) instanceof GraphicalEditPart)) {
return false;
}
return true;
}
private Command createCommand(List objects, RGB rgb) {
if (objects.isEmpty()) {
return null;
}
if (!(objects.get(0) instanceof GraphicalEditPart)) {
return null;
}
CompoundCommand command = new CompoundCommand();
for (int i = 0; i < objects.size(); i++) {
GraphicalEditPart part = (GraphicalEditPart) objects.get(i);
command.add(new ChangeBackgroundColorCommand((ViewableModel) part
.getModel(), rgb.red, rgb.green, rgb.blue));
}
return command;
}
public static class ChangeBackgroundColorRetargetAction extends
LabelRetargetAction {
public ChangeBackgroundColorRetargetAction() {
super(ID, ResourceString
.getResourceString("action.title.change.background.color"),
Action.AS_DROP_DOWN_MENU);
this.setImageDescriptor(Activator
.getImageDescriptor(ImageKey.CHANGE_BACKGROUND_COLOR));
this
.setDisabledImageDescriptor(Activator
.getImageDescriptor(ImageKey.CHANGE_BACKGROUND_COLOR_DISABLED));
this.setToolTipText(ResourceString
.getResourceString("action.title.change.background.color"));
// �T�u���j���[�̐���
setMenuCreator(new IMenuCreator() {
public Menu getMenu(Control parent) {
Menu menu = new Menu(parent);
try {
MenuItem item1 = new MenuItem(menu, SWT.NONE);
item1
.setText(ResourceString
.getResourceString("action.title.select.color"));
item1.setImage(Activator.getImage(ImageKey.PALETTE));
item1.addSelectionListener(new SelectionAdapter() {
/**
* {@inheritDoc}
*/
@Override
public void widgetSelected(SelectionEvent e) {
ColorDialog colorDialog = new ColorDialog(
PlatformUI.getWorkbench()
.getActiveWorkbenchWindow()
.getShell(), SWT.NULL);
colorDialog
.setText(ResourceString
.getResourceString("dialog.title.change.background.color"));
ChangeBackgroundColorAction action = (ChangeBackgroundColorAction) getActionHandler();
RGB rgb = colorDialog.open();
action.setRGB(rgb);
action.runWithEvent(null);
}
});
} catch (Exception e) {
Activator.showExceptionDialog(e);
}
return menu;
}
public Menu getMenu(Menu parent) {
return null;
}
public void dispose() {
}
});
}
}
@Override
public void dispose() {
image.dispose();
super.dispose();
}
}