package org.archstudio.bna.logics.editing;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import org.archstudio.bna.IBNAView;
import org.archstudio.bna.IBNAWorld;
import org.archstudio.bna.ICoordinate;
import org.archstudio.bna.ICoordinateMapper;
import org.archstudio.bna.IThing;
import org.archstudio.bna.IThingPeer;
import org.archstudio.bna.facets.peers.IHasLocalBounds;
import org.archstudio.bna.logics.AbstractThingLogic;
import org.archstudio.bna.logics.tracking.ModelBoundsTrackingLogic;
import org.archstudio.bna.ui.IBNAAllEventsListener2;
import org.archstudio.bna.ui.IBNAMenuListener2;
import org.archstudio.bna.utils.BNAAction;
import org.archstudio.bna.utils.BNAUtils;
import org.archstudio.bna.utils.BNAUtils2.ThingsAtLocation;
import org.archstudio.sysutils.Finally;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.FileDialog;
public class ExportImageLogic extends AbstractThingLogic implements IBNAMenuListener2, IBNAAllEventsListener2 {
public ExportImageLogic(IBNAWorld world) {
super(world);
}
@Override
public void fillMenu(final IBNAView view, ICoordinate location, ThingsAtLocation thingsAtLocation,
IMenuManager menuManager) {
BNAUtils.checkLock();
if (view.getParentView() == null) {
menuManager.add(new BNAAction("Export Image...") {
@Override
public void runWithLock() {
FileDialog fd = new FileDialog(view.getBNAUI().getComposite().getShell(), SWT.SAVE);
fd.setFilterExtensions(new String[] { "*.png" });
fd.setOverwrite(true);
if (fd.open() == null) {
return;
}
final File f = new File(fd.getFilterPath() + File.separator + fd.getFileName());
final String format = fd.getFilterExtensions()[fd.getFilterIndex()].substring(2);
try (Finally lock = BNAUtils.lock()) {
ModelBoundsTrackingLogic boundsLogic =
view.getBNAWorld().getThingLogicManager().addThingLogic(ModelBoundsTrackingLogic.class);
ICoordinateMapper cm = view.getCoordinateMapper();
Rectangle wbb = boundsLogic.getModelBounds();
Rectangle lbb = cm.worldToLocal(wbb);
lbb.width++;
lbb.height++;
for (IThing t : view.getBNAWorld().getBNAModel().getAllThings()) {
IThingPeer<?> peer = view.getThingPeer(t);
if (peer instanceof IHasLocalBounds) {
Rectangle peerLBB = ((IHasLocalBounds) peer).getLocalBounds();
if (peerLBB != null) {
lbb = lbb.union(peerLBB);
}
}
}
BufferedImage image = view.getBNAUI().render(lbb);
ImageIO.write(image, format, f);
}
catch (Exception e) {
e.printStackTrace();
MessageDialog.openError(view.getBNAUI().getComposite().getShell(), "Error",
"An exception (" + e.getClass().getName()
+ ") has occurred. Please see the platform log file for details.");
}
}
});
}
}
}