/*******************************************************************************
* Copyright (c) 2016 Weasis Team and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nicolas Roduit - initial API and implementation
*******************************************************************************/
package org.weasis.core.ui.editor.image;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import javax.swing.ToolTipManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.weasis.core.api.gui.model.ViewModel;
import org.weasis.core.api.gui.util.ActionW;
import org.weasis.core.api.image.ImageOpNode;
import org.weasis.core.api.image.SimpleOpManager;
import org.weasis.core.api.image.util.ImageLayer;
import org.weasis.core.api.media.data.ImageElement;
import org.weasis.core.api.util.FontTools;
import org.weasis.core.ui.model.layer.LayerAnnotation;
public class ExportImage<E extends ImageElement> extends DefaultView2d<E> {
private static final long serialVersionUID = 1149562889654679335L;
private static final Logger LOGGER = LoggerFactory.getLogger(ExportImage.class);
private final ViewCanvas<E> view2d;
private Graphics2D currentG2d;
private double imagePrintingResolution = 1.0;
public ExportImage(ViewCanvas<E> view2d) {
super(view2d.getEventManager(), null);
this.view2d = view2d;
// Pixel iterator is necessary for updating label of measurements
this.imageLayer.setBuildIterator(true);
// Remove OpEventListener to avoid reseting some parameters when setting the series
this.imageLayer.removeEventListener(imageLayer.getDisplayOpManager());
setFont(FontTools.getFont8());
this.infoLayer = view2d.getInfoLayer().getLayerCopy(this);
infoLayer.setVisible(view2d.getInfoLayer().getVisible());
infoLayer.setShowBottomScale(false);
// For exporting view, remove Pixel value, Preloading bar, Key Object
infoLayer.setDisplayPreferencesValue(LayerAnnotation.PIXEL, false);
infoLayer.setDisplayPreferencesValue(LayerAnnotation.PRELOADING_BAR, false);
// Copy image operations from view2d
SimpleOpManager operations = imageLayer.getDisplayOpManager();
for (ImageOpNode op : view2d.getImageLayer().getDisplayOpManager().getOperations()) {
operations.addImageOperationAction(op.copy());
}
// Copy the current values of image operations
view2d.copyActionWState(actionsInView);
setPreferredSize(new Dimension(1024, 1024));
ViewModel model = view2d.getViewModel();
Rectangle2D canvas = new Rectangle2D.Double(view2d.modelToViewLength(model.getModelOffsetX()),
view2d.modelToViewLength(model.getModelOffsetY()), view2d.getJComponent().getWidth(),
view2d.getJComponent().getHeight());
Rectangle2D mArea = view2d.getViewModel().getModelArea();
Rectangle2D viewFullImg = new Rectangle2D.Double(0, 0, view2d.modelToViewLength(mArea.getWidth()),
view2d.modelToViewLength(mArea.getHeight()));
Rectangle2D.intersect(canvas, viewFullImg, viewFullImg);
actionsInView.put("origin.image.bound", viewFullImg); //$NON-NLS-1$
actionsInView.put("origin.zoom", view2d.getActionValue(ActionW.ZOOM.cmd())); //$NON-NLS-1$
Point2D p = new Point2D.Double(
view2d.viewToModelX(viewFullImg.getX() - canvas.getX() + (viewFullImg.getWidth() - 1) * 0.5),
view2d.viewToModelY(viewFullImg.getY() - canvas.getY() + (viewFullImg.getHeight() - 1) * 0.5));
actionsInView.put("origin.center", p); //$NON-NLS-1$
// Do not use setSeries() because the view will be reset
this.series = view2d.getSeries();
setImage(view2d.getImage());
}
public double getImagePrintingResolution() {
return imagePrintingResolution;
}
public void setImagePrintingResolution(double imagePrintingResolution) {
this.imagePrintingResolution = imagePrintingResolution;
}
@Override
public void disposeView() {
disableMouseAndKeyListener();
removeFocusListener(this);
ToolTipManager.sharedInstance().unregisterComponent(this);
imageLayer.removeLayerChangeListener(this);
// Unregister listener in GraphicsPane
graphicManager.removeChangeListener(layerModelHandler);
graphicManager.removeGraphicChangeHandler(graphicsChangeHandler);
setViewModel(null);
}
@Override
public Graphics getGraphics() {
if (currentG2d != null) {
return currentG2d;
}
return super.getGraphics();
}
@Override
public void paintComponent(Graphics g) {
if (g instanceof Graphics2D) {
draw((Graphics2D) g);
}
}
@Override
public void draw(Graphics2D g2d) {
currentG2d = g2d;
Stroke oldStroke = g2d.getStroke();
Paint oldColor = g2d.getPaint();
double viewScale = getViewModel().getViewScale();
double offsetX = getViewModel().getModelOffsetX() * viewScale;
double offsetY = getViewModel().getModelOffsetY() * viewScale;
// Paint the visible area
g2d.translate(-offsetX, -offsetY);
// Set font size according to the view size
g2d.setFont(getLayerFont());
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// Set label box size and spaces between items
graphicManager.updateLabels(Boolean.TRUE, this);
if (g2d.getClass().getName().contains("print")) { //$NON-NLS-1$
imageLayer.drawImageForPrinter(g2d, imagePrintingResolution);
} else {
imageLayer.drawImage(g2d);
}
drawLayers(g2d, affineTransform, inverseTransform);
g2d.translate(offsetX, offsetY);
if (infoLayer != null) {
infoLayer.paint(g2d);
}
g2d.setPaint(oldColor);
g2d.setStroke(oldStroke);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT);
// Reset label box size and spaces between items
graphicManager.updateLabels(Boolean.TRUE, view2d);
currentG2d = null;
}
@Override
public void handleLayerChanged(ImageLayer<E> layer) {
// Do nothing
}
@Override
public void enableMouseAndKeyListener(MouseActions mouseActions) {
// Do nothing
}
}