/*
    This class is an extension of the Frame class for use as the
    main window of an application.

    You can add controls or menus to camila97 with Cafe Studio.
 */

import cam2jav;
import java.io.*;
import java.awt.*;
import MJEWindow;
/*
import wingsoft.editor.Main;
import wingsoft.editor.Global;
*/

public class camila97 extends Frame {
    mnuMain theMenu;
    Panel pnlToolbar;
    Panel pnlMain;
    pnlPrj thePrj;
    pnlEdi theEdi;
    pnlInt theInt;
    pnlRep theRep;
    pnlLib theLib;
    pnlRei theRei;
    CardLayout theLayout;
    Button btnPrj;
    Button btnEdi;
    Button btnInt;
    Button btnRep;
    Button btnLib;
    Button btnRei;
    Button btnCam;
    Label lblProj;
    Label lblPath;
    Label lblFile;

    public camila97() {

        super("The CAMILA Toolkit");

        //{{INIT_MENUS
        theMenu = new mnuMain(this);
        //}}

        //{{INIT_CONTROLS
        setLayout(new BorderLayout());

        pnlToolbar = new Panel();
        pnlToolbar.setLayout(new GridLayout(0,6,5,5));
        btnPrj = new Button("Project");
        btnInt = new Button("Interpreter");
        btnCam = new Button("CAMILA shell");
        btnRep = new Button("Repository");
        btnLib = new Button("Library");
        //btnEdi = new Button("Editor");
        btnRei = new Button("Reification");
        //btnRei.setEnabled(false);
        pnlToolbar.add(btnPrj);
        pnlToolbar.add(btnInt);
        pnlToolbar.add(btnCam);
        pnlToolbar.add(btnRep);
        pnlToolbar.add(btnLib);
        pnlToolbar.add(btnRei);

        lblProj = new Label("<none>");
        lblPath = new Label("<none>");
        lblFile = new Label("<none>");
/*
        pnlToolbar.add(new Label("Project:",Label.LEFT));
        pnlToolbar.add(new Label("Path:",Label.LEFT));
        pnlToolbar.add(new Label("File:",Label.LEFT));
		lblProj.setForeground(Color.blue);
		lblPath.setForeground(Color.blue);
		lblFile.setForeground(Color.blue);
        pnlToolbar.add(lblProj,Label.LEFT);
        pnlToolbar.add(lblPath,Label.LEFT);
        pnlToolbar.add(lblFile,Label.LEFT);
*/

        pnlMain = new Panel();
        thePrj = new pnlPrj(this);
        theEdi = new pnlEdi();
        theInt = new pnlInt();
        theLib = new pnlLib(this);
        theRep = new pnlRep(this);
        theRei = new pnlRei(this);

        theLayout = new CardLayout();
        pnlMain.setLayout(theLayout);

        pnlMain.add("A",new Panel());
        pnlMain.add("P",thePrj);
        pnlMain.add("E",theEdi);
        pnlMain.add("I",theInt);
        pnlMain.add("R",theRep);
        pnlMain.add("L",theLib);
        pnlMain.add("RL",theRei);

        add("North",pnlToolbar);
        add("Center",pnlMain);

		selectedMnuProjectNew();
        //add("South",txtDebug);
        //resize(preferredSize());
        resize(640,480);
        //}}

        show();
    }

/*
    public synchronized void show() {
    	move(50, 50);
    	super.show();
    }
*/
    public boolean handleEvent(Event event) {

    	if (event.id == Event.WINDOW_DESTROY) {
            hide();         // hide the Frame
            dispose();      // tell windowing system to free resources
            System.exit(0); // exit
            return true;
    	}
    	return super.handleEvent(event);
    }

    public boolean action(Event event, Object arg) {
        if (event.target instanceof MenuItem) {
            if (event.target == theMenu.mnuProjectNew) {
                selectedMnuProjectNew();
                return true;
            } else if (event.target == theMenu.mnuProjectOpen) {
                selectedMnuProjectOpen();
                return true;
            } else if (event.target == theMenu.mnuProjectSave) {
                selectedMnuProjectSave();
                return true;
            } else if (event.target == theMenu.mnuProjectSaveAs) {
                selectedMnuProjectSaveAs();
                return true;
            } else if (event.target == theMenu.mnuProjectExit) {
                selectedMnuProjectExit();
                return true;
            } else if (event.target == theMenu.mnuViewProject) {
                theLayout.show(pnlMain,"P");
                return true;
            } else if (event.target == theMenu.mnuViewInterpreter) {
                theLayout.show(pnlMain,"I");
                return true;
            } else if (event.target == theMenu.mnuViewRepository) {
                theLayout.show(pnlMain,"R");
                return true;
            } else if (event.target == theMenu.mnuViewLibrary) {
                theLayout.show(pnlMain,"L");
                return true;
            } else if (event.target == theMenu.mnuViewReification) {
                theLayout.show(pnlMain,"RL");
                return true;
            } else if (event.target == theMenu.mnuHelpAbout) {
                selectedMnuHelpAbout();
                return true;
            }
        }
        else if (event.target instanceof Button) {
            if (event.target == btnPrj) {
                theLayout.show(pnlMain,"P");
                return true;
            } else if (event.target == btnEdi) {
/*
                Main editor = new Main("");
                editor.layoutMain();
                editor.show();
*/
                return true;
            } else if (event.target == btnInt) {
                theLayout.show(pnlMain,"I");
                return true;
            } else if (event.target == btnCam) {
                cam2jav x = new cam2jav();
                x.camShell();
                return true;
            } else if (event.target == btnRep) {
                theLayout.show(pnlMain,"R");
                return true;
            } else if (event.target == btnLib) {
                theLayout.show(pnlMain,"L");
                return true;
            } else if (event.target == btnRei) {
                theLayout.show(pnlMain,"RL");
                return true;
            }
        }

        return super.action(event, arg);
    }

    public static void main(String args[]) {
        new camila97();
	    cam2jav camila = new cam2jav(); camila.camInit();
    }

    public void selectedMnuProjectNew() {
        theLayout.show(pnlMain,"P");
        thePrj.lstFiles.removeAll();
        theEdi.txtEdit.setText("");
    }
    public void selectedMnuProjectOpen() {
        FileDialog theFileDialog;

setCursor(new Cursor(Cursor.WAIT_CURSOR));
        theFileDialog = new FileDialog(this,"Opening Project...",FileDialog.LOAD);
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        theFileDialog.show();
        lblPath.setText(theFileDialog.getDirectory());
        lblFile.setText(theFileDialog.getFile());
        String fl = new String(lblFile.getText());

        File file = new File(fl);
        StringBuffer text = new StringBuffer((int) file.length());

        thePrj.lstFiles.removeAll();
        theRei.lstReifs.removeAll();

        try {
          FileInputStream fs = new FileInputStream(fl);
          BufferedInputStream bs = new BufferedInputStream(fs, 5000);
          DataInputStream ds = new DataInputStream(bs);
          String str = ds.readLine();

          while (str != null) {
            if (str.endsWith(".cam")) {
                thePrj.lstFiles.addItem(str);
            }
            else if (str.endsWith(".reif")) {
                theRei.lstReifs.addItem(str);
            }
/*
            text.append(str);
            text.append("\n");
*/
            str = ds.readLine();
          }

          fs.close();
        } catch (Exception err) {
          //editor.console.set("Cannot read file.");
        }

        //theEditor.txtEdit.setText(theFileDialog.flnOpenFile());
    }
    public void selectedMnuProjectSave() {
        FileDialog theFileDialog;

        theFileDialog = new FileDialog(this,"Saving Project...");
        //theFileDialog.flnSaveFile();
    }
    public void selectedMnuProjectSaveAs() {
        FileDialog theFileDialog;

        theFileDialog = new FileDialog(this,"Save project as...",FileDialog.SAVE);
        theFileDialog.setFile("Untitled.project");
        theFileDialog.show();
        String file = theFileDialog.getFile();

        if (file != null) {
           int i;
           String directory = theFileDialog.getDirectory();
           String path = directory + file;
           try {
             //console.set("Saving project...");

             FileOutputStream fs = new FileOutputStream(path);
             PrintStream ps = new PrintStream(fs);
             //String ls = System.getProperty("line.separator");

             for (i = 0; i < thePrj.lstFiles.getItemCount(); i++) {
		ps.println(thePrj.lstFiles.getItem(i));
             }
             for (i = 0; i < theRei.lstReifs.getItemCount(); i++) {
		ps.println(theRei.lstReifs.getItem(i));
             }

             fs.close();
             //console.set("Ready.");
           } catch (Exception e) {
             //console.set("Cannot save project.");
           }

           //save(path);
        }

        //theFileDialog.flnSaveFileAs();
    }
    public void selectedMnuProjectExit() {
        QuitBox theQuitBox;
        theQuitBox = new QuitBox(this);
        theQuitBox.show();
    }
    public void selectedMnuHelpAbout() {
        dlgAbout theDlgAbout = new dlgAbout(this);
        theDlgAbout.show();
    }
    public void selectedMnuInsertFile() {
        // to do: put event handler code here.
        FileDialog theFileDialog = new FileDialog(this,"Inserting file into project...");
        theFileDialog.show();
        lblPath.setText(theFileDialog.getDirectory());
        lblFile.setText(theFileDialog.getFile());
        thePrj.lstFiles.addItem(lblPath.getText()+lblFile.getText());
    }
    public void selectedMnuRemoveFile() {
        // to do: put event handler code here.
        FileDialog theFileDialog = new FileDialog(this,"Inserting file into project...");
        lblPath.setText(theFileDialog.getDirectory());
        lblFile.setText(theFileDialog.getFile());
        //theProject.lstFiles.addItem(lblPath.getText()+lblFile.getText());
    }
/*
    public void selectedMnuInsertModel() {
        theEdi.txtEdit.appendText("MODEL\n\nENDMODEL");
    }
    public void selectedMnuInsertFunction() {
        theEdi.txtEdit.appendText("\n\nFUNC f()\n;PRE\nRETURN");
    }
    public void selectedMnuInsertEvent() {
        theEdi.txtEdit.appendText("\n\nFUNC f()\n;PRE\nSTATE");
    }
    public void selectedMnuRepositoryInsert() {
        // to do: put event handler code here.
        FileDialog theFileDialog = new FileDialog(this,"Inserting new RSC into repository...");
        theFileDialog.show();
        //theProject.lstFiles.addItem(theFileDialog.getDirectory()+theFileDialog.getFile());
    }
*/
/*
    public void selectedMnuToolsPretty() {
        // to do: put event handler code here.
System.out.println("running...");
        cam2jav x = new cam2jav();
        x.camPretty(lblPath.getText(),lblFile.getText());
    }
    public void selectedMnuToolsMan() {
        // to do: put event handler code here.
System.out.println("running...");
        cam2jav x = new cam2jav();
        x.camMan(new String(""));
    }
    public void selectedMnuToolsHtml() {
        // to do: put event handler code here.
System.out.println("running...");
        cam2jav x = new cam2jav();
        x.camHtml(new String(""));
    }
*/

}


class dlgAbout extends Dialog {

