Java tutorial
import java.io.IOException; import java.io.InputStream; import java.util.ResourceBundle; import java.util.Vector; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.ExtendedModifyEvent; import org.eclipse.swt.custom.ExtendedModifyListener; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Font; import org.eclipse.swt.graphics.FontData; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.ImageData; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.FontDialog; import org.eclipse.swt.widgets.Menu; import org.eclipse.swt.widgets.MenuItem; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.ToolBar; import org.eclipse.swt.widgets.ToolItem; import org.eclipse.swt.widgets.Widget; /** */ public class TextEditor { Shell shell; ToolBar toolBar; StyledText text; Images images = new Images(); Vector cachedStyles = new Vector(); Color RED = null; Color BLUE = null; Color GREEN = null; Font font = null; ToolItem boldButton, italicButton, underlineButton, strikeoutButton; Menu createEditMenu() { Menu bar = shell.getMenuBar(); Menu menu = new Menu(bar); MenuItem item = new MenuItem(menu, SWT.PUSH); item.setText("Cut_menuitem"); item.setAccelerator(SWT.MOD1 + 'X'); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { handleCutCopy(); text.cut(); } }); item = new MenuItem(menu, SWT.PUSH); item.setText("Copy_menuitem"); item.setAccelerator(SWT.MOD1 + 'C'); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { handleCutCopy(); text.copy(); } }); item = new MenuItem(menu, SWT.PUSH); item.setText("Paste_menuitem"); item.setAccelerator(SWT.MOD1 + 'V'); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { text.paste(); } }); new MenuItem(menu, SWT.SEPARATOR); item = new MenuItem(menu, SWT.PUSH); item.setText("Font_menuitem"); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { setFont(); } }); return menu; } Menu createFileMenu() { Menu bar = shell.getMenuBar(); Menu menu = new Menu(bar); MenuItem item = new MenuItem(menu, SWT.PUSH); item.setText("Exit_menuitem"); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { shell.close(); } }); return menu; } /* * Set a style */ void setStyle(Widget widget) { Point sel = text.getSelectionRange(); if ((sel == null) || (sel.y == 0)) return; StyleRange style; for (int i = sel.x; i < sel.x + sel.y; i++) { StyleRange range = text.getStyleRangeAtOffset(i); if (range != null) { style = (StyleRange) range.clone(); style.start = i; style.length = 1; } else { style = new StyleRange(i, 1, null, null, SWT.NORMAL); } if (widget == boldButton) { style.fontStyle ^= SWT.BOLD; } else if (widget == italicButton) { style.fontStyle ^= SWT.ITALIC; } else if (widget == underlineButton) { style.underline = !style.underline; } else if (widget == strikeoutButton) { style.strikeout = !style.strikeout; } text.setStyleRange(style); } text.setSelectionRange(sel.x + sel.y, 0); } /* * Clear all style data for the selected text. */ void clear() { Point sel = text.getSelectionRange(); if ((sel != null) && (sel.y != 0)) { StyleRange style; style = new StyleRange(sel.x, sel.y, null, null, SWT.NORMAL); text.setStyleRange(style); } text.setSelectionRange(sel.x + sel.y, 0); } /* * Set the foreground color for the selected text. */ void fgColor(Color fg) { Point sel = text.getSelectionRange(); if ((sel == null) || (sel.y == 0)) return; StyleRange style, range; for (int i = sel.x; i < sel.x + sel.y; i++) { range = text.getStyleRangeAtOffset(i); if (range != null) { style = (StyleRange) range.clone(); style.start = i; style.length = 1; style.foreground = fg; } else { style = new StyleRange(i, 1, fg, null, SWT.NORMAL); } text.setStyleRange(style); } text.setSelectionRange(sel.x + sel.y, 0); } void createMenuBar() { Menu bar = new Menu(shell, SWT.BAR); shell.setMenuBar(bar); MenuItem fileItem = new MenuItem(bar, SWT.CASCADE); fileItem.setText("File_menuitem"); fileItem.setMenu(createFileMenu()); MenuItem editItem = new MenuItem(bar, SWT.CASCADE); editItem.setText("edit"); editItem.setMenu(createEditMenu()); } void createShell(Display display) { shell = new Shell(display); shell.setText("Window"); images.loadAll(display); GridLayout layout = new GridLayout(); layout.numColumns = 1; shell.setLayout(layout); shell.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { if (font != null) font.dispose(); images.freeAll(); RED.dispose(); GREEN.dispose(); BLUE.dispose(); } }); } void createStyledText() { initializeColors(); text = new StyledText(shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); GridData spec = new GridData(); spec.horizontalAlignment = GridData.FILL; spec.grabExcessHorizontalSpace = true; spec.verticalAlignment = GridData.FILL; spec.grabExcessVerticalSpace = true; text.setLayoutData(spec); text.addExtendedModifyListener(new ExtendedModifyListener() { public void modifyText(ExtendedModifyEvent e) { handleExtendedModify(e); } }); } void createToolBar() { toolBar = new ToolBar(shell, SWT.NULL); SelectionAdapter listener = new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { setStyle(event.widget); } }; boldButton = new ToolItem(toolBar, SWT.CHECK); boldButton.setImage(images.Bold); boldButton.setToolTipText("Bold"); boldButton.addSelectionListener(listener); italicButton = new ToolItem(toolBar, SWT.CHECK); italicButton.setImage(images.Italic); italicButton.setToolTipText("Italic"); italicButton.addSelectionListener(listener); underlineButton = new ToolItem(toolBar, SWT.CHECK); underlineButton.setImage(images.Underline); underlineButton.setToolTipText("Underline"); underlineButton.addSelectionListener(listener); strikeoutButton = new ToolItem(toolBar, SWT.CHECK); strikeoutButton.setImage(images.Strikeout); strikeoutButton.setToolTipText("Strikeout"); strikeoutButton.addSelectionListener(listener); ToolItem item = new ToolItem(toolBar, SWT.SEPARATOR); item = new ToolItem(toolBar, SWT.PUSH); item.setImage(images.Red); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { fgColor(RED); } }); item = new ToolItem(toolBar, SWT.PUSH); item.setImage(images.Green); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { fgColor(GREEN); } }); item = new ToolItem(toolBar, SWT.PUSH); item.setImage(images.Blue); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { fgColor(BLUE); } }); item = new ToolItem(toolBar, SWT.SEPARATOR); item = new ToolItem(toolBar, SWT.PUSH); item.setImage(images.Erase); item.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { clear(); } }); } /* * Cache the style information for text that has been cut or copied. */ void handleCutCopy() { // Save the cut/copied style info so that during paste we will maintain // the style information. Cut/copied text is put in the clipboard in // RTF format, but is not pasted in RTF format. The other way to // handle the pasting of styles would be to access the Clipboard // directly and // parse the RTF text. cachedStyles = new Vector(); Point sel = text.getSelectionRange(); int startX = sel.x; for (int i = sel.x; i <= sel.x + sel.y - 1; i++) { StyleRange style = text.getStyleRangeAtOffset(i); if (style != null) { style.start = style.start - startX; if (!cachedStyles.isEmpty()) { StyleRange lastStyle = (StyleRange) cachedStyles.lastElement(); if (lastStyle.similarTo(style) && lastStyle.start + lastStyle.length == style.start) { lastStyle.length++; } else { cachedStyles.addElement(style); } } else { cachedStyles.addElement(style); } } } } void handleExtendedModify(ExtendedModifyEvent event) { if (event.length == 0) return; StyleRange style; if (event.length == 1 || text.getTextRange(event.start, event.length).equals(text.getLineDelimiter())) { // Have the new text take on the style of the text to its right // (during // typing) if no style information is active. int caretOffset = text.getCaretOffset(); style = null; if (caretOffset < text.getCharCount()) style = text.getStyleRangeAtOffset(caretOffset); if (style != null) { style = (StyleRange) style.clone(); style.start = event.start; style.length = event.length; } else { style = new StyleRange(event.start, event.length, null, null, SWT.NORMAL); } if (boldButton.getSelection()) style.fontStyle |= SWT.BOLD; if (italicButton.getSelection()) style.fontStyle |= SWT.ITALIC; style.underline = underlineButton.getSelection(); style.strikeout = strikeoutButton.getSelection(); if (!style.isUnstyled()) text.setStyleRange(style); } else { // paste occurring, have text take on the styles it had when it was // cut/copied for (int i = 0; i < cachedStyles.size(); i++) { style = (StyleRange) cachedStyles.elementAt(i); StyleRange newStyle = (StyleRange) style.clone(); newStyle.start = style.start + event.start; text.setStyleRange(newStyle); } } } public static void main(String[] args) { Display display = new Display(); TextEditor example = new TextEditor(); Shell shell = example.open(display); while (!shell.isDisposed()) if (!display.readAndDispatch()) display.sleep(); display.dispose(); } public Shell open(Display display) { createShell(display); createMenuBar(); createToolBar(); createStyledText(); shell.setSize(500, 300); shell.open(); return shell; } void setFont() { FontDialog fontDialog = new FontDialog(shell); fontDialog.setFontList((text.getFont()).getFontData()); FontData fontData = fontDialog.open(); if (fontData != null) { if (font != null) { font.dispose(); } font = new Font(shell.getDisplay(), fontData); text.setFont(font); } } void initializeColors() { Display display = Display.getDefault(); RED = new Color(display, new RGB(255, 0, 0)); BLUE = new Color(display, new RGB(0, 0, 255)); GREEN = new Color(display, new RGB(0, 255, 0)); } } /******************************************************************************* * Copyright (c) 2000, 2004 IBM Corporation and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: IBM Corporation - initial API and implementation ******************************************************************************/ class Images { // Bitmap Images public Image Bold; public Image Italic; public Image Underline; public Image Strikeout; public Image Red; public Image Green; public Image Blue; public Image Erase; Image[] AllBitmaps; Images() { } public void freeAll() { for (int i = 0; i < AllBitmaps.length; i++) AllBitmaps[i].dispose(); AllBitmaps = null; } Image createBitmapImage(Display display, String fileName) { InputStream sourceStream = Images.class.getResourceAsStream(fileName + ".bmp"); InputStream maskStream = Images.class.getResourceAsStream(fileName + "_mask.bmp"); ImageData source = new ImageData(sourceStream); ImageData mask = new ImageData(maskStream); Image result = new Image(display, source, mask); try { sourceStream.close(); maskStream.close(); } catch (IOException e) { e.printStackTrace(); } return result; } public void loadAll(Display display) { // Bitmap Images Bold = createBitmapImage(display, "bold"); Italic = createBitmapImage(display, "italic"); Underline = createBitmapImage(display, "underline"); Strikeout = createBitmapImage(display, "strikeout"); Red = createBitmapImage(display, "red"); Green = createBitmapImage(display, "green"); Blue = createBitmapImage(display, "blue"); Erase = createBitmapImage(display, "erase"); AllBitmaps = new Image[] { Bold, Italic, Underline, Strikeout, Red, Green, Blue, Erase, }; } }