/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ro.nextreports.designer.action.report.layout.cell; import ro.nextreports.engine.util.ObjectCloner; import ro.nextreports.engine.band.BandElement; import ro.nextreports.engine.band.ImageBandElement; import ro.nextreports.engine.band.ImageColumnBandElement; import ro.nextreports.engine.ReportLayout; import javax.swing.*; import javax.imageio.ImageIO; import ro.nextreports.designer.Globals; import ro.nextreports.designer.ImageResizePanel; import ro.nextreports.designer.LayoutHelper; import ro.nextreports.designer.ReportGrid; import ro.nextreports.designer.action.undo.LayoutEdit; import ro.nextreports.designer.grid.Cell; import ro.nextreports.designer.grid.SelectionModel; import ro.nextreports.designer.grid.event.SelectionModelEvent; import ro.nextreports.designer.ui.BaseDialog; import ro.nextreports.designer.util.I18NSupport; import java.awt.event.ActionEvent; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * User: mihai.panaitescu * Date: 23-Mar-2010 * Time: 11:07:35 */ public class ImageSizeAction extends AbstractAction { public ImageSizeAction() { super(); putValue(Action.NAME, I18NSupport.getString("size.image.action.name")); } public void actionPerformed(final ActionEvent event) { final ReportGrid grid = Globals.getReportGrid(); SelectionModel selectionModel = grid.getSelectionModel(); List<Cell> cells = selectionModel.getSelectedCells(); final List<BandElement> olds = new ArrayList<BandElement>(); for (Cell cell : cells) { BandElement be = grid.getBandElement(cell.getRow(), cell.getColumn()); if ((be instanceof ImageBandElement) || (be instanceof ImageColumnBandElement)) { olds.add(be); } } final ReportLayout oldLayout = ObjectCloner.silenceDeepCopy(LayoutHelper.getReportLayout()); Thread executorThread = new Thread(new Runnable() { public void run() { int[] size = new int[] {0,0}; for (int i=0, len = olds.size(); i<len; i++) { BandElement oldElement = olds.get(i); int[] size2; if (oldElement instanceof ImageBandElement) { size2 = getRealImageSize(((ImageBandElement)oldElement).getImage()); } else { // for ImageColumnBandElement we put a static actual size (we do not go to database to compute it) size2 = new int[] {50,50}; } if (i == 0) { size = size2; } else { if ((size[0] != size2[0]) || (size[1] != size2[1])) { size[0] = size[1] = 0; break; } } } final int[] s = size; SwingUtilities.invokeLater(new Runnable() { public void run() { final ImageResizePanel panel = new ImageResizePanel(s, olds.get(0)); final BaseDialog dialog = new BaseDialog(panel, I18NSupport.getString("size.image.action.name")); dialog.pack(); dialog.setLocationRelativeTo(Globals.getMainFrame()); dialog.setVisible(true); if (!dialog.okPressed()) { return; } for (int i = 0, len = olds.size(); i < len; i++) { BandElement be = olds.get(i); if (be instanceof ImageBandElement) { ImageBandElement ibe = (ImageBandElement)be; ibe.setWidth(panel.getImageWidth()); ibe.setHeight(panel.getImageHeight()); } else { ImageColumnBandElement icbe = (ImageColumnBandElement)be; icbe.setWidth(panel.getImageWidth()); icbe.setHeight(panel.getImageHeight()); } } SelectionModelEvent selectionEvent = new SelectionModelEvent(Globals.getReportGrid().getSelectionModel(), false); Globals.getReportDesignerPanel().getPropertiesPanel().selectionChanged(selectionEvent); ReportLayout newLayout = ObjectCloner.silenceDeepCopy(LayoutHelper.getReportLayout()); Globals.getReportUndoManager().addEdit(new LayoutEdit(oldLayout, newLayout, I18NSupport.getString("size.image.action.name"))); } }); } }, "NEXT : " + getClass().getSimpleName()); executorThread.start(); } private int[] getRealImageSize(String image) { InputStream is = getClass().getResourceAsStream("/" + image); int[] size = new int[2]; size[0] = 0; size[1] = 0; try { BufferedImage img = ImageIO.read(is); if (img != null) { size[0] = img.getWidth(); size[1] = img.getHeight(); } } catch (IOException ex) { ex.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return size; } }