    public dlgAbout(Frame parent) {

        super(parent, "About", true);

    	setResizable(false);

    	//{{INIT_CONTROLS
        setLayout(new BorderLayout());
        //addNotify();
        lblAbout=new Label("The Camila Toolkit");
        lblAbout.setFont(new Font("Helvetica",Font.BOLD,14));
        add("North",lblAbout);
        btnOK=new Button("OK");
        add("Center",btnOK);
        lblCopyright=new Label("Copyright @ 1997 DI/UMINHO. All Rights Reserved.", Label.CENTER);
        lblCopyright.setFont(new Font("Dialog",Font.PLAIN,10));
        add("South",lblCopyright);
        resize(300,300);
        //}}
    }
/*
    public synchronized void show() {
    	Rectangle bounds = getParent().bounds();
    	Rectangle abounds = bounds();

    	move(bounds.x + (bounds.width - abounds.width)/ 2,
    	     bounds.y + (bounds.height - abounds.height)/2);

    	super.show();
    }

    public synchronized void wakeUp() {
    	notify();
    }
*/
    public boolean handleEvent(Event event) {
    	if (event.id == Event.ACTION_EVENT && event.target == btnOK) {
    	    	clickedBtnOK();
    	    	return true;
    	}
    	else

    	if (event.id == Event.WINDOW_DESTROY) {
    	    hide();
    	    return true;
    	}
    	return true;//super.handleEvent(event);
    }

    //{{DECLARE_CONTROLS
    Label lblAbout;
    Button btnOK;
    Label lblCopyright;
    //}}

    public void clickedBtnOK() {
        handleEvent(new Event(this, Event.WINDOW_DESTROY, null));
    }
}


class QuitBox extends Dialog {

    public QuitBox(Frame parent) {

	super(parent, "Quit Application?", true);
    	setResizable(false);

        setLayout(new BorderLayout());
        lblQuit=new Label("Exiting CAMILA Toolkit. Are you sure?",Label.CENTER);
        add("Center",lblQuit);
        pnlQuit = new Panel();
        add("South",pnlQuit);
        yesButton=new Button("Yes, I'm sure!");
        pnlQuit.add(yesButton);
        noButton=new Button("No, I'm not.");
        pnlQuit.add(noButton);
        resize(300,100);
        //}}
    }

/*
    public synchronized void show() {
    	Rectangle bounds = getParent().bounds();
    	Rectangle abounds = bounds();

    	move(bounds.x + (bounds.width - abounds.width)/ 2,
    	     bounds.y + (bounds.height - abounds.height)/2);

    	super.show();
    }
    public synchronized void wakeUp() {
    	notify();
    }

*/
    public boolean handleEvent(Event event) {
    	if (event.id == Event.ACTION_EVENT && event.target == noButton) {
    	    	clickedNoButton();
    	    	return true;
    	}
    	else
    	if (event.id == Event.ACTION_EVENT && event.target == yesButton) {
    	    	clickedYesButton();
    	    	return true;
    	}
    	else

    	if (event.id == Event.WINDOW_DESTROY) {
    	    hide();
    	    return true;
    	}
    	return super.handleEvent(event);
    }

    //{{DECLARE_CONTROLS
    Panel pnlQuit;
    Label lblQuit;
    Button yesButton;
    Button noButton;
    //}}

    public void clickedYesButton() {
        System.exit(0);
    }
    public void clickedNoButton() {
        handleEvent(new Event(this, Event.WINDOW_DESTROY, null));
    }
}

class mnuMain {
    MenuBar mb;

    Menu mnuProject;
    MenuItem mnuProjectNew;
    MenuItem mnuProjectOpen;
    MenuItem mnuProjectSave;
    MenuItem mnuProjectSaveAs;
    Menu mnuView;
    MenuItem mnuViewProject;
    MenuItem mnuViewInterpreter;
    MenuItem mnuViewRepository;
    MenuItem mnuViewLibrary;
    MenuItem mnuViewReification;
/*
    MenuItem mnuProjectInsertFile;
    MenuItem mnuProjectRemoveFile;
*/
    MenuItem mnuProjectExit;
/*
    Menu mnuEdit;
    MenuItem mnuEditUndo;
    MenuItem mnuEditCut;
    MenuItem mnuEditCopy;
    MenuItem mnuEditPaste;
    MenuItem mnuInsertModel;
    MenuItem mnuInsertFunction;
    MenuItem mnuInsertEvent;
*/
/*
    Menu mnuRepository;
    MenuItem mnuRepositoryShow;
    MenuItem mnuRepositoryInsert;
    MenuItem mnuRepositoryExtract;
*/
/*
    Menu mnuBuild;
    MenuItem mnuBuildSyntaxCheck;
    MenuItem mnuBuildTypeCheck;
    MenuItem mnuBuildCompile;
    MenuItem mnuBuildDebug;
    MenuItem mnuBuildExecute;
    MenuItem mnuBuildReify;
    MenuItem mnuBuildSettings;
*/
/*
    Menu mnuTools;
    MenuItem mnuToolsPretty;
    MenuItem mnuToolsMan;
    MenuItem mnuToolsHtml;
*/
/*
    Menu mnuShow;
    MenuItem mnuShowHierarchy;
    MenuItem mnuShowRepository;
*/
/*
    Menu mnuWindow;
    MenuItem mnuWindowProject;
    MenuItem mnuWindowEditor;
    MenuItem mnuWindowInterpreter;
*/
    Menu mnuHelp;
    MenuItem mnuHelpTopics;
    MenuItem mnuHelpAbout;

    public mnuMain (Frame frame) {
        mb = new MenuBar();
        frame.setMenuBar(mb);

        mnuProject = new Menu("Project");
        mnuProject.add(mnuProjectNew = new MenuItem("New"));
        mnuProject.add(mnuProjectOpen = new MenuItem("Open..."));
/*
        mnuProject.add(mnuProjectClose = new MenuItem("Close"));
*/
        mnuProject.add(mnuProjectSave = new MenuItem("Save"));
        mnuProject.add(mnuProjectSaveAs = new MenuItem("Save As..."));
        mnuProject.addSeparator();
/*
        mnuProject.add(mnuProjectInsertFile = new MenuItem("Insert file into project..."));
        mnuProject.add(mnuProjectRemoveFile = new MenuItem("Remove file from project..."));
        mnuProject.addSeparator();
*/
        mnuProject.add(mnuProjectExit = new MenuItem("Exit"));
        mb.add(mnuProject);

        mnuView = new Menu("View");
        mnuView.add(mnuViewProject = new MenuItem("Project Window"));
        mnuView.add(mnuViewInterpreter = new MenuItem("Interpreter Window"));
        mnuView.add(mnuViewRepository = new MenuItem("Repository Window"));
        mnuView.add(mnuViewLibrary = new MenuItem("Library Window"));
        mnuView.add(mnuViewReification = new MenuItem("Reification Window"));
        mb.add(mnuView);
/*
        mnuEdit = new Menu("Edit");
        mnuEdit.add(mnuEditUndo = new MenuItem("Undo"));
        mnuEdit.addSeparator();
        mnuEdit.add(mnuEditCut = new MenuItem("Cut"));
        mnuEdit.add(mnuEditCopy = new MenuItem("Copy"));
        mnuEdit.add(mnuEditPaste = new MenuItem("Paste"));
        mb.add(mnuEdit);
*/
/*
        mnuInsert = new Menu("Insert");
        mnuInsert.add(mnuInsertFile = new MenuItem("Files into project"));
        mnuInsert.addSeparator();
*/
/*
        mnuInsert.add(mnuInsertModel = new MenuItem("Model"));
        mnuInsert.add(mnuInsertFunction = new MenuItem("Function"));
        mnuInsert.add(mnuInsertEvent = new MenuItem("Event"));
        mb.add(mnuInsert);
*/
/*
        mnuRepository = new Menu("Repository");
        mnuRepository.add(mnuRepositoryShow = new MenuItem("Show RSC hierarchy"));
        mnuRepository.add(mnuRepositoryInsert = new MenuItem("Insert RSC into repository"));
        mnuRepository.add(mnuRepositoryExtract = new MenuItem("Remove RSC from repository"));
        mb.add(mnuRepository);
*/
/*
        mnuBuild = new Menu("Build");
        mnuBuild.add(mnuBuildCompile = new MenuItem("Compile"));
        mnuBuild.add(mnuBuildSyntaxCheck = new MenuItem("Syntax check"));
        mnuBuild.add(mnuBuildSyntaxCheck = new MenuItem("Type check"));
        mnuBuild.addSeparator();
        mnuBuild.add(mnuBuildDebug = new MenuItem("Debug in shell"));
        mnuBuild.add(mnuBuildExecute = new MenuItem("Execute in shell"));
        mnuBuild.addSeparator();
        mnuBuild.add(mnuBuildReify = new MenuItem("Reify to..."));
        mnuBuild.addSeparator();
        mnuBuild.add(mnuBuildSettings = new MenuItem("Settings"));
        mb.add(mnuBuild);
*/
/*
        mnuTools = new Menu("Tools");
        mnuTools.add(mnuToolsPretty = new MenuItem("Pretty Print"));
        mnuTools.add(mnuToolsMan = new MenuItem("Generate MAN file"));
        mnuTools.add(mnuToolsHtml = new MenuItem("Generate HTML file"));
        mb.add(mnuTools);
*/
/*
        mnuShow = new Menu("Show");
        mnuShow.add(mnuShowHierarchy = new MenuItem("Hierarchy"));
        mnuShow.add(mnuShowRepository = new MenuItem("Repository"));
        mb.add(mnuShow);
*/
/*
        mnuWindow = new Menu("Window");
        mnuWindow.add(mnuWindowProject = new MenuItem("Project"));
        mnuWindow.add(mnuWindowEditor = new MenuItem("Editor"));
        mnuWindow.add(mnuWindowInterpreter = new MenuItem("Interpreter"));
        mb.add(mnuWindow);
*/
        mnuHelp = new Menu("Help");
        mnuHelp.add(mnuHelpTopics = new MenuItem("Help Topics"));
        mnuHelp.addSeparator();
        mnuHelp.add(mnuHelpAbout = new MenuItem("About..."));
        mb.add(mnuHelp);
    }
}

class pnlPrj extends Panel {
    camila97 m_frame;
    Font font;
    Panel pnlFiles;
    List lstFiles;
    List lstState;
    Panel pnlButtons;
    Panel pnlCommands;
    Button btnAddFile;
    Button btnRemFile;
    Button btnEditFile;
    Button btnCompileFile;
    Button btnExecuteFile;
    Button btnExShellFile;
    Button btnReifiedFile;
    Button btnPrettyPrint;
    Button btnGenerateMan;
    Button btnGenerateHtm;
    Button btnAboutCamila;

