/*
Copyright (c) 2009-2013 Olivier Chafik, All Rights Reserved
This file is part of JNAerator (http://jnaerator.googlecode.com/).
JNAerator is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
JNAerator is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with JNAerator. If not, see <http://www.gnu.org/licenses/>.
*/
package com.ochafik.lang.jnaerator;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import com.ochafik.lang.jnaerator.JNAerator.Feedback;
import com.ochafik.lang.jnaerator.studio.JNAeratorStudio;
import com.ochafik.lang.reflect.DebugUtils;
import com.ochafik.swing.candy.JLinkLabel;
import com.ochafik.util.SystemUtils;
public class SimpleGUI implements Feedback {
JFrame frame;
JLabel status;
JButton cancelButton;
final JNAeratorConfig config;
final Thread threadToCancel;
private String title;
private String ftitle;
public SimpleGUI(JNAeratorConfig config) {
this.config = config;
frame = new JFrame("JNAerator");
this.threadToCancel = Thread.currentThread();
title = config.entryName;
if (title == null) {
//title = StringUtils.implode(conf.libraryByFile.keySet(), ", ");
//if (title.length() == 0)
title = "<unnamed configuration>";
}
ftitle = "JNAerator : " + title;
frame.getContentPane().add("North", new JLinkLabel(title, new Runnable() {
public void run() {
ByteArrayOutputStream bout = new ByteArrayOutputStream();
PrintStream pout = new PrintStream(bout);
DebugUtils.println(SimpleGUI.this.config, pout);
JTextArea ta = new JTextArea();
ta.setWrapStyleWord(true);
ta.setLineWrap(true);
ta.setText(new String(bout.toByteArray()));
JScrollPane sp = new JScrollPane(ta);
Dimension s = new Dimension(500, 400);
ta.setMaximumSize(new Dimension(s.width, Integer.MAX_VALUE));
sp.setMaximumSize(s);
sp.setMinimumSize(s);
sp.setPreferredSize(s);
JOptionPane.showMessageDialog(frame, sp, ftitle, JOptionPane.INFORMATION_MESSAGE);
}
}));
frame.getContentPane().add("Center", status = new JLabel("Initializing..."));
frame.setMinimumSize(new Dimension(400, 0));
frame.getContentPane().add("South", cancelButton = new JButton("Cancel"));
cancelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (finished) {
if (toOpenWhenFinished instanceof File) {
try {
File f = (File) toOpenWhenFinished;
f = f.getAbsoluteFile();
if (f.isDirectory()) {
SystemUtils.runSystemOpenDirectory(f);
} else {
SystemUtils.runSystemOpenFileParent(f);
}
} catch (NoSuchMethodException e1) {
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} else if (toOpenWhenFinished instanceof Throwable) {
JNAeratorStudio.error(frame, null, null, (Throwable) toOpenWhenFinished);
}
} else {
tryCancel();
}
}
});
cancelButton.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_ESCAPE) {
tryQuit();
}
}
});
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
tryQuit();
}
});
}
void tryQuit() {
if (finished) {
System.exit(0);
}
tryCancel();
}
private void tryCancel() {
if (JOptionPane.showConfirmDialog(frame, "Are you sure you want to cancel ?", ftitle, JOptionPane.WARNING_MESSAGE) == JOptionPane.OK_OPTION) {
threadToCancel.interrupt();
System.exit(0);
}
}
Object toOpenWhenFinished;
boolean finished;
void show() {
frame.pack();
frame.setVisible(true);
}
void hide() {
frame.setVisible(false);
}
public void setStatus(final String string) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
status.setText(string);
}
});
}
public void setFinished(final File fileToOpen) {
toOpenWhenFinished = fileToOpen;
finished = true;
setStatus("JNAeration completed (hit Escape to quit)");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
String name = fileToOpen.getName();
cancelButton.setText(fileToOpen.isDirectory()
? "Open output directory"
: "Show file '" + name + "'");
cancelButton.setToolTipText(fileToOpen.getAbsolutePath());
}
});
}
@Override
public void setFinished(final Throwable e) {
finished = true;
toOpenWhenFinished = e;
setStatus("JNAeration failed !");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
cancelButton.setText("Show error details");
cancelButton.setToolTipText(e.toString());
}
});
}
@Override
public void sourcesParsed(SourceFiles sourceFiles) {
}
@Override
public void wrappersGenerated(Result result) {
}
}