Java tutorial
/******************************************************************************* * 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(); } }