    public pnlPrj (camila97 frame) {
        super();

        m_frame = frame;
        setLayout(new BorderLayout());
        font = new Font("Courier", Font.PLAIN, 12);

        pnlFiles = new Panel();
        pnlFiles.setLayout(new BorderLayout());
        lstFiles = new List();
        lstFiles.setBackground(Color.white);
        lstFiles.setFont(new Font("Courier",Font.PLAIN,12));
        lstState = new List();
        lstState.setFont(new Font("Arial",Font.BOLD,10));
        pnlFiles.add("Center",lstFiles);
        //pnlFiles.add("East",lstState);

        pnlButtons = new Panel();
        pnlButtons.setLayout(new GridLayout(0,1,4,4));
        btnAddFile = new Button("Add file to project");
        btnRemFile = new Button("Remove file from project");
        btnRemFile.setEnabled(false);
        btnEditFile = new Button("Edit file");
        btnEditFile.setEnabled(false);
        btnCompileFile = new Button("Compile file");
        btnCompileFile.setEnabled(false);
        btnExecuteFile = new Button("Execute file");
        btnExecuteFile.setEnabled(false);
        btnExShellFile = new Button("Execute file in shell");
        btnExShellFile.setEnabled(false);
        btnReifiedFile = new Button("Apply reification to file");
        btnReifiedFile.setEnabled(false);
        btnPrettyPrint = new Button("Pretty Print");
        btnPrettyPrint.setEnabled(false);
        btnGenerateMan = new Button("Show man file");
        btnGenerateMan.setEnabled(false);
        btnGenerateHtm = new Button("Show man file as HTML");
        btnGenerateHtm.setEnabled(false);
        btnAboutCamila = new Button("About CAMILA...");
        pnlButtons.add(btnAddFile);
        pnlButtons.add(btnRemFile);
        pnlButtons.add(btnEditFile);
        //pnlButtons.add(btnCompileFile);
        pnlButtons.add(btnExecuteFile);
        pnlButtons.add(btnExShellFile);
        pnlButtons.add(btnReifiedFile);
        pnlButtons.add(btnPrettyPrint);
        pnlButtons.add(btnGenerateMan);
        pnlButtons.add(btnGenerateHtm);
        pnlButtons.add(btnAboutCamila);

        pnlCommands = new Panel();
        pnlCommands.setLayout(new BorderLayout());
        pnlCommands.add("North",pnlButtons);

        add("Center",pnlFiles);
        add("East",pnlCommands);
    }

    //public boolean action(Event event, Object arg) {
    public boolean handleEvent(Event event) {

        if (event.target == lstFiles && event.id == Event.LIST_SELECT) {
            if (lstFiles.getSelectedIndex() != -1) {
                btnRemFile.setEnabled(true);
                btnEditFile.setEnabled(true);
                btnCompileFile.setEnabled(true);
                btnExecuteFile.setEnabled(true);
                btnExShellFile.setEnabled(true);
                btnReifiedFile.setEnabled(true);
                btnPrettyPrint.setEnabled(true);
                btnGenerateMan.setEnabled(true);
                btnGenerateHtm.setEnabled(true);
            }
            else {
                btnRemFile.setEnabled(false);
                btnEditFile.setEnabled(false);
                btnCompileFile.setEnabled(false);
                btnExecuteFile.setEnabled(false);
                btnExShellFile.setEnabled(false);
                btnReifiedFile.setEnabled(false);
                btnPrettyPrint.setEnabled(false);
                btnGenerateMan.setEnabled(false);
                btnGenerateHtm.setEnabled(false);
            }
        }
        else if (event.target == btnAddFile && event.id == Event.ACTION_EVENT) {
            selectedBtnAddFile();
            return true;
        } else if (event.target == btnRemFile && event.id == Event.ACTION_EVENT) {
            selectedBtnRemFile();
            return true;
        } else if (event.target == btnEditFile && event.id == Event.ACTION_EVENT) {
            selectedBtnEditFile();
            return true;
        } else if (event.target == btnCompileFile && event.id == Event.ACTION_EVENT) {
            selectedBtnCompileFile();
            return true;
        } else if (event.target == btnExecuteFile && event.id == Event.ACTION_EVENT) {
            selectedBtnExecuteFile();
            return true;
        } else if (event.target == btnExShellFile && event.id == Event.ACTION_EVENT) {
            selectedBtnExShellFile();
            return true;
        } else if (event.target == btnReifiedFile && event.id == Event.ACTION_EVENT) {
            selectedBtnReifiedFile();
            return true;
        } else if (event.target == btnPrettyPrint && event.id == Event.ACTION_EVENT) {
            selectedBtnPrettyPrint();
            return true;
        } else if (event.target == btnGenerateMan && event.id == Event.ACTION_EVENT) {
            selectedBtnGenerateMan();
            return true;
        } else if (event.target == btnGenerateHtm && event.id == Event.ACTION_EVENT) {
            selectedBtnGenerateHtm();
            return true;
        } else if (event.target == btnAboutCamila && event.id == Event.ACTION_EVENT) {
            selectedBtnAboutCamila();
            return true;
        }

        return false;
    }

    public void selectedBtnAddFile() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        FileDialog theFileDialog = new FileDialog(m_frame,"Adding file to project...");
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        theFileDialog.show();
        String d = theFileDialog.getDirectory();
        String s = theFileDialog.getFile();
        //if (s.compareTo("") != 0) {
        if (s != null) {
            m_frame.thePrj.lstFiles.addItem(d+s);
        }
    }

    public void selectedBtnRemFile() {
        int i = lstFiles.getSelectedIndex();
        if (i != -1) {
            lstFiles.delItem(i);
            if (lstFiles.getItemCount() == 0) {
                btnRemFile.setEnabled(false);
                btnEditFile.setEnabled(false);
                btnCompileFile.setEnabled(false);
                btnExecuteFile.setEnabled(false);
                btnExShellFile.setEnabled(false);
                btnReifiedFile.setEnabled(false);
                btnPrettyPrint.setEnabled(false);
                btnGenerateMan.setEnabled(false);
                btnGenerateHtm.setEnabled(false);
            }
        }
    }

    public void selectedBtnEditFile() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            MJEWindow editor = new MJEWindow(s,font);
        }
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnCompileFile() {
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camCompile(s);
        }
    }

    public void selectedBtnExecuteFile() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camExecute(s);
            m_frame.theInt.txtPrompt.init();
            m_frame.theLayout.show(m_frame.pnlMain,"I");
        }
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnShellFile() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camShell();
        }
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnExShellFile() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camExShell(s);
        }
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnReifiedFile() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            //m_frame.btnRei.setEnabled(true);
            m_frame.theRei.txtInitModel.setText(m_frame.theRei.readFile(s));
            m_frame.theLayout.show(m_frame.pnlMain,"RL");
        }
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnPrettyPrint() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camPretty(lstFiles.getSelectedItem());
        }
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnGenerateMan() {
        String s = lstFiles.getSelectedItem();
        if (s != null) {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
            cam2jav x = new cam2jav();
            x.camMan(lstFiles.getSelectedItem());
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        }
    }

    public void selectedBtnGenerateHtm() {
        String s = lstFiles.getSelectedItem();
        if (s != null) {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
            cam2jav x = new cam2jav();
            x.camHtml(lstFiles.getSelectedItem());
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
        }
    }

    public void selectedBtnAboutCamila() {
        m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        cam2jav x = new cam2jav();
        //x.camMoreAbout("http://camila.di.uminho.pt/");
        x.camMoreAbout("index.html");
        m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }
}

class pnlEdi extends Panel {
    TextArea txtEdit;

    public pnlEdi () {
        super();

        setLayout(new BorderLayout());
        txtEdit = new TextArea();//20,80);
        txtEdit.setFont(new Font("Dialog",Font.PLAIN,10));
        add("Center",txtEdit);

        //show();
    }
}

class pnlInt extends Panel {
    txtInt txtPrompt;

    public pnlInt () {
        super();

        setLayout(new BorderLayout());
        txtPrompt = new txtInt();
        txtPrompt.setFont(new Font("Dialog",Font.PLAIN,10));
        add("Center",txtPrompt);
    }

}

class txtInt extends TextArea {
    int currentXPos;
    int currentYPos;
    int currentCPos;
    int currentIPos;
    //Vector vecHistory;

    public txtInt () {
        super();

        setFont(new Font("Dialog",Font.PLAIN,10));
        setText("UM-XMETOO version 1.62 .DLL.COMM.USERTYPE (aap/pem/cjr/jj  1997/11/04 17:39:43)");
        append("\nCAMILA    version 1.77 (1997/11/07 18:36:58)");
        append("\n\n?- ");
        currentYPos = 4;
        currentXPos = 129;
        currentIPos = 129;
        currentCPos = 129;
    }
    public void init() {
        setText("UM-XMETOO version 1.62 .DLL.COMM.USERTYPE (aap/pem/cjr/jj  1997/11/04 17:39:43)");
        append("\nCAMILA    version 1.77 (1997/11/07 18:36:58)");
        append("\n\n?- ");
        currentYPos = 4;
        currentXPos = 129;
        currentIPos = 129;
        currentCPos = 129;
        setCaretPosition(129);
    }
    public String evaluate(String s) {
        cam2jav x = new cam2jav();
        
        return x.camEval(s);
    }

    public boolean handleEvent(Event event) {

        if (currentCPos == 129) {
            setCaretPosition(129);
        }
/*
System.out.println("Event id="+event.id);
System.out.println("Event key="+event.key);
*/

if (event.id == 401) {

        if (event.key == Event.ENTER) {
//System.out.println("enter pressed...");
//select(currentIPos,currentCPos-1);//IPos+6);
select(currentIPos,currentCPos);//IPos+6);
//select(currentIPos,currentCPos);
//System.out.println("IPos="+currentIPos);
//System.out.println("CPos="+currentCPos);
String rDebug = new String(getSelectedText());
//System.out.println("selection="+rDebug);
append("\n");
StringBuffer test = new StringBuffer(new String(""));
test.append(rDebug);
//test.append(new String(";"));
//System.out.println("test="+test.toString());
String rCamila = new String(evaluate(test.toString()));
//append(evaluate(test.toString()));
append(rCamila);
            append("\n?- ");
            setCaretPosition(getCaretPosition()+(rCamila.length())+6);//getCaretPosition()+4);
            currentYPos += 2;
            currentIPos = getCaretPosition();
            currentCPos = getCaretPosition();
            currentXPos = getCaretPosition();

            return true;
        } else if (event.key == 127) {
            --currentCPos;
            return false;
        } else {
            ++currentXPos;
            ++currentCPos;
            //setCaretPosition(currentXPos);

            return false;
        }
} else if (event.id == 403) {
        if (event.key == Event.UP) {
//System.out.println("Key up");
            setCaretPosition(currentCPos);
            return true;
        } else if (event.key == Event.DOWN) {
//System.out.println("Key down");
            setCaretPosition(currentCPos);
            return true;
        } else if (event.key == Event.LEFT) {
            if (currentXPos > currentIPos) {
                --currentXPos;
                //--currentCPos;
                setCaretPosition(currentXPos);
            } else {
                setCaretPosition(currentXPos);
            }
            return true;
        } else if (event.key == Event.RIGHT) {
            if (currentXPos+1 > currentCPos) {
                setCaretPosition(currentXPos);
            } else {
                ++currentXPos;
                //++currentCPos;
                setCaretPosition(currentXPos);
            }
            return true;
        }
}
//currentCPos = getCaretPosition();
//System.out.println(event.key);
        return false;
    }

}

class pnlRep extends Panel {
    camila97 m_frame;
    Font font;
    List lstRSC;
    Panel pnlBUT;
    Panel pnlRSC;
    Panel pnlIMG;
    ScrollPane pnlScr;
    Button btnIsImpOf;
    Button btnIsSpeOf;
    Button btnExeFile;
    Button btnExeShellFile;
    Button btnPrettyFile;
    Button btnManFile;
    Button btnSrcFile;
    Button btnMoreInf;
    Label lblCanvas;
    RSCImageCanvas rscCanvas;

