FileDocCategorySizeDatePackage
StyledEditor2.javaAPI DocExample5806Thu Oct 24 20:14:28 BST 2002None

StyledEditor2.java

// StyledEditor2.java
// An extension of SimpleEditor that adds styled-text features.  This version
// also adds the ability to save a styled document as an HTML file.
//
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.awt.event.*;
import java.awt.Toolkit;
import java.io.*;

public class StyledEditor2 extends SimpleEditor {

  public static void main(String[] args) {
    StyledEditor2 editor = new StyledEditor2();
    editor.setVisible(true);
    editor.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  }

  // Create a styed editor.
  public StyledEditor2() {
    updateInputMap();  // Install our style-related keystrokes
  }

  // Override to create a JTextPane.
  protected JTextComponent createTextComponent() {
    return new JTextPane();
  }

  // Add icons & friendly names for font actions.
  protected void makeActionsPretty() {
    super.makeActionsPretty();

    Action a;
    a = getTextComponent().getActionMap().get("font-bold");
    a.putValue(Action.SMALL_ICON, new ImageIcon("icons/bold.gif"));
    a.putValue(Action.NAME, "Bold");
    a = getTextComponent().getActionMap().get("font-italic");
    a.putValue(Action.SMALL_ICON, new ImageIcon("icons/italic.gif"));
    a.putValue(Action.NAME, "Italic");
    a = getTextComponent().getActionMap().get("font-underline");
    a.putValue(Action.SMALL_ICON, new ImageIcon("icons/underline.gif"));
    a.putValue(Action.NAME, "Underline");

    a = getTextComponent().getActionMap().get("font-family-SansSerif");
    a.putValue(Action.NAME, "SansSerif");
    a = getTextComponent().getActionMap().get("font-family-Monospaced");
    a.putValue(Action.NAME, "Monospaced");
    a = getTextComponent().getActionMap().get("font-family-Serif");
    a.putValue(Action.NAME, "Serif");

    a = getTextComponent().getActionMap().get("font-size-10");
    a.putValue(Action.NAME, "10");
    a = getTextComponent().getActionMap().get("font-size-12");
    a.putValue(Action.NAME, "12");
    a = getTextComponent().getActionMap().get("font-size-16");
    a.putValue(Action.NAME, "16");
    a = getTextComponent().getActionMap().get("font-size-24");
    a.putValue(Action.NAME, "24");
  }

  // Add key mappings for font style features.
  protected void updateInputMap() {
    // Extend the input map used by our text component.
    InputMap map = getTextComponent().getInputMap();
    int mask = Toolkit.getDefaultToolkit().getMenuShortcutKeyMask();
    KeyStroke bold = KeyStroke.getKeyStroke(KeyEvent.VK_B, mask, false);
    KeyStroke italic = KeyStroke.getKeyStroke(KeyEvent.VK_I, mask, false);
    KeyStroke under = KeyStroke.getKeyStroke(KeyEvent.VK_U, mask, false);
    map.put(bold, "font-bold");
    map.put(italic, "font-italic");
    map.put(under, "font-underline");
  }

  // Add font actions to the toolbar.
  protected JToolBar createToolBar() {
    JToolBar bar = super.createToolBar();
    bar.addSeparator();

    bar.add(getTextComponent().getActionMap().get("font-bold")).setText("");
    bar.add(getTextComponent().getActionMap().get("font-italic")).setText("");
    bar.add(getTextComponent().getActionMap().get("font-underline")).setText("");

    return bar;
  }

  // Add font actions to the menu.
  protected JMenuBar createMenuBar() {
    JMenuBar menubar = super.createMenuBar();
    JMenu font = new JMenu("Font");
    menubar.add(font);

    JMenu style = new JMenu("Style");
    JMenu family = new JMenu("Family");
    JMenu size = new JMenu("Size");
    font.add(style);
    font.add(family);
    font.add(size);

    style.add(getTextComponent().getActionMap().get("font-bold"));
    style.add(getTextComponent().getActionMap().get("font-underline"));
    style.add(getTextComponent().getActionMap().get("font-italic"));

    family.add(getTextComponent().getActionMap().get("font-family-SansSerif"));
    family.add(getTextComponent().getActionMap().get("font-family-Monospaced"));
    family.add(getTextComponent().getActionMap().get("font-family-Serif"));

    size.add(getTextComponent().getActionMap().get("font-size-10"));
    size.add(getTextComponent().getActionMap().get("font-size-12"));
    size.add(getTextComponent().getActionMap().get("font-size-16"));
    size.add(getTextComponent().getActionMap().get("font-size-24"));

    // Don't forget; we can define new actions too!
    size.add(new StyledEditorKit.FontSizeAction("64", 64));

    JMenu htmlMenu = new JMenu("HTML");
    menubar.add(htmlMenu);
    htmlMenu.add(new SaveAsHtmlAction());

    return menubar;
  }

  class SaveAsHtmlAction extends AbstractAction {
    public SaveAsHtmlAction() {
      super("Save As HTML...", null);
    }

    // Query user for a filename and attempt to open and write the text
    // component's content to the file.
    public void actionPerformed(ActionEvent ev) {
      JFileChooser chooser = new JFileChooser();
      if (chooser.showSaveDialog(StyledEditor2.this) !=
            JFileChooser.APPROVE_OPTION)
        return;
      File file = chooser.getSelectedFile();
      if (file == null)
        return;
      FileWriter writer = null;
      try {
        writer = new FileWriter(file);
          MinimalHTMLWriter htmlWriter = new MinimalHTMLWriter(writer, 
            (StyledDocument)getTextComponent().getDocument());
        htmlWriter.write();
      }
      catch (IOException ex) {
        JOptionPane.showMessageDialog(StyledEditor2.this,
            "HTML File Not Saved", "ERROR", JOptionPane.ERROR_MESSAGE);
      }
      catch (BadLocationException ex) {
        JOptionPane.showMessageDialog(StyledEditor2.this,
            "HTML File Corrupt", "ERROR", JOptionPane.ERROR_MESSAGE);
      }
      finally {
        if (writer != null) {
          try {
            writer.close();
          } catch (IOException x) {}
        }
      }
    }
  }
}