package org.eclipse.iee.pad.image.ui;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.iee.editor.core.pad.CompositePad;
import org.eclipse.iee.pad.image.ImagePart;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Label;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.io.Files;
public class ImagePad extends CompositePad<ImagePart> {
private transient static final Logger logger = LoggerFactory
.getLogger(ImagePad.class);
public transient static final int STATE_MENU = 0;
public transient static final int STATE_IMAGE = 1;
public transient static final int STATE_ERROR = 2;
private int fCurrentState = STATE_IMAGE;
protected transient Image fOriginalImage = null;
protected transient Image fResizedImage = null;
private Label label;
private Composite fParent;
private Composite fCurrent;
private PropertyChangeListener fListener;
public ImagePad() {
fListener = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if ("imageWidth".equals(evt.getPropertyName())
|| "imageHeight".equals(evt.getPropertyName())) {
updateResizedImage();
}
}
};
}
@Override
public void createPartControl(final Composite parent) {
fParent = parent;
initView(parent);
}
protected void initView(Composite parent) {
if (fCurrent != null) {
fCurrent.dispose();
}
switch (fCurrentState) {
case STATE_MENU:
initWelcomeView();
break;
case STATE_IMAGE:
initImageView();
break;
case STATE_ERROR:
initErrorView();
break;
default:
throw new RuntimeException("ImagePad: invalid state");
}
}
protected void initWelcomeView() {
/* Clear data */
/* Initialize controls */
FillLayout layout = new FillLayout(SWT.VERTICAL);
fParent.setLayout(layout);
final Composite welcome = new Composite(fParent, SWT.NONE);
// It is hint operation now
welcome.setBackground(new Color(null, 255, 255, 255));
final Label label = new Label(welcome, SWT.WRAP | SWT.CENTER);
label.setText("This sample control is for inserting image into Eclipse editor");
label.setSize(200, 100);
final Button button = new Button(welcome, SWT.PUSH);
button.setText("Choose image");
welcome.pack();
/* State logic */
button.addMouseListener(new MouseListener() {
@Override
public void mouseUp(MouseEvent e) {
FileDialog fileDialog = new FileDialog(welcome.getShell(),
SWT.OPEN);
fileDialog.setFilterNames(new String[] { "Jpeg (*.jpg)",
"PNG (*.png)" });
fileDialog
.setFilterExtensions(new String[] { "*.jpg", "*.png" });
String imagePath = fileDialog.open();
if (imagePath == null) {
return;
}
/* Dispose current controls */
button.removeMouseListener(this);
button.dispose();
label.dispose();
setImageFile(imagePath);
}
@Override
public void mouseDoubleClick(MouseEvent arg0) {
}
@Override
public void mouseDown(MouseEvent arg0) {
}
});
fCurrent = welcome;
}
protected void initImageView() {
logger.debug("initImageView");
String imageFile = getContainer().getContainerManager().getStoragePath()
+ "image/" + getDocumentPart().getImagePath();
try(InputStream is = new FileInputStream(imageFile)) {
fOriginalImage = new Image(fParent.getDisplay(), imageFile);
if (getDocumentPart().getImageWidth() > 0 && getDocumentPart().getImageHeigth() > 0) {
fResizedImage = new Image(fParent.getDisplay(), fOriginalImage
.getImageData().scaledTo(getDocumentPart().getImageWidth(), getDocumentPart().getImageHeigth()));
} else {
fResizedImage = fOriginalImage;
}
} catch (FileNotFoundException e) {
logger.error("Image file {} is absent", imageFile);
fCurrentState = STATE_ERROR;
initView(fParent);
} catch (Exception e) {
logger.error("Failed to initialize image", e);
fCurrentState = STATE_ERROR;
initView(fParent);
}
/* Initialize controls */
FillLayout layout = new FillLayout();
fParent.setLayout(layout);
label = new Label(fParent, SWT.NONE);
label.setImage(fResizedImage);
fParent.pack();
fParent.addControlListener(new ControlListener() {
@Override
public void controlResized(ControlEvent e) {
Point size = fParent.getSize();
getDocumentPart().setImageWidth(size.x);
getDocumentPart().setImageHeigth(size.y);
getContainer().updateDocument();
}
@Override
public void controlMoved(ControlEvent e) {
}
});
}
protected void initErrorView() {
FillLayout layout = new FillLayout(SWT.VERTICAL);
fParent.setLayout(layout);
// It is hint operation now
fParent.setBackground(new Color(null, 255, 255, 255));
final Label label = new Label(fParent, SWT.WRAP | SWT.CENTER);
label.setText("Error occured");
final Button button = new Button(fParent, SWT.PUSH);
button.setText("Reload");
fParent.pack();
/* State logic */
button.addMouseListener(new MouseListener() {
@Override
public void mouseDown(MouseEvent e) {
/* Dispose controls */
button.removeMouseListener(this);
button.dispose();
label.dispose();
/* Switch to welcome state */
fCurrentState = STATE_MENU;
initView(fParent);
}
@Override
public void mouseDoubleClick(MouseEvent arg0) {
}
@Override
public void mouseUp(MouseEvent arg0) {
}
});
}
@Override
public void save() {
}
@Override
public void activate() {
// TODO Auto-generated method stub
}
@Override
public String getType() {
return "Image";
}
public void setImageFile(String imagePath) {
File storageDirectory = new File(getContainer().getContainerManager()
.getStoragePath() + "image/");
if (!storageDirectory.exists()) {
if (!storageDirectory.mkdirs()) {
return;
}
}
File imageSrc = new File(imagePath);
File imageDst = new File(getContainer().getContainerManager()
.getStoragePath() + "image/" + imageSrc.getName());
if (!imageDst.exists()) {
try {
Files.copy(imageSrc, imageDst);
} catch (IOException e1) {
}
}
getDocumentPart().setImagePath(imageSrc.getName());
switchToImage();
}
private void switchToImage() {
/* Switch to image presentation state */
fCurrentState = STATE_IMAGE;
initView(fParent);
}
@Override
public String getTex() {
return "\\includegraphics{"
+ getContainer().getContainerManager().getStoragePath()
+ "image/" + getDocumentPart().getImagePath() + "}";
}
private void updateResizedImage() {
int imageWidth = getDocumentPart().getImageWidth();
int imageHeigth = getDocumentPart().getImageHeigth();
fResizedImage = new Image(fParent.getDisplay(), fOriginalImage
.getImageData().scaledTo(imageWidth, imageHeigth));
label.setImage(fResizedImage);
fParent.pack();
fParent.redraw();
}
@Override
public void dispose() {
getDocumentPart().removePropertyChangeListener(fListener);
}
@Override
protected void doBindValue(ImagePart value) {
value.addPropertyChangeListener(fListener);
}
@Override
protected void doUnbindValue(ImagePart oldValue) {
oldValue.removePropertyChangeListener(fListener);
}
}