home *** CD-ROM | disk | FTP | other *** search
/ Java by Example / jbecd.bin / JBE-CD / Mje / Test2.java < prev    next >
Text File  |  1996-04-08  |  10KB  |  471 lines

  1. //
  2. // Mini Java Editor window
  3. //
  4.  
  5. import java.io.*;
  6. import java.awt.*;
  7.  
  8. class MJEWindow extends Frame {
  9.   TextArea area;
  10.   MJEOutput output;
  11.   String fonts[];
  12.   String styles[] = {"Plain", "Bold", "Italic"};
  13.   String sizes[] = {"8", "9", "10", "12", "14", "16", "18", "24"};
  14.   String clipboard;
  15.   String saveFile = null;
  16.   String fname;
  17.   int fstyle;
  18.   int fsize;
  19.  
  20.   MenuItem saveItem = new MenuItem("Save");
  21.   MenuItem compileItem = new MenuItem("Compile");
  22.   CheckboxMenuItem fontItems[];
  23.   CheckboxMenuItem styleItems[];
  24.   CheckboxMenuItem sizeItems[];
  25.  
  26.   public static void main(String args[]) {;
  27.     MJEWindow win = new MJEWindow("Untitled");
  28.  
  29.     if (args.length > 0) {
  30.       win.setTitle(new File(args[0]).getName());
  31.  
  32.       win.saveFile = args[0];
  33.       win.area.setText(win.readFile(win.saveFile));
  34.       win.saveItem.enable();
  35.     }
  36.   }
  37.  
  38.   MJEWindow(String title) {
  39.  
  40.   // Initialize
  41.  
  42.     area = new TextArea(35, 80);
  43.     output = new MJEOutput(this, 5);
  44.  
  45.     fonts = getToolkit().getFontList();
  46.     MenuBar menuBar = new MenuBar();
  47.  
  48.     fname = "Courier";
  49.     fstyle = Font.PLAIN;
  50.     fsize = 12;
  51.  
  52.   // Create file menu
  53.  
  54.     Menu fileMenu = new Menu("File");
  55.     fileMenu.add(new MenuItem("New"));
  56.     fileMenu.add(new MenuItem("Open..."));
  57.     fileMenu.add(saveItem);
  58.     fileMenu.add(new MenuItem("Save As..."));
  59.     fileMenu.add(new MenuItem("-"));
  60.     fileMenu.add(compileItem);
  61.     menuBar.add(fileMenu);
  62.  
  63.   // Create edit menu
  64.  
  65.     Menu editMenu = new Menu("Edit");
  66.     editMenu.add(new MenuItem("Cut"));
  67.     editMenu.add(new MenuItem("Copy"));
  68.     editMenu.add(new MenuItem("Paste"));
  69.     editMenu.add(new MenuItem("Select All"));
  70.     editMenu.add(new MenuItem("-"));
  71.     editMenu.add(new MenuItem("Go To Line..."));
  72.     editMenu.add(new MenuItem("Find..."));
  73.     menuBar.add(editMenu);
  74.  
  75.   // Create font menu
  76.  
  77.     Menu fontMenu = new Menu("Font");
  78.     fontItems = new CheckboxMenuItem[fonts.length];
  79.  
  80.     for (int i = 0; i < fonts.length; i++) {
  81.       fontItems[i] = new CheckboxMenuItem(fonts[i]);
  82.       fontMenu.add(fontItems[i]);
  83.     
  84.       if (fonts[i].equals(fname))
  85.     fontItems[i].setState(true);
  86.     }
  87.  
  88.     menuBar.add(fontMenu);
  89.  
  90.   // Create style menu
  91.  
  92.     Menu styleMenu = new Menu("Style");
  93.     styleItems = new CheckboxMenuItem[styles.length];
  94.  
  95.     for (int i = 0; i < styles.length; i++) {
  96.       styleItems[i] = new CheckboxMenuItem(styles[i]);
  97.       styleMenu.add(styleItems[i]);
  98.     
  99.       if (i == fstyle) 
  100.     styleItems[i].setState(true);
  101.     }
  102.  
  103.     menuBar.add(styleMenu);
  104.     
  105.  // Create size menu
  106.  
  107.     Menu sizeMenu = new Menu("Size");
  108.     sizeItems = new CheckboxMenuItem[sizes.length];
  109.  
  110.     for (int i = 0; i < sizes.length; i++) {
  111.       sizeItems[i] = new CheckboxMenuItem(sizes[i]);    
  112.       sizeMenu.add(sizeItems[i]);
  113.  
  114.       if (sizes[i].equals(new Integer(fsize).toString()))
  115.     sizeItems[i].setState(true);
  116.     }
  117.  
  118.     menuBar.add(sizeMenu);
  119.  
  120.   // Show window
  121.  
  122.     setMenuBar(menuBar);
  123.     saveItem.disable();
  124.     compileItem.disable();
  125.  
  126.     area.setFont(new Font(fname, fstyle, fsize));
  127.     setTitle(title);
  128.     output.clear();
  129.  
  130.     add("Center", area);
  131.     add("South", output);
  132.     pack();
  133.     show();
  134.   }
  135.  
  136. // Open file
  137.  
  138.   public boolean open(String path) {
  139.     if (path != null) {
  140.       setTitle(path);
  141.       saveFile = path;
  142.       area.setText(readFile(path));
  143.       saveItem.enable();
  144.       output.clear();
  145.  
  146.       if (path.endsWith(".java")) 
  147.     compileItem.enable();
  148.       else
  149.     compileItem.disable();
  150.  
  151.       return true;
  152.     }
  153.  
  154.     return false;
  155.   }
  156.  
  157.   public boolean save() {
  158.     writeFile(saveFile, area.getText());
  159.     return true;
  160.   }
  161.  
  162. // Read file
  163.  
  164.   public String readFile(String fl) {
  165.     String text = new String();
  166.  
  167.     try {
  168.       FileInputStream fs = new FileInputStream(fl);
  169.       DataInputStream ds = new DataInputStream(fs);
  170.       String str = new String();
  171.  
  172.       while (str != null) {
  173.       str = ds.readLine();
  174.  
  175.     if (str != null)
  176.       text = text + str + "\n";
  177.       }
  178.     } catch (Exception err) {
  179.       System.out.println("Cannot open file.");
  180.     }
  181.  
  182.     return text;
  183.   }
  184.  
  185. // Write file
  186.  
  187.   public void writeFile(String fl, String txt) {
  188.     try {
  189.       FileOutputStream fs = new FileOutputStream(fl);
  190.       DataOutputStream ds = new DataOutputStream(fs);
  191.     String ls = System.getProperty("line.separator");
  192.  
  193.     for (int i = 0; i < txt.length(); i++) {
  194.         char ch = txt.charAt(i);
  195.  
  196.       switch (ch) {
  197.         case '\n':
  198.           ds.writeBytes(ls);
  199.         break;
  200.         
  201.         default:
  202.         ds.write(ch);
  203.        }
  204.       }
  205.     } catch (Exception err) {
  206.       System.out.println("Cannot save file.");
  207.     }
  208.   }
  209.  
  210. // Handle system event
  211.  
  212.   public boolean handleEvent(Event evt) {
  213.     if (evt.id == Event.WINDOW_DESTROY && evt.target == this) {
  214.       save();
  215.       dispose();
  216.     }
  217.  
  218.     return super.handleEvent(evt);
  219.   }
  220.  
  221. // Handle component events
  222.  
  223.   public boolean action(Event evt, Object obj) {
  224.     String label = (String) obj;
  225.     String file = null;
  226.   
  227.   // Handle file menu
  228.  
  229.     if (label.equals("New")) {
  230.       area.setText("");
  231.       setTitle("Untitled");
  232.       saveItem.disable();
  233.       output.clear();
  234.  
  235.       return true;
  236.     }
  237.  
  238.     if (label.equals("Open...")) {
  239.       FileDialog dialog = new FileDialog(this, "Open...", FileDialog.LOAD);
  240.  
  241.       dialog.show();
  242.       file = dialog.getFile();
  243.  
  244.       if (file != null)
  245.     open(dialog.getDirectory() + file);
  246.  
  247.       return true;
  248.     }
  249.  
  250.     if (label.equals("Save")) {
  251.       writeFile(saveFile, area.getText());
  252.     }
  253.  
  254.     if (label.equals("Save As...")) {
  255.       FileDialog dialog = new FileDialog(this, "Save As...", FileDialog.SAVE);
  256.       
  257.       dialog.setFile(saveFile);
  258.       dialog.show();
  259.       file = dialog.getFile();
  260.  
  261.       if (file != null) {
  262.     setTitle(file);
  263.     saveFile = file;
  264.         saveItem.enable();
  265.     writeFile(file, area.getText());
  266.       }
  267.  
  268.       return true;
  269.     }
  270.  
  271.     if (label.equals("Compile")) {
  272.       try {
  273.     output.delItems(0, output.countItems() - 1);
  274.     System.out.println(output.countItems());
  275.         output.addItem("Compiling " + saveFile + "...");        
  276.     writeFile(saveFile, area.getText());
  277.  
  278.     Process ps = Runtime.getRuntime().exec("javac " + saveFile);    
  279.     DataInputStream ds = new DataInputStream(ps.getInputStream());
  280.  
  281.         String str = new String();
  282.  
  283.         while (str != null) {
  284.         str = ds.readLine();
  285.  
  286.       if (str != null)    
  287.          if (str.startsWith(saveFile)) {
  288.           String msg = str.substring(saveFile.length() + 1);
  289.  
  290.           for (int i = 1; i < 5; i++)
  291.             if (msg.charAt(i) == ':') {
  292.           int pos = 0;
  293.  
  294.                String line = msg.substring(0, i);
  295.               String err = msg.substring(i + 2, msg.length() - 1);
  296.           String code = ds.readLine().trim();
  297.           String tmp = ds.readLine();
  298.  
  299.           for (int j = 0; j < tmp.length(); j++)
  300.             if (tmp.charAt(j) == '^')
  301.               pos = j;
  302.  
  303.               output.addItem("*** " + line + " (" + pos + "): " + code + 
  304.             " (" + err + ").");
  305.         }
  306.         }
  307.         }
  308.  
  309.         output.addItem("Ready.");
  310.       }
  311.       catch (Exception err) { }
  312.     }
  313.  
  314.   // Handle edit menu
  315.  
  316.     if (label.equals("Cut")) {
  317.       clipboard = area.getSelectedText();
  318.       
  319.     area.replaceText("", area.getSelectionStart(), 
  320.         area.getSelectionEnd());
  321.  
  322.     return true;
  323.     }
  324.  
  325.     if (label.equals("Copy")) {
  326.       clipboard = area.getSelectedText();
  327.     return true;
  328.     }
  329.  
  330.     if (label.equals("Paste")) {
  331.       int start = area.getSelectionStart();
  332.       int end = area.getSelectionEnd();
  333.  
  334.       if (start == end) 
  335.         area.insertText(clipboard, start);
  336.       else
  337.         area.replaceText(clipboard, start, end);
  338.  
  339.       return true;
  340.     }
  341.  
  342.     if (label.equals("Select All"))
  343.       area.selectAll();
  344.  
  345.     if (label.equals("Go To Line...")) {
  346.       GotoDialog dialog = new GotoDialog(this);
  347.       dialog.pack();
  348.       dialog.show();
  349.     
  350.       return true;
  351.     }
  352.  
  353.     if (label.equals("Find...")) {
  354.       FindDialog dialog = new FindDialog(this);
  355.       dialog.pack();
  356.       dialog.show();
  357.     
  358.       return true;
  359.     }
  360.  
  361.   // Handle font menu
  362.  
  363.     for (int i = 0; i < fonts.length; i++) {
  364.       if (label.equals(fonts[i])) {
  365.     for (int j = 0; j < fonts.length; j++) 
  366.       if (i != j)
  367.         fontItems[j].setState(false);
  368.  
  369.       fname = label;
  370.       area.setFont(new Font(fname, fstyle, fsize));
  371.         
  372.       return true;
  373.     }
  374.     }
  375.  
  376.   // Handle style menu
  377.  
  378.     for (int i = 0; i < styles.length; i++) {
  379.       if (label.equals(styles[i])) {
  380.      for (int j = 0; j < styles.length; j++) 
  381.       if (i != j)
  382.         styleItems[j].setState(false);
  383.         
  384.      fstyle = i;
  385.     area.setFont(new Font(fname, fstyle, fsize));
  386.       
  387.     return true;
  388.       }
  389.     }
  390.  
  391.   // Handle size menu
  392.  
  393.     for (int i = 0; i < sizes.length; i++) {
  394.       if (label.equals(sizes[i])) {
  395.     for (int j = 0; j < sizes.length; j++) 
  396.       if (i != j)
  397.         sizeItems[j].setState(false);
  398.         
  399.      fsize = new Integer(label).intValue();
  400.     area.setFont(new Font(fname, fstyle, fsize));
  401.  
  402.     return true;
  403.       }
  404.     }
  405.     
  406.     return false; 
  407.   }
  408.  
  409.   public TextArea getTextArea() {
  410.     return area;
  411.   }
  412.  
  413.   public void gotoLine(int line) {
  414.     gotoLine(line, 0);
  415.   }
  416.  
  417.   public void gotoLine(int line, int col) {
  418.     int i = 1, pos = 0;
  419.     String str = area.getText();
  420.  
  421.     while (i < line) {
  422.       if (str.charAt(pos) == '\n')
  423.     i++;
  424.  
  425.       pos++;
  426.     }
  427.  
  428.     area.requestFocus();
  429.     area.select(pos + col, pos + col);
  430.   }      
  431. }
  432.  
  433. //
  434. // Output area
  435. //
  436.  
  437. class MJEOutput extends List {
  438.   MJEWindow win;
  439.  
  440.   public MJEOutput(MJEWindow w, int rows) {
  441.     super(rows, false);
  442.     win = w;
  443.   }
  444.  
  445.   public void clear() {
  446.     delItems(0, countItems() - 1);
  447.     addItem("Ready.");
  448.   }
  449.  
  450.   public boolean action(Event evt, Object obj) {
  451.     String str = (String) obj;
  452.  
  453.     if (str.charAt(0) == '*') { 
  454.       for (int i = 5; i < 9; i++)
  455.         if (str.charAt(i) == ' ') {
  456.       int line = new Integer(str.substring(4, i)).intValue();
  457.       int col = 0;
  458.  
  459.       for (int j = i + 2; j < i + 5; j++)
  460.         if (str.charAt(j) == ')') 
  461.           col = new Integer(str.substring(i + 2, j)).intValue();
  462.  
  463.       win.gotoLine(line, col);
  464.       break;
  465.         }
  466.     }
  467.  
  468.     return super.action(evt, obj);
  469.   }
  470. }
  471.