    public pnlRep (camila97 frame) {
        super();

        m_frame = frame;
        //setLayout(new GridLayout(0,2));
        setLayout(new BorderLayout());

        font = new Font("Courier", Font.PLAIN, 12);

        Panel pnlBUT = new Panel();
        pnlBUT.setLayout(new GridLayout(0,2,1,1));
/*
        Button btnIsImpOf = new Button("is implementation of");
        btnIsImpOf.setEnabled(false);
        Button btnIsSpeOf = new Button("is special case of");
        btnIsSpeOf.setEnabled(false);
*/
        btnExeFile = new Button("execute file");
        btnExeShellFile = new Button("execute file in shell");
        btnPrettyFile = new Button("pretty print");
        btnManFile = new Button("show man file");
        btnSrcFile = new Button("see source file");
        btnMoreInf = new Button("more about...");
        //pnlBUT.add(btnIsImpOf);
        //pnlBUT.add(btnIsSpeOf);
        pnlBUT.add(btnExeFile);
        pnlBUT.add(btnExeShellFile);
        pnlBUT.add(btnPrettyFile);
        pnlBUT.add(btnManFile);
        pnlBUT.add(btnSrcFile);
        pnlBUT.add(btnMoreInf);

        pnlRSC = new Panel();
        pnlRSC.setLayout(new BorderLayout());
        lstRSC = new List();
        lstRSC.setBackground(Color.white);
        lstRSC.setFont(new Font("ARIAL",Font.PLAIN,12));
/* repository insertion */

lstRSC.addItem("RSC");
lstRSC.addItem("    FSET");
lstRSC.addItem("        BREL");
lstRSC.addItem("            ORDER");
lstRSC.addItem("        FFSET");
lstRSC.addItem("        QSET");
lstRSC.addItem("    FFUN");
lstRSC.addItem("        MSET");
lstRSC.addItem("        FAMILY");
lstRSC.addItem("        PQUEUE");
lstRSC.addItem("            PQUEUEMK");
lstRSC.addItem("        QFUN");
lstRSC.addItem("        FDEP");
lstRSC.addItem("            FDMO");
lstRSC.addItem("                FDMONAT");
lstRSC.addItem("                    BAMS");
lstRSC.addItem("    SEQ");
lstRSC.addItem("        FLIST");
lstRSC.addItem("            TEXT");
lstRSC.addItem("        STACK");
lstRSC.addItem("        QUEUE");

        pnlRSC.add("North",pnlBUT);
        pnlRSC.add("Center",lstRSC);

        pnlIMG = new Panel();
        pnlIMG.setLayout(new BorderLayout());
        pnlScr = new ScrollPane(ScrollPane.SCROLLBARS_ALWAYS);
//pnlScr.setSize(520,350);
pnlScr.doLayout();
        rscCanvas = new RSCImageCanvas();
        lblCanvas = new Label("RSC - Reusable Software Component",Label.CENTER);
		lblCanvas.setFont(new Font("ARIAL",Font.BOLD,12));
        pnlIMG.add("North",lblCanvas);
pnlScr.add(rscCanvas);
        pnlIMG.add("Center",pnlScr);
        add("West",pnlRSC);
        add("Center",pnlIMG);

    }

    public boolean handleEvent(Event event) {
        String rscName = new String();

        if (event.target == lstRSC && event.id == Event.LIST_SELECT) {
            switch(lstRSC.getSelectedIndex()) {
		        case 0:
                        lblCanvas.setText("RSC");
                        rscCanvas.setRSC(0); break;
		        case 1:
                        lblCanvas.setText("FSET");
                        rscCanvas.setRSC(1); break;
		        case 2:
                        lblCanvas.setText("BREL");
                        rscCanvas.setRSC(2); break;
		        case 3:
                        lblCanvas.setText("ORDER");
                        rscCanvas.setRSC(3); break;
		        case 4:
                        lblCanvas.setText("FFSET");
                        rscCanvas.setRSC(4); break;
		        case 5:
                        lblCanvas.setText("QSET");
                        rscCanvas.setRSC(5); break;
		        case 6:
                        lblCanvas.setText("FFUN");
                        rscCanvas.setRSC(6); break;
		        case 7:
                        lblCanvas.setText("MSET");
                        rscCanvas.setRSC(7); break;
		        case 8:
                        lblCanvas.setText("FAMILY");
                        rscCanvas.setRSC(8); break;
		        case 9:
                        lblCanvas.setText("PQUEUE");
                        rscCanvas.setRSC(9); break;
		        case 10:
                        lblCanvas.setText("PQUEUEMK");
                        rscCanvas.setRSC(10); break;
		        case 11:
                        lblCanvas.setText("QFUN");
                        rscCanvas.setRSC(11); break;
		        case 12:
                        lblCanvas.setText("FDEP");
                        rscCanvas.setRSC(12); break;
		        case 13:
                        lblCanvas.setText("FDMO");
                        rscCanvas.setRSC(13); break;
		        case 14:
                        lblCanvas.setText("FDMONAT");
                        rscCanvas.setRSC(14); break;
		        case 15:
                        lblCanvas.setText("BAMS");
                        rscCanvas.setRSC(15); break;
		        case 16:
                        lblCanvas.setText("SEQ");
                        rscCanvas.setRSC(16); break;
		        case 17:
                        lblCanvas.setText("FLIST");
                        rscCanvas.setRSC(17); break;
		        case 18:
                        lblCanvas.setText("TEXT");
                        rscCanvas.setRSC(18); break;
		        case 19:
                        lblCanvas.setText("STACK");
                        rscCanvas.setRSC(19); break;
		        case 20:
                        lblCanvas.setText("QUEUE");
                        rscCanvas.setRSC(20); break;
                default:
                         lblCanvas.setText("RSC");
                         rscCanvas.setRSC(0);
			}
            rscCanvas.repaint();

            return true;
        }
        else if (event.target == btnSrcFile && event.id == Event.ACTION_EVENT) {
            if (lstRSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstRSC.getSelectedIndex()) {
                    case 0: rscName = "RSC.cam";break;
                    case 1: rscName = "FSET.cam";break;
                    case 2: rscName = "BREL.cam";break;
                    case 3: rscName = "ORDER.cam";break;
                    case 4: rscName = "FFSET.cam";break;
                    case 5: rscName = "QSET.cam";break;
                    case 6: rscName = "FFUN.cam";break;
                    case 7: rscName = "MSET.cam";break;
                    case 8: rscName = "FAMILY.cam";break;
                    case 9: rscName = "PQUEUE.cam";break;
                    case 10: rscName = "PQUEUEMK.cam";break;
                    case 11: rscName = "QFUN.cam";break;
                    case 12: rscName = "FDEP.cam";break;
                    case 13: rscName = "FDMO.cam";break;
                    case 14: rscName = "FDMONAT.cam";break;
                    case 15: rscName = "BAMS.cam";break;
                    case 16: rscName = "SEQ.cam";break;
                    case 17: rscName = "FLIST.cam";break;
                    case 18: rscName = "TEXT.cam";break;
                    case 19: rscName = "STACK.cam";break;
                    case 20: rscName = "QUEUE.cam";break;
                    default: rscName = "";
                }
                cam2jav x = new cam2jav();
                StringBuffer rscModule = new StringBuffer(x.getRscDir());
//System.out.println("ola1="+x.getRscDir());
                rscModule.append(rscName);
//System.out.println("ola2="+rscName.toString());
                MJEWindow rsc = new MJEWindow(rscModule.toString(),font);
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }

            return true;
        }
        else if (event.target == btnExeFile && event.id == Event.ACTION_EVENT) {
            if (lstRSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstRSC.getSelectedIndex()) {
                    case 0: rscName = "RSC.cam";break;
                    case 1: rscName = "FSET.cam";break;
                    case 2: rscName = "BREL.cam";break;
                    case 3: rscName = "ORDER.cam";break;
                    case 4: rscName = "FFSET.cam";break;
                    case 5: rscName = "QSET.cam";break;
                    case 6: rscName = "FFUN.cam";break;
                    case 7: rscName = "MSET.cam";break;
                    case 8: rscName = "FAMILY.cam";break;
                    case 9: rscName = "PQUEUE.cam";break;
                    case 10: rscName = "PQUEUEMK.cam";break;
                    case 11: rscName = "QFUN.cam";break;
                    case 12: rscName = "FDEP.cam";break;
                    case 13: rscName = "FDMO.cam";break;
                    case 14: rscName = "FDMONAT.cam";break;
                    case 15: rscName = "BAMS.cam";break;
                    case 16: rscName = "SEQ.cam";break;
                    case 17: rscName = "FLIST.cam";break;
                    case 18: rscName = "TEXT.cam";break;
                    case 19: rscName = "STACK.cam";break;
                    case 20: rscName = "QUEUE.cam";break;
                    default: rscName = "";
                }

                cam2jav x = new cam2jav();
                StringBuffer rscModule = new StringBuffer(x.getRscDir());
                rscModule.append(rscName);
                x.camExecute(rscModule.toString());
                m_frame.theInt.txtPrompt.init();
                m_frame.theLayout.show(m_frame.pnlMain,"I");
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }

