package istlab.KisoJikken;
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.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.Hashtable;
import javax.swing.JCheckBoxMenuItem;
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;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.errors.NoWorkTreeException;
public class Launcher extends JFrame implements MouseInputListener, KeyListener, Runnable {
public static Launcher theapp;
public static String version = "0.77";
static int reboot_msec = 2000;
// JPanel mainP;
File root;
GitManager gitrepom;
JTree tree;
JCheckBoxMenuItem jcbmi;
Hashtable<File, Editor> file2editor;
// all generated processes (maybe alive only)
public static ArrayList<Process> allProcs = new ArrayList<Process>();
public Launcher(String[] args) {
super("Kiso NWP Launcher v" + version);
setDefaultCloseOperation(EXIT_ON_CLOSE);
// mainP = new JPanel();
file2editor = new Hashtable<File, Editor>();
theapp = this;
if (args.length > 0)
root = new MyFile(args[0]);
else
root = new MyFile(App.userhome + App.nwpsrc);
try {
gitrepom = new GitManager(root);
gitrepom.checkClean(true);
} catch (IOException | NoWorkTreeException | GitAPIException e) {
e.printStackTrace();
}
// 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
boolean isEnglish = false;
JMenuItem mi;
JMenu menu;
JMenuBar menuBar = new JMenuBar();
menu = new JMenu(isEnglish ? "File" : "ファイル"); /**************************************************** */
menuBar.add(menu);
jcbmi = new JCheckBoxMenuItem("classファイルを非表示にする");
jcbmi.addItemListener(ae -> reloadFiles());
menu.add(jcbmi);
mi = new JMenuItem("ファイル一覧を再読み込み");
mi.addActionListener(ae -> reloadFiles());
menu.add(mi);
menu.addSeparator();
mi = new JMenuItem("NWPフォルダの変更状況確認");
mi.addActionListener(ae -> {
try {
gitrepom.checkClean(false);
} catch (NoWorkTreeException e) {
e.printStackTrace();
} catch (GitAPIException e) {
e.printStackTrace();
}
});
menu.add(mi);
menu.addSeparator();
mi = new JMenuItem("Launcherを再起動する");
mi.addActionListener(ae -> restart());
menu.add(mi);
mi = new JMenuItem("Launcherを終了");
mi.addActionListener(ae -> System.exit(0));
menu.add(mi);
// mi = new JMenuItem("NWPフォルダの再取得(または初期状態に戻す)");
// mi.addActionListener(ae -> App.getNWPifnotexist(true));
// menu.add(mi);
// mi = new JMenuItem("NWPフォルダを削除orリネームする");
// mi.addActionListener(ae -> renameOrDeleteNWPFolder());
// menu.add(mi);
menu = new JMenu(isEnglish ? "Process" : "プロセス"); /**************************************************** */
menuBar.add(menu);
mi = new JMenuItem("jps (Javaのプロセス確認)");
mi.addActionListener(ae -> runCommand(ae.getActionCommand(), null));
menu.add(mi);
// lsof -i -n -P | grep java
mi = new JMenuItem("Javaが開いているポートの確認");
mi.addActionListener(ae -> {
JOptionPane.showInputDialog(Launcher.theapp, "Javaプログラムが開いているポートを確認するには\n" +
"お手数ですが、ターミナルで以下を入力してください。\n\n" +
"(コピーしやすさを考慮し、テキストフィールドに表示しています)",
"lsof -i -n -P | grep java");
});
menu.add(mi);
mi = new JMenuItem("アクティブなJavaプロセスを停止");
mi.addActionListener(ae -> stopProcess(false));
menu.add(mi);
mi = new JMenuItem("すべてのJavaプロセスを停止");
mi.addActionListener(ae -> stopProcess(true));
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);
mi = new JMenuItem(isEnglish ? "LMS Login" : "講義システム ログイン");
mi.addActionListener(ae -> openURL("https://ss.istlab.info/users/login"));
menu.add(mi);
menu = new JMenu("App"); /**************************************************** */
menuBar.add(menu);
mi = new JMenuItem("Launcherのバージョン情報を表示");
mi.addActionListener(ae -> JOptionPane.showMessageDialog(this, "Kiso NWP Launcher v" + version));
menu.add(mi);
mi = new JMenuItem("Launcherの最新版をチェック");
mi.addActionListener(ae -> downloadLatest());
menu.add(mi);
mi = new JMenuItem("ダウンロードサイトを開く");
mi.addActionListener(ae -> openURL(App.downloadurl));
menu.add(mi);
mi = new JMenuItem("JARファイルの場所を開く");
mi.addActionListener(ae -> openExecPath());
menu.add(mi);
setJMenuBar(menuBar);
// getContentPane().add(mainP, BorderLayout.WEST);
setSize(310, 600);
}
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 restart() {
reboot_msec = 0;
App.reboot(App.execPath.toString());
}
public void runCommand(String cmd, String chdir) {
System.out.println(cmd);
new CommandRunner(cmd, chdir).startstop();
}
public void runCommand(String cmd, String chdir, int wheight) {
System.out.println(cmd);
new CommandRunner(cmd, chdir, wheight).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, jcbmi.isSelected());
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 = App.execPath.getParent().toFile();
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
}
@Override
public void run() {
// wait 5sec and shutdown
try {
Thread.sleep(reboot_msec);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(0);
}
}