/*
Core SWING Advanced Programming
By Kim Topley
ISBN: 0 13 083292 8
Publisher: Prentice Hall
*/
import java.awt.Color;
import java.awt.Cursor;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.text.EditorKit;
public class EditorPaneExample7 extends JFrame {
public EditorPaneExample7() {
super("JEditorPane Example 7");
pane = new JEditorPane();
pane.setEditable(false); // Start read-only
getContentPane().add(new JScrollPane(pane), "Center");
// Build the panel of controls
JPanel panel = new JPanel();
panel.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = 1;
c.gridheight = 1;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.NONE;
c.weightx = 0.0;
c.weighty = 0.0;
JLabel urlLabel = new JLabel("File name: ", JLabel.RIGHT);
panel.add(urlLabel, c);
JLabel loadingLabel = new JLabel("State: ", JLabel.RIGHT);
c.gridy = 1;
panel.add(loadingLabel, c);
JLabel typeLabel = new JLabel("Type: ", JLabel.RIGHT);
c.gridy = 2;
panel.add(typeLabel, c);
c.gridx = 1;
c.gridy = 0;
c.gridwidth = 1;
c.weightx = 1.0;
c.fill = GridBagConstraints.HORIZONTAL;
textField = new JTextField(32);
panel.add(textField, c);
loadingState = new JLabel(spaces, JLabel.LEFT);
loadingState.setForeground(Color.black);
c.gridy = 1;
c.gridwidth = 2;
panel.add(loadingState, c);
loadedType = new JLabel(spaces, JLabel.LEFT);
loadedType.setForeground(Color.black);
c.gridy = 2;
panel.add(loadedType, c);
getContentPane().add(panel, "South");
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
saveButton = new JButton("Save");
plain = new JCheckBox("Plain Text");
html = new JCheckBox("HTML");
rtf = new JCheckBox("RTF");
panel.add(plain);
panel.add(html);
panel.add(rtf);
ButtonGroup group = new ButtonGroup();
group.add(plain);
group.add(html);
group.add(rtf);
plain.setSelected(true);
panel.add(Box.createVerticalStrut(10));
panel.add(saveButton);
panel.add(Box.createVerticalGlue());
panel.setBorder(BorderFactory.createEmptyBorder(2, 4, 2, 4));
getContentPane().add(panel, "East");
// Change page based on text field
textField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
String fileName = textField.getText().trim();
file = new File(fileName);
absolutePath = file.getAbsolutePath();
String url = "file:///" + absolutePath;
try {
// Check if the new page and the old
// page are the same.
URL newURL = new URL(url);
URL loadedURL = pane.getPage();
if (loadedURL != null && loadedURL.sameFile(newURL)) {
return;
}
// Try to display the page
textField.setEnabled(false); // Disable input
textField.paintImmediately(0, 0, textField.getSize().width,
textField.getSize().height);
saveButton.setEnabled(false);
saveButton.paintImmediately(0, 0,
saveButton.getSize().width,
saveButton.getSize().height);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
// Busy cursor
loadingState.setText("Loading...");
loadingState.paintImmediately(0, 0,
loadingState.getSize().width, loadingState
.getSize().height);
loadedType.setText("");
loadedType.paintImmediately(0, 0,
loadedType.getSize().width,
loadedType.getSize().height);
pane.setEditable(false);
pane.setPage(url);
loadedType.setText(pane.getContentType());
} catch (Exception e) {
JOptionPane.showMessageDialog(pane, new String[] {
"Unable to open file", url }, "File Open Error",
JOptionPane.ERROR_MESSAGE);
loadingState.setText("Failed");
textField.setEnabled(true);
setCursor(Cursor.getDefaultCursor());
}
}
});
// Listen for page load to complete
pane.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("page")) {
loadingState.setText("Page loaded.");
textField.setEnabled(true); // Allow entry of new file name
textField.requestFocus();
setCursor(Cursor.getDefaultCursor());
// Allow editing and saving if appropriate
pane.setEditable(file.canWrite());
saveButton.setEnabled(file.canWrite());
}
}
});
saveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
Writer w = null;
OutputStream os = System.out;
String contentType;
if (plain.isSelected()) {
contentType = "text/plain";
w = new OutputStreamWriter(os);
} else if (html.isSelected()) {
contentType = "text/html";
w = new OutputStreamWriter(os);
} else {
contentType = "text/rtf";
}
EditorKit kit = pane.getEditorKitForContentType(contentType);
try {
if (w != null) {
kit.write(w, pane.getDocument(), 0, pane.getDocument()
.getLength());
w.flush();
} else {
kit.write(os, pane.getDocument(), 0, pane.getDocument()
.getLength());
os.flush();
}
} catch (Exception e) {
System.out.println("Write failed");
}
}
});
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception evt) {}
JFrame f = new EditorPaneExample7();
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent evt) {
System.exit(0);
}
});
f.setSize(500, 400);
f.setVisible(true);
}
private static final String spaces = " ";
private JEditorPane pane;
private JTextField textField;
private JLabel loadingState;
private JLabel loadedType;
private JButton saveButton;
private JCheckBox plain;
private JCheckBox html;
private JCheckBox rtf;
private File file;
private String absolutePath;
}
|