            return true;
        }
        else if (event.target == btnExeShellFile && event.id == Event.ACTION_EVENT) {
            if (lstRSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstRSC.getSelectedIndex()) {
                    case 0: rscName = "RSC.cam";break;
                    case 1: rscName = "FSET.cam";break;
                    case 2: rscName = "BREL.cam";break;
                    case 3: rscName = "ORDER.cam";break;
                    case 4: rscName = "FFSET.cam";break;
                    case 5: rscName = "QSET.cam";break;
                    case 6: rscName = "FFUN.cam";break;
                    case 7: rscName = "MSET.cam";break;
                    case 8: rscName = "FAMILY.cam";break;
                    case 9: rscName = "PQUEUE.cam";break;
                    case 10: rscName = "PQUEUEMK.cam";break;
                    case 11: rscName = "QFUN.cam";break;
                    case 12: rscName = "FDEP.cam";break;
                    case 13: rscName = "FDMO.cam";break;
                    case 14: rscName = "FDMONAT.cam";break;
                    case 15: rscName = "BAMS.cam";break;
                    case 16: rscName = "SEQ.cam";break;
                    case 17: rscName = "FLIST.cam";break;
                    case 18: rscName = "TEXT.cam";break;
                    case 19: rscName = "STACK.cam";break;
                    case 20: rscName = "QUEUE.cam";break;
                    default: rscName = "";
                }

                cam2jav x = new cam2jav();
                StringBuffer rscModule = new StringBuffer(x.getRscDir());
                rscModule.append(rscName);
                x.camExShell(rscModule.toString());
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }

            return true;
        }
        else if (event.target == btnPrettyFile && event.id == Event.ACTION_EVENT) {
            if (lstRSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstRSC.getSelectedIndex()) {
                    case 0: rscName = "RSC.cam";break;
                    case 1: rscName = "FSET.cam";break;
                    case 2: rscName = "BREL.cam";break;
                    case 3: rscName = "ORDER.cam";break;
                    case 4: rscName = "FFSET.cam";break;
                    case 5: rscName = "QSET.cam";break;
                    case 6: rscName = "FFUN.cam";break;
                    case 7: rscName = "MSET.cam";break;
                    case 8: rscName = "FAMILY.cam";break;
                    case 9: rscName = "PQUEUE.cam";break;
                    case 10: rscName = "PQUEUEMK.cam";break;
                    case 11: rscName = "QFUN.cam";break;
                    case 12: rscName = "FDEP.cam";break;
                    case 13: rscName = "FDMO.cam";break;
                    case 14: rscName = "FDMONAT.cam";break;
                    case 15: rscName = "BAMS.cam";break;
                    case 16: rscName = "SEQ.cam";break;
                    case 17: rscName = "FLIST.cam";break;
                    case 18: rscName = "TEXT.cam";break;
                    case 19: rscName = "STACK.cam";break;
                    case 20: rscName = "QUEUE.cam";break;
                    default: rscName = "";
                }

                cam2jav x = new cam2jav();
                StringBuffer rscModule = new StringBuffer(x.getRscDir());
                rscModule.append(rscName);
                x.camPretty(rscModule.toString());
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }

            return true;
        }
        else if (event.target == btnManFile && event.id == Event.ACTION_EVENT) {
            if (lstRSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstRSC.getSelectedIndex()) {
                    case 0: rscName = "RSC.cam";break;
                    case 1: rscName = "FSET.cam";break;
                    case 2: rscName = "BREL.cam";break;
                    case 3: rscName = "ORDER.cam";break;
                    case 4: rscName = "FFSET.cam";break;
                    case 5: rscName = "QSET.cam";break;
                    case 6: rscName = "FFUN.cam";break;
                    case 7: rscName = "MSET.cam";break;
                    case 8: rscName = "FAMILY.cam";break;
                    case 9: rscName = "PQUEUE.cam";break;
                    case 10: rscName = "PQUEUEMK.cam";break;
                    case 11: rscName = "QFUN.cam";break;
                    case 12: rscName = "FDEP.cam";break;
                    case 13: rscName = "FDMO.cam";break;
                    case 14: rscName = "FDMONAT.cam";break;
                    case 15: rscName = "BAMS.cam";break;
                    case 16: rscName = "SEQ.cam";break;
                    case 17: rscName = "FLIST.cam";break;
                    case 18: rscName = "TEXT.cam";break;
                    case 19: rscName = "STACK.cam";break;
                    case 20: rscName = "QUEUE.cam";break;
                    default: rscName = "";
                }

                cam2jav x = new cam2jav();
                StringBuffer rscModule = new StringBuffer(x.getRscDir());
                rscModule.append(rscName);
                x.camMan(rscModule.toString());
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }

            return true;
        }
        else if (event.target == btnMoreInf && event.id == Event.ACTION_EVENT) {
            m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
            cam2jav x = new cam2jav();
            //x.camMoreAbout("http://camila.di.uminho.pt/camila-rsc.html");
            x.camMoreAbout("camila-rsc.html");
            m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

            return true;
        }

        return false;
    }

}

class pnlLib extends Panel {
    camila97 m_frame;
    Font font;
    List lstCSC;
    Panel pnlCSC;
    Panel pnlBUT;
    Panel pnlCommands;
    Button btnSrcFile;
    Button btnSigFile;
    Button btnPrtFile;
    Button btnManFile;
    Button btnMoreInf;

    public pnlLib(camila97 frame) {
        super();

        m_frame = frame;

        setLayout(new BorderLayout());

        font = new Font("Courier", Font.PLAIN, 12);

        pnlCSC = new Panel();
        //pnlCSC.setLayout(new BorderLayout());
        pnlCSC.setLayout(new GridLayout(0,1));
        lstCSC = new List();
        lstCSC.setFont(new Font("ARIAL",Font.PLAIN,12));
        lstCSC.setBackground(Color.white);
        lstCSC.add("FF - a CAMILA library for finite mappings");
        lstCSC.add("FFS - a CAMILA library for sets of finite mappings");
        lstCSC.add("INT - a CAMILA library for small integers (-32768..32767)");
        lstCSC.add("MON -  basic CAMILA monoidal constructions");
        lstCSC.add("MSE -  CAMILA library for multisets");
        lstCSC.add("SEQ - a CAMILA library for the A-seq functor");
        lstCSC.add("STR - a CAMILA library for the finite string STR data type");
        lstCSC.add("TEX - a CAMILA abstract syntax for a LaTeX subset");
        lstCSC.add("TXT - a CAMILA library for text representation");
        pnlCSC.add(lstCSC);

        pnlBUT = new Panel();
        pnlBUT.setLayout(new GridLayout(0,1,4,4));
        btnSrcFile = new Button("see source file");
        btnSigFile = new Button("show signature");
        btnPrtFile = new Button("pretty print");
        btnManFile = new Button("show man file");
        btnMoreInf = new Button("more about...");
        pnlBUT.add(btnSrcFile);
        pnlBUT.add(btnSigFile);
        pnlBUT.add(btnPrtFile);
        pnlBUT.add(btnManFile);
        pnlBUT.add(btnMoreInf);

        pnlCommands = new Panel();
        pnlCommands.setLayout(new BorderLayout());
        pnlCommands.add("North",pnlBUT);

        add("Center",pnlCSC);
        add("East",pnlCommands);
    }

    public boolean handleEvent(Event event) {
        String rscName;
        if (event.target == btnSrcFile && event.id == Event.ACTION_EVENT) {
            if (lstCSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstCSC.getSelectedIndex()) {
                    case 0: rscName = "ff.cam";break;
                    case 1: rscName = "ffs.cam";break;
                    case 2: rscName = "int.cam";break;
                    case 3: rscName = "mon.cam";break;
                    case 4: rscName = "mse.cam";break;
                    case 5: rscName = "seq.cam";break;
                    case 6: rscName = "str.cam";break;
                    case 7: rscName = "tex.cam";break;
                    case 8: rscName = "txt.cam";break;
                    default: rscName = "";
                }
                cam2jav x = new cam2jav();
                StringBuffer camModule = new StringBuffer(x.getCamDir());
                camModule.append(rscName);
                MJEWindow rsc = new MJEWindow(camModule.toString(),font);
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
            return true;
        }
        else if (event.target == btnSigFile && event.id == Event.ACTION_EVENT) {
            if (lstCSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstCSC.getSelectedIndex()) {
                    case 0: rscName = "ff.html";break;
                    case 1: rscName = "ffs.html";break;
                    case 2: rscName = "int.html";break;
                    case 3: rscName = "mon.html";break;
                    case 4: rscName = "mse.html";break;
                    case 5: rscName = "seq.html";break;
                    case 6: rscName = "str.html";break;
                    case 7: rscName = "tex.html";break;
                    case 8: rscName = "txt.html";break;
                    default: rscName = "";
                }
                cam2jav x = new cam2jav();
                StringBuffer sigModule = new StringBuffer(x.getSigDir());
                sigModule.append(rscName);
                x.camApplet(sigModule.toString());
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
            return true;
        }
       else if (event.target == btnPrtFile && event.id == Event.ACTION_EVENT) {
            if (lstCSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstCSC.getSelectedIndex()) {
                    case 0: rscName = "ff.cam";break;
                    case 1: rscName = "ffs.cam";break;
                    case 2: rscName = "int.cam";break;
                    case 3: rscName = "mon.cam";break;
                    case 4: rscName = "mse.cam";break;
                    case 5: rscName = "seq.cam";break;
                    case 6: rscName = "str.cam";break;
                    case 7: rscName = "tex.cam";break;
                    case 8: rscName = "txt.cam";break;
                    default: rscName = "";
                }
                cam2jav x = new cam2jav();
                StringBuffer camModule = new StringBuffer(x.getCamDir());
                camModule.append(rscName);
                x.camPretty(camModule.toString());
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
            return true;
        }
        else if (event.target == btnManFile && event.id == Event.ACTION_EVENT) {
            if (lstCSC.getSelectedIndex() != -1) {
                m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
                switch(lstCSC.getSelectedIndex()) {
                    case 0: rscName = "ff.html";break;
                    case 1: rscName = "ffs.html";break;
                    case 2: rscName = "int.html";break;
                    case 3: rscName = "mon.html";break;
                    case 4: rscName = "mse.html";break;
                    case 5: rscName = "seq.html";break;
                    case 6: rscName = "str.html";break;
                    case 7: rscName = "tex.html";break;
                    case 8: rscName = "txt.html";break;
                    default: rscName = "";
                }
                cam2jav x = new cam2jav();
                StringBuffer docModule = new StringBuffer(x.getDocDir());
                docModule.append(rscName);
                x.camShowMan(docModule.toString());
                m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
            }
            return true;
        }
        else if (event.target == btnMoreInf && event.id == Event.ACTION_EVENT) {
            m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
            cam2jav x = new cam2jav();
            //x.camMoreAbout("http://camila.di.uminho.pt/camila-csc.html");
            x.camMoreAbout("camila-csc.html");
            m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));

            return true;
        }

        return false;
    }

}

class RSCImageCanvas extends Canvas {
    int rscID;

    public RSCImageCanvas() {
        //reshape(0,0,521,351);
        setSize(new Dimension(650,500));
	rscID = 0;
        setBackground(Color.white);
    }

    public void setRSC(int i) { rscID = i; }

    public void drawArrow(Graphics g,int x1,int y1,int x2,int y2) {
        int ARROWSIZE = 10;
        double ARROWANGLE = Math.PI/6;

        Point AL,AR;
        double px,py;
        double alpha,alphaL,alphaR;
        double Alx,Aly,Arx,Ary;

        px = x2 - x1;
        py = y1 - y2;
        // Calculating alpha, alphaL, alphaR...
        if (px == 0) alpha = (py < 0) ? Math.PI/2 : -Math.PI/2;
        else alpha = Math.atan(py / px);
        // Calculating alphaL, alphaR...
        alphaL = alpha - ARROWANGLE;
        alphaR = alpha + ARROWANGLE;
        // Calculating arrow projections...
        Alx = Math.cos(alphaL) * ARROWSIZE;
        Aly = Math.sin(alphaL) * ARROWSIZE;
        Arx = Math.cos(alphaR) * ARROWSIZE;
        Ary = Math.sin(alphaR) * ARROWSIZE;
        // Calculating arrow points...
        if (px > 0)
        {
            AL = new Point((int)x2 - (int)(Alx),(int)y2 + (int)(Aly));
            AR = new Point((int)x2 - (int)(Arx),(int)y2 + (int)(Ary));
        }
        else
        {
            AL = new Point((int)x2 + (int)(Alx),(int)y2 - (int)(Aly));
            AR = new Point((int)x2 + (int)(Arx),(int)y2 - (int)(Ary));
        }
        // Drawing...
        g.drawLine(x1,y1,x2,y2);
        g.drawLine(AL.x,AL.y,x2,y2);
        g.drawLine(AR.x,AR.y,x2,y2);
    }

