/*
* @(#)DrawView.java
*
* Copyright (c) 1996-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.draw;
import org.jhotdraw.draw.io.TextInputFormat;
import org.jhotdraw.draw.io.OutputFormat;
import org.jhotdraw.draw.io.InputFormat;
import org.jhotdraw.draw.io.ImageOutputFormat;
import org.jhotdraw.draw.io.ImageInputFormat;
import org.jhotdraw.draw.print.DrawingPageable;
import org.jhotdraw.draw.io.DOMStorableInputOutputFormat;
import java.awt.geom.*;
import java.awt.print.Pageable;
import org.jhotdraw.gui.*;
import org.jhotdraw.undo.*;
import org.jhotdraw.util.*;
import java.awt.*;
import java.beans.*;
import java.io.*;
import java.lang.reflect.*;
import java.net.URI;
import javax.swing.*;
import javax.swing.border.*;
import org.jhotdraw.app.AbstractView;
import org.jhotdraw.app.action.edit.RedoAction;
import org.jhotdraw.app.action.edit.UndoAction;
import org.jhotdraw.draw.*;
import org.jhotdraw.draw.action.*;
import org.jhotdraw.gui.URIChooser;
import org.jhotdraw.net.URIUtil;
/**
* Provides a view on a drawing.
* <p>
* See {@link org.jhotdraw.app.View} interface on how this view interacts with an application.
*
* @author Werner Randelshofer
* @version $Id$
*/
public class DrawView extends AbstractView {
private static final long serialVersionUID = 1L;
/**
* Each DrawView uses its own undo redo manager.
* This allows for undoing and redoing actions per view.
*/
private UndoRedoManager undo;
/**
* Depending on the type of an application, there may be one editor per
* view, or a single shared editor for all views.
*/
private DrawingEditor editor;
/**
* Creates a new view.
*/
public DrawView() {
initComponents();
scrollPane.setLayout(new PlacardScrollPaneLayout());
scrollPane.setBorder(new EmptyBorder(0,0,0,0));
setEditor(new DefaultDrawingEditor());
undo = new UndoRedoManager();
view.setDrawing(createDrawing());
view.getDrawing().addUndoableEditListener(undo);
initActions();
undo.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
setHasUnsavedChanges(undo.hasSignificantEdits());
}
});
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.draw.Labels");
JPanel placardPanel = new JPanel(new BorderLayout());
javax.swing.AbstractButton pButton;
pButton = ButtonFactory.createZoomButton(view);
pButton.putClientProperty("Quaqua.Button.style","placard");
pButton.putClientProperty("Quaqua.Component.visualMargin",new Insets(0,0,0,0));
pButton.setFont(UIManager.getFont("SmallSystemFont"));
placardPanel.add(pButton, BorderLayout.WEST);
pButton = ButtonFactory.createToggleGridButton(view);
pButton.putClientProperty("Quaqua.Button.style","placard");
pButton.putClientProperty("Quaqua.Component.visualMargin",new Insets(0,0,0,0));
pButton.setFont(UIManager.getFont("SmallSystemFont"));
labels.configureToolBarButton(pButton, "view.toggleGrid.placard");
placardPanel.add(pButton, BorderLayout.EAST);
scrollPane.add(placardPanel, JScrollPane.LOWER_LEFT_CORNER);
}
/**
* Creates a new Drawing for this view.
*/
protected Drawing createDrawing() {
Drawing drawing = new QuadTreeDrawing();
DOMStorableInputOutputFormat ioFormat =
new DOMStorableInputOutputFormat(new DrawFigureFactory());
drawing.addInputFormat(ioFormat);
ImageFigure prototype = new ImageFigure();
drawing.addInputFormat(new ImageInputFormat(prototype));
drawing.addInputFormat(new TextInputFormat(new TextFigure()));
TextAreaFigure taf = new TextAreaFigure();
taf.setBounds(new Point2D.Double(10,10), new Point2D.Double(60,40));
drawing.addInputFormat(new TextInputFormat(taf));
drawing.addOutputFormat(ioFormat);
drawing.addOutputFormat(new ImageOutputFormat());
return drawing;
}
/**
* Creates a Pageable object for printing the view.
*/
public Pageable createPageable() {
return new DrawingPageable(view.getDrawing());
}
/**
* Initializes view specific actions.
*/
private void initActions() {
getActionMap().put(UndoAction.ID, undo.getUndoAction());
getActionMap().put(RedoAction.ID, undo.getRedoAction());
}
@Override
protected void setHasUnsavedChanges(boolean newValue) {
super.setHasUnsavedChanges(newValue);
undo.setHasSignificantEdits(newValue);
}
/**
* Writes the view to the specified uri.
*/
@Override
public void write(URI f, URIChooser fc) throws IOException {
Drawing drawing = view.getDrawing();
OutputFormat outputFormat = drawing.getOutputFormats().get(0);
outputFormat.write(f, drawing);
}
/**
* Reads the view from the specified uri.
*/
@Override
public void read(URI f, URIChooser fc) throws IOException {
try {
final Drawing drawing = createDrawing();
boolean success = false;
for (InputFormat sfi : drawing.getInputFormats()) {
try {
sfi.read(f, drawing, true);
success = true;
break;
} catch (Exception e) {
// try with the next input format
}
}
if (!success) {
ResourceBundleUtil labels = ResourceBundleUtil.getBundle("org.jhotdraw.app.Labels");
throw new IOException(labels.getFormatted("file.open.unsupportedFileFormat.message", URIUtil.getName(f)));
}
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
view.getDrawing().removeUndoableEditListener(undo);
view.setDrawing(drawing);
view.getDrawing().addUndoableEditListener(undo);
undo.discardAllEdits();
}
});
} catch (InterruptedException e) {
InternalError error = new InternalError();
e.initCause(e);
throw error;
} catch (InvocationTargetException e) {
InternalError error = new InternalError();
error.initCause(e);
throw error;
}
}
/**
* Sets a drawing editor for the view.
*/
public void setEditor(DrawingEditor newValue) {
if (editor != null) {
editor.remove(view);
}
editor = newValue;
if (editor != null) {
editor.add(view);
}
}
/**
* Gets the drawing editor of the view.
*/
public DrawingEditor getEditor() {
return editor;
}
/**
* Clears the view.
*/
@Override
public void clear() {
final Drawing newDrawing = createDrawing();
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
view.getDrawing().removeUndoableEditListener(undo);
view.setDrawing(newDrawing);
view.getDrawing().addUndoableEditListener(undo);
undo.discardAllEdits();
}
});
} catch (InvocationTargetException ex) {
ex.printStackTrace();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
@Override
public boolean canSaveTo(URI file) {
return new File(file).getName().endsWith(".xml");
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
scrollPane = new javax.swing.JScrollPane();
view = new org.jhotdraw.draw.DefaultDrawingView();
setLayout(new java.awt.BorderLayout());
scrollPane.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
scrollPane.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
scrollPane.setViewportView(view);
add(scrollPane, java.awt.BorderLayout.CENTER);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JScrollPane scrollPane;
private org.jhotdraw.draw.DefaultDrawingView view;
// End of variables declaration//GEN-END:variables
}