package com.cxy.redisclient.presentation;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import sun.misc.BASE64Decoder;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.cxy.redisclient.integration.I18nFile;
import com.cxy.redisclient.presentation.component.RedisClientDialog;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSyntaxException;
public class WatchDialog extends RedisClientDialog {
private String value;
private int currentTextType = 0;
private int currentImageType = -1;
private Text text;
private Label label;
private boolean currentText = true;
public WatchDialog(Shell parent, Image image, String value) {
super(parent, image);
this.value = value;
}
@Override
protected void createContents() {
shell.setText(RedisClient.i18nFile.getText(I18nFile.DATAWATCHER));
shell.setLayout(new GridLayout(1, false));
Composite composite = new Composite(shell, SWT.NONE);
composite.setLayout(new GridLayout(1, false));
composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
Group grpValueType = new Group(composite, SWT.NONE);
grpValueType.setLayout(new GridLayout(2, false));
grpValueType.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
grpValueType.setText(RedisClient.i18nFile.getText(I18nFile.DATATYPE));
Button btnRadioButton = new Button(grpValueType, SWT.RADIO);
btnRadioButton.setSelection(true);
btnRadioButton.setText(RedisClient.i18nFile.getText(I18nFile.TEXT));
final Combo textType = new Combo(grpValueType, SWT.DROP_DOWN | SWT.READ_ONLY);
textType.setItems(new String[] { RedisClient.i18nFile.getText(I18nFile.PLAINTEXT), RedisClient.i18nFile.getText(I18nFile.JSON), RedisClient.i18nFile.getText(I18nFile.XML) });
textType.select(0);
Button btnRadioButton_1 = new Button(grpValueType, SWT.RADIO);
btnRadioButton_1.setText(RedisClient.i18nFile.getText(I18nFile.IMAGE));
final Combo imageType = new Combo(grpValueType, SWT.DROP_DOWN | SWT.READ_ONLY);
imageType.setEnabled(false);
imageType.setItems(new String[] { RedisClient.i18nFile.getText(I18nFile.BASE64IMAGE) });
final Group grpValue = new Group(composite, SWT.NONE);
grpValue.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
grpValue.setText(RedisClient.i18nFile.getText(I18nFile.DATA));
grpValue.setBounds(0, 0, 70, 81);
grpValue.setLayout(new GridLayout(1, false));
text = new Text(grpValue, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
text.setEditable(false);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
text.setText(value);
btnRadioButton.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (!currentText) {
imageType.setEnabled(false);
textType.setEnabled(true);
if (label != null && !label.isDisposed()) {
label.setVisible(false);
label.dispose();
}
text = new Text(grpValue, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL | SWT.MULTI);
text.setEditable(false);
text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
text.setText(value);
tranformText(textType, text);
currentText = true;
}
}
});
btnRadioButton_1.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (currentText) {
imageType.setEnabled(true);
textType.setEnabled(false);
if (text != null && !text.isDisposed()) {
text.setVisible(false);
text.dispose();
}
label = new Label(grpValue, SWT.NONE);
label.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
label.setAlignment(SWT.CENTER);
tranformImage(imageType, label);
currentText = false;
}
}
});
textType.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tranformText(textType, text);
currentTextType = textType.getSelectionIndex();
}
});
imageType.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
tranformImage(imageType, label);
currentImageType = imageType.getSelectionIndex();
}
});
Composite composite_1 = new Composite(shell, SWT.NONE);
composite_1.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, false, 1, 1));
composite_1.setLayout(new FillLayout(SWT.HORIZONTAL));
Button btnOk = new Button(composite_1, SWT.NONE);
btnOk.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
shell.dispose();
}
});
btnOk.setText(RedisClient.i18nFile.getText(I18nFile.OK));
super.createContents();
}
private void tranformImage(Combo imageType, Label label) {
int index = imageType.getSelectionIndex();
if (index == 0) {
BASE64Decoder decode = new BASE64Decoder();
try {
byte[] b = decode.decodeBuffer(value);
ByteArrayInputStream bais = new ByteArrayInputStream(b);
Image img = new Image(shell.getDisplay(), bais);
label.setImage(img);
} catch (SWTException e) {
imageType.select(currentImageType);
throw new RuntimeException(RedisClient.i18nFile.getText(I18nFile.IMAGEEXCEPTION));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
shell.pack();
setMiddle();
}
private void tranformText(final Combo textType, final Text text) {
int index = textType.getSelectionIndex();
if (index == 0) {
text.setText(value);
} else if (index == 1) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
try {
JsonElement je = jp.parse(value);
String prettyJsonString = gson.toJson(je);
text.setText(prettyJsonString);
} catch (JsonSyntaxException e) {
textType.select(currentTextType);
throw new RuntimeException(RedisClient.i18nFile.getText(I18nFile.JSONEXCEPTION));
}
} else if (index == 2) {
SAXReader reader = new SAXReader();
StringReader in = new StringReader(value);
Document doc;
try {
doc = reader.read(in);
OutputFormat formater = OutputFormat.createPrettyPrint();
StringWriter out = new StringWriter();
XMLWriter writer = new XMLWriter(out, formater);
writer.write(doc);
writer.close();
text.setText(out.getBuffer().toString());
} catch (DocumentException e) {
textType.select(currentTextType);
throw new RuntimeException(RedisClient.i18nFile.getText(I18nFile.XMLEXCEPTION));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
shell.pack();
setMiddle();
}
}