From 3afd1add400d3c3320faa5705a303064aa14ec9b Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 24 Oct 2016 16:17:56 +0200 Subject: [PATCH] added bitchin' cloud animation --- .../cloud/presenter/CloudPresenter.java | 21 +- .../src/org/diylc/images/IconLoader.java | 2 +- .../src/org/diylc/images/cloud_bg.png | Bin 0 -> 7637 bytes .../src/org/diylc/images/missing_image.png | Bin 0 -> 3090 bytes .../plugins/cloud/view/CloudBrowserFrame.java | 196 ++++++++++++------ .../plugins/cloud/view/CloudGlassPane.java | 111 ++++++++++ 6 files changed, 258 insertions(+), 72 deletions(-) create mode 100644 diylc/diylc-swing/src/org/diylc/images/cloud_bg.png create mode 100644 diylc/diylc-swing/src/org/diylc/images/missing_image.png create mode 100644 diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudGlassPane.java diff --git a/diylc/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java b/diylc/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java index a0bb772d..2ce4af25 100644 --- a/diylc/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java +++ b/diylc/diylc-core/src/org/diylc/plugins/cloud/presenter/CloudPresenter.java @@ -2,9 +2,13 @@ package org.diylc.plugins.cloud.presenter; import java.awt.Image; import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; import java.net.InetAddress; import java.net.NetworkInterface; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; import java.util.List; import org.apache.log4j.Logger; @@ -212,12 +216,25 @@ public class CloudPresenter { LOG.info(String.format("search(%1$s,%2$s,%3$s,%4$d,%5$d)", criteria, category, sortOrder, pageNumber, itemsPerPage)); try { Object res = service.search(criteria, category, "json", pageNumber, itemsPerPage, sortOrder); + // Thread.sleep(2000); if (res == null) throw new CloudException("Failed to retreive search results."); if (res instanceof String) throw new CloudException(res.toString()); - if (res instanceof List) - return (List) res; + if (res instanceof List) { + List projects = (List) res; + // Download thumbnails and replace urls with local paths + for (int i = 0; i < projects.size(); i++) { + String url = projects.get(i).getThumbnailUrl(); + URL website = new URL(url); + ReadableByteChannel rbc = Channels.newChannel(website.openStream()); + File temp = File.createTempFile("thumbnail", ".png"); + FileOutputStream fos = new FileOutputStream(temp); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + projects.get(i).setThumbnailUrl(temp.getAbsolutePath()); + } + return projects; + } throw new CloudException("Unexpected server response received for search results: " + res.getClass().getName()); } catch (Exception e) { throw new CloudException(e); diff --git a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java index 669756c9..a7a55879 100644 --- a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java +++ b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java @@ -33,7 +33,7 @@ public enum IconLoader { "arrow.png"), Cloud("cloud.png"), CloudUp("cloud_up.png"), CloudGear("cloud_gear.png"), IdCardEdit( "id_card_edit.png"), KeyEdit("key_edit.png"), Find("find.png"), Dashboard("dashboard.png"), DataFind( "data_find.png"), CloudDownload("cloud-download.png"), NavLeftBlue("nav_left_blue.png"), NavRightBlue( - "nav_right_blue.png"); + "nav_right_blue.png"), MissingImage("missing_image.png"), CloudBg("cloud_bg.png"); protected String name; diff --git a/diylc/diylc-swing/src/org/diylc/images/cloud_bg.png b/diylc/diylc-swing/src/org/diylc/images/cloud_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..43d0a040e5596e9d3ee8ffc4031fd463a4dba346 GIT binary patch literal 7637 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 literal 0 HcmV?d00001 diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudBrowserFrame.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudBrowserFrame.java index b8d5b2ae..d4e12165 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudBrowserFrame.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudBrowserFrame.java @@ -5,13 +5,12 @@ import java.awt.Cursor; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; -import java.awt.Image; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; -import java.io.IOException; import java.net.URL; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; @@ -28,11 +27,13 @@ import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JRootPane; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; import javax.swing.SwingWorker; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; @@ -46,7 +47,6 @@ import org.diylc.plugins.cloud.model.ProjectEntity; import org.diylc.plugins.cloud.presenter.CloudException; import org.diylc.plugins.cloud.presenter.CloudPresenter; import org.diylc.swing.ISwingUI; -import org.diylc.swing.gui.CustomGlassPane; import org.diylc.swing.gui.DialogFactory; import org.diylc.swing.plugins.file.FileFilterEnum; @@ -73,6 +73,12 @@ public class CloudBrowserFrame extends JFrame { private IPlugInPort plugInPort; private CloudPresenter cloudPresenter; + private JPanel navigationPanel; + private JButton prevPageButton; + private JButton nextPageButton; + private JLabel pageLabel; + private List currentResults; + // search criteria private String searchFor; private String category; @@ -90,7 +96,10 @@ public class CloudBrowserFrame extends JFrame { setContentPane(getMainPanel()); this.pack(); this.setLocationRelativeTo(owner); - this.setGlassPane(new CustomGlassPane()); + this.setGlassPane(new CloudGlassPane()); + + JRootPane rootPane = SwingUtilities.getRootPane(getGoButton()); + rootPane.setDefaultButton(getGoButton()); } public JPanel getMainPanel() { @@ -155,6 +164,15 @@ public class CloudBrowserFrame extends JFrame { gbc.weighty = 1; gbc.fill = GridBagConstraints.BOTH; browsePanel.add(getResultsScrollPane(), gbc); + + gbc.anchor = GridBagConstraints.NORTHWEST; + gbc.insets = new Insets(2, 2, 2, 2); + gbc.gridx = 0; + gbc.gridy++; + gbc.fill = GridBagConstraints.BOTH; + gbc.weighty = 0; + gbc.gridwidth = 3; + browsePanel.add(getNavigationPanel(), gbc); } return browsePanel; } @@ -253,7 +271,7 @@ public class CloudBrowserFrame extends JFrame { @Override public void actionPerformed(ActionEvent e) { - CloudBrowserFrame.this.pageNumber = 1; + setPageNumber(1); CloudBrowserFrame.this.searchFor = getSearchField().getText(); CloudBrowserFrame.this.category = getCategoryBox().getSelectedItem() == null ? "" : getCategoryBox().getSelectedItem().toString(); @@ -283,6 +301,7 @@ public class CloudBrowserFrame extends JFrame { @Override public void complete(List result) { + CloudBrowserFrame.this.currentResults = result; getResultsPanel().removeAll(); int count = 0; for (Iterator i = result.iterator(); i.hasNext();) { @@ -293,7 +312,7 @@ public class CloudBrowserFrame extends JFrame { showNoMatches(); count++; } - addNavigationPanel(count); + // addNavigationPanel(count); } }); } @@ -443,65 +462,100 @@ public class CloudBrowserFrame extends JFrame { getResultsPanel().add(new JSeparator(), gbc); } - private void addNavigationPanel(int location) { - JPanel navigationPanel = new JPanel(new GridBagLayout()); - navigationPanel.setBackground(Color.white); + private JPanel getNavigationPanel() { + if (navigationPanel == null) { + navigationPanel = new JPanel(new GridBagLayout()); + navigationPanel.setBackground(Color.white); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.SOUTHWEST; + gbc.insets = new Insets(2, 2, 2, 2); + gbc.gridx = 0; + gbc.weightx = 0; + gbc.fill = GridBagConstraints.NONE; + navigationPanel.add(getPrevPageButton(), gbc); - JButton prevPageButton = new JButton(IconLoader.NavLeftBlue.getIcon()); - prevPageButton.setBorderPainted(false); - prevPageButton.setContentAreaFilled(false); - prevPageButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - prevPageButton.addActionListener(new ActionListener() { + gbc.gridx++; + gbc.weightx = 1; + gbc.anchor = GridBagConstraints.LINE_START; + gbc.fill = GridBagConstraints.HORIZONTAL; + navigationPanel.add(getPageLabel(), gbc); - @Override - public void actionPerformed(ActionEvent e) { - if (CloudBrowserFrame.this.pageNumber > 1) { - CloudBrowserFrame.this.pageNumber--; - CloudBrowserFrame.this.search(); - } - } - }); + gbc.gridx++; + gbc.weightx = 0; + gbc.anchor = GridBagConstraints.SOUTHWEST; + gbc.fill = GridBagConstraints.NONE; + navigationPanel.add(getNextPageButton(), gbc); - JButton nextPageButton = new JButton(IconLoader.NavRightBlue.getIcon()); - nextPageButton.setBorderPainted(false); - nextPageButton.setContentAreaFilled(false); - nextPageButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - nextPageButton.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - CloudBrowserFrame.this.pageNumber++; - CloudBrowserFrame.this.search(); - } - }); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.SOUTHWEST; - gbc.insets = new Insets(2, 2, 2, 2); - gbc.gridx = 0; - gbc.weightx = 0; - gbc.fill = GridBagConstraints.NONE; - navigationPanel.add(prevPageButton, gbc); - - gbc.gridx++; - gbc.weightx = 1; - navigationPanel.add(new JLabel(), gbc); - - gbc.gridx++; - gbc.weightx = 0; - navigationPanel.add(nextPageButton, gbc); - - gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.NORTHWEST; - gbc.insets = new Insets(2, 2, 2, 2); - gbc.gridx = 0; - gbc.gridy = location * 6; - gbc.fill = GridBagConstraints.BOTH; - gbc.weighty = 100; - gbc.gridwidth = 3; - getResultsPanel().add(navigationPanel, gbc); + } + return navigationPanel; } + private JButton getPrevPageButton() { + if (prevPageButton == null) { + prevPageButton = new JButton(IconLoader.NavLeftBlue.getIcon()); + prevPageButton.setBorderPainted(false); + prevPageButton.setContentAreaFilled(false); + prevPageButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + prevPageButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (CloudBrowserFrame.this.pageNumber > 1) { + setPageNumber(CloudBrowserFrame.this.pageNumber - 1); + CloudBrowserFrame.this.search(); + } + } + }); + } + return prevPageButton; + } + + private JButton getNextPageButton() { + if (nextPageButton == null) { + nextPageButton = new JButton(IconLoader.NavRightBlue.getIcon()); + nextPageButton.setBorderPainted(false); + nextPageButton.setContentAreaFilled(false); + nextPageButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + nextPageButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + if (CloudBrowserFrame.this.currentResults != null && !CloudBrowserFrame.this.currentResults.isEmpty()) { + setPageNumber(CloudBrowserFrame.this.pageNumber + 1); + CloudBrowserFrame.this.search(); + } + } + }); + } + return nextPageButton; + } + + private void setPageNumber(int pageNumber) { + this.pageNumber = pageNumber; + getPageLabel().setText("Page " + pageNumber); + } + + private JLabel getPageLabel() { + if (pageLabel == null) { + pageLabel = new JLabel(); + pageLabel.setFont(pageLabel.getFont().deriveFont(12f)); + pageLabel.setHorizontalAlignment(SwingConstants.CENTER); + } + return pageLabel; + } + + // private void addNavigationPanel(int location) { + // GridBagConstraints gbc = new GridBagConstraints(); + // gbc.anchor = GridBagConstraints.NORTHWEST; + // gbc.insets = new Insets(2, 2, 2, 2); + // gbc.gridx = 0; + // gbc.gridy = location * 6; + // gbc.fill = GridBagConstraints.BOTH; + // gbc.weighty = 100; + // gbc.gridwidth = 3; + // getResultsPanel().add(getNavigationPanel(), gbc); + // } + public void executeBackgroundTask(final ITask task) { getGlassPane().setVisible(true); SwingWorker worker = new SwingWorker() { @@ -513,16 +567,14 @@ public class CloudBrowserFrame extends JFrame { @Override protected void done() { + getGlassPane().setVisible(false); try { T result = get(); task.complete(result); - getGlassPane().setVisible(false); } catch (ExecutionException e) { LOG.error("Background task execution failed", e); - getGlassPane().setVisible(false); task.failed(e); } catch (InterruptedException e) { - getGlassPane().setVisible(false); LOG.error("Background task execution interrupted", e); task.failed(e); } @@ -539,13 +591,19 @@ public class CloudBrowserFrame extends JFrame { return JOptionPane.showConfirmDialog(this, message, title, optionType, messageType); } - private Icon downloadImage(String imageUrl) { - Image image = null; + private Icon downloadImage(String imageFile) { + // Image image = null; + // try { + // URL url = new URL(imageUrl); + // image = ImageIO.read(url); + // } catch (IOException e) { + // } + // return image == null ? IconLoader.MissingImage.getIcon() : new ImageIcon(image); try { - URL url = new URL(imageUrl); - image = ImageIO.read(url); - } catch (IOException e) { + BufferedImage img = ImageIO.read(new File(imageFile)); + return new ImageIcon(img); + } catch (Exception e) { + return IconLoader.MissingImage.getIcon(); } - return new ImageIcon(image); } } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudGlassPane.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudGlassPane.java new file mode 100644 index 00000000..fa5e3c37 --- /dev/null +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/CloudGlassPane.java @@ -0,0 +1,111 @@ +package org.diylc.swing.plugins.cloud.view; + +import java.awt.Color; +import java.awt.Cursor; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.RenderingHints; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.awt.event.KeyListener; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; + +import javax.swing.JPanel; +import javax.swing.Timer; + +import org.diylc.images.IconLoader; + +public class CloudGlassPane extends JPanel implements MouseListener, KeyListener { + + public static final CloudGlassPane GLASS_PANE = new CloudGlassPane(); + + private static final long serialVersionUID = -5344758920442881290L; + + private long startTime; + private final int msPerPx = 5; + + private Timer animationTimer; + + public CloudGlassPane() { + addKeyListener(this); + addMouseListener(this); + setCursor(new Cursor(Cursor.WAIT_CURSOR)); + setOpaque(false); + setBackground(new Color(192, 222, 237)); + + animationTimer = new Timer(20, new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + repaint(); + } + }); + } + + @Override + public void setVisible(boolean aFlag) { + if (aFlag) { + startTime = System.currentTimeMillis(); + animationTimer.start(); + } else + animationTimer.stop(); + super.setVisible(aFlag); + }; + + @Override + public void paint(java.awt.Graphics g) { + Graphics2D g2d = (Graphics2D) g; + // g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.8f)); + + Image cloud = IconLoader.CloudBg.getImage(); + + g2d.setColor(new Color(192, 222, 237)); + g2d.fillRect(0, cloud.getHeight(null), getWidth(), getHeight()); + + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + long ellapsed = System.currentTimeMillis() - startTime; + long dx = (ellapsed / msPerPx) % cloud.getWidth(null); + g2d.drawImage(cloud, -(int) dx, 0, null); + if (cloud.getWidth(null) - dx < getWidth()) { + g2d.drawImage(cloud, (int) (cloud.getWidth(null) - dx), 0, null); + } + + g2d.setColor(Color.white); + g2d.setFont(g2d.getFont().deriveFont(22f)); + String text = "Querying the cloud, please hold on..."; + FontMetrics metrics = g.getFontMetrics(g2d.getFont()); + Rectangle rect = new Rectangle(getSize()); + int x = (rect.width - metrics.stringWidth(text)) / 2; + int y = ((rect.height - metrics.getHeight()) / 2) + metrics.getAscent(); + g.drawString(text, x, y); + }; + + @Override + public void mouseClicked(final MouseEvent pArg0) {} + + @Override + public void mouseEntered(final MouseEvent pArg0) {} + + @Override + public void mouseExited(final MouseEvent pArg0) {} + + @Override + public void mousePressed(final MouseEvent pArg0) {} + + @Override + public void mouseReleased(final MouseEvent pArg0) {} + + @Override + public void keyPressed(KeyEvent e) {} + + @Override + public void keyReleased(KeyEvent e) {} + + @Override + public void keyTyped(KeyEvent e) {} +}