package com.kartoflane.superluminal2.ui;
import java.util.ArrayList;
import java.util.Collections;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.events.MouseListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeItem;
import com.kartoflane.superluminal2.Superluminal;
import com.kartoflane.superluminal2.components.enums.Systems;
import com.kartoflane.superluminal2.core.Database;
import com.kartoflane.superluminal2.ftl.GlowSet;
import com.kartoflane.superluminal2.ftl.GlowSet.Glows;
import com.kartoflane.superluminal2.ftl.SystemObject;
import com.kartoflane.superluminal2.mvc.views.Preview;
import com.kartoflane.superluminal2.utils.UIUtils;
import com.kartoflane.superluminal2.utils.Utils.AlphanumComparator;
public class GlowSelectionDialog {
private static GlowSelectionDialog instance = null;
private GlowSet result = null;
private Preview preview = null;
private SystemObject selectedSystem = null;
private Shell shell;
private Tree tree;
private Button btnCancel;
private Button btnConfirm;
private Button btnNew;
private Canvas canvas;
public GlowSelectionDialog(Shell parent) {
if (instance != null)
throw new IllegalStateException("Previous instance has not been disposed!");
instance = this;
shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
shell.setText(Superluminal.APP_NAME + " - Glow Set Selection");
shell.setLayout(new GridLayout(3, false));
tree = new Tree(shell, SWT.BORDER | SWT.FULL_SELECTION);
tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2));
Label lblPreview = new Label(shell, SWT.NONE);
lblPreview.setText("Preview:");
canvas = new Canvas(shell, SWT.NONE);
canvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
preview = new Preview();
RGB rgb = canvas.getBackground().getRGB();
preview.setBackgroundColor((int) (0.9 * rgb.red), (int) (0.9 * rgb.green), (int) (0.9 * rgb.blue));
preview.setDrawBackground(true);
canvas.addPaintListener(preview);
Composite compButtons = new Composite(shell, SWT.NONE);
GridLayout gl_compButtons = new GridLayout(3, false);
gl_compButtons.marginHeight = 0;
gl_compButtons.marginWidth = 0;
compButtons.setLayout(gl_compButtons);
compButtons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 3, 1));
btnNew = new Button(compButtons, SWT.NONE);
btnNew.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1));
btnNew.setText("Add New Set");
btnConfirm = new Button(compButtons, SWT.NONE);
GridData gd_btnConfirm = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_btnConfirm.widthHint = 80;
btnConfirm.setLayoutData(gd_btnConfirm);
btnConfirm.setText("Confirm");
btnCancel = new Button(compButtons, SWT.NONE);
GridData gd_btnCancel = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gd_btnCancel.widthHint = 80;
btnCancel.setLayoutData(gd_btnCancel);
btnCancel.setText("Cancel");
tree.addMouseListener(new MouseListener() {
@Override
public void mouseDoubleClick(MouseEvent e) {
if (e.button == 1 && tree.getSelectionCount() != 0) {
TreeItem selectedItem = tree.getSelection()[0];
if (selectedItem.getItemCount() == 0 && btnConfirm.isEnabled())
btnConfirm.notifyListeners(SWT.Selection, null);
else if (selectedItem.getBounds().contains(e.x, e.y))
selectedItem.setExpanded(!selectedItem.getExpanded());
}
}
@Override
public void mouseDown(MouseEvent e) {
}
@Override
public void mouseUp(MouseEvent e) {
}
});
tree.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
if (tree.getSelectionCount() != 0) {
TreeItem selectedItem = tree.getSelection()[0];
result = (GlowSet) selectedItem.getData();
btnConfirm.setEnabled(result != null);
updateData();
} else {
btnConfirm.setEnabled(false);
result = null;
updateData();
}
}
});
btnCancel.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
result = null;
dispose();
}
});
btnConfirm.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
dispose();
}
});
btnNew.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent e) {
GlowSetDialog dialog = new GlowSetDialog(shell);
GlowSet newGlow = dialog.open();
if (newGlow != null) {
Database.getInstance().getCore().store(newGlow);
TreeItem currentItem = updateTree(selectedSystem);
result = selectedSystem.getGlow().getGlowSet();
updateData();
if (currentItem != null)
tree.setSelection(currentItem);
}
}
});
shell.addListener(SWT.Close, new Listener() {
@Override
public void handleEvent(Event e) {
btnCancel.notifyListeners(SWT.Selection, null);
e.doit = false;
}
});
shell.addTraverseListener(new TraverseListener() {
@Override
public void keyTraversed(TraverseEvent e) {
if (e.detail == SWT.TRAVERSE_RETURN && tree.getSelectionCount() != 0) {
TreeItem selectedItem = tree.getSelection()[0];
if (selectedItem.getItemCount() == 0 && btnConfirm.isEnabled())
btnConfirm.notifyListeners(SWT.Selection, null);
else
selectedItem.setExpanded(!selectedItem.getExpanded());
}
}
});
shell.pack();
shell.setMinimumSize(shell.getSize());
shell.setSize(400, 300);
}
public static GlowSelectionDialog getInstance() {
return instance;
}
public GlowSet open(SystemObject system) {
selectedSystem = system;
TreeItem currentItem = updateTree(system);
shell.open();
result = system.getGlow().getGlowSet();
updateData();
if (currentItem != null)
tree.setSelection(currentItem);
Display display = UIUtils.getDisplay();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
return result;
}
public void dispose() {
preview.dispose();
shell.dispose();
instance = null;
}
public boolean isActive() {
return !shell.isDisposed() && shell.isVisible();
}
private TreeItem updateTree(SystemObject system) {
TreeItem currentItem = null;
for (TreeItem trtm : tree.getItems())
trtm.dispose();
ArrayList<String> glowSetNames = new ArrayList<String>();
for (GlowSet gs : Database.getInstance().getGlowSets())
glowSetNames.add(gs.getNamespace());
Collections.sort(glowSetNames, new AlphanumComparator());
for (String namespace : glowSetNames) {
GlowSet glowSet = Database.getInstance().getGlowSet(namespace);
// Only create widgets for cloaking glows if Cloaking system is selected
boolean cloak = glowSet.getImage(Glows.CLOAK) != null;
if ((system.getSystemId() == Systems.CLOAKING) != cloak)
continue;
TreeItem trtm = new TreeItem(tree, SWT.NONE);
trtm.setText(glowSet.getIdentifier());
trtm.setData(glowSet);
if (glowSet.compareTo(system.getGlow().getGlowSet()) == 0)
currentItem = trtm;
}
return currentItem;
}
private void updateData() {
String path = null;
if (result != null) {
path = result.getImage(Glows.CLOAK);
if (path == null)
path = result.getImage(Glows.BLUE);
}
preview.setImage(path);
preview.setLocation(canvas.getSize().x / 2, canvas.getSize().y / 2);
canvas.redraw();
}
}