Basic Editor : Editor « SWT JFace Eclipse « Java






Basic Editor

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("java2s.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();
  }
}

           
       








Related examples in the same category

1.Java Source code ViewerJava Source code Viewer
2.SWT Text Editor DemoSWT Text Editor Demo
3.SWT Completion Editor
4.Basic Editor 2Basic Editor 2
5.Basic Editor 3Basic Editor 3
6.Script MultiTextEdit
7.SWT Editor