From 0b3bc7a879f92af9ebbfc80fa5b48d60eab8952c Mon Sep 17 00:00:00 2001 From: bancika Date: Sun, 6 Dec 2020 10:14:01 +0100 Subject: [PATCH] reorganize cloud thumbnail code --- .../swing/plugins/canvas/CanvasPanel.java | 6 +- .../swing/plugins/cloud/CloudPlugIn.java | 8 +- .../plugins/cloud/ThumbnailGenerator.java | 85 ++++++++++++++ .../plugins/cloud/view/UploadDialog.java | 105 ++++++------------ .../view/browser/ResultsScrollPanel.java | 15 +-- 5 files changed, 134 insertions(+), 85 deletions(-) create mode 100644 diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/ThumbnailGenerator.java diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index 2400c1ba..a1c4166d 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -142,9 +142,9 @@ public class CanvasPanel extends JComponent implements Autoscroll { getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.CTRL_DOWN_MASK), "zoomOut"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK), "zoomIn"); -getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) - .put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK), "zoomOut"); + .put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK), "zoomIn"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK), "zoomOut"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_0, KeyEvent.CTRL_DOWN_MASK), "resetZoom"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java index d072dd34..32051949 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/CloudPlugIn.java @@ -62,7 +62,8 @@ public class CloudPlugIn implements IPlugIn { private ISwingUI swingUI; private IPlugInPort plugInPort; - private IPlugInPort thumbnailPresenter; + private IPlugInPort thumbnailPresenter; + private ThumbnailGenerator thumbnailGenerator; private LibraryAction libraryAction; @@ -81,7 +82,8 @@ public class CloudPlugIn implements IPlugIn { super(); this.swingUI = swingUI; - this.thumbnailPresenter = new Presenter(new DummyView(), InMemoryConfigurationManager.getInstance()); + this.thumbnailPresenter = new Presenter(new DummyView(), InMemoryConfigurationManager.getInstance()); + this.thumbnailGenerator = new ThumbnailGenerator(thumbnailPresenter); swingUI.injectMenuAction(getLibraryAction(), ONLINE_TITLE); swingUI.injectMenuAction(null, ONLINE_TITLE); @@ -441,7 +443,7 @@ public class CloudPlugIn implements IPlugIn { if (ButtonDialog.OK.equals(dialog.getSelectedButtonCaption())) { try { final File thumbnailFile = File.createTempFile("upload-thumbnail", ".png"); - if (ImageIO.write(dialog.getThumbnail(), "png", thumbnailFile)) { + if (ImageIO.write(CloudPlugIn.this.thumbnailGenerator.getThumbnail(), "png", thumbnailFile)) { swingUI.executeBackgroundTask(new ITask() { @Override diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/ThumbnailGenerator.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/ThumbnailGenerator.java new file mode 100644 index 00000000..2fa94419 --- /dev/null +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/ThumbnailGenerator.java @@ -0,0 +1,85 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + +*/ +package org.diylc.swing.plugins.cloud; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import java.util.EnumSet; + +import org.diylc.common.DrawOption; +import org.diylc.common.IPlugInPort; + +/** + * Generates thumbnail image with hard-coded dimensions. + * + * @author bancika + * + */ +public class ThumbnailGenerator { + + private IPlugInPort plugInPort; + + public ThumbnailGenerator(IPlugInPort plugInPort) { + this.plugInPort = plugInPort; + } + + public BufferedImage getThumbnail() { + Dimension d = getThumbnailSize(); + BufferedImage thumbnailImage = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB); + Graphics2D cg = thumbnailImage.createGraphics(); + + paintThumbnail(cg, new Rectangle(thumbnailImage.getWidth(), thumbnailImage.getHeight())); + return thumbnailImage; + } + + public Dimension getThumbnailSize() { + Dimension d = this.plugInPort.getCanvasDimensions(false, false); + if (d.height > d.width) + return new Dimension(192 * d.width / d.height, 192); + else + return new Dimension(192, 192 * d.height / d.width); + } + + public void paintThumbnail(Graphics g, Rectangle rect) { + Graphics2D g2d = (Graphics2D) g; + Dimension d = this.plugInPort.getCanvasDimensions(false, false); + + g2d.setColor(Color.white); + g2d.fill(rect); + + double projectRatio = d.getWidth() / d.getHeight(); + double actualRatio = rect.getWidth() / rect.getHeight(); + double zoomRatio; + if (projectRatio > actualRatio) { + zoomRatio = rect.getWidth() / d.getWidth(); + } else { + zoomRatio = rect.getHeight() / d.getHeight(); + } + + // g2d.scale(zoomRatio, zoomRatio); + this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null, zoomRatio, null); + } +} diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java index 2ada9160..84986d5b 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java @@ -21,37 +21,32 @@ */ package org.diylc.swing.plugins.cloud.view; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import java.util.EnumSet; -import java.util.List; - -import javax.swing.BorderFactory; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JComponent; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.JTextField; -import javax.swing.UIManager; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import org.diylc.common.DrawOption; -import org.diylc.common.IPlugInPort; -import org.diylc.common.PropertyWrapper; -import org.diylc.swing.gui.components.HTMLTextArea; -import org.diylc.swingframework.ButtonDialog; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; + +import org.diylc.common.IPlugInPort; +import org.diylc.common.PropertyWrapper; +import org.diylc.swing.gui.components.HTMLTextArea; +import org.diylc.swing.plugins.cloud.ThumbnailGenerator; +import org.diylc.swingframework.ButtonDialog; import org.diylc.utils.KeywordExtractor; public class UploadDialog extends ButtonDialog { @@ -79,11 +74,14 @@ public class UploadDialog extends ButtonDialog { private JTextField keywordsField; private IPlugInPort plugInPort; - private String[] categories; + private String[] categories; + + private ThumbnailGenerator thumbnailGenerator; public UploadDialog(JFrame owner, IPlugInPort plugInPort, String[] categories, boolean isUpdate) { super(owner, isUpdate ? "Re-Upload A Project" : "Upload A Project", new String[] {OK, CANCEL}); - this.plugInPort = plugInPort; + this.plugInPort = plugInPort; + this.thumbnailGenerator = new ThumbnailGenerator(plugInPort); this.categories = categories; layoutGui(); getButton(OK).setEnabled(false); @@ -205,24 +203,16 @@ public class UploadDialog extends ButtonDialog { public void paint(Graphics g) { super.paint(g); - paintThumbnail(g, getBounds()); + UploadDialog.this.thumbnailGenerator.paintThumbnail(g, getBounds()); } }, gbc); - thumbnailPanel.setPreferredSize(getThumbnailSize()); + thumbnailPanel.setPreferredSize(this.thumbnailGenerator.getThumbnailSize()); thumbnailPanel.setBorder(BorderFactory.createEtchedBorder()); } return thumbnailPanel; } - private Dimension getThumbnailSize() { - Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false, false); - if (d.height > d.width) - return new Dimension(192 * d.width / d.height, 192); - else - return new Dimension(192, 192 * d.height / d.width); - } - private JTextField getNameField() { if (nameField == null) { nameField = new JTextField(); @@ -293,35 +283,6 @@ public class UploadDialog extends ButtonDialog { return getCategoryBox().getSelectedItem().toString(); } - public BufferedImage getThumbnail() { - Dimension d = getThumbnailSize(); - BufferedImage thumbnailImage = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB); - Graphics2D cg = thumbnailImage.createGraphics(); - - paintThumbnail(cg, new Rectangle(thumbnailImage.getWidth(), thumbnailImage.getHeight())); - return thumbnailImage; - } - - private void paintThumbnail(Graphics g, Rectangle rect) { - Graphics2D g2d = (Graphics2D) g; - Dimension d = UploadDialog.this.plugInPort.getCanvasDimensions(false, false); - - g2d.setColor(Color.white); - g2d.fill(rect); - - double projectRatio = d.getWidth() / d.getHeight(); - double actualRatio = rect.getWidth() / rect.getHeight(); - double zoomRatio; - if (projectRatio > actualRatio) { - zoomRatio = rect.getWidth() / d.getWidth(); - } else { - zoomRatio = rect.getHeight() / d.getHeight(); - } - -// g2d.scale(zoomRatio, zoomRatio); - UploadDialog.this.plugInPort.draw(g2d, EnumSet.of(DrawOption.ANTIALIASING), null, zoomRatio, null); - } - public String getKeywords() { return getKeywordsField().getText(); } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java index 29d89b96..6ad14d1b 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java @@ -57,7 +57,6 @@ import org.diylc.common.IPlugInPort; import org.diylc.common.ITask; import org.diylc.common.PropertyWrapper; import org.diylc.core.IView; -import org.diylc.swing.images.IconLoader; import org.diylc.plugins.cloud.model.CommentEntity; import org.diylc.plugins.cloud.model.ProjectEntity; import org.diylc.plugins.cloud.presenter.CloudPresenter; @@ -69,8 +68,9 @@ import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.gui.DummyView; import org.diylc.swing.gui.components.HTMLTextArea; import org.diylc.swing.gui.editor.PropertyEditorDialog; +import org.diylc.swing.images.IconLoader; +import org.diylc.swing.plugins.cloud.ThumbnailGenerator; import org.diylc.swing.plugins.cloud.view.CommentDialog; -import org.diylc.swing.plugins.cloud.view.UploadDialog; import org.diylc.swing.plugins.file.FileFilterEnum; import org.diylc.swingframework.ButtonDialog; import org.diylc.utils.Pair; @@ -400,8 +400,11 @@ public class ResultsScrollPanel extends JScrollPane { + project.getName() + "\" with a new file?\nThis opperation is irreversible. Once replaced, the old version of the project cannot be restored.", "Replace Project", IView.YES_NO_OPTION, IView.QUESTION_MESSAGE) == IView.YES_OPTION) { + final Presenter thumbnailPresenter = new Presenter(new DummyView(), InMemoryConfigurationManager.getInstance()); + final ThumbnailGenerator thumbnailGenerator = new ThumbnailGenerator(thumbnailPresenter); + final File file = DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(), null, FileFilterEnum.DIY.getExtensions()[0], null, cloudUI.getOwnerFrame()); @@ -413,15 +416,13 @@ public class ResultsScrollPanel extends JScrollPane { @Override public Pair doInBackground() throws Exception { LOG.debug("Uploading from " + file.getAbsolutePath()); - thumbnailPresenter.loadProjectFromFile(file.getAbsolutePath()); - final UploadDialog dialog = DialogFactory.getInstance().createUploadDialog( - cloudUI.getOwnerFrame(), thumbnailPresenter, new String[0], true); + thumbnailPresenter.loadProjectFromFile(file.getAbsolutePath()); final File thumbnailFile = File.createTempFile("upload-thumbnail", ".png"); - if (ImageIO.write(dialog.getThumbnail(), "png", thumbnailFile)) { + if (ImageIO.write(thumbnailGenerator.getThumbnail(), "png", thumbnailFile)) { CloudPresenter.Instance.replaceProjectFile( plugInPort.getCurrentVersionNumber().toString(), thumbnailFile, file, project.getId()); - return new Pair(dialog.getThumbnail(), + return new Pair(thumbnailGenerator.getThumbnail(), CloudPresenter.Instance.fetchUserUploads(project.getId()).get(0)); } else { cloudUI.showMessage(