    public void drawRSC(Graphics g) {
        Rectangle r = bounds();
        //int hlines = r.height / 10;
        //int vlines = r.width / 10;
        g.setFont(new Font("Arial",Font.BOLD,8));

        // CAMILA source code generation
        switch (rscID) {
/* camila generated file insertion */

case 0:

g.drawRect(250,50,150,400);
g.drawString("RSC",318,225);
g.drawString("A",325,313);
drawArrow(g,250,216,0,216);
g.drawString("EQL : A --> BOOL ",148,206);
drawArrow(g,0,332,250,332);
g.drawString("NOP :  -->  ",178,322);
drawArrow(g,400,216,650,216);
g.drawString("RD :  --> A ",407,206);
drawArrow(g,650,332,400,332);
g.drawString("WR : A -->  ",407,322);break;
case 1:

g.drawRect(250,50,150,400);
g.drawString("FSET",311,225);
g.drawString("A-set",317,313);
drawArrow(g,250,158,0,158);
g.drawString("EMPTY :  --> BOOL ",142,148);
drawArrow(g,250,216,0,216);
g.drawString("EQL : A-set --> BOOL ",124,206);
drawArrow(g,250,274,0,274);
g.drawString("GET :  --> A ",172,264);
drawArrow(g,0,332,250,332);
g.drawString("INIT :  -->  ",172,322);
drawArrow(g,0,390,250,390);
g.drawString("INS : A -->  ",172,380);
drawArrow(g,650,158,400,158);
g.drawString("NOP :  -->  ",407,148);
drawArrow(g,400,216,650,216);
g.drawString("RD :  --> A-set ",407,206);
drawArrow(g,650,274,400,274);
g.drawString("REM : A -->  ",407,264);
drawArrow(g,400,332,650,332);
g.drawString("TEST : A --> BOOL ",407,322);
drawArrow(g,650,390,400,390);
g.drawString("WR : A-set -->  ",407,380);break;
case 2:

g.drawRect(250,50,150,400);
g.drawString("BREL",311,225);
g.drawString("(A*B)-set",309,313);
drawArrow(g,250,143,0,143);
g.drawString("EMPTY :  --> BOOL ",142,133);
drawArrow(g,250,186,0,186);
g.drawString("EQL : (A*B)-set --> BOOL ",100,176);
drawArrow(g,250,229,0,229);
g.drawString("GET :  --> A*B ",160,219);
drawArrow(g,0,272,250,272);
g.drawString("INIT :  -->  ",172,262);
drawArrow(g,0,315,250,315);
g.drawString("INS : A*B -->  ",160,305);
drawArrow(g,0,358,250,358);
g.drawString("NOP :  -->  ",178,348);
drawArrow(g,250,401,0,401);
g.drawString("RD :  --> (A*B)-set ",130,391);
drawArrow(g,650,143,400,143);
g.drawString("REM : A*B -->  ",407,133);
drawArrow(g,650,186,400,186);
g.drawString("REML : B -->  ",407,176);
drawArrow(g,650,229,400,229);
g.drawString("REMR : A -->  ",407,219);
drawArrow(g,400,272,650,272);
g.drawString("SELL : B --> A-set ",407,262);
drawArrow(g,400,315,650,315);
g.drawString("SELR : A --> B-set ",407,305);
drawArrow(g,400,358,650,358);
g.drawString("TEST : A*B --> BOOL ",407,348);
drawArrow(g,650,401,400,401);
g.drawString("WR : (A*B)-set -->  ",407,391);break;
case 3:

g.drawRect(250,50,150,400);
g.drawString("ORDER",311,225);
g.drawString("(A*A)-set",309,313);
drawArrow(g,250,138,0,138);
g.drawString("EMPTY :  --> BOOL ",142,128);
drawArrow(g,250,176,0,176);
g.drawString("EQL : (A*A)-set --> BOOL ",100,166);
drawArrow(g,250,214,0,214);
g.drawString("GET :  --> A*A ",160,204);
drawArrow(g,0,252,250,252);
g.drawString("INIT :  -->  ",172,242);
drawArrow(g,0,290,250,290);
g.drawString("INS : A*A -->  ",160,280);
drawArrow(g,0,328,250,328);
g.drawString("NOP :  -->  ",178,318);
drawArrow(g,0,366,250,366);
g.drawString("RCLOSE :  -->  ",160,356);
drawArrow(g,250,404,0,404);
g.drawString("RD :  --> (A*A)-set ",130,394);
drawArrow(g,650,135,400,135);
g.drawString("REM : A*A -->  ",407,125);
drawArrow(g,650,170,400,170);
g.drawString("REML : A -->  ",407,160);
drawArrow(g,650,205,400,205);
g.drawString("REMR : A -->  ",407,195);
drawArrow(g,650,240,400,240);
g.drawString("SCLOSE :  -->  ",407,230);
drawArrow(g,400,275,650,275);
g.drawString("SELL : A --> A-set ",407,265);
drawArrow(g,400,310,650,310);
g.drawString("SELR : A --> A-set ",407,300);
drawArrow(g,650,345,400,345);
g.drawString("TCLOSE :  -->  ",407,335);
drawArrow(g,400,380,650,380);
g.drawString("TEST : A*A --> BOOL ",407,370);
drawArrow(g,650,415,400,415);
g.drawString("WR : (A*A)-set -->  ",407,405);break;
case 4:

g.drawRect(250,50,150,400);
g.drawString("FFSET",311,225);
g.drawString("(A->B)-set",305,313);
drawArrow(g,250,150,0,150);
g.drawString("EMPTY :  --> BOOL ",142,140);
drawArrow(g,250,200,0,200);
g.drawString("EQL : (A->B)-set --> BOOL ",94,190);
drawArrow(g,250,250,0,250);
g.drawString("GET :  --> A->B ",154,240);
drawArrow(g,250,300,0,300);
g.drawString("HIST : B --> B->NAT ",130,290);
drawArrow(g,0,350,250,350);
g.drawString("INIT :  -->  ",172,340);
drawArrow(g,0,400,250,400);
g.drawString("INS : A->B -->  ",154,390);
drawArrow(g,650,143,400,143);
g.drawString("JOIN : (A->B)-set -->  ",407,133);
drawArrow(g,650,186,400,186);
g.drawString("NOP :  -->  ",407,176);
drawArrow(g,400,229,650,229);
g.drawString("RD :  --> (A->B)-set ",407,219);
drawArrow(g,650,272,400,272);
g.drawString("REM : A->B -->  ",407,262);
drawArrow(g,650,315,400,315);
g.drawString("REN : A->A -->  ",407,305);
drawArrow(g,400,358,650,358);
g.drawString("TEST : A->B --> BOOL ",407,348);
drawArrow(g,650,401,400,401);
g.drawString("WR : (A->B)-set -->  ",407,391);break;
case 5:

g.drawRect(250,50,150,400);
g.drawString("QSET",311,225);
g.drawString("(A-set)-set",305,313);
drawArrow(g,250,150,0,150);
g.drawString("CLASS : A --> A-set ",130,140);
drawArrow(g,250,200,0,200);
g.drawString("EMPTY :  --> BOOL ",142,190);
drawArrow(g,250,250,0,250);
g.drawString("EQL : (A-set)-set --> BOOL ",88,240);
drawArrow(g,0,300,250,300);
g.drawString("EQU : A , A -->  ",148,290);
drawArrow(g,250,350,0,350);
g.drawString("ETEST : A , A --> BOOL ",112,340);
drawArrow(g,250,400,0,400);
g.drawString("GET :  --> A-set ",148,390);
drawArrow(g,650,143,400,143);
g.drawString("INIT :  -->  ",407,133);
drawArrow(g,650,186,400,186);
g.drawString("INS : A-set -->  ",407,176);
drawArrow(g,650,229,400,229);
g.drawString("NOP :  -->  ",407,219);
drawArrow(g,400,272,650,272);
g.drawString("RD :  --> (A-set)-set ",407,262);
drawArrow(g,650,315,400,315);
g.drawString("REM : A-set -->  ",407,305);
drawArrow(g,400,358,650,358);
g.drawString("TEST : A-set --> BOOL ",407,348);
drawArrow(g,650,401,400,401);
g.drawString("WR : (A-set)-set -->  ",407,391);break;
case 6:

g.drawRect(250,50,150,400);
g.drawString("FFUN",311,225);
g.drawString("A->B",317,313);
drawArrow(g,250,170,0,170);
g.drawString("EMPTY :  --> BOOL ",142,160);
drawArrow(g,250,240,0,240);
g.drawString("EQL : A->B --> BOOL ",130,230);
drawArrow(g,250,310,0,310);
g.drawString("FIND : A --> B ",160,300);
drawArrow(g,0,380,250,380);
g.drawString("INIT :  -->  ",172,370);
drawArrow(g,650,158,400,158);
g.drawString("INS : A , B -->  ",407,148);
drawArrow(g,650,216,400,216);
g.drawString("NOP :  -->  ",407,206);
drawArrow(g,400,274,650,274);
g.drawString("RD :  --> A->B ",407,264);
drawArrow(g,650,332,400,332);
g.drawString("REM : A -->  ",407,322);
drawArrow(g,650,390,400,390);
g.drawString("WR : A->B -->  ",407,380);break;
case 7:

g.drawRect(250,50,150,400);
g.drawString("MSET",311,225);
g.drawString("A->NAT",313,313);
drawArrow(g,0,150,250,150);
g.drawString("ADD : A->NAT -->  ",142,140);
drawArrow(g,0,200,250,200);
g.drawString("DIF : A->NAT -->  ",142,190);
drawArrow(g,250,250,0,250);
g.drawString("EMPTY :  --> BOOL ",142,240);
drawArrow(g,250,300,0,300);
g.drawString("EQL : A->NAT --> BOOL ",118,290);
drawArrow(g,250,350,0,350);
g.drawString("FIND : A --> NAT ",148,340);
drawArrow(g,0,400,250,400);
g.drawString("INIT :  -->  ",172,390);
drawArrow(g,650,150,400,150);
g.drawString("INS : A , NAT -->  ",407,140);
drawArrow(g,650,200,400,200);
g.drawString("MUL : NAT -->  ",407,190);
drawArrow(g,650,250,400,250);
g.drawString("NOP :  -->  ",407,240);
drawArrow(g,400,300,650,300);
g.drawString("RD :  --> A->NAT ",407,290);
drawArrow(g,650,350,400,350);
g.drawString("REM : A -->  ",407,340);
drawArrow(g,650,400,400,400);
g.drawString("WR : A->NAT -->  ",407,390);break;
case 8:

g.drawRect(250,50,150,400);
g.drawString("FAMILY",304,225);
g.drawString("A->B-set",309,313);
drawArrow(g,250,158,0,158);
g.drawString("EMPTY :  --> BOOL ",142,148);
drawArrow(g,250,216,0,216);
g.drawString("EQL : A->B-set --> BOOL ",106,206);
drawArrow(g,250,274,0,274);
g.drawString("FIND : A --> B-set ",136,264);
drawArrow(g,0,332,250,332);
g.drawString("INIT :  -->  ",172,322);
drawArrow(g,0,390,250,390);
g.drawString("INS : A , B-set -->  ",124,380);
drawArrow(g,650,150,400,150);
g.drawString("JOIN : A , B -->  ",407,140);
drawArrow(g,650,200,400,200);
g.drawString("LEAVE : A , B -->  ",407,190);
drawArrow(g,650,250,400,250);
g.drawString("NOP :  -->  ",407,240);
drawArrow(g,400,300,650,300);
g.drawString("RD :  --> A->B-set ",407,290);
drawArrow(g,650,350,400,350);
g.drawString("REM : A -->  ",407,340);
drawArrow(g,650,400,400,400);
g.drawString("WR : A->B-set -->  ",407,390);break;
case 9:

g.drawRect(250,50,150,400);
g.drawString("PQUEUE",304,225);
g.drawString("A->B-seq",309,313);
drawArrow(g,250,150,0,150);
g.drawString("DEQ :  --> B ",172,140);
drawArrow(g,250,200,0,200);
g.drawString("EMPTY :  --> BOOL ",142,190);
drawArrow(g,0,250,250,250);
g.drawString("ENQ : A , B -->  ",148,240);
drawArrow(g,250,300,0,300);
g.drawString("EQL : A->B-seq --> BOOL ",106,290);
drawArrow(g,250,350,0,350);
g.drawString("FIND : A --> B-seq ",136,340);
drawArrow(g,250,400,0,400);
g.drawString("FRONT :  --> B ",160,390);
drawArrow(g,650,150,400,150);
g.drawString("INIT :  -->  ",407,140);
drawArrow(g,650,200,400,200);
g.drawString("INS : A , B-seq -->  ",407,190);
drawArrow(g,650,250,400,250);
g.drawString("NOP :  -->  ",407,240);
drawArrow(g,400,300,650,300);
g.drawString("RD :  --> A->B-seq ",407,290);
drawArrow(g,650,350,400,350);
g.drawString("REM : A -->  ",407,340);
drawArrow(g,650,400,400,400);
g.drawString("WR : A->B-seq -->  ",407,390);break;
case 10:

g.drawRect(250,50,150,400);
g.drawString("PQUEUEMK",297,225);
g.drawString("(A1*A2)->B-seq",297,313);
drawArrow(g,250,150,0,150);
g.drawString("DEQ :  --> B ",172,140);
drawArrow(g,250,200,0,200);
g.drawString("EMPTY :  --> BOOL ",142,190);
drawArrow(g,0,250,250,250);
g.drawString("ENQ : A1*A2 , B -->  ",124,240);
drawArrow(g,250,300,0,300);
g.drawString("EQL : (A1*A2)->B-seq --> BOOL ",70,290);
drawArrow(g,250,350,0,350);
g.drawString("FIND : A1*A2 --> B-seq ",112,340);
drawArrow(g,250,400,0,400);
g.drawString("FRONT :  --> B ",160,390);
drawArrow(g,650,150,400,150);
g.drawString("INIT :  -->  ",407,140);
drawArrow(g,650,200,400,200);
g.drawString("INS : A1*A2 , B-seq -->  ",407,190);
drawArrow(g,650,250,400,250);
g.drawString("NOP :  -->  ",407,240);
drawArrow(g,400,300,650,300);
g.drawString("RD :  --> (A1*A2)->B-seq ",407,290);
drawArrow(g,650,350,400,350);
g.drawString("REM : A1*A2 -->  ",407,340);
drawArrow(g,650,400,400,400);
g.drawString("WR : (A1*A2)->B-seq -->  ",407,390);break;
case 11:

g.drawRect(250,50,150,400);
g.drawString("QFUN",311,225);
g.drawString("A->B->C",313,313);
drawArrow(g,0,158,250,158);
g.drawString("DEL : A , B -->  ",148,148);
drawArrow(g,250,216,0,216);
g.drawString("EMPTY :  --> BOOL ",142,206);
drawArrow(g,250,274,0,274);
g.drawString("EQL : A->B->C --> BOOL ",112,264);
drawArrow(g,250,332,0,332);
g.drawString("FIND : A --> B->C ",142,322);
drawArrow(g,0,390,250,390);
g.drawString("INIT :  -->  ",172,380);
drawArrow(g,650,158,400,158);
g.drawString("INS : A , B->C -->  ",407,148);
drawArrow(g,650,216,400,216);
g.drawString("NOP :  -->  ",407,206);
drawArrow(g,400,274,650,274);
g.drawString("RD :  --> A->B->C ",407,264);
drawArrow(g,650,332,400,332);
g.drawString("REM : A -->  ",407,322);
drawArrow(g,650,390,400,390);
g.drawString("WR : A->B->C -->  ",407,380);break;
case 12:

g.drawRect(250,50,150,400);
g.drawString("FDEP",311,225);
g.drawString("A->B*C",313,313);
drawArrow(g,250,158,0,158);
g.drawString("EMPTY :  --> BOOL ",142,148);
drawArrow(g,250,216,0,216);
g.drawString("EQL : A->B*C --> BOOL ",118,206);
drawArrow(g,250,274,0,274);
g.drawString("FIND : A --> B*C ",148,264);
drawArrow(g,0,332,250,332);
g.drawString("INIT :  -->  ",172,322);
drawArrow(g,0,390,250,390);
g.drawString("INS : A , B*C -->  ",136,380);
drawArrow(g,650,150,400,150);
g.drawString("NOP :  -->  ",407,140);
drawArrow(g,400,200,650,200);
g.drawString("RD :  --> A->B*C ",407,190);
drawArrow(g,650,250,400,250);
g.drawString("REM : A -->  ",407,240);
drawArrow(g,400,300,650,300);
g.drawString("SELL : A --> B ",407,290);
drawArrow(g,400,350,650,350);
g.drawString("SELR : A --> C ",407,340);
drawArrow(g,650,400,400,400);
g.drawString("WR : A->B*C -->  ",407,390);break;
case 13:

g.drawRect(250,50,150,400);
g.drawString("FDMO",311,225);
g.drawString("A->(B-set)*C",301,313);
drawArrow(g,0,150,250,150);
g.drawString("ADDONL : A , B-set -->  ",106,140);
drawArrow(g,250,200,0,200);
g.drawString("EMPTY :  --> BOOL ",142,190);
drawArrow(g,250,250,0,250);
g.drawString("EQL : A->(B-set)*C --> BOOL ",82,240);
drawArrow(g,250,300,0,300);
g.drawString("FIND : A --> (B-set)*C ",112,290);
drawArrow(g,0,350,250,350);
g.drawString("INIT :  -->  ",172,340);
drawArrow(g,0,400,250,400);
g.drawString("INS : A , (B-set)*C -->  ",100,390);
drawArrow(g,650,143,400,143);
g.drawString("NEW : A , B-set , C -->  ",407,133);
drawArrow(g,650,186,400,186);
g.drawString("NOP :  -->  ",407,176);
drawArrow(g,400,229,650,229);
g.drawString("RD :  --> A->(B-set)*C ",407,219);
drawArrow(g,650,272,400,272);
g.drawString("REM : A -->  ",407,262);
drawArrow(g,400,315,650,315);
g.drawString("SELL : A --> B-set ",407,305);
drawArrow(g,400,358,650,358);
g.drawString("SELR : A --> C ",407,348);
drawArrow(g,650,401,400,401);
g.drawString("WR : A->(B-set)*C -->  ",407,391);break;
case 14:

g.drawRect(250,50,150,400);
g.drawString("FDMONAT",304,225);
g.drawString("A->(B-set)*NAT",297,313);
drawArrow(g,0,138,250,138);
g.drawString("ADDONL : A , B-set -->  ",106,128);
drawArrow(g,0,176,250,176);
g.drawString("ADDONR : A , NAT -->  ",118,166);
drawArrow(g,250,214,0,214);
g.drawString("EMPTY :  --> BOOL ",142,204);
drawArrow(g,250,252,0,252);
g.drawString("EQL : A->(B-set)*NAT --> BOOL ",70,242);
drawArrow(g,250,290,0,290);
g.drawString("FIND : A --> (B-set)*NAT ",100,280);
drawArrow(g,0,328,250,328);
g.drawString("INIT :  -->  ",172,318);
drawArrow(g,0,366,250,366);
g.drawString("INS : A , (B-set)*NAT -->  ",88,356);
drawArrow(g,0,404,250,404);
g.drawString("NEW : A , B-set , NAT -->  ",88,394);
drawArrow(g,650,138,400,138);
g.drawString("NOP :  -->  ",407,128);
drawArrow(g,400,176,650,176);
g.drawString("RD :  --> A->(B-set)*NAT ",407,166);
drawArrow(g,650,214,400,214);
g.drawString("REM : A -->  ",407,204);
drawArrow(g,400,252,650,252);
g.drawString("SELL : A --> B-set ",407,242);
drawArrow(g,400,290,650,290);
g.drawString("SELONR : NAT --> B-set ",407,280);
drawArrow(g,400,328,650,328);
g.drawString("SELR : A --> NAT ",407,318);
drawArrow(g,650,366,400,366);
g.drawString("SUBONR : A , NAT -->  ",407,356);
drawArrow(g,650,404,400,404);
g.drawString("WR : A->(B-set)*NAT -->  ",407,394);break;
case 15:

g.drawRect(250,50,150,400);
g.drawString("BAMS",311,225);
g.drawString("AccId->(AccHolder-set)*NAT",273,313);
drawArrow(g,0,138,250,138);
g.drawString("AddAccHolders : AccId , AccHolder-set -->  ",-8,128);
drawArrow(g,0,176,250,176);
g.drawString("Credit : AccId , NAT -->  ",94,166);
drawArrow(g,250,214,0,214);
g.drawString("EMPTY :  --> BOOL ",142,204);
drawArrow(g,250,252,0,252);
g.drawString("EQL : AccId->(AccHolder-set)*NAT --> BOOL ",-2,242);
drawArrow(g,250,290,0,290);
g.drawString("FIND : AccId --> (AccHolder-set)*NAT ",28,280);
drawArrow(g,250,328,0,328);
g.drawString("GoodCostumers : NAT --> AccHolder-set ",22,318);
drawArrow(g,0,366,250,366);
g.drawString("INIT :  -->  ",172,356);
drawArrow(g,0,404,250,404);
g.drawString("INS : AccId , (AccHolder-set)*NAT -->  ",16,394);
drawArrow(g,650,138,400,138);
g.drawString("NOP :  -->  ",407,128);
drawArrow(g,650,176,400,176);
g.drawString("OpenAccount : AccId , AccHolder-set , NAT -->  ",407,166);
drawArrow(g,400,214,650,214);
g.drawString("RD :  --> AccId->(AccHolder-set)*NAT ",407,204);
drawArrow(g,650,252,400,252);
g.drawString("REM : AccId -->  ",407,242);
drawArrow(g,400,290,650,290);
g.drawString("SELL : AccId --> AccHolder-set ",407,280);
drawArrow(g,400,328,650,328);
g.drawString("SELR : AccId --> NAT ",407,318);
drawArrow(g,650,366,400,366);
g.drawString("WR : AccId->(AccHolder-set)*NAT -->  ",407,356);
drawArrow(g,650,404,400,404);
g.drawString("Withdraw : AccId , NAT -->  ",407,394);break;
case 16:

g.drawRect(250,50,150,400);
g.drawString("SEQ",318,225);
g.drawString("A-seq",317,313);
drawArrow(g,250,187,0,187);
g.drawString("EMPTY :  --> BOOL ",142,177);
drawArrow(g,250,274,0,274);
g.drawString("EQL : A-seq --> BOOL ",124,264);
drawArrow(g,0,361,250,361);
g.drawString("INIT :  -->  ",172,351);
drawArrow(g,650,187,400,187);
g.drawString("NOP :  -->  ",407,177);
drawArrow(g,400,274,650,274);
g.drawString("RD :  --> A-seq ",407,264);
drawArrow(g,650,361,400,361);
g.drawString("WR : A-seq -->  ",407,351);break;
case 17:

g.drawRect(250,50,150,400);
g.drawString("FLIST",311,225);
g.drawString("(A-seq)-seq",305,313);
drawArrow(g,0,158,250,158);
g.drawString("CONS : A -->  ",166,148);
drawArrow(g,250,216,0,216);
g.drawString("EMPTY :  --> BOOL ",142,206);
drawArrow(g,250,274,0,274);
g.drawString("EQL : (A-seq)-seq --> BOOL ",88,264);
drawArrow(g,250,332,0,332);
g.drawString("GET :  --> A ",172,322);
drawArrow(g,250,390,0,390);
g.drawString("HEAD :  --> A ",166,380);
drawArrow(g,650,158,400,158);
g.drawString("INIT :  -->  ",407,148);
drawArrow(g,650,216,400,216);
g.drawString("NOP :  -->  ",407,206);
drawArrow(g,400,274,650,274);
g.drawString("RD :  --> (A-seq)-seq ",407,264);
drawArrow(g,650,332,400,332);
g.drawString("TAIL : A -->  ",407,322);
drawArrow(g,650,390,400,390);
g.drawString("WR : (A-seq)-seq -->  ",407,380);break;
case 18:

g.drawRect(250,50,150,400);
g.drawString("TEXT",311,225);
g.drawString("((A-seq)-seq)-seq",293,313);
drawArrow(g,0,150,250,150);
g.drawString("CONS : A-seq -->  ",142,140);
drawArrow(g,250,200,0,200);
g.drawString("DEL : NAT , NAT --> A ",118,190);
drawArrow(g,250,250,0,250);
g.drawString("EMPTY :  --> BOOL ",142,240);
drawArrow(g,250,300,0,300);
g.drawString("EQL : ((A-seq)-seq)-seq --> BOOL ",52,290);
drawArrow(g,250,350,0,350);
g.drawString("GET :  --> A-seq ",148,340);
drawArrow(g,250,400,0,400);
g.drawString("HEAD :  --> A-seq ",142,390);
drawArrow(g,650,143,400,143);
g.drawString("INIT :  -->  ",407,133);
drawArrow(g,650,186,400,186);
g.drawString("INS : A , NAT , NAT -->  ",407,176);
drawArrow(g,650,229,400,229);
g.drawString("NOP :  -->  ",407,219);
drawArrow(g,400,272,650,272);
g.drawString("RD :  --> ((A-seq)-seq)-seq ",407,262);
drawArrow(g,400,315,650,315);
g.drawString("READ : NAT , NAT --> A ",407,305);
drawArrow(g,650,358,400,358);
g.drawString("TAIL : A-seq -->  ",407,348);
drawArrow(g,650,401,400,401);
g.drawString("WR : ((A-seq)-seq)-seq -->  ",407,391);break;
case 19:

g.drawRect(250,50,150,400);
g.drawString("STACK",311,225);
g.drawString("A-seq",317,313);
drawArrow(g,250,170,0,170);
g.drawString("EMPTY :  --> BOOL ",142,160);
drawArrow(g,250,240,0,240);
g.drawString("EQL : A-seq --> BOOL ",124,230);
drawArrow(g,0,310,250,310);
g.drawString("INIT :  -->  ",172,300);
drawArrow(g,0,380,250,380);
g.drawString("NOP :  -->  ",178,370);
drawArrow(g,400,158,650,158);
g.drawString("POP :  --> A ",407,148);
drawArrow(g,650,216,400,216);
g.drawString("PUSH : A -->  ",407,206);
drawArrow(g,400,274,650,274);
g.drawString("RD :  --> A-seq ",407,264);
drawArrow(g,400,332,650,332);
g.drawString("TOP :  --> A ",407,322);
drawArrow(g,650,390,400,390);
g.drawString("WR : A-seq -->  ",407,380);break;
case 20:

g.drawRect(250,50,150,400);
g.drawString("QUEUE",311,225);
g.drawString("A-seq",317,313);
drawArrow(g,250,170,0,170);
g.drawString("DEQ :  --> A ",172,160);
drawArrow(g,250,240,0,240);
g.drawString("EMPTY :  --> BOOL ",142,230);
drawArrow(g,0,310,250,310);
g.drawString("ENQ : A -->  ",172,300);
drawArrow(g,250,380,0,380);
g.drawString("EQL : A-seq --> BOOL ",124,370);
drawArrow(g,400,158,650,158);
g.drawString("FRONT :  --> A ",407,148);
drawArrow(g,650,216,400,216);
g.drawString("INIT :  -->  ",407,206);
drawArrow(g,650,274,400,274);
g.drawString("NOP :  -->  ",407,264);
drawArrow(g,400,332,650,332);
g.drawString("RD :  --> A-seq ",407,322);
drawArrow(g,650,390,400,390);
g.drawString("WR : A-seq -->  ",407,380);break;
default:

g.drawRect(250,50,150,400);
g.drawString("RSC",318,225);
g.drawString("A",325,313);
drawArrow(g,250,216,0,216);
g.drawString("EQL : A --> BOOL ",148,206);
drawArrow(g,0,332,250,332);
g.drawString("NOP :  -->  ",178,322);
drawArrow(g,400,216,650,216);
g.drawString("RD :  --> A ",407,206);
drawArrow(g,650,332,400,332);
g.drawString("WR : A -->  ",407,322);
        }
    }

