/*
* JEdit.java
*
* Created on July 30, 2007, 10:13 AM
*/
/**
* Multi-tabbed text editor.
*
* @author pquiring
*/
import javaforce.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.text.*;
public class JEdit extends javax.swing.JFrame implements FindEvent, ReplaceEvent, DocumentListener, ActionListener {
private String getVersion() { return "0.12"; }
/** Creates new form jfedit */
public JEdit() {
initComponents();
initApp();
JFImage icon = new JFImage();
icon.loadPNG(this.getClass().getClassLoader().getResourceAsStream("jfedit.png"));
setIconImage(icon.getImage());
loadProject();
cut.addActionListener(this);
copy.addActionListener(this);
paste.addActionListener(this);
delete.addActionListener(this);
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
popup = new javax.swing.JPopupMenu();
cut = new javax.swing.JMenuItem();
copy = new javax.swing.JMenuItem();
paste = new javax.swing.JMenuItem();
delete = new javax.swing.JMenuItem();
FormListener formListener = new FormListener();
cut.setText("Cut");
popup.add(cut);
copy.setText("Copy");
popup.add(copy);
paste.setText("Paste");
popup.add(paste);
delete.setText("Delete");
popup.add(delete);
setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
addComponentListener(formListener);
addWindowStateListener(formListener);
addWindowListener(formListener);
getContentPane().setLayout(new java.awt.GridLayout(1, 0));
pack();
}
// Code for dispatching events from components to event handlers.
private class FormListener implements java.awt.event.ComponentListener, java.awt.event.WindowListener, java.awt.event.WindowStateListener {
FormListener() {}
public void componentHidden(java.awt.event.ComponentEvent evt) {
}
public void componentMoved(java.awt.event.ComponentEvent evt) {
if (evt.getSource() == JEdit.this) {
JEdit.this.formComponentMoved(evt);
}
}
public void componentResized(java.awt.event.ComponentEvent evt) {
if (evt.getSource() == JEdit.this) {
JEdit.this.formComponentResized(evt);
}
}
public void componentShown(java.awt.event.ComponentEvent evt) {
}
public void windowActivated(java.awt.event.WindowEvent evt) {
}
public void windowClosed(java.awt.event.WindowEvent evt) {
}
public void windowClosing(java.awt.event.WindowEvent evt) {
if (evt.getSource() == JEdit.this) {
JEdit.this.formWindowClosing(evt);
}
}
public void windowDeactivated(java.awt.event.WindowEvent evt) {
}
public void windowDeiconified(java.awt.event.WindowEvent evt) {
}
public void windowIconified(java.awt.event.WindowEvent evt) {
}
public void windowOpened(java.awt.event.WindowEvent evt) {
}
public void windowStateChanged(java.awt.event.WindowEvent evt) {
if (evt.getSource() == JEdit.this) {
JEdit.this.formWindowStateChanged(evt);
}
}
}// </editor-fold>//GEN-END:initComponents
private void formComponentMoved(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentMoved
if (settings.bWindowMax) return;
Point loc = getLocation();
settings.WindowXPos = loc.x;
settings.WindowYPos = loc.y;
}//GEN-LAST:event_formComponentMoved
private void formComponentResized(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_formComponentResized
if (settings.bWindowMax) return;
Dimension size = getSize();
settings.WindowXSize = size.width;
settings.WindowYSize = size.height;
}//GEN-LAST:event_formComponentResized
private void formWindowStateChanged(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowStateChanged
settings.bWindowMax = evt.getNewState() == MAXIMIZED_BOTH;
}//GEN-LAST:event_formWindowStateChanged
private void formWindowClosing(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_formWindowClosing
exit();
}//GEN-LAST:event_formWindowClosing
/**
* @param args the command line arguments
*/
public static String args[];
public static void main(String args[]) {
JEdit.args = args;
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new JEdit().setVisible(true);
}
});
}
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JMenuItem copy;
private javax.swing.JMenuItem cut;
private javax.swing.JMenuItem delete;
private javax.swing.JMenuItem paste;
private javax.swing.JPopupMenu popup;
// End of variables declaration//GEN-END:variables
private static Settings settings = new Settings();
private class page {
JPanel panel;
JScrollPane scroll;
JFTextArea txt;
boolean dirty;
File filename;
boolean bUnix;
};
private Vector<page> pages;
private boolean bLoading = false;
private IndentBreakAction indentBreakAction = new IndentBreakAction();
private JTabbedPane tabs;
private void initApp() {
tabs = new JTabbedPane();
setContentPane(tabs);
tabs.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
tabsKeyPressed(evt);
}
});
setTitle("jfedit");
pages = new Vector<page>();
loadcfg();
setSize(settings.WindowXSize, settings.WindowYSize);
setLocation(settings.WindowXPos, settings.WindowYPos);
if (settings.bWindowMax) setExtendedState(MAXIMIZED_BOTH);
if (args != null) {
for(int a=0;a<args.length;a++) loadpages(args[a]);
}
if (pages.size() == 0) addpage("untitled");
tabs.setSelectedIndex(0);
pages.get(0).txt.grabFocus();
}
public void loadcfg() {
XML xml = new XML();
String filename = JF.getUserPath() + "/.jfedit.xml";
File file = new File(filename);
if (!file.exists()) return; //doesn't exist
if (!xml.read(filename)) return; //bad cfg
if (!xml.root.name.equals("jfedit")) return; //bad cfg
xml.writeClass(xml.root, settings);
settings.fnt = JF.getMonospacedFont(0, settings.fontSize);
}
public void savecfg() {
XML xml = new XML();
XML.XMLTag tag;
xml.root.name = "jfedit";
xml.readClass(xml.root, settings);
String filename = JF.getUserPath() + "/.jfedit.xml";
xml.write(filename);
}
//find data
private String findstr = "";
private String repstr = "";
private boolean findww;
private boolean findcw;
//interface FindEvent
public void findEvent(FindDialog dialog) {
findstr = dialog.getText();
findww = dialog.getWhole();
findcw = dialog.getCase();
findagain(false);
}
//interface ReplaceEvent
public boolean findEvent(ReplaceDialog dialog) {
findstr = dialog.getFindText();
findww = dialog.getWhole();
findcw = dialog.getCase();
boolean ret = replace_find();
if (!ret) notfound();
return ret;
}
public void replaceEvent(ReplaceDialog dialog) {
findstr = dialog.getFindText();
repstr = dialog.getReplaceText();
findww = dialog.getWhole();
findcw = dialog.getCase();
replace_replace();
}
public void replaceAllEvent(ReplaceDialog dialog) {
findstr = dialog.getFindText();
repstr = dialog.getReplaceText();
findww = dialog.getWhole();
findcw = dialog.getCase();
replace_all();
}
private JFTextArea createJFTextArea() {
JFTextArea txt = new JFTextArea();
txt.setFont(settings.fnt);
txt.setTabSize(settings.tabSize);
txt.setLineWrap(settings.bLineWrap);
txt.addKeyListener(new java.awt.event.KeyAdapter() {
public void keyPressed(java.awt.event.KeyEvent evt) {
tabsKeyPressed(evt);
}
});
txt.getDocument().addDocumentListener(this);
txt.getActionMap().put(DefaultEditorKit.insertBreakAction, indentBreakAction);
txt.setComponentPopupMenu(popup);
return txt;
}
private page addpage(String title) {
page pg = new page();
pg.bUnix = settings.bUnix;
pg.panel = JF.createJPanel(new GridLayout(), null);
pg.txt = createJFTextArea();
pg.scroll = new JScrollPane(pg.txt);
pg.panel.add(pg.scroll);
pg.filename = new File(title);
pg.dirty = false;
pg.panel.setVisible(true);
tabs.addTab(title, pg.panel);
this.doLayout();
tabs.setSelectedComponent(pg.panel);
pages.add(pg);
return pg;
}
private int getidx() { return tabs.getSelectedIndex(); }
private boolean savepage() {
int idx = getidx();
if (pages.get(idx).dirty == false) return true;
if (pages.get(idx).filename.toString().equals("untitled")) {return savepageas();}
String tmp;
try {
tmp = pages.get(idx).txt.getText();
if (settings.bClean) {
boolean cleaned = false;
while (tmp.indexOf(" \n") != -1) {tmp = tmp.replaceAll(" \n" ,"\n");cleaned = true;}
if (cleaned) {
int pos = pages.get(idx).txt.getCaretPosition();
int line = pages.get(idx).txt.getLineOfOffset(pos);
setText(pages.get(idx).txt, tmp);
pages.get(idx).txt.setCaretPosition(pages.get(idx).txt.getLineStartOffset(line));
}
}
if (!pages.get(idx).bUnix) {
tmp = tmp.replaceAll("\n", "\r\n");
}
FileOutputStream fos = new FileOutputStream(pages.get(idx).filename);
fos.write(tmp.getBytes("UTF-8"));
fos.close();
tabs.setTitleAt(idx, pages.get(idx).filename.getName());
pages.get(idx).dirty = false;
return true;
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Failed to save '" + pages.get(idx).filename.toString() + "'", "Warning", JOptionPane.ERROR_MESSAGE);
return false;
}
}
private boolean savepageas() {
int idx = getidx();
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
chooser.setCurrentDirectory(new File(JF.getCurrentPath()));
if (chooser.showSaveDialog(this) == JFileChooser.APPROVE_OPTION) {
pages.get(idx).dirty = true;
pages.get(idx).filename = chooser.getSelectedFile();
tabs.setTitleAt(idx, pages.get(idx).filename.getName());
return savepage();
}
return false;
}
private boolean closepage(int idx) {
tabs.setSelectedIndex(idx);
return closepage();
}
private boolean closepage() {
int idx = getidx();
if (pages.get(idx).dirty) {
//confirm to Save : Yes/No/Cancel
switch (JOptionPane.showConfirmDialog(this, "Do you wish to save '" + pages.get(idx).filename.toString() + "' ?", "Confirm",
JOptionPane.YES_NO_CANCEL_OPTION)) {
case JOptionPane.YES_OPTION:
if (!savepage()) return false;
break;
case JOptionPane.NO_OPTION:
break;
default:
case JOptionPane.CANCEL_OPTION:
return false;
}
}
pages.remove(idx);
tabs.remove(idx);
if (pages.size() == 0) addpage("untitled");
return true;
}
private void openpage() {
int idx = getidx();
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
chooser.setCurrentDirectory(new File(JF.getCurrentPath()));
if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) {
//check if current page is "untitled" and !dirty
if (pages.get(idx).filename.toString().equals("untitled") && pages.get(idx).dirty == false) {
//load on current page
pages.get(idx).filename = chooser.getSelectedFile();
} else {
addpage(chooser.getSelectedFile().getAbsolutePath());
idx = tabs.getTabCount() - 1;
}
loadpage(idx);
pages.get(idx).txt.grabFocus();
}
}
private void loadpages(String filespec) {
File f = new File(filespec);
if (f.isDirectory()) {
/*
String files[] = f.list();
if (files == null || files.length == 0) return;
for(int a=0;a<files.length;a++) {
addpage(files[a]);
loadpage(tabs.getTabCount() - 1);
}
*/
} else {
addpage(filespec);
loadpage(tabs.getTabCount() - 1);
}
}
private void loadpage(int idx) {
byte txt[];
if ((pages.get(idx).filename.toString().indexOf("*") != -1) || (pages.get(idx).filename.toString().indexOf("?") != -1)) {
closepage(idx);
return;
}
try {
File file = pages.get(idx).filename;
if (!file.exists()) return;
FileInputStream fis = new FileInputStream(file);
int size = fis.available();
if (size > 1024 * 1024) {
if (!JF.showConfirm("Warning", "File is > 1MB, load anyways?")) {
closepage(idx);
return;
}
}
txt = new byte[size];
fis.read(txt);
fis.close();
bLoading = true;
String str = new String(txt, "UTF-8");
boolean bUnix = settings.bUnix;
if (settings.bPreserve) {
int lf = str.indexOf("\n");
if (lf > 0) {
if (txt[lf-1] == '\r') bUnix = false;
}
}
pages.get(idx).bUnix = bUnix;
setText(pages.get(idx).txt, str);
pages.get(idx).txt.setCaretPosition(0);
bLoading = false;
tabs.setTitleAt(idx, pages.get(idx).filename.getName());
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Failed to open '" + pages.get(idx).filename.toString() + "'", "Warning", JOptionPane.ERROR_MESSAGE);
closepage(idx);
}
}
private void notfound() {
JOptionPane.showMessageDialog(this, "Unable to find match", "Notice", JOptionPane.ERROR_MESSAGE);
// tabs.repaint(); //FIX BUG ON MY COMPUTER (JAVA DOESN'T LIKE MY VIDEO CARD)
}
private void find() {
FindDialog.showFindDialog(this, false, findstr, findww, findcw, this);
// tabs.repaint(); //FIX BUG ON MY COMPUTER (JAVA DOESN'T LIKE MY VIDEO CARD)
}
private boolean isChar(char ch) {
//return true if ch is a char that would be a part of a whole word
if ((ch >= 'a') && (ch <= 'z')) return true;
if ((ch >= 'A') && (ch <= 'Z')) return true;
if ((ch >= '0') && (ch <= '9')) return true;
if (ch == '_') return true;
return false;
}
private boolean findagain(boolean quiet) {
int idx = getidx();
if (findstr == null) return false;
String txt = pages.get(idx).txt.getText();
int txtlen = txt.length();
int findstrlen = findstr.length();
int pos = -1;
for(int a=pages.get(idx).txt.getCaretPosition();a<txt.length();a++) {
if (txt.regionMatches(!findcw, a, findstr, 0, findstrlen)) {
if (findww) {
if ((a > 0) && (isChar(txt.charAt(a-1)))) continue;
if ((a < txtlen - findstrlen) && (isChar(txt.charAt(a+findstrlen)))) continue;
}
pos = a;
break;
}
}
if (pos == -1) {if (!quiet) notfound(); return false;}
pages.get(idx).txt.setCaretPosition(pos);
pages.get(idx).txt.select(pos, pos + findstr.length());
return true;
}
private void replace() {
int idx = getidx();
ReplaceDialog.showReplaceDialog(this, true, findstr, repstr, findww, findcw, this);
// tabs.repaint(); //FIX BUG ON MY COMPUTER (JAVA DOESN'T LIKE MY VIDEO CARD)
}
private boolean replace_find() {
int idx = getidx();
return findagain(true);
}
private void replace_replace() {
int idx = getidx();
pages.get(idx).txt.replaceSelection(repstr);
}
private void replace_all() {
int idx = getidx();
int cnt = 0;
JFTextArea txt = pages.get(idx).txt;
txt.setCaretPosition(0);
while (true) {
if (!replace_find()) break;
replace_replace();
cnt++;
}
JOptionPane.showMessageDialog(this,
"Replaced " + cnt + " occurances"
, "Info", JOptionPane.INFORMATION_MESSAGE);
}
private void gotopos() {
String str;
int line;
int idx = getidx();
try {
str = JOptionPane.showInputDialog(this, "Which line?",
"Goto", JOptionPane.QUESTION_MESSAGE);
if (str == null) return;
line = JF.atoi(str) - 1;
if (line < 0) return;
pages.get(idx).txt.setCaretPosition(pages.get(idx).txt.getLineStartOffset(line));
} catch (Exception e2) {}
}
private boolean isActive(Process proc) {
try {
int exitValue = proc.exitValue();
return false;
} catch (Exception e) {
return true;
}
}
private void execute() {
try {
String str = JOptionPane.showInputDialog(this, "Enter OS command",
"Execute", JOptionPane.QUESTION_MESSAGE);
if (str == null) return;
String strs[] = str.split(" ");
ArrayList<String> list = new ArrayList<String>();
for(int a=0;a<strs.length;a++) list.add(strs[a]);
ProcessBuilder pb = new ProcessBuilder(list);
pb.redirectErrorStream(true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Process proc = pb.start();
// proc.waitFor(); //dead locks often
InputStream is = proc.getInputStream();
while (isActive(proc)) {
int fs = is.available();
if (fs > 0) {
byte data[] = new byte[fs];
int read = is.read(data);
baos.write(data, 0, read);
}
}
int fs = is.available();
if (fs > 0) {
byte data[] = new byte[fs];
int read = is.read(data);
baos.write(data, 0, read);
}
if (baos.size() == 0) {
JOptionPane.showMessageDialog(this, "No output", "Execute",
JOptionPane.INFORMATION_MESSAGE);
return;
}
page pg = addpage("output-" + strs[0]);
setText(pg.txt, baos.toString());
pg.txt.grabFocus();
pg.txt.setCaretPosition(0);
} catch (Exception e) {
}
}
private void print() {
int idx = getidx();
try {
pages.get(idx).txt.print(); //Java 1.6
} catch (Exception e) {
JOptionPane.showMessageDialog(this, "Failed to print '" + pages.get(idx).filename.toString() + "'", "Warning", JOptionPane.ERROR_MESSAGE);
}
}
private void exit() {
//close all windows
int cnt = pages.size();
for(int a=0;a<cnt;a++) {
if (!closepage()) return;
}
savecfg();
System.exit(0);
}
public void changedUpdate(DocumentEvent e) {
changed();
}
public void insertUpdate(DocumentEvent e) {
changed();
}
public void removeUpdate(DocumentEvent e) {
changed();
}
public void changed() {
if (bLoading) return;
int idx = getidx();
if (idx < 0 || idx >= pages.size()) return;
if (pages.get(idx).dirty == false) {
pages.get(idx).dirty = true;
tabs.setTitleAt(idx, pages.get(idx).filename.getName() + " *");
}
}
public void setText(JFTextArea ta, String txt) {
txt = txt.replaceAll("\r\n","\n"); //PC file
txt = txt.replaceAll("\r","\n"); //MAC file
ta.setText(txt);
ta.clearHistory();
}
public static class IndentBreakAction extends TextAction {
/**
* Creates this object with the appropriate identifier.
*/
public IndentBreakAction() {
super(DefaultEditorKit.insertBreakAction);
}
/**
* The operation to perform when this action is triggered.
*
* @param e the action event
*/
public void actionPerformed(ActionEvent e) {
JTextComponent target = getTextComponent(e);
if (target == null) return;
if ((! target.isEditable()) || (! target.isEnabled())) {
UIManager.getLookAndFeel().provideErrorFeedback(target);
return;
}
try {
// Determine which line we are on
Document doc = target.getDocument();
Element rootElement = doc.getDefaultRootElement();
int selectionStart = target.getSelectionStart();
int line = rootElement.getElementIndex( selectionStart );
// Get the text for this line
int start = rootElement.getElement(line).getStartOffset();
int end = rootElement.getElement(line).getEndOffset();
int length = end - start;
String text = doc.getText(start, length);
int offset = 0;
// Get the number of white spaces characters at the start of the line
for (offset = 0; offset < length; offset++) {
char c = text.charAt(offset);
if (c != ' ' && c != '\t')
break;
}
// When splitting the text include white space at start of line
// else do default processing
if ((selectionStart - start >= offset) && (settings.bAutoIndent))
target.replaceSelection("\n" + text.substring(0, offset) );
else
target.replaceSelection("\n");
} catch(BadLocationException ble) {}
}
}
private void shift_left(char ch) {
if (pages.size() == 0) return;
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
int ss = txt.getSelectionStart();
int se = txt.getSelectionEnd();
if (ss == se) return;
String lns[] = txt.getSelectedText().split("\n", -1);
StringBuffer newString = new StringBuffer();
for(int a=0;a<lns.length;a++) {
if (a > 0) newString.append("\n");
if ((lns[a].length() > 0) && (lns[a].charAt(0) == ch)) { lns[a] = lns[a].substring(1); se--; }
newString.append(lns[a]);
}
txt.replaceSelection(newString.toString());
txt.setSelectionStart(ss);
txt.setSelectionEnd(se);
}
private void shift_right(char ch) {
if (pages.size() == 0) return;
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
int ss = txt.getSelectionStart();
int se = txt.getSelectionEnd();
if (ss == se) return;
String lns[] = txt.getSelectedText().split("\n", -1);
StringBuffer newString = new StringBuffer();
String chstr = "" + ch;
for(int a=0;a<lns.length;a++) {
if (a > 0) newString.append("\n");
if (lns[a].length() > 0) {
newString.append(chstr);
se++;
}
newString.append(lns[a]);
}
txt.replaceSelection(newString.toString());
txt.setSelectionStart(ss);
txt.setSelectionEnd(se);
}
private void lowercase() {
if (pages.size() == 0) return;
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
int ss = txt.getSelectionStart();
int se = txt.getSelectionEnd();
if (ss == se) return;
txt.replaceSelection(txt.getSelectedText().toLowerCase());
txt.setSelectionStart(ss);
txt.setSelectionEnd(se);
}
private void uppercase() {
if (pages.size() == 0) return;
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
int ss = txt.getSelectionStart();
int se = txt.getSelectionEnd();
if (ss == se) return;
txt.replaceSelection(txt.getSelectedText().toUpperCase());
txt.setSelectionStart(ss);
txt.setSelectionEnd(se);
}
private void tabsKeyPressed(java.awt.event.KeyEvent evt) {
//Key Pressed
int f1 = evt.getKeyCode();
int f2 = evt.getModifiers();
int idx;
JFTextArea txt;
if ((f1 == KeyEvent.VK_F1) && (f2 == 0)) {
JOptionPane.showMessageDialog(this,
"jfedit/" + getVersion() + "\n\n" +
"F1 = Help\n" +
"F2 = Edit Settings\n" +
"F4 = Document Info\n" +
"F5 = Shift Selection left 1 space\n" +
"F6 = Shift Selection right 1 space\n" +
"F7 = Shift Selection left 1 tab\n" +
"F8 = Shift Selection right 1 tab\n" +
"F9 = Lower case Selection\n" +
"F10 = Upper case Selection\n" +
"CTRL-O = Open\n" +
"CTRL-W = Close\n" +
"CTRL-S = Save\n" +
"CTRL-Q = Save As\n" +
"CTRL-F = Find\n" +
"CTRL-G/F3 = Find Again\n" +
"CTRL-R = Replace\n" +
"CTRL-L = Goto Line #\n" +
"CTRL-E = Execute Command\n" +
"CTRL-P = Print\n" +
"ALT-# = Switch to document\n\n"
, "Help", JOptionPane.INFORMATION_MESSAGE);
return;
}
if ((f1 == KeyEvent.VK_F2) && (f2 == 0)) {
EditSettings.editSettings(this, settings);
settings.fnt = JF.getMonospacedFont(0, settings.fontSize);
int cnt = pages.size();
for(int a=0;a<cnt;a++) {
txt = pages.get(a).txt;
txt.setFont(settings.fnt);
txt.setTabSize(settings.tabSize);
txt.setLineWrap(settings.bLineWrap);
}
}
if ((f1 == KeyEvent.VK_F4) && (f2 == 0)) {
idx = getidx();
page pg = pages.get(idx);
txt = pg.txt;
boolean bUnix = pg.bUnix;
int cp, px, py;
try {
cp = txt.getCaretPosition();
py = txt.getLineOfOffset(cp);
px = cp - txt.getLineStartOffset(py);
} catch (Exception e) {
py = -1;
px = -1;
}
px++;
py++;
StringBuilder info = new StringBuilder();
info.append("File : " + pg.filename + "\n");
info.append("Lines : " + txt.getLineCount() + "\n");
info.append("Current Position : " + px + "," + py + "\n");
info.append("Line Endings : " + (bUnix ? "LF" : "CRLF") + "\n");
// info.append("JVM : " + System.getProperty("java.version"));
JOptionPane.showMessageDialog(this, info.toString(), "Info", JOptionPane.INFORMATION_MESSAGE);
return;
}
if ((f1 == KeyEvent.VK_F5) && (f2 == 0)) { shift_left(' '); }
if ((f1 == KeyEvent.VK_F6) && (f2 == 0)) { shift_right(' '); }
if ((f1 == KeyEvent.VK_F7) && (f2 == 0)) { shift_left('\t'); }
if ((f1 == KeyEvent.VK_F8) && (f2 == 0)) { shift_right('\t'); }
if ((f1 == KeyEvent.VK_F9) && (f2 == 0)) { lowercase(); }
if ((f1 == KeyEvent.VK_F10) && (f2 == 0)) { uppercase(); evt.consume(); }
if ((f1 == KeyEvent.VK_N) && (f2 == KeyEvent.CTRL_MASK)) { addpage("untitled"); return; }
if ((f1 == KeyEvent.VK_S) && (f2 == KeyEvent.CTRL_MASK)) { savepage(); return; }
if ((f1 == KeyEvent.VK_Q) && (f2 == KeyEvent.CTRL_MASK)) { savepageas(); return; }
if ((f1 == KeyEvent.VK_W) && (f2 == KeyEvent.CTRL_MASK)) { closepage(); return; }
if ((f1 == KeyEvent.VK_O) && (f2 == KeyEvent.CTRL_MASK)) { openpage(); return; }
if ((f1 == KeyEvent.VK_F) && (f2 == KeyEvent.CTRL_MASK)) { find(); return; }
if ((f1 == KeyEvent.VK_G) && (f2 == KeyEvent.CTRL_MASK)) { findagain(false); return; }
if ((f1 == KeyEvent.VK_F3) && (f2 == 0)) { findagain(false); return; }
if ((f1 == KeyEvent.VK_R) && (f2 == KeyEvent.CTRL_MASK)) { replace(); return; }
if ((f1 == KeyEvent.VK_L) && (f2 == KeyEvent.CTRL_MASK)) { gotopos(); return; }
if ((f1 == KeyEvent.VK_E) && (f2 == KeyEvent.CTRL_MASK)) { execute(); return; }
if ((f1 == KeyEvent.VK_P) && (f2 == KeyEvent.CTRL_MASK)) { print(); return; }
if ((f2 == KeyEvent.ALT_MASK) && (f1 >= KeyEvent.VK_0) && (f1 <= KeyEvent.VK_9)) {
idx = f1 - KeyEvent.VK_0;
if (idx == 0) idx = 9; else idx--;
if (idx >= pages.size()) return;
tabs.setSelectedIndex(idx);
return;
}
if ((f2 == KeyEvent.ALT_MASK) && (f1 == KeyEvent.VK_MINUS)) tabs.setSelectedIndex(10);
if ((f2 == KeyEvent.ALT_MASK) && (f1 == KeyEvent.VK_EQUALS)) tabs.setSelectedIndex(11);
}
private enum Section {None, Folders, Files};
private ArrayList<String> folders = new ArrayList<String>();
private ArrayList<String> files = new ArrayList<String>();
private void loadProject() {
if (!new File(".project").exists()) return;
try {
FileInputStream fis = new FileInputStream(".project");
String project = new String(JF.readAll(fis));
fis.close();
String lns[] = project.replaceAll("\r", "").split("\n");
Section sec = Section.None;
for(int a=0;a<lns.length;a++) {
String ln = lns[a].toLowerCase().trim();
switch (ln) {
case "[folders]": sec = Section.Folders; break;
case "[files]": sec = Section.Files; break;
default:
if (ln.length() == 0) break;
if (ln.charAt(0) == '[') break;
switch (sec) {
case Folders: folders.add(ln); break;
case Files: files.add(ln); break;
}
break;
}
}
//TODO : build Tree
} catch (Exception e) {
e.printStackTrace();
}
}
private void cut() {
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
txt.cut();
}
private void copy() {
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
txt.copy();
}
private void paste() {
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
txt.paste();
}
private void delete() {
int idx = getidx();
JFTextArea txt = pages.get(idx).txt;
txt.replaceSelection("");
}
public void actionPerformed(ActionEvent ae) {
String a = ae.getActionCommand();
switch (a) {
case "Cut": cut(); break;
case "Copy": copy(); break;
case "Paste": paste(); break;
case "Delete": delete(); break;
}
}
}