//package javaGUI;
import java.awt.*;
import java.beans.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import javax.swing.tree.*;
import java.io.*;
import java.util.*;
//import gfWindow.GrammarFilter;
public class GFEditor2 extends JFrame implements ActionListener, CaretListener,
KeyListener, FocusListener {
public JPopupMenu popup2 = new JPopupMenu();
public JMenuItem menuItem2;
public static JTextField field = new JTextField("textField!");
public javax.swing.Timer timer2 = new javax.swing.Timer(500, this);
public MouseEvent m2;
public static String selectedText="";
public static boolean debug = false;
public static boolean debug3 = false;
public static boolean debug2 = true;
public static boolean selectionCheck = false;
public static String focusPosition = "";
public static String stringToAppend = "";
public static Vector currentPosition = new Vector();
public static int selStart = -1;
public static int selEnd = -1;
//public static int oldSelStart = 0;
public static String restString = "";
public static int currentLength = 0;
public static int newLength = 0;
public static int oldLength = 0;
public static int addedLength = 0;
public static boolean newObject = false;
public static boolean finished = false;
private String parseInput = "";
private String alphaInput = "";
private static String status = "status";
private static String selectedMenuLanguage = "Abstract";
private static String linearization = "";
private String termInput = "";
private static String outputString = "";
private static String treeString = "";
private static String fileString = "";
public static Vector commands = new Vector();
public static Vector outputVector = new Vector();
public static Hashtable nodeTable = new Hashtable();
JFileChooser fc1 = new JFileChooser("./");
JFileChooser fc = new JFileChooser("./");
private String [] filterMenu = {"Filter", "identity",
"erase", "take100", "text", "code", "latexfile",
"structured", "unstructured" };
private String [] modifyMenu = {"Modify", "identity","transfer",
"compute", "paraphrase", "typecheck", "solve", "context" };
// private String [] modeMenu = {"Menus", "printname",
// "plain", "short", "long", "typed", "untyped" };
private static String [] newMenu = {"New"};
private static boolean firstLin = true;
private static boolean waiting = false;
public static boolean treeChanged = true;
private static String result;
private static BufferedReader fromProc;
private static BufferedWriter toProc;
private static String commandPath = new String("GF");
private static JTextArea output = new JTextArea();
public static DefaultListModel listModel= new DefaultListModel();
private JList list = new JList(listModel);
private static DynamicTree2 tree = new DynamicTree2();
private JLabel grammar = new JLabel("No topic ");
private JButton save = new JButton("Save");
private JButton open = new JButton("Open");
private JButton newTopic = new JButton("New Topic");
private JButton gfCommand = new JButton("GF command");
private JButton leftMeta = new JButton("?<");
private JButton left = new JButton("<");
private JButton top = new JButton("Top");
private JButton right = new JButton(">");
private JButton rightMeta = new JButton(">?");
private JButton read = new JButton("Read");
// private JButton parse = new JButton("Parse");
// private JButton term = new JButton("Term");
private JButton alpha = new JButton("Alpha");
private JButton random = new JButton("Random");
private JButton undo = new JButton("Undo");
private JPanel inputPanel = new JPanel();
private JPanel inputPanel2 = new JPanel();
private JPanel inputPanel3 = new JPanel();
private JButton ok = new JButton("OK");
private JButton cancel = new JButton("Cancel");
private JTextField inputField = new JTextField();
private JLabel inputLabel = new JLabel("Read: ");
private JButton browse = new JButton("Browse...");
private ButtonGroup readGroup = new ButtonGroup();
private JRadioButton termReadButton = new JRadioButton("Term");
private JRadioButton stringReadButton = new JRadioButton("String");
private JDialog dialog;
private static JComboBox menu = new JComboBox(newMenu);
private JComboBox filter = new JComboBox(filterMenu);
private JComboBox modify = new JComboBox(modifyMenu);
// private JComboBox mode = new JComboBox(modeMenu);
private JPanel downPanel = new JPanel();
private JSplitPane treePanel;
private JPanel upPanel = new JPanel();
private JPanel middlePanel = new JPanel();
private JPanel middlePanelUp = new JPanel();
private JPanel middlePanelDown = new JPanel();
private JSplitPane centerPanel;
private static JFrame gui2 = new JFrame();
private JPanel centerPanel2= new JPanel();
private JPanel centerPanelDown = new JPanel();
private JScrollPane outputPanelDown = new JScrollPane(list);
private JScrollPane outputPanelCenter = new JScrollPane(output);
private JPanel outputPanelUp = new JPanel();
private JPanel statusPanel = new JPanel();
private static JLabel statusLabel = new JLabel(status);
private Container cp;
private static JMenuBar menuBar= new JMenuBar();;
private static ButtonGroup menuGroup = new ButtonGroup();
private JMenu viewMenu= new JMenu("View");
private JMenu submenu= new JMenu("language");
private JMenu modeMenu= new JMenu("Menus");
private static JMenu langMenu= new JMenu("Languages");
private static JMenu fileMenu= new JMenu("File");
private JRadioButtonMenuItem rbMenuItem;
private JRadioButtonMenuItem rbMenuItemLong;
// private JRadioButtonMenuItem rbMenuItemAbs;
private JRadioButtonMenuItem rbMenuItemUnTyped;
private static JMenuItem fileMenuItem;
private static JCheckBoxMenuItem cbMenuItem;
private static RadioListener myListener ;
private static ButtonGroup group = new ButtonGroup();
private static ButtonGroup languageGroup = new ButtonGroup();
public GFEditor2()
{
this.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
endProgram();
}
});
//Add listener to components that can bring up popup menus.
MouseListener popupListener2 = new PopupListener();
output.addMouseListener(popupListener2);
timer2.setRepeats(false);
setJMenuBar(menuBar);
setTitle("GF Syntax Editor");
viewMenu.setToolTipText("View settings");
fileMenu.setToolTipText("Main operations");
langMenu.setToolTipText("Language settings");
menuBar.add(fileMenu);
menuBar.add(langMenu);
menuBar.add(viewMenu);
menuBar.add(modeMenu);
cbMenuItem = new JCheckBoxMenuItem("Tree");
cbMenuItem.setActionCommand("showTree");
myListener = new RadioListener();
cbMenuItem.addActionListener(myListener);
cbMenuItem.setSelected(true);
viewMenu.add(cbMenuItem);
viewMenu.addSeparator();
fileMenuItem = new JMenuItem("Open...");
fileMenuItem.setActionCommand("open");
fileMenuItem.addActionListener(this);
fileMenu.add(fileMenuItem);
fileMenuItem = new JMenuItem("New Topic...");
fileMenuItem.setActionCommand("newTopic");
fileMenuItem.addActionListener(this);
fileMenu.add(fileMenuItem);
fileMenuItem = new JMenuItem("Reset");
fileMenuItem.setActionCommand("reset");
fileMenuItem.addActionListener(this);
fileMenu.add(fileMenuItem);
fileMenuItem = new JMenuItem("Save As...");
fileMenuItem.setActionCommand("save");
fileMenuItem.addActionListener(this);
fileMenu.add(fileMenuItem);
fileMenu.addSeparator();
fileMenuItem = new JMenuItem("Exit");
fileMenuItem.setActionCommand("quit");
fileMenuItem.addActionListener(this);
fileMenu.add(fileMenuItem);
rbMenuItem = new JRadioButtonMenuItem("One window");
rbMenuItem.setActionCommand("combine");
rbMenuItem.addActionListener(myListener);
rbMenuItem.setSelected(true);
/* rbMenuItem.setMnemonic(KeyEvent.VK_R);
rbMenuItem.setAccelerator(KeyStroke.getKeyStroke(
KeyEvent.VK_1, ActionEvent.ALT_MASK));
rbMenuItem.getAccessibleContext().setAccessibleDescription(
"This doesn't really do anything");
*/
menuGroup.add(rbMenuItem);
viewMenu.add(rbMenuItem);
rbMenuItem = new JRadioButtonMenuItem("Split windows");
rbMenuItem.setMnemonic(KeyEvent.VK_O);
rbMenuItem.setActionCommand("split");
rbMenuItem.addActionListener(myListener);
menuGroup.add(rbMenuItem);
viewMenu.add(rbMenuItem);
modeMenu.add(submenu);
/* rbMenuItemAbs = new JRadioButtonMenuItem("Abstract");
rbMenuItemAbs.setActionCommand("Abstract");
rbMenuItemAbs.addActionListener(myListener);
languageGroup.add(rbMenuItemAbs);
*/
modeMenu.addSeparator();
menuGroup = new ButtonGroup();
rbMenuItemLong = new JRadioButtonMenuItem("long");
rbMenuItemLong.setActionCommand("long");
rbMenuItemLong.setSelected(true);
rbMenuItemLong.addActionListener(myListener);
menuGroup.add(rbMenuItemLong);
modeMenu.add(rbMenuItemLong);
rbMenuItem = new JRadioButtonMenuItem("short");
rbMenuItem.setActionCommand("short");
rbMenuItem.addActionListener(myListener);
menuGroup.add(rbMenuItem);
modeMenu.add(rbMenuItem);
modeMenu.addSeparator();
menuGroup = new ButtonGroup();
rbMenuItem = new JRadioButtonMenuItem("typed");
rbMenuItem.setActionCommand("typed");
rbMenuItem.addActionListener(myListener);
rbMenuItem.setSelected(false);
menuGroup.add(rbMenuItem);
modeMenu.add(rbMenuItem);
rbMenuItemUnTyped = new JRadioButtonMenuItem("untyped");
rbMenuItemUnTyped.setSelected(true);
rbMenuItemUnTyped.setActionCommand("untyped");
rbMenuItemUnTyped.addActionListener(myListener);
menuGroup.add(rbMenuItemUnTyped);
modeMenu.add(rbMenuItemUnTyped);
cp = getContentPane();
cp.setLayout(new BorderLayout());
output.setToolTipText("Linearizations' display area");
output.addCaretListener(this);
output.setEditable(false);
output.setLineWrap(true);
output.setWrapStyleWord(true);
output.setSelectionColor(Color.green);
// output.setSelectionColor(Color.white);
// output.setFont(new Font("Arial Unicode MS", Font.PLAIN, 17));
output.setFont(new Font(null, Font.PLAIN, 17));
field.setFont(new Font(null, Font.PLAIN, 17));
field.setFocusable(true);
field.addKeyListener(this);
field.addFocusListener(this);
// System.out.println(output.getFont().getFontName());
gfCommand.setToolTipText("Sending a command to GF");
read.setToolTipText("Refining with term or linearization from typed string or file");
modify.setToolTipText("Choosing a linearization method");
alpha.setToolTipText("Performing alpha-conversion");
random.setToolTipText("Generating random refinement");
undo.setToolTipText("Going back to the previous state");
downPanel.add(gfCommand);
//downPanel.add(parse);
//downPanel.add(term);
downPanel.add(read);
downPanel.add(modify);
downPanel.add(alpha);
downPanel.add(random);
downPanel.add(undo);
leftMeta.setToolTipText("Moving the focus to the previous metavariable");
rightMeta.setToolTipText("Moving the focus to the next metavariable");
left.setToolTipText("Moving the focus to the previous term");
right.setToolTipText("Moving the focus to the next term");
top.setToolTipText("Moving the focus to the top term");
middlePanelUp.add(leftMeta);
middlePanelUp.add(left);
middlePanelUp.add(top);
middlePanelUp.add(right);
middlePanelUp.add(rightMeta);
middlePanelDown.add(new JLabel("Select Action on Subterm"));
middlePanel.setLayout(new BorderLayout());
middlePanel.add(middlePanelUp, BorderLayout.NORTH);
middlePanel.add(middlePanelDown, BorderLayout.CENTER);
menu.setToolTipText("The list of available categories to start editing");
open.setToolTipText("Reading both a new environment and an editing object from file. Current editing will be discarded");
save.setToolTipText("Writing the current editing object to file in the term or text format");
grammar.setToolTipText("Current Topic");
newTopic.setToolTipText("Reading a new environment from file. Current editing will be discarded.");
upPanel.add(grammar);
upPanel.add(menu);
upPanel.add(open);
upPanel.add(save);
upPanel.add(newTopic);
filter.setToolTipText("Choosing the linearization representation format");
modeMenu.setToolTipText("Choosing the refinement options' representation");
statusLabel.setToolTipText("The current focus type");
list.setToolTipText("The list of current refinment options");
tree.setToolTipText("The abstract syntax tree representation of the current editing object");
upPanel.add(filter);
//upPanel.add(mode);
populateTree(tree);
outputPanelUp.setLayout(new BorderLayout());
outputPanelUp.add(outputPanelCenter, BorderLayout.CENTER);
outputPanelUp.add(statusPanel, BorderLayout.SOUTH);
statusPanel.setLayout(new GridLayout(1,1));
statusPanel.add(statusLabel);
treePanel = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
tree, outputPanelUp);
treePanel.setDividerSize(5);
treePanel.setDividerLocation(100);
centerPanel2.setLayout(new BorderLayout());
gui2.setSize(350,150);
gui2.setTitle("Select Action on Subterm");
gui2.setLocationRelativeTo(treePanel);
centerPanelDown.setLayout(new BorderLayout());
centerPanel = new JSplitPane(JSplitPane.VERTICAL_SPLIT,
treePanel, centerPanelDown);
centerPanel.addKeyListener(tree);
centerPanel.setOneTouchExpandable(true);
centerPanelDown.add(middlePanel, BorderLayout.NORTH);
centerPanelDown.add(outputPanelDown, BorderLayout.CENTER);
cp.add(centerPanel, BorderLayout.CENTER);
cp.add(upPanel, BorderLayout.NORTH);
cp.add(downPanel, BorderLayout.SOUTH);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
MouseListener mouseListener = new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
listAction(list.locationToIndex(e.getPoint()));
}
}
};
list.addMouseListener(mouseListener);
list.addKeyListener(this);
menu.addActionListener(this);
save.addActionListener(this);
open.addActionListener(this);
newTopic.addActionListener(this);
gfCommand.addActionListener(this);
filter.addActionListener(this);
filter.setMaximumRowCount(9);
leftMeta.addActionListener(this);
left.addActionListener(this);
menu.setFocusable(false);
save.setFocusable(false);
save.setActionCommand("save");
open.setFocusable(false);
open.setActionCommand("open");
newTopic.setFocusable(false);
newTopic.setActionCommand("newTopic");
gfCommand.setFocusable(false);
filter.setFocusable(false);
leftMeta.setFocusable(false);
left.setFocusable(false);
top.addActionListener(this);
right.addActionListener(this);
rightMeta.addActionListener(this);
//parse.addActionListener(this);
//term.addActionListener(this);
read.addActionListener(this);
modify.addActionListener(this);
//mode.addActionListener(this);
alpha.addActionListener(this);
random.addActionListener(this);
undo.addActionListener(this);
top.setFocusable(false);
right.setFocusable(false);
rightMeta.setFocusable(false);
//parse.setFocusable(false);
//term.setFocusable(false);
read.setFocusable(false);
modify.setFocusable(false);
//mode.setFocusable(false);
alpha.setFocusable(false);
random.setFocusable(false);
undo.setFocusable(false);
output.addKeyListener(tree);
setSize(800,730);
outputPanelUp.setPreferredSize(new Dimension(500,300));
treePanel.setDividerLocation(0.3);
nodeTable.put(new TreePath(DynamicTree2.rootNode.getPath()), new Integer(0));
setVisible(true);
JRadioButton termButton = new JRadioButton("Term");
termButton.setActionCommand("term");
termButton.setSelected(true);
JRadioButton linButton = new JRadioButton("Text");
linButton.setActionCommand("lin");
// Group the radio buttons.
group.add(linButton);
group.add(termButton);
JPanel buttonPanel = new JPanel();
buttonPanel.setPreferredSize(new Dimension(70, 70));
buttonPanel.add(new JLabel("Format:"));
buttonPanel.add(linButton);
buttonPanel.add(termButton);
fc1.setAccessory(buttonPanel);
termReadButton.setActionCommand("term");
stringReadButton.setSelected(true);
stringReadButton.setActionCommand("lin");
// Group the radio buttons.
readGroup.add(stringReadButton);
readGroup.add(termReadButton);
JPanel readButtonPanel = new JPanel();
readButtonPanel.setLayout(new GridLayout(3,1));
readButtonPanel.setPreferredSize(new Dimension(70, 70));
readButtonPanel.add(new JLabel("Format:"));
readButtonPanel.add(stringReadButton);
readButtonPanel.add(termReadButton);
dialog= new JDialog(this, "Input");
dialog.setLocationRelativeTo(this);
dialog.getContentPane().add(inputPanel);
inputPanel.setLayout(new BorderLayout(10,10));
inputPanel3.setLayout(new GridLayout(2,1,5,5));
inputPanel3.add(inputLabel);
inputPanel3.add(inputField);
ok.addActionListener(this);
browse.addActionListener(this);
cancel.addActionListener(this);
inputField.setPreferredSize(new Dimension(300,23));
inputPanel.add(inputPanel3, BorderLayout.CENTER);
inputPanel.add(new JLabel(" "), BorderLayout.WEST);
inputPanel.add(readButtonPanel, BorderLayout.EAST);
inputPanel.add(inputPanel2, BorderLayout.SOUTH);
inputPanel2.add(ok);
inputPanel2.add(cancel);
inputPanel2.add(browse);
dialog.setSize(350,135);
try {
result = fromProc.readLine();
while(result != null) {
finished = false;
if (debug) System.out.println("1 "+result);
while (result.indexOf("gf")==-1){
outputString +=result+"\n";
result = fromProc.readLine();
if (debug) System.out.println("1 "+result);
}
appendMarked(outputString, -1,-1);
while ((result.indexOf("newcat")==-1)&&(result.indexOf("8)
s+=result.trim();
else
s+=result;
}
}
// if (s.charAt(0)!='d')
// listModel.addElement("Refine " + s);
// else
listModel.addElement(s);
s="";
//read /show
//read send
result = fromProc.readLine();
if (debug) System.out.println("8 "+result);
result = fromProc.readLine();
if (debug) System.out.println("8 "+result);
saveCommand();
// read /item
result = fromProc.readLine();
if (debug) System.out.println("8 "+result);
result = fromProc.readLine();
if (debug) System.out.println("8 "+result);
}
} catch(IOException e){ }
}
public static void saveCommand(){
if (newObject) commands.add(result);
try {
result = fromProc.readLine();
if (debug) System.out.println("9 "+result);
} catch(IOException e){ }
}
public void readLin(){
try {
linearization="";
linearization += result+"\n";
result = fromProc.readLine();
if (debug) System.out.println("6 "+result);
while (result.indexOf("/linearization")==-1){
linearization += result+"\n";
result = fromProc.readLine();
if (debug) System.out.println("6 "+result);
}
if (newObject) formLin();
result = fromProc.readLine();
if (debug) System.out.println("6 "+result);
} catch(IOException e){ }
}
public static void readTree(){
try {
result = fromProc.readLine();
if (debug) System.out.println("6 "+result);
while (result.indexOf("/tree")==-1){
treeString += result+"\n";
result = fromProc.readLine();
if (debug) System.out.println("6 "+result);
}
if (treeChanged && (newObject)) {
formTree(tree);
treeChanged = false;
}
treeString="";
result = fromProc.readLine();
if (debug) System.out.println("6 "+result);
} catch(IOException e){ }
}
public static void readMessage(){
String s ="";
try {
result = fromProc.readLine();
if (debug) System.out.println("7 "+result);
while (result.indexOf("/message")==-1){
s += result+"\n";
result = fromProc.readLine();
if (debug) System.out.println("7 "+result);
}
if (s.length()>1)
appendMarked("-------------"+'\n'+s,-1,-1);
result = fromProc.readLine();
if (debug) System.out.println("7 "+result);
} catch(IOException e){ }
}
public void formNewMenu () {
boolean more = true;
try {
result = fromProc.readLine();
if (debug) System.out.println("2 "+result);
while (more){
if (result.indexOf("topic")==-1) {
menu.addItem(result.substring(6));
}
else
more = false;
result = fromProc.readLine();
if (debug) System.out.println("2 "+result);
result = fromProc.readLine();
if (debug) System.out.println("3 "+result);
if (result.indexOf("topic")!=-1)
more = false;
result = fromProc.readLine();
if (debug) System.out.println("4 "+result);
}
grammar.setText(result.substring(4)+" ");
result = fromProc.readLine();
if (debug) System.out.println("2 "+result);
result = fromProc.readLine();
if (debug) System.out.println("3 "+result);
result = fromProc.readLine();
if (debug) System.out.println("4 "+result);
more = true;
while (more){
if ((result.indexOf("/gf")==-1)&&(result.indexOf("lin")==-1)) {
//form lang and Menu menu:
cbMenuItem = new JCheckBoxMenuItem(result.substring(4));
if (debug) System.out.println ("menu item: "+result.substring(4));
if ((result.substring(4)).equals("Abstract"))
cbMenuItem.setSelected(false);
else
cbMenuItem.setSelected(true);
cbMenuItem.setActionCommand("lang");
cbMenuItem.addActionListener(myListener);
langMenu.add(cbMenuItem);
/*
{
submenu.add(rbMenuItemAbs);
if (selectedMenuLanguage.equals("Abstract"))
rbMenuItemAbs.setSelected(true);
languageGroup.add(rbMenuItemAbs);
}
else
{
*/
rbMenuItem = new JRadioButtonMenuItem(result.substring(4));
rbMenuItem.setActionCommand(result.substring(4));
rbMenuItem.addActionListener(myListener);
languageGroup.add(rbMenuItem);
if ((result.substring(4)).equals(selectedMenuLanguage))
{
System.out.println("Selecting "+selectedMenuLanguage);
rbMenuItem.setSelected(true);
}
submenu.add(rbMenuItem);
// }
}
else
more = false;
// read
result = fromProc.readLine();
if (debug) System.out.println("2 "+result);
// read or
result = fromProc.readLine();
if (debug) System.out.println("3 "+result);
if ((result.indexOf("/gf")!=-1)||(result.indexOf("lin")!=-1))
more = false;
if (result.indexOf("/gf")!=-1)
finished = true;
// registering the file name:
if (result.indexOf("language")!=-1) {
String path = result.substring(result.indexOf('=')+1,
result.indexOf('>'));
path =path.substring(path.lastIndexOf('/')+1);
if (debug) System.out.println("name: "+path);
fileString +="--" + path +"\n";
if (path.lastIndexOf('.')!=path.indexOf('.'))
grammar.setText(path.substring(0,
path.indexOf('.')).toUpperCase()+" ");
}
result = fromProc.readLine();
if (debug) System.out.println("4 "+result);
}
if (debug)
System.out.println("languageGroupElement formed"+
languageGroup.getButtonCount());
langMenu.addSeparator();
fileMenuItem = new JMenuItem("Add...");
fileMenuItem.setActionCommand("import");
fileMenuItem.addActionListener(this);
langMenu.add(fileMenuItem);
// in order to get back in main in the beggining of while:
result = fromProc.readLine();
} catch(IOException e){ }
}
public void outputAppend(){
int i, j, k, l, l2, selectionLength, m=0, n=0;
if (debug2)
System.out.println("INPUT:"+result);
l = result.indexOf("',i);
l2 = result.indexOf("focus");
if (l2!=-1){
// in case focus tag is cut into two lines:
if (l==-1) l=l2-7;
m=result.indexOf("position",l);
if (debug2) System.out.println("POSITION START: "+m);
n=result.indexOf("]",m);
if (debug2) System.out.println("POSITION END: "+n);
if (debug)
System.out.println("form Lin1: "+result);
focusPosition = result.substring(m+9,n+1);
statusLabel.setText(" "+result.substring(i+5,j));
//cutting
result= result.substring(0,l)+result.substring(j+2);
i=result.indexOf("/focus",l);
selectionLength = i-l-1;
if (debug2)
System.out.println("selection length: "+selectionLength);
j=result.indexOf('>',i);
k=result.length()-j-1;
if (debug) System.out.println("form Lin2: "+result);
if (debug)
System.out.println("char at the previous position"+result.charAt(i-1));
//cutting
// in case focus tag is cut into two lines:
if (result.charAt(i-1)!='<')
// check if punktualtion marks like . ! ? are at the end of a sentence:
if (result.charAt(j+1)==' ')
result= result.substring(0,i-8)+result.substring(j+2);
else
result= result.substring(0,i-9)+result.substring(j+1);
else
if (result.charAt(j+1)==' ')
result= result.substring(0,i-1)+result.substring(j+2);
else
result= result.substring(0,i-2)+result.substring(j+1);
j= result.indexOf("');
String s = result.substring(ind+1,ind2);
result = lin.substring(0,lin.indexOf(""));
lin = lin.substring(lin.indexOf(""));
while (lin.length()>1) {
//check if the language is on
if (!visible) visible = true;
// in the list?
for (int i=0; i
lin = lin.substring(lin.indexOf('\n')+1);
// read lin or 'end'
if (lin.length()<1) break;
result = lin.substring(0,lin.indexOf('\n'));
lin = lin.substring(lin.indexOf('\n')+1);
if (result.indexOf("');
s = result.substring(ind+1,ind2);
result = lin.substring(0,lin.indexOf(""));
lin = lin.substring(lin.indexOf(""));
}
}
}
public void actionPerformed(ActionEvent ae)
{
boolean abs = true;
Object obj = ae.getSource();
if ( obj == menu ) {
if (!menu.getSelectedItem().equals("New"))
{
treeChanged = true;
send("n " + menu.getSelectedItem());
newObject = true;
menu.setSelectedIndex(0);
}
}
if ( obj == filter ) {
if (!filter.getSelectedItem().equals("Filter"))
{
send("f " + filter.getSelectedItem());
filter.setSelectedIndex(0);
}
}
if ( obj == modify ) {
if (!modify.getSelectedItem().equals("Modify"))
{
treeChanged = true;
send("c " + modify.getSelectedItem());
modify.setSelectedIndex(0);
}
}
if (obj==timer2){
if (debug3) System.out.println("changing pop-up menu2!");
popup2.removeAll();
for (int i = 0; i0)
{
for (Enumeration e = languageGroup.getElements();
e.hasMoreElements() ;)
{
ab = (AbstractButton)e.nextElement();
System.out.println("more to remove ! "+ab.getText());
languageGroup.remove(ab);
}
System.out.println("languageGroupElement after import removal "+
languageGroup.getButtonCount());
}
submenu.removeAll();
File file = fc1.getSelectedFile();
// opening the file for editing :
if (debug) System.out.println("opening: "+ file.getPath().replace('\\','/'));
if (group.getSelection().getActionCommand().equals("term")) {
if (debug) System.out.println(" opening as a term ");
send("open "+ file.getPath().replace('\\','/'));
}
else {
if (debug) System.out.println(" opening as a linearization ");
send("openstring "+ file.getPath().replace('\\','/'));
}
fileString ="";
grammar.setText("No Topic ");
}
}
if ( name.equals("import") ) {
if (fc.getChoosableFileFilters().length<2)
fc.addChoosableFileFilter(new GrammarFilter());
int returnVal = fc.showOpenDialog(GFEditor2.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
// importing a new language :
if (debug) System.out.println("importing: "+ file.getPath());
langMenu.removeAll();
AbstractButton ab = null;
while (languageGroup.getButtonCount()>0)
{
for (Enumeration e = languageGroup.getElements();
e.hasMoreElements() ;)
{
ab = (AbstractButton)e.nextElement();
System.out.println("more to remove ! "+ab.getText());
languageGroup.remove(ab);
}
System.out.println("languageGroupElement after import removal "+
languageGroup.getButtonCount());
}
submenu.removeAll();
menu.removeAllItems();
menu.addItem("New");
fileString ="";
send("i "+ file.getPath().replace('\\','/'));
}
}
if ( name.equals("newTopic") ) {
if (fc.getChoosableFileFilters().length<2)
fc.addChoosableFileFilter(new GrammarFilter());
int returnVal = fc.showOpenDialog(GFEditor2.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
int n = JOptionPane.showConfirmDialog(this,
"This will dismiss the previous editing. Would you like to continue?",
"Starting a new topic", JOptionPane.YES_NO_OPTION);
if (n == JOptionPane.YES_OPTION){
File file = fc.getSelectedFile();
// importing a new grammar :
newObject = false;
statusLabel.setText(status);
listModel.clear();
tree.clear();
populateTree(tree);
menu.removeAllItems();
menu.addItem("New");
langMenu.removeAll();
AbstractButton ab = null;
while (languageGroup.getButtonCount()>0)
{
for (Enumeration e = languageGroup.getElements();
e.hasMoreElements() ;)
{
ab = (AbstractButton)e.nextElement();
System.out.println("more to remove ! "+ab.getText());
languageGroup.remove(ab);
}
System.out.println("languageGroupElement after import removal "+
languageGroup.getButtonCount());
}
selectedMenuLanguage = "Abstract";
rbMenuItemLong.setSelected(true);
rbMenuItemUnTyped.setSelected(true);
submenu.removeAll();
fileString="";
grammar.setText("No Topic ");
send("e "+ file.getPath().replace('\\','/'));
}
}
}
if ( obj == gfCommand ){
String s = JOptionPane.showInputDialog("Command:", parseInput);
if (s!=null) {
parseInput = s;
//s = "gf "+s; This is for debugging, otherwise shift the comment to the next line.
treeChanged = true;
send(s);
}
}
if ( name.equals("reset") ) {
newObject = false;
statusLabel.setText(status);
listModel.clear();
tree.clear();
populateTree(tree);
menu.removeAllItems();
menu.addItem("New");
langMenu.removeAll();
AbstractButton ab = null;
while (languageGroup.getButtonCount()>0)
{
for (Enumeration e = languageGroup.getElements();
e.hasMoreElements() ;)
{
ab = (AbstractButton)e.nextElement();
System.out.println("more to remove ! "+ab.getText());
languageGroup.remove(ab);
}
System.out.println("languageGroupElement after import removal "+
languageGroup.getButtonCount());
}
selectedMenuLanguage = "Abstract";
submenu.removeAll();
rbMenuItemLong.setSelected(true);
rbMenuItemUnTyped.setSelected(true);
fileString="";
grammar.setText("No Topic ");
send("e");
}
if ( obj == leftMeta ) {
treeChanged = true;
send("<<");
}
if ( obj == left ) {
treeChanged = true;
send("<");
}
if ( obj == top ) {
treeChanged = true;
send("'");
}
if ( obj == right ) {
treeChanged = true;
send(">");
}
if ( obj == rightMeta ) {
treeChanged = true;
send(">>");
}
if ( obj == cancel ) {
dialog.hide();
}
if ( obj == browse ) {
if (fc.getChoosableFileFilters().length<2)
fc.addChoosableFileFilter(new GrammarFilter());
int returnVal = fc.showOpenDialog(GFEditor2.this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File file = fc.getSelectedFile();
inputField.setText(file.getPath().replace('\\','/'));
}
}
if ( obj == ok ) {
treeChanged = true;
if (termReadButton.isSelected()) {
termInput = inputField.getText();
if (termInput.indexOf('/')==-1){
send("g "+termInput);
System.out.println("sending term string");
}
else {
send("tfile "+termInput);
System.out.println("sending file term: "+termInput);
}
}
else {
parseInput = inputField.getText();
if (parseInput.indexOf('/')==-1){
send("p "+parseInput);
System.out.println("sending parse string: "+parseInput);
}
else {
send("pfile "+parseInput);
System.out.println("sending file parse string: "+parseInput);
}
}
dialog.hide();
}
if ( obj == read ) {
if (stringReadButton.isSelected())
inputField.setText(parseInput);
else
inputField.setText(termInput);
dialog.show();
}
/* if ( obj == term ) {
inputLabel.setText("Term:");
inputField.setText(termInput);
dialog.show();
}
if ( obj == parse ) {
inputLabel.setText("Parse:");
inputField.setText(parseInput);
dialog.show();
}
*/
if ( obj == alpha){
String s = JOptionPane.showInputDialog("Type string:", alphaInput);
if (s!=null) {
alphaInput = s;
treeChanged = true;
send("x "+s);
}
}
if ( obj == random){
treeChanged = true;
send("a");
}
if ( obj == undo){
treeChanged = true;
send("u");
}
}
} catch (Exception e){}
}
static void writeOutput(String str, String fileName) {
try {
FileOutputStream fos = new FileOutputStream(fileName);
Writer out = new OutputStreamWriter(fos, "UTF8");
out.write(str);
out.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null,
"Document is empty!","Error", JOptionPane.ERROR_MESSAGE);
}
}
public static void populateTree(DynamicTree2 treePanel) {
String p1Name = new String("Root");
DefaultMutableTreeNode p1;
p1 = treePanel.addObject(null, p1Name);
}
public static void formTree(DynamicTree2 treePanel) {
Hashtable table = new Hashtable();
TreePath path=null;
boolean treeStarted = false, selected = false;
String s = treeString;
String name ="";
treePanel.clear();
int j, shift=0, star=0, index = 0;
DefaultMutableTreeNode p2=null, p1=null;
if (debug) System.out.print("treeString: "+ s);
if (s.indexOf('*')!=-1) star = 1;
while (s.length()>0) {
while ((s.length()>0) && ((s.charAt(0)=='*')||(s.charAt(0)==' '))){
if (s.charAt(0) == '*') selected = true;
s = s.substring(1);
shift++;
}
if (s.length()>0) {
j = s.indexOf("\n");
name = s.substring(0, j);
index++;
s = s.substring(j+1);
shift = (shift - star)/2;
p1 = (DefaultMutableTreeNode)table.get(new Integer(shift));
p2 = treePanel.addObject(p1, name);
table.put(new Integer(shift+1), p2);
path = new TreePath(p2.getPath());
nodeTable.put(path, new Integer(index));
if (selected) {
treePanel.tree.setSelectionPath(path);
treePanel.oldSelection = index;
if (debug) System.out.println("new selected index "+ index);
selected = false;
}
treeStarted=true;
}
shift = 0;
}
if ((p2!=null)) {
treePanel.tree.makeVisible(path);
gui2.toFront();
index = 0;
}
}
/** Listens to the radio buttons. */
class RadioListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String action = e.getActionCommand();
if (action.equals("split") ) {
cp.remove(centerPanel);
centerPanel2.add(middlePanelUp, BorderLayout.SOUTH);
if (((JCheckBoxMenuItem)viewMenu.getItem(0)).isSelected()) {
centerPanel2.add(treePanel, BorderLayout.CENTER);
}
else {
centerPanel2.add(outputPanelUp, BorderLayout.CENTER);
}
cp.add(centerPanel2, BorderLayout.CENTER);
gui2.getContentPane().add(outputPanelDown);
gui2.setVisible(true);
pack();
repaint();
}
if (action.equals("combine") ) {
cp.remove(centerPanel2);
middlePanel.add(middlePanelUp, BorderLayout.NORTH);
if (((JCheckBoxMenuItem)viewMenu.getItem(0)).isSelected()) { gui2.setVisible(false);
centerPanel.setLeftComponent(treePanel);
}
else {
centerPanel.setLeftComponent(outputPanelUp);
gui2.setVisible(false);
}
cp.add(centerPanel, BorderLayout.CENTER);
centerPanelDown.add(outputPanelDown, BorderLayout.CENTER);
pack();
repaint();
}
if (action.equals("showTree") ) {
if (!((JCheckBoxMenuItem)e.getSource()).isSelected()){
if (debug) System.out.println("was selected");
cbMenuItem.setSelected(false);
if (((JRadioButtonMenuItem)viewMenu.getItem(2)).isSelected()) {
centerPanel.remove(treePanel);
centerPanel.setLeftComponent(outputPanelUp);
}
else {
centerPanel2.remove(treePanel);
centerPanel2.add(outputPanelUp, BorderLayout.CENTER);
}
}
else {
if (debug) System.out.println("was not selected");
cbMenuItem.setSelected(true);
if (((JRadioButtonMenuItem)viewMenu.getItem(2)).isSelected()) {
centerPanel.remove(outputPanelUp);
treePanel.setRightComponent(outputPanelUp);
centerPanel.setLeftComponent(treePanel);
}
else {
centerPanel2.remove(outputPanelUp);
treePanel.setRightComponent(outputPanelUp);
centerPanel2.add(treePanel, BorderLayout.CENTER);
}
}
pack();
repaint();
}
if (action.equals("lang")) {
if (newObject) {
output.setText("");
formLin();
}
if (debug)
System.out.println("language option has changed "+((JCheckBoxMenuItem)e.getSource()).getText());
if (((JCheckBoxMenuItem)e.getSource()).isSelected()){
System.out.println("turning on");
send("on "+((JCheckBoxMenuItem)e.getSource()).getText());
}
else{
System.out.println("turning off");
send("off "+((JCheckBoxMenuItem)e.getSource()).getText());
}
}
//modeMenus actions:
else {
if ((action.equals("long")) || (action.equals("short")))
{
send("ms " + action);
}
else
if ((action.equals("typed")) || (action.equals("untyped")))
{
send("mt " + action);
}
else
{
selectedMenuLanguage = action;
if (action.equals("Abstract"))
{
send("ml Abs");
}
else
{
System.out.println("sending "+action);
send("ml " + action);
}
}
}
}
}
/** Handle the key pressed event. */
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
Object obj = e.getSource();
if ((keyCode == 10)&&(obj==list)) {
listAction(list.getSelectedIndex());
}
// Processing Enter:
if ((keyCode == 10)&&(obj==field)) {
getLayeredPane().remove(field);
treeChanged = true;
send("p "+field.getText());
System.out.println("sending parse string: "+field.getText());
repaint();
}
// Processing Escape:
if ((keyCode == 27)&&(obj==field)) {
getLayeredPane().remove(field);
repaint();
}
}
/** Handle the key typed event. */
public void keyTyped(KeyEvent e) {
}
/** Handle the key released event. */
public void keyReleased(KeyEvent e) {
}
public String comparePositions(String first, String second)
{
String common ="[]";
int i = 1;
while ((i0&&(end-1)&&(start=0)&&(((MarkedArea)outputVector.elementAt(i)).begin > start))
i--;
if (debug2)
System.out.println("i: "+i+" j: "+j);
if ((j=jElement.begin)
{
iElement = (MarkedArea)outputVector.elementAt(0);
iPosition = iElement.position;
if (debug2)
System.out.println("Less: "+jPosition+" and "+iPosition);
position = findMax(0,j);
if (debug2)
System.out.println("SELECTEDTEXT: "+position+"\n");
treeChanged = true;
send("mp "+position);
}
// before:
else
if (debug2)
System.out.println("BEFORE vector of size: "+outputVector.size());
}
// just:
else
{
iElement = (MarkedArea)outputVector.elementAt(i);
iPosition = iElement.position;
if (debug2)
System.out.println("SELECTED TEXT Just: "+iPosition +" and "+jPosition+"\n");
position = findMax(i,j);
if (debug2)
System.out.println("SELECTEDTEXT: "+position+"\n");
treeChanged = true;
send("mp "+position);
}
}
else
// more && after:
if (i>=0)
{
iElement = (MarkedArea)outputVector.elementAt(i);
iPosition = iElement.position;
// more
if (start<=iElement.end)
{
jElement = (MarkedArea)outputVector.elementAt(outputVector.size()-1);
jPosition = jElement.position;
if (debug2)
System.out.println("MORE: "+iPosition+ " and "+jPosition);
position = findMax(i,outputVector.size()-1);
if (debug2)
System.out.println("SELECTEDTEXT: "+position+"\n");
treeChanged = true;
send("mp "+position);
}
else
// after:
if (debug2)
System.out.println("AFTER vector of size: "+outputVector.size());
}
else
// bigger:
{
iElement = (MarkedArea)outputVector.elementAt(0);
iPosition = iElement.position;
jElement = (MarkedArea)outputVector.elementAt(outputVector.size()-1);
jPosition = jElement.position;
if (debug2)
System.out.println("BIGGER: "+iPosition +" and "+jPosition+"\n");
if (debug2)
System.out.println("SELECTEDTEXT: []\n");
treeChanged = true;
send("mp []");
}
}//not null selection
}
public static void appendMarked(String s, int selectionStart, int selectionEnd)
{ if (s.length()>0)
{
if (debug2)
System.out.println("STRING: "+s);
if (debug2)
System.out.println("where selection start is: "+selectionStart);
if (debug2)
System.out.println("where selection end is: "+selectionEnd);
currentLength = 0;
newLength=0;
oldLength = output.getText().length();
int j, l, l2, n, pos, selStartTotal, selEndTotal, selEndT;
restString = s;
int m2, m1;
String position = "";
// if ((selectionStart>-1)&&(selectionEnd>=selectionStart))
if (selectionStart>-1)
{
selStart = selectionStart;
selEnd = selectionEnd;
if (debug2)
System.out.println("SELECTION: " + selStart + " "+selEnd+ "TOTAL: "+s.length());
if (selEnd>selStart)
selectionCheck = (s.substring(selStart, selEnd).indexOf("<")==-1);
l = restString.indexOf("-1)||(l>-1))
{
if ((l2==-1)||((l-1)))
{
j = restString.indexOf(">",l);
n = restString.indexOf("<",j);
m1 = restString.indexOf("[",l);
m2 = restString.indexOf("]",l);
//getting position:
position = restString.substring(m1,m2+1);
// something before the tag:
if (l-currentLength>1)
{
if (debug2)
System.out.println("SOMETHING BEFORE THE TAG");
if (currentPosition.size()>0)
register(currentLength, l, (String)currentPosition.elementAt(currentPosition.size()-1));
else
register(currentLength, l, "[]");
}
// nothing before the tag:
else
{
if (debug2)
System.out.println("NOTHING BEFORE THE TAG");
if (n>0)
register(j+2, n, position);
else
register(j+2, restString.length(), position);
removeSubTreeTag(l,j+1);
}
currentLength += newLength ;
} // l tag:
if (l2-currentLength>1)
{
if (debug2)
System.out.println("SOMETHING BEFORE THE TAG");
if (currentPosition.size()>0)
register(currentLength, l2, (String)currentPosition.elementAt(currentPosition.size()-1));
else
register(currentLength, l2, "[]");
currentLength += newLength ;
}
// nothing before the tag:
else
// punctuation after the tag:
if (restString.substring(l2+10,l2+11).trim().length()>0)
{
if (debug2)
System.out.println("PUNCTUATION AFTER THE TAG");
if (debug2) System.out.println("STRING: "+restString);
//cutting the tag first!:
if (l2>0)
removeSubTreeTag(l2-1,l2+9);
else
removeSubTreeTag(l2,l2+9);
if (debug2) System.out.println("STRING after cutting the tag: "+restString);
// cutting the space in the last registered component:
if (outputVector.size()>0)
{
((MarkedArea)outputVector.elementAt(outputVector.size()-1)).end -=1;
if (currentLength>0) currentLength -=1;
}
if (debug2) System.out.println("currentLength: "+currentLength +" old length " +oldLength);
// register the punctuation:
if (currentPosition.size()>0)
register(currentLength, currentLength+2, (String)currentPosition.elementAt(currentPosition.size()-1));
else
register(currentLength, currentLength+2, "[]");
currentLength += newLength ;
}
else
// just cutting the tag:
removeSubTreeTag(l2,l2+10);
}
l2 = restString.indexOf("=selStart)&&(outputVector.size()>0))
{
// exclamation sign etc.:
if (currentLength>selEnd)
selStartTotal = selStart+oldLength;
else
selStartTotal = currentLength+oldLength;
selEndTotal = selEnd+oldLength;
selEndT = selEndTotal+1;
pos = ((MarkedArea)outputVector.elementAt(outputVector.size()-1)).end;
if (debug2)
System.out.print("the last registered position: "+ pos);
if (debug2)
System.out.println(" selStart: "+ selStartTotal+ " selEnd: "+selEndTotal);
if (selEnd+oldLength>pos)
{
addedLength = selEndTotal-selStartTotal+2;
outputVector.addElement(new MarkedArea(selStartTotal, selEndTotal+1, focusPosition,restString.substring(currentLength)));
if (debug2)
System.out.println("APPENDING Selection Last:"+restString.substring(currentLength)+
"Length: "+addedLength+" POSITION: "+selStartTotal + " "+selEndT);
}
}
} //if selectionStart>-1
else
{
System.out.println("NO SELECTION IN THE TEXT TO BE APPENDED!");
//cutting tags from previous focuses if any:
int r = restString.indexOf("");
while (r>-1)
{
// check if punktualtion marks like . ! ? are at the end of a sentence:
if (restString.charAt(r+10)==' ')
restString = restString.substring(0,r)+restString.substring(r+11);
else
restString = restString.substring(0,r)+restString.substring(r+10);
r = restString.indexOf("");
}
r = restString.indexOf("-1)
{
int t = restString.indexOf(">",r);
if (t=selectionStart)&&(selectionStart>-1))
try {
output.getHighlighter().addHighlight(selStart+oldLength, selEnd+oldLength+1, new DefaultHighlighter.DefaultHighlightPainter(Color.green) );
selectedText = output.getText().substring(selStart+oldLength, selEnd+oldLength+1);
// output.getHighlighter().addHighlight(selStart+oldLength, selEnd+oldLength+1, new DefaultHighlighter.DefaultHighlightPainter(Color.white) );
} catch (Exception e) {System.out.println("highlighting problem!");}
}// s.length()>0
}
public static void register(int start, int end, String position)
{
oldLength = output.getText().length();
addedLength = 0;
int resultCurrent = 0;
int resultNew = 0;
newLength = end-start;
// the tag has some words to register:
if (newLength>0)
{
//focus has a separate position:
if (selectionCheck&&(selEnd0)
{
outputVector.addElement(new MarkedArea(resultCurrent, resultNew, position,stringToAppend));
if (debug2)
System.out.println("APPENDING ZONE:"+stringToAppend+
"Length: "+newLength+" POSITION: "+resultCurrent + " "+resultNew+" "+position);
}
else
if (debug2)
System.out.println("whiteSpaces: "+newLength);
}
} //some words to register
}
//updating:
public static void removeSubTreeTag (int start, int end)
{
if (debug2)
System.out.println("removing: "+ start +" to "+ end);
int difference =end-start+1;
int positionStart, positionEnd;
if (difference>20)
{
positionStart = restString.indexOf("[", start);
positionEnd = restString.indexOf("]", start);
currentPosition.addElement(restString.substring(positionStart, positionEnd+1));
}
else
if (currentPosition.size()>0)
currentPosition.removeElementAt(currentPosition.size()-1);
if (start>0)
restString = restString.substring(0,start)+restString.substring(end+1);
else
restString = restString.substring(end+1);
if (selStart > end)
{ selStart -=difference;
selEnd -=difference;
}
else
if (selEnd < start) ;
else selEnd -=difference;
}
public void listAction(int index) {
if (index == -1)
{if (debug) System.out.println("no selection");}
else {
treeChanged = true;
send((String)commands.elementAt(list.getSelectedIndex()));
}
}
// pop-up menu (adapted from DynamicTree2):
class PopupListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
// int selStart = tree.getRowForLocation(e.getX(), e.getY());
// output.setSelectionRow(selStart);
if (debug3)
System.out.println("mouse pressed2: "+output.getSelectionStart()+" "+output.getSelectionEnd());
//maybeShowPopup(e);
}
public void mouseReleased(MouseEvent e) {
if (debug3) System.out.println("mouse released2!"+output.getSelectionStart()+" "+output.getSelectionEnd());
maybeShowPopup(e);
}
}
void maybeShowPopup(MouseEvent e) {
int i=outputVector.size()-1;
// right click:
if (e.isPopupTrigger()) {
m2 = e;
timer2.start();
}
// middle click
if (e.getButton() == MouseEvent.BUTTON2)
{
if (debug3) System.out.println("MIDDLE BUTTON!");
// selection Exists:
if (!selectedText.equals(""))
{
if (selectedText.length()<5)
field.setBounds(e.getX()+200, e.getY()+80, 140, 30);
else
field.setBounds(e.getX()+200, e.getY()+80, selectedText.length()*10, 30);
getLayeredPane().add(field, new Integer(1), 0);
field.setText(selectedText);
field.requestFocusInWindow();
}
}
}
void addMenuItem(String name){
menuItem2 = new JMenuItem(name);
menuItem2.setActionCommand("popupMenuItem");
menuItem2.addActionListener(this);
popup2.add(menuItem2);
}
public void focusGained(FocusEvent e)
{
}
public void focusLost(FocusEvent e)
{
getLayeredPane().remove(field);
repaint();
}
}