    public void paint(Graphics g) {
/*
        if (focus) {
            g.setColor(Color.red);
        } else {
            g.setColor(Color.darkGray);
        }
*/
        drawRSC(g);
    }
}


class pnlRei extends Panel {
    camila97 m_frame;
    Button btnReifProc;
    Button btnReifERmod;
    Button btnReifFFmod;
    Button btnReifRules;
    Button btnSeeReifProc;
    Font font;
    List lstReifs;
    Panel pnlTop;
    Panel pnlModels;
    Panel pnlButtons;
    Label lblReifRep;
    TextArea txtInitModel;
    TextArea txtInfoModel;

    public pnlRei (camila97 frame) {
        super();

        m_frame = frame;

        font = new Font("Courier", Font.PLAIN, 12);

        setLayout(new BorderLayout());

        pnlModels = new Panel();
        pnlModels.setLayout(new BorderLayout());
        txtInitModel = new TextArea();
        txtInitModel.setBackground(Color.white);
        txtInitModel.setEditable(false);
        txtInfoModel = new TextArea();
        txtInfoModel.setBackground(Color.white);
        pnlModels.add("Center",txtInitModel);
        pnlModels.add("South",txtInfoModel);

        pnlButtons = new Panel();
        pnlButtons.setLayout(new GridLayout(0,1,4,4));
        btnSeeReifProc = new Button("see reification process");
        btnReifERmod = new Button("reify to ER model");
        btnReifFFmod = new Button("reify to FF model");
        btnReifRules = new Button("see reification rules");
        btnReifProc = new Button("see current reification");
        btnReifProc.setEnabled(false);

        pnlButtons.add(btnSeeReifProc);
        pnlButtons.add(btnReifERmod);
        pnlButtons.add(btnReifFFmod);
        pnlButtons.add(btnReifRules);
        pnlButtons.add(btnReifProc);

        pnlTop = new Panel();
        pnlTop.setLayout(new BorderLayout());
        lblReifRep = new Label("REIFICATION REPOSITORY");
		lblReifRep.setFont(new Font("ARIAL",Font.BOLD,12));
        lstReifs = new List();
        lstReifs.setBackground(Color.white);
	    lstReifs.setFont(new Font("Courier",Font.PLAIN,12));
        pnlTop.add("North",lblReifRep);
        pnlTop.add("Center",lstReifs);

        add("North",pnlTop);
        add("Center",pnlModels);
        add("East",pnlButtons);
    }

