/* Copyright (c) 2010 The Regents of the University of California. All rights reserved. Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose, provided that the above copyright notice and the following two paragraphs appear in all copies of this software. IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.. */ package org.clothocore.widget.dashboard2.gui; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseWheelEvent; import java.awt.event.MouseWheelListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.KeyStroke; import net.iharder.dnd.FileDrop; import org.clothocore.api.core.Collator; import org.clothocore.api.core.Collector; import org.clothocore.api.core.wrapper.ToolWrapper; import org.clothocore.util.misc.BareBonesBrowserLaunch; import org.clothocore.util.buttons.GlassButton; import org.clothocore.util.basic.ImageSource; import org.clothocore.util.buttons.TransparentButton; import org.openide.util.ImageUtilities; /** * * @author J. Christopher Anderson */ public class ButtonPanel extends JPanel { public ButtonPanel(Application app) { _app = app; //Get the number of panels calculateNumPanels(); initcomponents(); connectListen = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { setConnected(); } }; Collector.logConnectionListener(connectListen); } private void initcomponents() { setLayout(null); JMenuItem listener = new JMenuItem(); listener.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK)); listener.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { connectActionPerformed(null); } }); _app.getRootPane().add(listener); listener = new JMenuItem(); listener.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U, InputEvent.CTRL_MASK)); listener.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { Collector.selectCurrentUser(); } }); _app.getRootPane().add(listener); listener = new JMenuItem(); listener.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK)); listener.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { helpActionPerformed(); } }); _app.getRootPane().add(listener); listener = new JMenuItem(); listener.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0)); listener.addActionListener(new java.awt.event.ActionListener() { @Override public void actionPerformed(java.awt.event.ActionEvent evt) { helpActionPerformed(); } }); _app.getRootPane().add(listener); //Add shutdown listener _app.addWindowListener( new WindowAdapter() { @Override public void windowClosed( WindowEvent e ) { Collector.shutDown(); } } ); //Load left and right arrows ImageIcon leftArrow = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/leftArrow.png", false ); ImageIcon rightArrow = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/rightArrow.png", false ); //Load the buttons lock = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/lock.png", false ); unlock = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/unlock.png", false ); ImageIcon minimize = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/minimize.png", false ); ImageIcon close = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/close.png", false ); ImageIcon expand = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/Obutton.png", false ); popUpInfo = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/infoPop.png", false ); //Load the loading button ImageIcon loadingImg = new ImageIcon("plugins/Widgets/dashboard2/images/loading.gif"); //Load the blinking green connected button connected = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/dot.gif", false ); disconnected = ImageUtilities.loadImageIcon( "org/clothocore/widget/dashboard2/images/reddot.png", false ); //Put in a draggerHeader button draggerHeader = new GlassButton(""); draggerHeader.setBounds(0,0,115, 13); draggerHeader.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { @Override public void mouseDragged(java.awt.event.MouseEvent evt) { _app.draggerHeaderDragged(evt); } @Override public void mouseMoved(java.awt.event.MouseEvent evt) { _app.draggerHeaderMoved(evt); } }); add(draggerHeader); draggerHeader.setVisible(false); //Put in a lock/unlock button lockButton = new TransparentButton(unlock); lockButton.setLocation(114,1); lockButton.setToolTipText("Unlock"); lockButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { unlockButtonClicked(evt);}}); add(lockButton); //Put in a expand button TransparentButton expandButton = new TransparentButton(expand); expandButton.setLocation(139,1); expandButton.setToolTipText("Enlarge/Shrink Buttons"); expandButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { expandButtonClicked(evt);}}); add(expandButton); //Put in a minimize button TransparentButton minimizeButton = new TransparentButton(minimize); minimizeButton.setLocation(162,1); minimizeButton.setToolTipText("Minimize"); minimizeButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { minimizeButtonClicked(evt);}}); add(minimizeButton); //Put in a close button TransparentButton closeButton = new TransparentButton(close); closeButton.setLocation(185,1); closeButton.setToolTipText("Close"); closeButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { closeButtonClicked(evt);}}); add(closeButton); //Put in a clotho button TransparentButton clothoButton = new TransparentButton(ImageSource.getClothoLogoIcon(38, true)); clothoButton.setExitAlpha(0.28f); clothoButton.setEnterAlpha(0.4f); clothoButton.setLocation(13,8); clothoButton.setToolTipText("Connect to database"); clothoButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { connectActionPerformed(evt);}}); add(clothoButton); //Put in a manage button GlassButton manageButton = new GlassButton(""); manageButton.setBounds(118,21,90, 18); manageButton.setToolTipText("Manage plugins"); manageButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { manageButtonClicked(evt);}}); add(manageButton); //Put in a left arrow button leftButton = new TransparentButton(leftArrow); leftButton.setLocation(22,255); leftButton.setExitAlpha(0.7f); leftButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { leftButtonClicked(evt);}}); add(leftButton); //Put in a right arrow button rightButton = new TransparentButton(rightArrow); rightButton.setLocation(150,255); rightButton.setExitAlpha(0.7f); rightButton.addMouseListener(new java.awt.event.MouseAdapter() { @Override public void mouseClicked(java.awt.event.MouseEvent evt) { rightButtonClicked(evt);}}); add(rightButton); setLeftAndRightButtons(); //Listen for leftward and rightward swipes addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { private long[] times = new long[8]; private Point startPos; private long lastTimeSwiped = System.currentTimeMillis(); @Override public void mouseDragged(java.awt.event.MouseEvent evt) { long startTime = System.currentTimeMillis(); if(times[0] == 0) { times[0] = startTime; startPos = evt.getPoint(); } else if(times[1] == 0) { times[1] = startTime; } else if(times[2] == 0) { times[2] = startTime; } else if(times[3] == 0) { times[3] = startTime; } else if(times[4] == 0) { times[4] = startTime; }else if(times[5] == 0) { times[5] = startTime; } else if(times[6] == 0) { times[6] = startTime; } else if(times[7] == 0) { times[7] = startTime; } else { //If it's been a long time since a contiguous dragging event, quit //Sees if time elapsed during the 8 swipes is too slow if(startTime - times[0] > 800) { } //Otherwise, see if it was a leftward or rightward swipe else { Point endPos = evt.getPoint(); int xdeflection = endPos.x - startPos.x; int ydeflection = endPos.y - startPos.y; //If it was a leftward or rightward swipe, keep going if(Math.abs(ydeflection) < Math.abs(xdeflection)) { if(startTime - lastTimeSwiped > 900) { //Determine if leftward or rightward, call left and right events if(xdeflection < Math.abs(xdeflection) ) { System.out.println("leftward swipe done"); if(leftButton.isVisible()) { leftButtonClicked(null); } } else { System.out.println("rightward swipe done"); if(rightButton.isVisible()) { rightButtonClicked(null); } lastTimeSwiped = System.currentTimeMillis(); } } } } //Clear the times array for(int i=0; i<8; i++) { times[i] = 0; } } } }); //Put in the connected button connectedButton = new TransparentButton(disconnected); connectedButton.setLocation(100,255); connectedButton.setExitAlpha(0.3f); connectedButton.setEnterAlpha(0.3f); connectedButton.setToolTipText("F1 for Help"); add(connectedButton); //Put in the plugin fileDrop new FileDrop( this, new FileDrop.Listener() { @Override public void filesDropped( java.io.File[] files ) { pluginDropped( files ); } } ); //Put in the wheel listener this.addMouseWheelListener(new MouseWheelListener() { @Override public void mouseWheelMoved(MouseWheelEvent e) { int rotation = e.getWheelRotation(); if(rotation<0) { leftButtonClicked(null); } else { rightButtonClicked(null); } } }); //Put in searchbar searchbar = new SuperSearch(_app); searchbar.setBounds(5,282,205,21); add(searchbar); } private void connectActionPerformed(java.awt.event.MouseEvent evt) { _app.blurrer.setBlurring(true,"Connecting..."); new Thread( new Runnable() { @Override public void run() { Collector.connectToDefault(); _app.blurrer.setBlurring(false,"Connecting..."); } } ).start(); } /** * Called when a plugin gets dropped, it calls on the plugin loader * * @param files */ private void pluginDropped( final File[] files ) { final ArrayList<File> fileList = Collator.unpackInstall(files); if(fileList != null) { System.out.println( "****You dropped " + files[0].getName() ); _app.blurrer.setBlurring(true, "Installing plugin..."); new Thread() { //@Override public void run() { List<File> installList = Collator.areInstallable(fileList); if (!installList.isEmpty()) { Collator.installPlugins(installList); } _app.blurrer.setBlurring(false, "Installing plugin..."); //Collator.refreshDash(); } }.start(); //Collator.refreshDash(); } } protected void unlockButtonClicked(java.awt.event.MouseEvent evt) { //Put the button allowing for the window to be dragged around draggerHeader.setVisible(isLocked); //Toggle the icon if(isLocked) { lockButton.changeIcon(lock); lockButton.setToolTipText("Lock"); } else { lockButton.changeIcon(unlock); lockButton.setToolTipText("Unlock"); } //Toggle whether the window is locked on top or not _app.setAlwaysOnTop(!isLocked); isLocked = !isLocked; } protected void expandButtonClicked(java.awt.event.MouseEvent evt) { int numcol = ItemPanel.numCol; int newcol = 3; if(numcol==3) { newcol = 4; } else if(numcol==4) { newcol = 5; } else if(numcol==5) { newcol = 3; } calculateNumPanels(); _app.toolpanel.changeNumCols(newcol); } protected void minimizeButtonClicked(java.awt.event.MouseEvent evt) { _app.setState(JFrame.ICONIFIED); } protected void closeButtonClicked(java.awt.event.MouseEvent evt) { _app.dispose(); } protected void manageButtonClicked(java.awt.event.MouseEvent evt) { //If plugin manager is installed, launch it try { Collator.launchPluginManager(); } catch(java.lang.NullPointerException e) { System.out.println("plugin manager was not available"); } } void rightButtonClicked(java.awt.event.MouseEvent evt) { if(_app.buttonPanel.currPanel < numToolPanels - 1) { _app.buttonPanel.currPanel ++; _app.buttonPanel.setLeftAndRightButtons(); _app.toolpanel.initcomponents(); _app.toolpanel.validate(); _app.validate(); } } void leftButtonClicked(java.awt.event.MouseEvent evt) { if(_app.buttonPanel.currPanel > 0) { _app.buttonPanel.currPanel --; _app.buttonPanel.setLeftAndRightButtons(); _app.toolpanel.initcomponents(); _app.toolpanel.validate(); _app.validate(); } } void setLeftAndRightButtons() { if ( numToolPanels == 1 ) { rightButton.setVisible( false ); leftButton.setVisible( false ); return; } if ( currPanel == 0 ) { leftButton.setVisible( false ); } else { leftButton.setVisible( true ); } if ( currPanel == numToolPanels - 1 ) { rightButton.setVisible( false ); } else { rightButton.setVisible( true ); } } private void helpActionPerformed() { String url = "http://wiki.bu.edu/ece-clotho/index.php/Dashboard"; BareBonesBrowserLaunch.openURL(url); } public void setConnected() { if ( Collector.isConnected() ) { connectedButton.changeIcon( connected ); } else { connectedButton.changeIcon( disconnected ); } } void calculateNumPanels() { ArrayList<ToolWrapper> _wraps = Collator.getAllTools(); numWraps = (double) _wraps.size(); double dcount = Math.ceil( numWraps / ItemPanel.getNumPerToolPanel() ); numToolPanels = (int) dcount; } @Override public boolean isOpaque() { return false; } /*----------------- variables -----------------*/ private Application _app; private double numWraps; private static ImageIcon bkgImage; private static ImageIcon unlock; private static ImageIcon lock; private static ImageIcon connected; private static ImageIcon disconnected; private static ImageIcon popUpInfo; private GlassButton draggerHeader; private TransparentButton lockButton; private TransparentButton leftButton; private TransparentButton rightButton; private TransparentButton connectedButton; private TransparentButton popUpButton; private boolean isLocked=true; private Point mousePointer; int numToolPanels; int currPanel = 0; private ActionListener connectListen; //For update checking private static boolean _checkingUpdates=false; private static String _updateURL=""; SuperSearch searchbar ; }