package info.istlab.IoTP;
import java.awt.BorderLayout;
import java.awt.Desktop;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.event.MouseInputListener;
import javax.swing.tree.TreePath;
public class Launcher extends JFrame implements MouseInputListener, KeyListener {
public static Launcher theapp;
public static String version = "0.13";
// JPanel mainP;
File root;
JTree tree;
Hashtable<File, Editor> file2editor;
public static ArrayList<Process> allProcs = new ArrayList<Process>();
public Launcher(File _root) {
super("IoTP Launcher v" + version);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// mainP = new JPanel();
file2editor = new Hashtable<File, Editor>();
theapp = this;
root = _root;
// Create a TreeModel object to represent our tree of files
FileTreeModel model = new FileTreeModel(root, false);
// Create a JTree and tell it to display our model
tree = new JTree();
tree.setModel(model);
tree.addMouseListener(this);
tree.addKeyListener(this);
tree.setCellRenderer(new MyTreeCellRenderer());
// The JTree can get big, so allow it to scroll.
JScrollPane scrollpane = new JScrollPane(tree);
// mainP.setLayout(new BoxLayout(mainP, BoxLayout.PAGE_AXIS));
// for (int i = 1; i < 8; i++) {
// JButton b = new JButton("j" + i);
// mainP.add(b);
// }
// ShellScriptPanel run11 = new ShellScriptPanel("run1-1.sh");
getContentPane().add(scrollpane, BorderLayout.CENTER);
// Menu
JMenuBar menuBar = new JMenuBar();
JMenu menu = new JMenu("App"); /**************************************************** */
menuBar.add(menu);
JMenuItem mi;
mi = new JMenuItem("IoTPのバージョン確認");
mi.addActionListener(ae -> JOptionPane.showMessageDialog(this, "IoTP Launcher v" + version));
menu.add(mi);
mi = new JMenuItem("最新版があるかチェック");
mi.addActionListener(ae -> downloadLatest());
menu.add(mi);
mi = new JMenuItem("ダウンロードサイトをブラウザで開く");
mi.addActionListener(ae -> openURL(App.downloadurl));
menu.add(mi);
mi = new JMenuItem("終了");
mi.addActionListener(ae -> System.exit(0));
menu.add(mi);
menu = new JMenu("Serial"); /**************************************************** */
menuBar.add(menu);
mi = new JMenuItem("シリアルモニタを開く");
mi.addActionListener(ae -> SerialWindow.invoke() );
menu.add(mi);
menu = new JMenu("File"); /**************************************************** */
menuBar.add(menu);
mi = new JMenuItem("reload filetree");
mi.addActionListener(ae -> reloadFiles());
menu.add(mi);
mi = new JMenuItem("サンプルコードのフォルダを開く");
mi.addActionListener(ae -> openExecPath());
menu.add(mi);
// menu.addSeparator();
boolean isEnglish = false;
// menu = new JMenu(isEnglish ? "Process" : "プロセス"); /**************************************************** */
// menuBar.add(menu);
// mi = new JMenuItem("jps (Javaのプロセス確認)");
// mi.addActionListener(ae -> runCommand(ae.getActionCommand(), null));
// menu.add(mi);
// mi = new JMenuItem("killall java (Javaプロセスをすべて強制終了)");
// mi.addActionListener(ae -> runCommand(ae.getActionCommand(), null));
// menu.add(mi);
menu = new JMenu(isEnglish ? "Help" : "ヘルプ"); /**************************************************** */
menuBar.add(menu);
mi = new JMenuItem(isEnglish ? "Usage" : "つかいかた");
mi.addActionListener(ae -> openURL("https://ss.istlab.info/presens/dview/383/"));
menu.add(mi);
setJMenuBar(menuBar);
// getContentPane().add(mainP, BorderLayout.WEST);
setSize(310, 600);
setLocation(SerialWindow.centerOfScreen(getSize()));
}
public void renameOrDeleteNWPFolder() {
int res = JOptionPane.showConfirmDialog(this, "NWPフォルダを削除するなら「いいえ」、『NWP_日付_時刻』にフォルダ名を変更するなら「はい」を押してください。");
if (res == JOptionPane.YES_OPTION) {
// SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd_HHmm");
// runCommand("mv NWP NWP_" + sdf.format(new Date()), App.userhome);
reloadFiles();
} else if (res == JOptionPane.NO_OPTION) {
// runCommand("rm -fr ~/NWP", App.userhome);
reloadFiles();
}
}
public void runCommand(String cmd, String chdir) {
System.out.println(cmd);
new CommandRunner(cmd, chdir).startstop();
}
public void stopProcess(boolean isAll) {
ArrayList<Process> toberemoved = new ArrayList<Process>();
for (Process proc : allProcs) {
if (!isAll) {
if (proc.isAlive())
continue;
}
proc.destroyForcibly();
toberemoved.add(proc);
}
for (Process delproc : toberemoved) {
allProcs.remove(delproc);
Enumeration<JTAConsole> enu = JTAConsole.winStack.elements();
while (enu.hasMoreElements()) {
JTAConsole con = enu.nextElement();
con.windowClosing(null);
con.frame.dispose();
}
}
}
public void reloadFiles() {
FileTreeModel model = new FileTreeModel(root, false);
tree.setModel(model);
}
public void downloadLatest() {
boolean isLatest = App.isLatest();
// if () {
if (isLatest) {
JOptionPane.showMessageDialog(this,
"最新版です : v" + version + "\n(download folder: " + App.execPath.getParent().toString() + ")");
} else {
int res = JOptionPane.showConfirmDialog(this, "最新版 \n(" + App.latestVersion + ") をダウンロードする?\n(download folder: "
+ App.execPath.getParent().toString() + ")");
if (res == JOptionPane.YES_OPTION) {
App.download();
openExecPath();
}
}
}
public void openExecPath() {
File execFolder = new File(App.workingDir);
openFolder(execFolder);
}
public void openFolder(File path) {
try {
Desktop.getDesktop().open(path);
} catch (IOException e) {
e.printStackTrace();
}
}
public void openURL(String url) {
if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
try {
Desktop.getDesktop().browse(new URI(url));
} catch (IOException | URISyntaxException e) {
e.printStackTrace();
}
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
openEditor();
}
}
private void openEditor() {
TreePath tp = tree.getSelectionModel().getSelectionPath();
if (tp == null)
return;
File node = (File) tp.getLastPathComponent();
// フォルダなら開かない
if (node.isDirectory())
return;
Editor ed = file2editor.get(node);
if (ed == null) {
ed = new Editor(node);
file2editor.put(node, ed);
} else {
ed.setVisible(true);
ed.toFront();
}
System.out.println(node.toString());
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseDragged(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseMoved(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == 32) {
openEditor();
}
if (e.isControlDown() || e.isAltDown() || e.isAltGraphDown() || e.isMetaDown()) {
if (e.getKeyCode() == 81) { // Q
System.exit(0);
}
if (e.getKeyCode() == 87) { // W (Close)
System.exit(0);
}
}
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}