Mega Code Archive

 
Categories / Java / SWT Jface Eclipse
 

Basic Editor

/*******************************************************************************  * All Right Reserved. Copyright (c) 1998, 2004 Jackwind Li Guojie  *   * Created on Feb 23, 2004 8:40:41 PM by JACK $Id$  *    ******************************************************************************/ import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.resource.ImageRegistry; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; public class BasicEditor {   Display display = new Display();   Shell shell = new Shell(display);   // The control used for text displaying and editing.   StyledText text;   // Is there any changes since last saving action?   boolean hasUnsavedChanges;   // The file associated with current text content.   File file;   // The recent directory   private String lastOpenDirectory;      // The name of this program.   public static final String APP_NAME = "BasicEditor v1.0";      MenuItem miWrap = null;      public BasicEditor() {     shell.setLayout(new GridLayout());          // Add a tool bar.      ToolBar toolBar = new ToolBar(shell, SWT.FLAT | SWT.RIGHT );     ToolItem tiNew = new ToolItem(toolBar, SWT.PUSH);     tiNew.setText("&New");     tiNew.setImage(getImage("rntsoft.gif"));     tiNew.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         if(handleChangesBeforeDiscard())  {           file = null;           text.setText("");         }       }     });          ToolItem tiOpen = new ToolItem(toolBar, SWT.PUSH);     tiOpen.setText("&Open");     tiOpen.setImage(getImage("open.gif"));     tiOpen.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         if(handleChangesBeforeDiscard())           loadTextFromFile();       }     });          ToolItem tiSave = new ToolItem(toolBar, SWT.PUSH);     tiSave.setText("&Save");     tiSave.setImage(getImage("save.gif"));     tiSave.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         saveTextToFile();       }     });              new ToolItem(toolBar, SWT.SEPARATOR);        ToolItem tiCopy = new ToolItem(toolBar, SWT.PUSH);     tiCopy.setText("&Copy");     tiCopy.setImage(getImage("copy.gif"));     tiCopy.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.copy();       }     });          ToolItem tiCut = new ToolItem(toolBar, SWT.PUSH);     tiCut.setText("Cu&t");     tiCut.setImage(getImage("cut.gif"));     tiCut.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.cut();       }     });          ToolItem tiPaste = new ToolItem(toolBar, SWT.PUSH);     tiPaste.setText("&Paste");     tiPaste.setImage(getImage("paste.gif"));     tiPaste.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.paste();       }     });          new ToolItem(toolBar, SWT.SEPARATOR);          final ToolItem tiWrap = new ToolItem(toolBar, SWT.CHECK);     tiWrap.setText("&Wrap");     tiWrap.addListener(SWT.Selection, new Listener() {         public void handleEvent(Event event) {           text.setWordWrap(tiWrap.getSelection());           miWrap.setSelection(tiWrap.getSelection());         }     });              toolBar.pack();          System.out.println("Client area: " + shell.getClientArea());          text =       new StyledText(         shell,         SWT.MULTI           | SWT.WRAP           | SWT.BORDER           | SWT.H_SCROLL           | SWT.V_SCROLL);     text.setLayoutData(new GridData(GridData.FILL_BOTH));     Font font = new Font(shell.getDisplay(), "Courier New", 10, SWT.NORMAL);     text.setFont(font);     text.setText("BasicEditor version 1.0\r\nWriten by Jack Li Guojie. ");     text.addModifyListener(new ModifyListener() {       public void modifyText(ModifyEvent e) {         hasUnsavedChanges = true;       }     });              // Add menus.      Menu menuBar = new Menu(shell, SWT.BAR);          // --- sub menu: File     MenuItem fileMenuItem = new MenuItem(menuBar, SWT.CASCADE);     fileMenuItem.setText("&File");     Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);          MenuItem miNew = new MenuItem(fileMenu, SWT.PUSH);     miNew.setText("&New\tCtrl+N");     miNew.setImage(getImage("new.gif"));     miNew.setAccelerator(SWT.CTRL + 'N');     miNew.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         if(handleChangesBeforeDiscard())  {           file = null;           text.setText("");         }       }     });          MenuItem miOpen = new MenuItem(fileMenu, SWT.PUSH);     miOpen.setText("&Open\tCtrl+O");     miOpen.setAccelerator(SWT.CTRL + 'O');     miOpen.setImage(getImage("open.gif"));     miOpen.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         if(handleChangesBeforeDiscard())           loadTextFromFile();       }     });          MenuItem miSave = new MenuItem(fileMenu, SWT.PUSH);     miSave.setText("&Save\tCtrl+S");     miSave.setImage(getImage("save.gif"));     miSave.setAccelerator(SWT.CTRL + 'S');     miSave.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         saveTextToFile();       }     });          new MenuItem(fileMenu, SWT.SEPARATOR);          MenuItem miExit = new MenuItem(fileMenu, SWT.PUSH);     miExit.setText("&Exit");     miExit.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         if(handleChangesBeforeDiscard())           shell.dispose();       }     });          fileMenuItem.setMenu(fileMenu);          // --- sub menu: Edit.     MenuItem editMenuItem = new MenuItem(menuBar, SWT.CASCADE);     editMenuItem.setText("&Edit");          Menu editMenu = new Menu(shell, SWT.DROP_DOWN);          MenuItem miCopy = new MenuItem(editMenu, SWT.PUSH);     miCopy.setText("&Copy\tCtrl+C");     miCopy.setImage(getImage("copy.gif"));     miCopy.setAccelerator(SWT.CTRL + 'C');     miCopy.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.copy();       }     });          MenuItem miCut = new MenuItem(editMenu, SWT.PUSH);     miCut.setText("Cu&t\tCtrl+X");     miCut.setImage(getImage("cut.gif"));     miCut.setAccelerator(SWT.CTRL + 'X');     miCut.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.cut();       }     });          MenuItem miPaste = new MenuItem(editMenu, SWT.PUSH);     miPaste.setText("&Paste\tCtrl+P");     miPaste.setImage(getImage("paste.gif"));     miPaste.setAccelerator(SWT.CTRL + 'P');     miPaste.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.paste();       }     });          editMenuItem.setMenu(editMenu);          // --- sub menu: Format.     MenuItem formatMenuItem = new MenuItem(menuBar, SWT.CASCADE);     formatMenuItem.setText("&Format");          Menu formatMenu = new Menu(shell, SWT.DROP_DOWN);          miWrap = new MenuItem(formatMenu, SWT.CHECK);     miWrap.setText("&Wrap\tCtrl+W");     miWrap.setAccelerator(SWT.CTRL + 'W');     miWrap.addListener(SWT.Selection, new Listener() {       public void handleEvent(Event event) {         text.setWordWrap(miWrap.getSelection());         tiWrap.setSelection(miWrap.getSelection());       }     });          formatMenuItem.setMenu(formatMenu);          // Add the menu bar to the shell.     shell.setMenuBar(menuBar);                       shell.setSize(400, 200);     shell.open();     // Set up the event loop.     while (!shell.isDisposed()) {       if (!display.readAndDispatch()) {         // If no more entries in event queue         display.sleep();       }     }     display.dispose();   }      ImageRegistry imageRegistry = new ImageRegistry();      /**    * Retrieves the image corresponding to the given file name.     * Note that the image is managed by an image registry. You should not     * dispose the image after use.     * @param shortFileName    * @return    */   private Image getImage(String shortFileName) {     if(imageRegistry.getDescriptor(shortFileName) == null) {       ImageDescriptor descriptor = ImageDescriptor.createFromFile(null, "icons/" + shortFileName);       imageRegistry.put(shortFileName, descriptor);     }     return imageRegistry.get(shortFileName);   }      /**    * Hands unsaved changes before the text is discarded.     * @return whether furthur action should be carried on.     */   boolean handleChangesBeforeDiscard() {     if(! hasUnsavedChanges)       return true;          MessageBox messageBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO | SWT.CANCEL);     messageBox.setMessage("Do you want to save the changes to " + (file == null ? "a file?" : file.getName()));     messageBox.setText(APP_NAME);     int ret = messageBox.open();     if(ret == SWT.YES) {       return saveTextToFile();     }else if(ret == SWT.NO) {       return true;     }else{       return false;     }   }   /**    * Loads the text from a file selected by the user.     * @return the status of the operation.     */   boolean loadTextFromFile() {     FileDialog dialog = new FileDialog(shell, SWT.OPEN);     if (lastOpenDirectory != null)       dialog.setFilterPath(lastOpenDirectory);     String selectedFile = dialog.open();     if (selectedFile == null) {       log("Action cancelled: loading the text from a file");       return false;     }     file = new File(selectedFile);     lastOpenDirectory = file.getParent();          try {       BufferedReader reader = new BufferedReader(new FileReader(file));       StringBuffer sb = new StringBuffer();       String line = null;       while((line = reader.readLine()) != null) {         sb.append(line);         sb.append("\r\n");       }       text.setText(sb.toString());       return true;     }catch(IOException e) {       log("Failed to load the text from file: " + file);       log(e.toString());     }     return false;   }   /**    * Saves the content of the styled text to the file. If the file has    * not been specified yet, a FileDialog prompts up for the user to    * select a file.    * @return the status of the operation.     * @throws IOException    */   boolean saveTextToFile() {     if (file == null) {       FileDialog dialog = new FileDialog(shell, SWT.SAVE);       if (lastOpenDirectory != null)         dialog.setFilterPath(lastOpenDirectory);       String selectedFile = dialog.open();       if (selectedFile == null) {         log("Action cancelled: saving the text to a file");         return false;       }       file = new File(selectedFile);       lastOpenDirectory = file.getParent();     }     try {       FileWriter writer = new FileWriter(file);       writer.write(text.getText());       writer.close();       log("The text has been saved to file: " + file);       hasUnsavedChanges = false;       return true;     } catch (IOException e) {       log("Failed to save the text to file: " + file);       log(e.toString());     }     return false;   }   /**    * Logs system messages.    *     * @param message    */   void log(String message) {     System.out.println(message);   }   public static void main(String[] args) {     new BasicEditor();   } }