package org.geogebra.desktop.export;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Insets;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import javax.swing.JPanel;
import javax.swing.border.MatteBorder;
import org.geogebra.common.kernel.Kernel;
import org.geogebra.common.kernel.arithmetic.MyDouble;
import org.geogebra.desktop.euclidian.EuclidianViewD;
import org.geogebra.desktop.main.AppD;
class PagePreview extends JPanel {
private static final long serialVersionUID = 1L;
protected int m_w;
protected int m_h;
protected Printable target;
protected PageFormat format;
protected int pageIndex;
protected double scale = 1.0;
protected BufferedImage img;
private int targetIndex;
private AppD app;
public PagePreview(Printable target, PageFormat format, int pageIndex,
int targetIndex, AppD app) {
this.target = target;
this.format = format;
this.app = app;
this.pageIndex = pageIndex;
this.targetIndex = targetIndex;
m_w = (int) format.getWidth();
m_h = (int) format.getHeight();
setBackground(Color.white);
setBorder(new MatteBorder(1, 1, 2, 2, Color.black));
// update();
}
public int getTarget() {
return targetIndex;
}
public void setPageFormat(PageFormat format) {
this.format = format;
m_w = (int) (format.getWidth() * scale);
m_h = (int) (format.getHeight() * scale);
update();
}
public PageFormat getPageFormat() {
return format;
}
public void setScale(int scale) {
double newScale = scale / 100.0;
if (MyDouble.exactEqual(newScale, this.scale)) {
this.scale = newScale;
m_w = (int) (format.getWidth() * this.scale);
m_h = (int) (format.getHeight() * this.scale);
update();
}
}
@Override
public Dimension getPreferredSize() {
Insets ins = getInsets();
return new Dimension(m_w + ins.left + ins.right,
m_h + ins.top + ins.bottom);
}
@Override
public Dimension getMaximumSize() {
return getPreferredSize();
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
private void updateBufferedImage() {
img = new BufferedImage(m_w, m_h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = img.createGraphics();
g2.setColor(getBackground());
g2.fillRect(0, 0, m_w, m_h);
if (!Kernel.isEqual(scale, 1.0)) {
g2.scale(scale, scale);
}
try {
String scaleStr = null;
if (!(target instanceof EuclidianViewD)) {
int height = EuclidianViewD.printTitle(g2, scaleStr,
this.format, this.app);
g2.setTransform(new AffineTransform());
if (!Kernel.isEqual(scale, 1.0)) {
g2.scale(scale, scale);
}
if (height > 0) {
g2.translate(0, height + 20);
}
if (target instanceof PrintGridable) {
((PrintGridable) target).setTitleOffset(height);
}
}
target.print(g2, format, pageIndex);
} catch (Exception e) {
e.printStackTrace();
}
}
public void update() {
try {
updateBufferedImage();
} catch (Exception e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
}
repaint();
}
@Override
public void paint(Graphics g) {
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.drawImage(img, 0, 0, this);
paintBorder(g);
}
}