diff --git a/pom.xml b/pom.xml
index df06e2e..9e0ba0f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -62,6 +62,14 @@
commons-math3
3.6.1
+
+
+
+ com.fifesoft
+ autocomplete
+ 3.2.0
+
+
diff --git a/src/main/java/info/istlab/Zemi01/gitmonitor/App.java b/src/main/java/info/istlab/Zemi01/gitmonitor/App.java
new file mode 100644
index 0000000..ec83f80
--- /dev/null
+++ b/src/main/java/info/istlab/Zemi01/gitmonitor/App.java
@@ -0,0 +1,163 @@
+package info.istlab.Zemi01.gitmonitor;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.security.CodeSource;
+import java.security.ProtectionDomain;
+
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+
+/**
+ * Hello world!
+ *
+ */
+public class App {
+ public static String userhome;
+ public static Path execPath;
+ // public static String nwpsrc = File.separator + "NWP" + File.separator + "src";
+ // public static String gitrepos = "https://git.istlab.info/git/miura250/NWP.git";
+ public static String latestVersion;
+ // public static String downloadurl = "https://cit.istlab.info/KisoJikkenNWP/target/";
+
+ public App() {
+
+ }
+
+ public static void main(String[] args) {
+ try {
+ App.execPath = getApplicationPath(new App().getClass());
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+
+ // 最新版かどうかチェック
+ // if (!isLatest()) {
+ // System.out.println("Different! " + latestVersion + " from " + execPath.getFileName().toString());
+ // String pathfile = download();
+ // if (pathfile != null) {
+ // int res = JOptionPane.showConfirmDialog(null, "最新版をダウンロードしました。最新版を起動しますか?", "アプリ更新", JOptionPane.YES_NO_OPTION);
+ // if (res == JOptionPane.YES_OPTION) {
+ // reboot(pathfile);
+ // }
+ // }
+ // }
+
+ // ファイルがあるかチェック
+ userhome = System.getProperty("user.home");
+ // getNWPifnotexist(false);
+
+ SwingUtilities.invokeLater(() -> {
+ try {
+ String laf = UIManager.getSystemLookAndFeelClassName();
+ // System.out.println(laf);
+ // Linuxの場合
+ if (laf.endsWith("GTKLookAndFeel")) laf = "javax.swing.plaf.metal.MetalLookAndFeel";
+ UIManager.setLookAndFeel(laf);
+ } catch (Exception e) {
+ /* Never happens */ }
+ new GitFinder().setVisible(true);
+ });
+
+ }
+
+ public static Path getApplicationPath(Class> cls) throws URISyntaxException {
+ ProtectionDomain pd = cls.getProtectionDomain();
+ CodeSource cs = pd.getCodeSource();
+ URL location = cs.getLocation();
+ URI uri = location.toURI();
+ Path path = Paths.get(uri);
+ return path;
+ }
+
+/* public static boolean isLatest() {
+ // 最初に、ダウンロードサイトから最新版の情報を得る
+ // 更新があれば、ダウンロードし、ファイルを表示する。
+ StringBuilder sb = new StringBuilder();
+ latestVersion = null;
+ try {
+ URL url = new URL(downloadurl);
+ InputStream is = url.openConnection().getInputStream();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(is));
+ String line = null;
+ while ((line = reader.readLine()) != null) {
+ if (latestVersion == null) {
+ latestVersion = line.trim();
+ System.out.println(line);
+ }
+ sb.append(line + "\n");
+ }
+ reader.close();
+ } catch (Exception ex) {
+ }
+ // System.out.println(sb.toString());
+ // 同じかどうかチェック
+ // System.out.println("[" + latestVersion + "]");
+ // System.out.println("=" + execPath.getFileName() + "=");
+ if (execPath.getFileName().toString().equals("classes"))
+ return true;
+ return latestVersion.equals(execPath.getFileName().toString());
+ }*/
+
+/* // ダウンロードして実行パーミッションをつける
+ public static String download() {
+ try {
+ URL url = new URL(downloadurl + "/" + latestVersion);
+ ReadableByteChannel readableByteChannel = Channels.newChannel(url.openStream());
+ FileOutputStream fileOutputStream = new FileOutputStream(latestVersion);
+ FileChannel fileChannel = fileOutputStream.getChannel();
+ fileOutputStream.getChannel().transferFrom(readableByteChannel, 0, Long.MAX_VALUE);
+ fileChannel.close();
+ fileOutputStream.close();
+
+ File execjar = new File(execPath.getParent().toString() + File.separator + latestVersion);
+ execjar.setExecutable(true);
+ return execjar.getAbsolutePath();
+ } catch (Exception ex) {
+ } finally {
+ }
+ return null;
+ }
+
+ public static void reboot(String pathfile) {
+ String com = "sleep 2 ; java -jar " + pathfile;
+ System.out.println(com);
+ ProcessBuilder processBuilder = new ProcessBuilder("bash", "-c", com);
+ try {
+ processBuilder.start();
+ System.exit(0);
+ }catch(Exception ex){
+
+ }
+ }
+
+ public static void getNWPifnotexist(boolean showMessageIfExist) {
+ if (Files.notExists(Paths.get(userhome + nwpsrc))) {
+ int res = JOptionPane.showConfirmDialog(GitMonitor.rootFrame,
+ "NWP実験用のファイルが " + userhome + nwpsrc + " にありません。ダウンロードしますか?");
+ if (res == JOptionPane.YES_OPTION) {
+ System.out.println("cd ; git clone " + gitrepos + " を実行。");
+ ProcessBuilder processBuilder = new ProcessBuilder("git", "clone", gitrepos);
+ processBuilder.directory(new File(userhome));
+ processBuilder.inheritIO();
+ try {
+ Process process;
+ process = processBuilder.start();
+ process.waitFor();
+ } catch (IOException | InterruptedException e1) {
+ e1.printStackTrace();
+ }
+ } else {
+ System.out.println("cd ; git clone " + gitrepos + " を実行してください。");
+ System.exit(0);
+ }
+ } else {
+ if (showMessageIfExist)
+ JOptionPane.showMessageDialog(GitMonitor.rootFrame,
+ "NWP実験用のファイルが " + userhome + nwpsrc + " にすでにあるため、ダウンロードをキャンセルしました。");
+ }
+ }*/
+}
diff --git a/src/main/java/info/istlab/Zemi01/gitmonitor/CommandRunner.java b/src/main/java/info/istlab/Zemi01/gitmonitor/CommandRunner.java
new file mode 100644
index 0000000..d109b45
--- /dev/null
+++ b/src/main/java/info/istlab/Zemi01/gitmonitor/CommandRunner.java
@@ -0,0 +1,93 @@
+package info.istlab.Zemi01.gitmonitor;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+public class CommandRunner implements Runnable {
+ public static String prompt = "> ";
+
+ String command;
+
+ Thread thread;
+ Process process;
+ // JButton runB;
+ String workingDir;
+
+ JTAConsole con;
+
+ public CommandRunner(String cmd, String workDir) {
+ command = cmd;
+ workingDir = workDir;
+ // runB = rB;
+ }
+
+ public void startstop() {
+ if (thread == null) {
+ thread = new Thread(this);
+ thread.start();
+ // runB.setText("Stop");
+ } else {
+ process.destroyForcibly();
+ thread = null;
+ // runB.setText("Run");
+ }
+ }
+
+ public void invoke() {
+ if (con != null)
+ con.frame.setTitle(command + " " + workingDir);
+ startstop();
+ }
+
+ public void invoke(String cmd) {
+ command = cmd;
+ invoke();
+ }
+
+ @Override
+ public void run() {
+ // Run script
+ // System.out.println(scriptfile);
+ List cmds = Arrays.asList(command.split(" "));
+ ProcessBuilder processBuilder = new ProcessBuilder(cmds);
+ // ProcessBuilder processBuilder = new ProcessBuilder("pwd");
+ processBuilder.directory(new File(workingDir));
+ // processBuilder.inheritIO();
+
+ if (con == null)
+ con = new JTAConsole(command + " " + workingDir, this);
+ else
+ con.Systemoutprintln("===========================");
+ // con = new JTAConsole("(Exec) " + command);
+ // con.Systemoutprintln("=== 実行開始 ===");
+ // if (workingDir.equals(App.userhome)) {
+ // con.Systemoutprintln(prompt+"cd ~" + App.nwpsrc);
+ // } else {
+ con.Systemoutprintln(prompt + "cd " + workingDir);
+ // }
+ con.Systemoutprintln(prompt + command);
+
+ try {
+ process = processBuilder.start();
+ // Launcher.allProcs.add(process);
+ con.startBR(process);
+
+ // BufferedReader reader = new BufferedReader(new
+ // InputStreamReader(process.getInputStream()));
+ // String line;
+ // while ((line = reader.readLine()) != null) {
+ // jta.append(line);
+ // }
+ process.waitFor();
+ } catch (IOException | InterruptedException e1) {
+ e1.printStackTrace();
+ }
+ // con.Systemoutprintln("=== 終了 === (ALT+Wで閉じる)");
+
+ thread = null;
+ // runB.setText("Run");
+ }
+
+}
diff --git a/src/main/java/info/istlab/Zemi01/gitmonitor/GitFinder.java b/src/main/java/info/istlab/Zemi01/gitmonitor/GitFinder.java
new file mode 100644
index 0000000..4f44c04
--- /dev/null
+++ b/src/main/java/info/istlab/Zemi01/gitmonitor/GitFinder.java
@@ -0,0 +1,225 @@
+package info.istlab.Zemi01.gitmonitor;
+
+import java.awt.BorderLayout;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.io.File;
+import java.io.FileFilter;
+import java.net.URISyntaxException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JFrame;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.BadLocationException;
+
+import info.istlab.Zemi01.Launcher;
+
+public class GitFinder extends JPanel implements MouseListener {
+ public static JFrame rootFrame;
+ public static String userhome;
+ public static Path execPath;
+
+ public static void main(String[] args) {
+ new GitFinder();
+ }
+
+ JList list;
+ JTextField searchJTF;
+ ArrayList gitDirs;
+
+ public GitFinder() {
+ rootFrame = new JFrame("GitFinder");
+
+ basicDirs();
+ System.out.println(execPath);
+ System.out.println(userhome);
+
+ gitDirs = new ArrayList();
+ findDotGitFileRecursive(new File(userhome), gitDirs, 0); // 指定フォルダ以下の.gitを探索する
+ for (File f : gitDirs) {
+ System.out.println(f.getAbsolutePath());
+ }
+ searchJTF = new JTextField();
+ searchJTF.getDocument().addDocumentListener(new DocumentListener() {
+ @Override
+ public void insertUpdate(DocumentEvent e) {
+ filterList();
+ }
+ @Override
+ public void removeUpdate(DocumentEvent e) {
+ filterList();
+ }
+ @Override
+ public void changedUpdate(DocumentEvent e) {
+ filterList();
+ }
+ private void filterList() {
+ String filterText;
+ try {
+ filterText = searchJTF.getDocument().getText(0, searchJTF.getDocument().getLength());
+ } catch (BadLocationException ex) {
+ filterText = "";
+ }
+
+ List filteredListData = new ArrayList();
+ for (File item : gitDirs) {
+ if (item.getAbsolutePath().contains(filterText)) {
+ filteredListData.add(item);
+ }
+ }
+ list.setListData(filteredListData.toArray(new File[0]));
+ if (filteredListData.size()==1) list.setSelectedIndex(0);
+ }
+ });
+ searchJTF.addKeyListener(new KeyListener() {
+ @Override
+ public void keyTyped(KeyEvent e) {
+ }
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER){
+ if (list.getModel().getSize()==1){
+ File item = list.getModel().getElementAt(0);
+ chooseDir(item);
+ } else {
+ System.out.println(list.getSelectedIndex());
+ }
+ } else if (e.getKeyCode() == KeyEvent.VK_DOWN){
+ list.requestFocus();
+ if (list.getSelectedIndex()==-1) list.setSelectedIndex(0);
+ }
+ }
+ @Override
+ public void keyReleased(KeyEvent e) {
+ }
+ });
+
+
+ rootFrame.add(searchJTF, BorderLayout.NORTH);
+
+ list = new JList(gitDirs.toArray(new File[0]));
+ list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+ list.addMouseListener(this);
+ list.addKeyListener(new KeyListener() {
+ @Override
+ public void keyTyped(KeyEvent e) {
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ if (e.getKeyCode() == KeyEvent.VK_ENTER){
+ int pos;
+ if ( (pos = list.getSelectedIndex()) != -1 ){
+ File item = list.getModel().getElementAt(pos);
+ chooseDir(item);
+ }
+ } else if (e.getKeyCode() == KeyEvent.VK_UP && list.getSelectedIndex()==0){
+ //テキストフィールドにフォーカスを戻す
+ searchJTF.requestFocus();
+ list.clearSelection();
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+ // TODO Auto-generated method stub
+
+ }
+
+ });
+ JScrollPane jsp = new JScrollPane(list);
+ rootFrame.add(jsp);
+ rootFrame.pack();
+ // rootFrame.setSize(600,300);
+ rootFrame.setLocation(Launcher.centerOfScreen(rootFrame.getSize()));
+
+ rootFrame.setVisible(true);
+ rootFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+ }
+
+ /**
+ * 選んだ!
+ * @param targetDir
+ */
+ private void chooseDir(File targetDir){
+ System.out.println("Selected : " + targetDir.getParentFile().getAbsolutePath());
+ new CommandRunner("git status", targetDir.getParentFile().getAbsolutePath() ).startstop();
+
+
+ }
+
+ private void basicDirs() {
+ try {
+ execPath = App.getApplicationPath(this.getClass());
+ } catch (URISyntaxException e) {
+ e.printStackTrace();
+ }
+ userhome = System.getProperty("user.home");
+
+ }
+
+ private void findDotGitFileRecursive(File dir, ArrayList gitDirs, int level) {
+ if (level > 2)
+ return;
+ System.out.println("checking " + dir.getAbsolutePath());
+ File[] list = dir.listFiles(new FileFilter() {
+ public boolean accept(File path) {
+ return (path.isDirectory());
+ }
+ });
+ if (list == null)
+ return;
+ for (File tempdir : list) {
+ if (tempdir.getName().equals(".git")) {
+ gitDirs.add(tempdir);
+ } else {
+ findDotGitFileRecursive(tempdir, gitDirs, level + 1);
+ }
+ }
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getClickCount() == 2) {
+ int index = list.locationToIndex(e.getPoint());
+ File item = list.getModel().getElementAt(index);
+ chooseDir(item);
+ }
+ }
+
+ @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
+
+ }
+
+}
diff --git a/src/main/java/info/istlab/Zemi01/gitmonitor/JTAConsole.java b/src/main/java/info/istlab/Zemi01/gitmonitor/JTAConsole.java
new file mode 100644
index 0000000..3ddb56c
--- /dev/null
+++ b/src/main/java/info/istlab/Zemi01/gitmonitor/JTAConsole.java
@@ -0,0 +1,328 @@
+package info.istlab.Zemi01.gitmonitor;
+
+import java.awt.Point;
+import java.awt.Toolkit;
+import java.awt.datatransfer.Clipboard;
+import java.awt.datatransfer.StringSelection;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.Stack;
+
+import javax.swing.JFrame;
+import javax.swing.JScrollPane;
+import javax.swing.text.BadLocationException;
+
+import info.istlab.Zemi01.Launcher;
+
+public class JTAConsole extends MyRSJTextArea
+ implements Runnable, WindowListener, KeyListener, MouseListener, ActionListener {
+ // static JTAConsole lastWindow;
+ // static Point lastActivePoint;
+ static Stack winStack = new Stack();
+ JFrame frame;
+ Process process;
+ Thread thread;
+ InputStream instream;
+ InputStreamReader isreader;
+ BufferedReader reader;
+ OutputStream outstream;
+
+ // StringBuilder originalContent;
+ // String mainSrc;
+ // ProcessBuilder pb;
+ CommandRunner comRunner;
+
+ // public JTAConsole(ProcessBuilder prob) {
+ public JTAConsole(String title, CommandRunner runner) {
+ comRunner = runner;
+ // pb = prob;
+
+ frame = new JFrame(title);
+ frame.getContentPane().add(new JScrollPane(this));
+ frame.setSize(500, 200);
+ frame.setLocation(Launcher.centerOfScreen(frame.getSize()));
+ frame.setVisible(true);
+ frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
+ frame.addWindowListener(this);
+ if (winStack.size() > 0) {
+ JTAConsole last = winStack.peek();
+ if (last.isVisible()) {
+ Point lastFrameP = last.frame.getLocationOnScreen();
+ frame.setLocation(lastFrameP.x + 470, lastFrameP.y);
+ }
+ } else {
+ // if (Editor.lastOpened != null) {
+ // Point lastEditorP = Editor.lastOpened.getLocationOnScreen();
+ // Dimension lastEditorD = Editor.lastOpened.getSize();
+ // frame.setLocation(lastEditorP.x, lastEditorP.y + lastEditorD.height);
+ // }
+
+ }
+ addKeyListener(this);
+ addMouseListener(this);
+
+ // if (lastActivePoint != null){
+ // frame.setLocation(lastActivePoint.x+500, lastActivePoint.y);
+ // } else if (lastWindow != null && lastWindow.isVisible()){
+ // Point lastFrameP = lastWindow.frame.getLocationOnScreen();
+ // frame.setLocation(lastFrameP.x+500, lastFrameP.y);
+ // }
+ // lastWindow = this;
+ winStack.push(this);
+ // originalContent = new StringBuilder();
+ }
+
+ public void Systemoutprintln(String s) {
+ append(s + "\n");
+ // originalContent.append(s + "\n");
+ int len = getDocument().getLength();
+ if (getSelectedText() == null)
+ setCaretPosition(len);
+ }
+
+ public void startBR(Process proc) {
+ process = proc;
+ try {
+ reader = new BufferedReader(new InputStreamReader(proc.getInputStream(), "UTF-8"));
+ } catch (UnsupportedEncodingException e1) {
+ e1.printStackTrace();
+ }
+ // isreader = new InputStreamReader(proc.getInputStream());
+ outstream = process.getOutputStream();
+ String line;
+ try {
+ // while(true){
+ // if (isreader.ready()){
+ // char[] buf = new char[1000];
+ // isreader.read(buf);
+ // }
+ // }
+ while ((line = reader.readLine()) != null) {
+ Systemoutprintln(line);
+ }
+ process.waitFor();
+
+ } catch (IOException | InterruptedException e) {
+ // e.printStackTrace();
+ System.out.print(e.getClass().getCanonicalName() + " : ");
+ System.out.println(e.getLocalizedMessage());
+ }
+ }
+
+ @Override
+ public void run() {
+ String line;
+ try {
+ while ((line = reader.readLine()) != null) {
+ Systemoutprintln(line);
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void windowOpened(WindowEvent e) {
+
+ }
+
+ private void destroyProcess() {
+ try {
+ if (outstream != null)
+ outstream.close();
+ if (instream != null)
+ instream.close();
+ } catch (IOException e1) {
+ e1.printStackTrace();
+ }
+ process.destroyForcibly();
+ }
+
+ @Override
+ public void windowClosing(WindowEvent e) {
+ destroyProcess();
+
+ winStack.remove(this);
+ setVisible(false);
+ // if (!process.isAlive()) {
+ // Launcher.allProcs.remove(process);
+ // }
+ }
+
+ @Override
+ public void windowClosed(WindowEvent e) {
+
+ }
+
+ @Override
+ public void windowIconified(WindowEvent e) {
+
+ }
+
+ @Override
+ public void windowDeiconified(WindowEvent e) {
+
+ }
+
+ @Override
+ public void windowActivated(WindowEvent e) {
+ // JTAConsole.lastActivePoint = frame.getLocationOnScreen();
+ }
+
+ @Override
+ public void windowDeactivated(WindowEvent e) {
+
+ }
+
+ @Override
+ public void keyTyped(KeyEvent e) {
+
+ }
+
+ @Override
+ public void keyPressed(KeyEvent e) {
+ // if (e.isShiftDown()){
+ // setText(""); //reset content
+ // }
+ if (e.getKeyCode() == 10) {
+ setText(""); //reset content
+ comRunner.invoke();
+ }
+ if (e.getKeyCode()== KeyEvent.VK_B){
+ setText(""); //reset content
+ comRunner.invoke("git branch -avv");
+ }
+ if (e.getKeyCode()== KeyEvent.VK_S){
+ setText(""); //reset content
+ comRunner.invoke("git status");
+ }
+ if (e.getKeyCode()== KeyEvent.VK_R){
+ setText(""); //reset content
+ comRunner.invoke("git remote -v");
+ }
+
+ // if (e.getKeyCode() > 64 && e.getKeyCode() < 64 + 32) {
+ // if (e.isControlDown()) {
+ // System.out.print("CTRL+");
+ // }
+ // if (e.isAltDown()) {
+ // System.out.print("ALT+");
+ // }
+ // if (e.isAltGraphDown()) {
+ // System.out.print("AltGraph+");
+ // }
+ // if (e.isMetaDown()) {
+ // System.out.print("META+");
+ // }
+ // System.out.println(KeyEvent.getKeyText(e.getKeyCode()));
+ // }
+
+ if (e.isControlDown() || e.isAltDown() || e.isAltGraphDown() || e.isMetaDown()) {
+ if (e.getKeyCode() == 67) { // CTRL+C
+ if (getSelectedText() != null) {
+ // 文字列をクリップボードにコピーする
+ Toolkit kit = Toolkit.getDefaultToolkit();
+ Clipboard clip = kit.getSystemClipboard();
+ StringSelection ss = new StringSelection(getSelectedText());
+ clip.setContents(ss, ss);
+ System.out.println("選択範囲をコピーしました");
+ } else {
+ // プロセスのみ終了
+ destroyProcess();
+ }
+ }
+ if (e.getKeyCode() == 68 || e.getKeyCode() == 87) { // CTRL+D or Alt-W
+ windowClosing(null);
+ frame.dispose();
+ }
+ }
+ }
+
+ private void sendLastLine() {
+ int start;
+ try {
+ start = getLineStartOffset(getLineCount() - 1);
+ int end = getLineEndOffset(getLineCount() - 1);
+ String lastLineText = getText(start, end - start) + "\n";
+ // System.out.println(lastLineText);
+
+ byte[] sbyte = lastLineText.getBytes();
+ outstream.write(sbyte);
+ outstream.flush();
+ // originalContent.append("")
+
+ } catch (BadLocationException | IOException e) {
+ System.out.println(e.getLocalizedMessage());
+ }
+ }
+
+ @Override
+ public void keyReleased(KeyEvent e) {
+
+ }
+
+ @Override
+ public void mouseClicked(MouseEvent e) {
+ if (e.getButton() == MouseEvent.BUTTON3) {
+ // JTAConsolePopup popupMenu = new JTAConsolePopup(this);
+ // popupMenu.show(this, e.getX(), e.getY());
+ }
+ }
+
+ @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
+
+ }
+
+ /**
+ * PopupMenuの選択によるコマンド実行
+ *
+ * @param e
+ */
+ @Override
+ public void actionPerformed(ActionEvent e) {
+ if (e.getActionCommand().equals("Copy")) {
+ Toolkit kit = Toolkit.getDefaultToolkit();
+ Clipboard clip = kit.getSystemClipboard();
+ StringSelection ss = new StringSelection(getSelectedText());
+ clip.setContents(ss, ss);
+ } else if (e.getActionCommand().equals("Show Diff")) {
+ } else if (e.getActionCommand().equals("Submit")) {
+ }
+ }
+
+ public void setMainSrcByFileName(String absolutePath) {
+ }
+}
+
\ No newline at end of file
diff --git a/src/main/java/info/istlab/Zemi01/gitmonitor/MyRSJTextArea.java b/src/main/java/info/istlab/Zemi01/gitmonitor/MyRSJTextArea.java
new file mode 100644
index 0000000..3b80e10
--- /dev/null
+++ b/src/main/java/info/istlab/Zemi01/gitmonitor/MyRSJTextArea.java
@@ -0,0 +1,93 @@
+package info.istlab.Zemi01.gitmonitor;
+
+import java.awt.Color;
+import java.awt.Font;
+
+import javax.swing.JPopupMenu;
+import javax.swing.plaf.FontUIResource;
+
+import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory;
+import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea;
+import org.fife.ui.rsyntaxtextarea.Style;
+import org.fife.ui.rsyntaxtextarea.SyntaxScheme;
+import org.fife.ui.rsyntaxtextarea.Token;
+import org.fife.ui.rsyntaxtextarea.TokenMakerFactory;
+
+public class MyRSJTextArea extends RSyntaxTextArea {
+ AbstractTokenMakerFactory atmf;
+
+ public MyRSJTextArea() {
+ String syn = "TokenMaker4MyRSJTextArea";
+ atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance();
+ atmf.putMapping(syn, "istlab.KisoJikken.Test." + syn); //独自のTokenMakerを登録
+ setSyntaxEditingStyle(syn);
+ setFont(new FontUIResource("sansserif", Font.PLAIN, 14));
+
+ SyntaxScheme scheme = getSyntaxScheme();
+ // SyntaxScheme scheme = new SyntaxScheme(false);
+ // for(Style s : scheme.getStyles()){
+ // System.out.println(s);
+
+ Style baseStyle = new Style(Color.black);
+ for (int i = 0; i < 39; i++)
+ scheme.setStyle(i, baseStyle);
+ Style commentStyle = new Style(new Color(0, 128, 0), new Color(255, 255, 0x66), //緑文字、黄色背景
+ new Font("SansSerif", Font.ITALIC, 14));
+ Style commentStyle2 = new Style(new Color(0, 128, 0), new Color(0xcc, 255, 255),// 緑文字、水色背景
+ new Font("SansSerif", Font.ITALIC, 14));
+ Style commentStyle3 = new Style(new Color(0xcc, 0x00, 0xcc), new Color(0xff, 0xcc, 0xff),//マゼンタむらさき文字、ピンク背景
+ new Font("SansSerif", Font.ITALIC, 14));
+ Style commentStyle4 = new Style(new Color(0x33, 0x88, 0xcc), new Color(0xee, 0xee, 0xee),
+ new Font("SansSerif", Font.PLAIN, 14));
+ int[] comlist = new int[] { Token.COMMENT_EOL, Token.COMMENT_KEYWORD, Token.COMMENT_MARKUP };
+ for (int c : comlist) {
+ scheme.setStyle(c, commentStyle);
+ }
+ int[] comlist2 = new int[] { Token.COMMENT_MULTILINE };
+ for (int c : comlist2) {
+ scheme.setStyle(c, commentStyle2);
+ }
+ int[] comlist3 = new int[] { Token.COMMENT_DOCUMENTATION };
+ for (int c : comlist3) {
+ scheme.setStyle(c, commentStyle3);
+ }
+ int[] comlist4 = new int[] { Token.ANNOTATION };
+ for (int c : comlist4) {
+ scheme.setStyle(c, commentStyle4);
+ }
+ setSyntaxScheme(scheme);
+
+ // scheme.getStyle(Token.COMMENT_EOL).background = Color.cyan;
+ // scheme.getStyle(Token.COMMENT_DOCUMENTATION).background =
+ // Color.cyan.brighter();
+ // scheme.getStyle(Token.COMMENT_KEYWORD).background = Color.green;
+ // scheme.getStyle(Token.COMMENT_MARKUP).background = Color.gray;
+ // scheme.getStyle(Token.COMMENT_MULTILINE).background = Color.yellow;
+
+ // scheme.getStyle(Token.FUNCTION).foreground = Color.black;
+ // scheme.getStyle(Token.IDENTIFIER).foreground = Color.black;
+ // scheme.getStyle(Token.LITERAL_NUMBER_DECIMAL_INT).foreground = Color.black;
+ // scheme.getStyle(Token.LITERAL_NUMBER_FLOAT).foreground = Color.black;
+ // scheme.getStyle(Token.LITERAL_NUMBER_HEXADECIMAL).foreground = Color.black;
+ // scheme.getStyle(Token.OPERATOR).foreground = Color.black;
+ // scheme.getStyle(Token.VARIABLE).foreground = Color.black;
+ // scheme.getStyle(Token.ANNOTATION).foreground = Color.black;
+ // scheme.getStyle(Token.DATA_TYPE).foreground = Color.black;
+ // scheme.getStyle(Token.ERROR_CHAR).foreground = Color.black;
+ // scheme.getStyle(Token.LITERAL_CHAR).foreground = Color.black;
+
+ setHighlightCurrentLine(false); // カーソル行のハイライトを消す
+ setCodeFoldingEnabled(true);
+
+ }
+
+ @Override
+ protected void configurePopupMenu(JPopupMenu popupMenu) {
+ }
+
+ @Override
+ protected JPopupMenu createPopupMenu() {
+ return null;
+ }
+
+}