/*
* This code is part of Project Waterloo from King's College London
*
*
* Copyright King's College London 2011-
*
* @author Malcolm Lidierth, King's College London [Contact]
*
* Project Waterloo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Project Waterloo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*
*/
package kcl.waterloo.graphics;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.LayoutManager;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.ClipboardOwner;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.ContainerEvent;
import java.awt.event.ContainerListener;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import javax.swing.JComponent;
import javax.swing.RepaintManager;
import kcl.waterloo.defaults.GJDefaults;
import kcl.waterloo.common.deploy.AbstractDeployableGraphics2D;
import kcl.waterloo.actions.ActionServices;
import kcl.waterloo.export.ExportFactory;
import org.jdesktop.swingx.JXPanel;
import org.jdesktop.swingx.painter.Painter;
/**
*
* @author Malcolm Lidierth, King's College London [Contact]
*/
public class GJBasicPanel extends JXPanel implements ContainerListener, ComponentListener, Printable {
boolean backgroundPainted = false;
double ID = Double.NaN;
public GJBasicPanel() {
this(true);
}
public GJBasicPanel(LayoutManager layout) {
this(true);
setLayout(layout);
}
public GJBasicPanel(boolean flag) {
super(flag);
setOpaque(false);
setBackground(Color.white);
}
public void setID(double n) {
ID = n;
}
public double getID() {
return ID;
}
/**
* Returns true when the method is called on the EDT. Useful in systems that
* provide a mechanism to refer all method calls for an instance to the EDT
* e.g. via javaObjectEDT in MATLAB.
*
* @return true when called on the EDT
*/
public boolean isOnEDT() {
return EventQueue.isDispatchThread();
}
/**
* Defines whether or not the background painted by this component.When
* background painting is disabled, background painting is deferred to the
* parent.
*
* @return true if background is painted, false otherwise
* @see #setBackgroundPainted(boolean)
* @see #getBackground()
*/
public boolean isBackgroundPainted() {
return backgroundPainted;
}
/**
*
* Enables or disables the painting of background depending on the value of
* the parameter. Background painting is enabled by default.
*
* @param backPainted if true, axis labels are painted
* @see #isBackgroundPainted()
* @see #setBackground(Color)
*/
public void setBackgroundPainted(boolean backPainted) {
this.backgroundPainted = backPainted;
}
public static ArrayList getAllComponents(JComponent c) {
ArrayList arr = new ArrayList();
JComponent c2;
arr.add(c);
for (int k = 0; k < c.getComponentCount(); k++) {
c2 = (JComponent) c.getComponent(k);
if (c2.getComponentCount() > 0) {
ArrayList arr2 = getAllComponents(c2);
arr.addAll(arr2);
} else {
arr.add(c2);
}
}
return arr;
}
@Override
public void paintComponent(Graphics g) {
if (g instanceof AbstractDeployableGraphics2D) {
((AbstractDeployableGraphics2D) g).setPaintObject(this);
}
super.paintComponent(g);
}
/**
*
*
* This method is called by the subclasses to paint the background.
*
*
* Fills the background with a solid color as defined by
* {@code #BackgroundColor1}.
*
*
* Subclasses can implement an {@code #isBackgroundPainted()} method to
* determine whether this superclass method should be called.
*
*
* It is recommended that subclasses honor the contract defined by
* {@code #isBackgroundPainted()} and also therefore provide a
* {@code #setBackgroundPainted(boolean)} method.
*
* @param g2 the graphics surface on which the background must be drawn
*/
@SuppressWarnings(value = "unchecked")
final void paintBackground(Graphics2D g2) {
if (isBackgroundPainted()) {
//Graphics2D g = (Graphics2D) g2.create();
Painter p = this.getBackgroundPainter();
if (p != null) {
p.paint(g2, this, getWidth(), getHeight());
} else {
Color c = g2.getColor();
g2.setColor(getBackground());
g2.fillRect(0, 0, getWidth(), getHeight());
g2.setColor(c);
}
//g.dispose();
}
}
public void print() {
PrinterJob job = PrinterJob.getPrinterJob();
//HashPrintRequestAttributeSet hashSet = new HashPrintRequestAttributeSet();
job.setPrintable(this);
boolean flag = job.printDialog();
if (flag) {
try {
job.print();
} catch (PrinterException ex) {
}
}
}
@Override
public int print(Graphics g, PageFormat pf, int page) throws
PrinterException {
if (page > 0) {
return NO_SUCH_PAGE;
}
RepaintManager currentManager = RepaintManager.currentManager(this);
boolean dB = currentManager.isDoubleBufferingEnabled();
currentManager.setDoubleBufferingEnabled(false);
Graphics2D g2 = (Graphics2D) g.create();
g2.translate(pf.getImageableX(), pf.getImageableY());
double xscale = pf.getImageableWidth() / (double) getWidth();
double yscale = pf.getImageableHeight() / (double) getHeight();
double scale = Math.min(xscale, yscale);
g2.translate((pf.getImageableWidth() - getWidth() * scale) / 2d, (pf.getImageableHeight() - getHeight() * scale) / 2d);
g2.scale(scale, scale);
super.printAll(g);
currentManager.setDoubleBufferingEnabled(dB);
return PAGE_EXISTS;
}
/**
* Paints the component into a {@code BufferedImage}
*
* @return a BufferedImage
*/
public BufferedImage getImage() {
if (this.getGraphicsConfiguration() != null) {
BufferedImage img = this.getGraphicsConfiguration().createCompatibleImage(getWidth(), getHeight());
Graphics2D g2 = img.createGraphics();
paint(g2);
return img;
} else {
return null;
}
}
/**
* Returns a {@code Transferable} for this panel for use in CCP/DnD.
*
* @return custom {@code Transferable} subclass
*/
public LocalTransferable getTransferable() {
return getTransferable(true);
}
/**
* Returns a {@code Transferable} for this panel for use in CCP/DnD. If
* vectorFlag is true, the returned {@code Transferable} will support both
* image and vector graphics. Otherwise, image data only.
*
*
* @param vectorFlag
* @return custom {@code Transferable} subclass
*/
public LocalTransferable getTransferable(boolean vectorFlag) {
return new LocalTransferable(this, vectorFlag);
}
@Override
public void componentAdded(ContainerEvent e) {
}
@Override
public void componentRemoved(ContainerEvent e) {
}
@Override
public void componentResized(ComponentEvent e) {
}
@Override
public void componentMoved(ComponentEvent e) {
}
@Override
public void componentShown(ComponentEvent e) {
}
@Override
public void componentHidden(ComponentEvent e) {
}
public class LocalTransferable implements Transferable, ClipboardOwner {
private final DataFlavor svgFlavor = new DataFlavor("image/svg+xml", "Scalable Vector Format");
private final DataFlavor pdfFlavor = new DataFlavor("application/pdf", "Portable Document Format (PDF)");
private final DataFlavor epsFlavor = new DataFlavor("application/postscript", "Encapsulated PostScript (EPS)");
private final DataFlavor psFlavor = new DataFlavor("application/postscript", "PostScript (PS)");
private final DataFlavor textFlavor = DataFlavor.stringFlavor;
GJBasicPanel panel;
boolean vectorFlag;
/**
* Buffer used for svg - generate only once per instance.
*/
private String svgData = null;
LocalTransferable(GJBasicPanel p, boolean flag) {
super();
panel = p;
vectorFlag = flag;
}
@Override
public DataFlavor[] getTransferDataFlavors() {
if (vectorFlag) {
ArrayList flavors = new ArrayList();
// if (((Boolean) GJDefaults.getMap().get("Clipboard.formatSVG")).booleanValue()) {
// flavors.add(svgFlavor);
// }
// if (((Boolean) GJDefaults.getMap().get("Clipboard.formatSVGAsText")).booleanValue()) {
// flavors.add(textFlavor);
// }
if (((Boolean) GJDefaults.getMap().get("Clipboard.formatPDF")).booleanValue()) {
flavors.add(pdfFlavor);
}
if (((Boolean) GJDefaults.getMap().get("Clipboard.formatPS")).booleanValue()) {
flavors.add(psFlavor);
}
if (((Boolean) GJDefaults.getMap().get("Clipboard.formatEPS")).booleanValue()) {
flavors.add(epsFlavor);
}
flavors.add(DataFlavor.imageFlavor);
DataFlavor[] arr = new DataFlavor[flavors.size()];
arr = flavors.toArray(arr);
return arr;
} else {
return new DataFlavor[]{DataFlavor.imageFlavor};
}
}
@Override
public boolean isDataFlavorSupported(DataFlavor df) {
DataFlavor[] flavors = getTransferDataFlavors();
for (DataFlavor flavor : flavors) {
if (flavor.equals(df)) {
return true;
}
}
return false;
}
@Override
public Object getTransferData(DataFlavor df) throws IOException {
if (df.equals(DataFlavor.imageFlavor)) {
return panel.getImage();
} else if (df.equals(svgFlavor) && ((Boolean) GJDefaults.getMap().get("Clipboard.formatSVG")).booleanValue()) {
doSVG();
return new ByteArrayInputStream(svgData.getBytes("UTF-8"));
} else if (df.equals(textFlavor) && ((Boolean) GJDefaults.getMap().get("Clipboard.formatSVGAsText")).booleanValue()) {
doSVG();
return svgData;
} else if (df.equals(pdfFlavor) && ((Boolean) GJDefaults.getMap().get("Clipboard.formatPDF")).booleanValue()) {
if (ActionServices.isExportFactoryPresent()) {
doSVG();
return ExportFactory.convertSVG2PDF(svgData);
}
} else if (df.equals(psFlavor) && ((Boolean) GJDefaults.getMap().get("Clipboard.formatPS")).booleanValue()) {
if (ActionServices.isExportFactoryPresent()) {
return new ByteArrayInputStream(ExportFactory.saveAsPS(panel).toByteArray());
}
} else if (df.equals(epsFlavor) && ((Boolean) GJDefaults.getMap().get("Clipboard.formatEPS")).booleanValue()) {
if (ActionServices.isExportFactoryPresent()) {
return new ByteArrayInputStream(ExportFactory.saveAsEPS(panel).toByteArray());
}
}
return null;
}
@Override
public void lostOwnership(Clipboard clpbrd, Transferable t) {
}
private void doSVG() throws IOException {
if (svgData == null) {
svgData = ExportFactory.saveAsSVG(panel);
}
}
}
}
Ads help maintain this website.