/*
* @(#)ViewSourceAction.java
*
* Copyright (c) 2007-2010 The authors and contributors of JHotDraw.
* You may not use, copy or modify this file, except in compliance with the
* accompanying license terms.
*/
package org.jhotdraw.samples.svg.action;
import javax.annotation.Nullable;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.*;
import java.util.prefs.Preferences;
import javax.swing.event.UndoableEditEvent;
import org.jhotdraw.app.*;
import org.jhotdraw.app.action.*;
import javax.swing.*;
import javax.swing.event.UndoableEditListener;
import org.jhotdraw.app.Disposable;
import org.jhotdraw.draw.Drawing;
import org.jhotdraw.samples.svg.SVGView;
import org.jhotdraw.samples.svg.io.SVGOutputFormat;
import org.jhotdraw.util.ResourceBundleUtil;
import org.jhotdraw.util.prefs.PreferencesUtil;
/**
* ViewSourceAction.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class ViewSourceAction extends AbstractViewAction {
private static final long serialVersionUID = 1L;
public static final String ID = "view.viewSource";
/**
* We store the dialog as a client property in the view.
*/
private static final String DIALOG_CLIENT_PROPERTY = "view.viewSource.dialog";
/** Creates a new instance. */
public ViewSourceAction(Application app, @Nullable View view) {
super(app, view);
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels");
labels.configureAction(this, ID);
}
@Override
public void actionPerformed(ActionEvent e) {
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels");
final SVGView v = (SVGView) getActiveView();
Drawing drawing = v.getDrawing();
final JDialog dialog;
if (v.getClientProperty(DIALOG_CLIENT_PROPERTY) == null) {
dialog = new JDialog(SwingUtilities.getWindowAncestor(v.getComponent()));
v.putClientProperty(DIALOG_CLIENT_PROPERTY, dialog);
dialog.setTitle(labels.getFormatted("view.viewSource.titleText", v.getTitle()));
dialog.setResizable(true);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
final JTextArea ta = new JTextArea();
ta.setWrapStyleWord(true);
ta.setLineWrap(true);
JScrollPane sp = new JScrollPane(ta);
//sp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
dialog.getContentPane().add(sp);
dialog.setSize(400, 400);
dialog.setLocationByPlatform(true);
updateSource(drawing, ta);
final UndoableEditListener undoableEditHandler = new UndoableEditListener() {
@Override
public void undoableEditHappened(UndoableEditEvent e) {
updateSource(v.getDrawing(), ta);
}
};
v.getDrawing().addUndoableEditListener(undoableEditHandler);
final PropertyChangeListener propertyChangeHandler = new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName() == SVGView.DRAWING_PROPERTY) {
Drawing oldDrawing = (Drawing) evt.getOldValue();
if (oldDrawing != null) {
oldDrawing.removeUndoableEditListener(undoableEditHandler);
}
Drawing newDrawing = (Drawing) evt.getNewValue();
if (newDrawing != null) {
newDrawing.addUndoableEditListener(undoableEditHandler);
}
if (newDrawing!=null) {
updateSource(newDrawing, ta);
}
} else if (evt.getPropertyName() == View.TITLE_PROPERTY) {
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.samples.svg.Labels");
dialog.setTitle(labels.getFormatted("view.viewSource.titleText", v.getTitle()));
}
}
};
v.addPropertyChangeListener(propertyChangeHandler);
final Disposable disposable = new Disposable() {
@Override
public void dispose() {
if (v.getDrawing()!=null) {
v.getDrawing().removeUndoableEditListener(undoableEditHandler);
}
v.removePropertyChangeListener(propertyChangeHandler);
getApplication().removeWindow(dialog);
v.putClientProperty(DIALOG_CLIENT_PROPERTY, null);
v.removeDisposable(this);
}
};
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosed(WindowEvent evt) {
disposable.dispose();
}
});
v.addDisposable(disposable);
} else {
dialog = (JDialog) v.getClientProperty(DIALOG_CLIENT_PROPERTY);
JTextArea ta = (JTextArea) ((JScrollPane) dialog.getContentPane().getComponent(0)).getViewport().getView();
updateSource(drawing, ta);
}
Preferences prefs = PreferencesUtil.userNodeForPackage(getClass());
PreferencesUtil.installFramePrefsHandler(prefs, "viewSource", dialog);
getApplication().addWindow(dialog, v);
dialog.setVisible(true);
}
private void updateSource(Drawing drawing, JTextArea textArea) {
SVGOutputFormat format = new SVGOutputFormat();
format.setPrettyPrint(true);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
try {
format.write(buf, drawing);
String source = buf.toString("UTF-8");
textArea.setText(source);
} catch (IOException ex) {
textArea.setText(ex.toString());
}
}
}