    public boolean action(Event event, Object arg) {
        if (event.target == btnReifERmod) {
            selectedBtnReifERmod();
            return true;
        } else if (event.target == btnReifFFmod) {
            selectedBtnReifFFmod();
            return true;
        } else if (event.target == btnReifRules) {
            selectedBtnReifRules();
            return true;
        } else if (event.target == btnReifProc) {
            selectedBtnReifProc();
            return true;
        } else if (event.target == btnSeeReifProc) {
            selectedBtnSeeReifProc();
            return true;
        }
 
        return false;
    }

    public void selectedBtnReifERmod() {
        txtInfoModel.setText("\nThis is a very time consuming operation. Please, be patient...");
m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        //String s = lstReifs.getSelectedItem();
        String s = m_frame.thePrj.lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            //x.camReif(s,"BAMS");
            x.camERReif(s);
            lstReifs.addItem(s.concat(".reif"));
        }
/*
        cam2jav x = new cam2jav(); 
        x.camReif("bams.cam","BAMS");
*/
        //txtInfoModel.append("\n\nReification process completed.");
        txtInfoModel.append("\n\nReification process in progress...");
        btnReifProc.setEnabled(true);
m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnReifFFmod() {
        txtInfoModel.setText("\nThis is a very time consuming operation. Please, be patient...");
m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = m_frame.thePrj.lstFiles.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            //x.camReif(s,"BAMS");
            x.camFFReif(s);
            lstReifs.addItem(s.concat(".reif"));
        }
/*
        cam2jav x = new cam2jav(); 
        x.camReif("bams.cam","BAMS");
*/
        //txtInfoModel.append("\n\nReification process completed.");
        txtInfoModel.append("\n\nReification process in progress...");
        btnReifProc.setEnabled(true);
m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnReifRules() {
m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        cam2jav x = new cam2jav();
        x.camReifRules();
m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnReifProc() {
m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        MJEWindow rsc = new MJEWindow("_.reif",font);
/*
        String s = lstReifs.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camPrettyReif(s.concat(".dvi"));
        }
*/
m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public void selectedBtnSeeReifProc() {
m_frame.setCursor(new Cursor(Cursor.WAIT_CURSOR));
        String s = lstReifs.getSelectedItem();
        if (s != null) {
            cam2jav x = new cam2jav();
            x.camPrettyReif(s.concat(".dvi"));
        }
/*
        String s = lstReifs.getSelectedItem();
        if (s != null) {
            MJEWindow rsc = new MJEWindow(s,font);
        }
*/
m_frame.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    }

    public String readFile(String fl) {
      File file = new File(fl);
      StringBuffer text = new StringBuffer((int) file.length());

      try {
        FileInputStream fs = new FileInputStream(fl);
        BufferedInputStream bs = new BufferedInputStream(fs, 5000);
        DataInputStream ds = new DataInputStream(bs);
        String str = ds.readLine();
  
        while (str != null) {
          text.append(str);
          text.append("\n");
          str = ds.readLine();
        }
  
        fs.close();
      } catch (Exception err) {
        //editor.console.set("Cannot read file.");
      }

      return text.toString();
    }

}
