package org.insightech.er.editor.controller.editpart.element.node;
import java.beans.PropertyChangeEvent;
import java.io.ByteArrayInputStream;
import org.apache.commons.codec.binary.Base64;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.geometry.Dimension;
import org.eclipse.gef.EditPolicy;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.insightech.er.editor.controller.command.diagram_contents.element.node.image.ChangeInsertedImagePropertyCommand;
import org.insightech.er.editor.controller.editpart.element.ERDiagramEditPart;
import org.insightech.er.editor.controller.editpolicy.element.node.NodeElementComponentEditPolicy;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.diagram_contents.element.node.image.InsertedImage;
import org.insightech.er.editor.view.dialog.element.InsertedImageDialog;
import org.insightech.er.editor.view.figure.InsertedImageFigure;
public class InsertedImageEditPart extends NodeElementEditPart implements
IResizable {
private Image image;
private ImageData imageData;
/**
* {@inheritDoc}
*/
@Override
protected IFigure createFigure() {
InsertedImage model = (InsertedImage) this.getModel();
byte[] data = Base64.decodeBase64((model.getBase64EncodedData()
.getBytes()));
ByteArrayInputStream in = new ByteArrayInputStream(data);
this.imageData = new ImageData(in);
this.changeImage();
InsertedImageFigure figure = new InsertedImageFigure(this.image, model
.isFixAspectRatio(), model.getAlpha());
figure.setMinimumSize(new Dimension(1, 1));
return figure;
}
/**
* {@inheritDoc}
*/
@Override
protected void disposeFont() {
if (this.image != null && !this.image.isDisposed()) {
this.image.dispose();
}
super.disposeFont();
}
/**
* {@inheritDoc}
*/
@Override
protected void createEditPolicies() {
this.installEditPolicy(EditPolicy.COMPONENT_ROLE,
new NodeElementComponentEditPolicy());
super.createEditPolicies();
}
@Override
public void doPropertyChange(PropertyChangeEvent event) {
if (event.getPropertyName().equals(InsertedImage.PROPERTY_CHANGE_IMAGE)) {
changeImage();
InsertedImageFigure figure = (InsertedImageFigure) this.getFigure();
InsertedImage model = (InsertedImage) this.getModel();
figure.setImg(this.image, model.isFixAspectRatio(), model
.getAlpha());
this.refreshVisuals();
if (ERDiagramEditPart.isUpdateable()) {
this.getFigure().repaint();
}
}
super.doPropertyChange(event);
}
private void changeImage() {
InsertedImage model = (InsertedImage) this.getModel();
ImageData newImageData = new ImageData(this.imageData.width,
this.imageData.height, this.imageData.depth,
this.imageData.palette);
for (int x = 0; x < this.imageData.width; x++) {
for (int y = 0; y < this.imageData.height; y++) {
RGB rgb = this.imageData.palette.getRGB(this.imageData
.getPixel(x, y));
float[] hsb = rgb.getHSB();
if (model.getHue() != 0) {
hsb[0] = model.getHue() & 360;
}
hsb[1] = hsb[1] + (model.getSaturation() / 100f);
if (hsb[1] > 1.0f) {
hsb[1] = 1.0f;
} else if (hsb[1] < 0) {
hsb[1] = 0f;
}
hsb[2] = hsb[2] + (model.getBrightness() / 100f);
if (hsb[2] > 1.0f) {
hsb[2] = 1.0f;
} else if (hsb[2] < 0) {
hsb[2] = 0f;
}
RGB newRGB = new RGB(hsb[0], hsb[1], hsb[2]);
int pixel = imageData.palette.getPixel(newRGB);
newImageData.setPixel(x, y, pixel);
}
}
if (this.image != null && !this.image.isDisposed()) {
this.image.dispose();
}
this.image = new Image(Display.getDefault(), newImageData);
}
/**
* {@inheritDoc}
*/
@Override
public void performRequestOpen() {
InsertedImage insertedImage = (InsertedImage) this.getModel();
InsertedImage oldInsertedImage = (InsertedImage) insertedImage.clone();
ERDiagram diagram = this.getDiagram();
InsertedImageDialog dialog = new InsertedImageDialog(PlatformUI
.getWorkbench().getActiveWorkbenchWindow().getShell(),
insertedImage);
if (dialog.open() == IDialogConstants.OK_ID) {
ChangeInsertedImagePropertyCommand command = new ChangeInsertedImagePropertyCommand(
diagram, insertedImage, dialog.getNewInsertedImage(),
oldInsertedImage);
this.executeCommand(command);
} else {
ChangeInsertedImagePropertyCommand command = new ChangeInsertedImagePropertyCommand(
diagram, insertedImage, oldInsertedImage, oldInsertedImage);
command.execute();
}
}
}