/* * Copyright (c) 2014 tabletoptool.com team. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * rptools.com team - initial implementation * tabletoptool.com team - further development */ package com.t3.client.ui; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.io.IOException; import javax.swing.JComponent; import com.t3.client.swing.Animatable; import com.t3.client.swing.AnimationManager; import com.t3.clientserver.connection.ActivityListener; import com.t3.image.ImageUtil; import com.t3.language.I18N; /** * @author trevor */ public class ActivityMonitorPanel extends JComponent implements ActivityListener, Animatable { private static final int PADDING = 5; private static final int ON_DELAY = 100; private boolean receiving; private boolean transmitting; private boolean receiveComplete; private boolean transmitComplete; private static Image transmitOn; private static Image transmitOff; private static Image receiveOn; private static Image receiveOff; private static long receiveStart; private static long transmitStart; private static Dimension prefSize; static { try { transmitOn = ImageUtil.getImage("com/t3/client/image/transmitOn.png"); //$NON-NLS-1$ transmitOff = ImageUtil.getImage("com/t3/client/image/activityOff.png"); //$NON-NLS-1$ receiveOn = ImageUtil.getImage("com/t3/client/image/receiveOn.png"); //$NON-NLS-1$ receiveOff = ImageUtil.getImage("com/t3/client/image/activityOff.png"); //$NON-NLS-1$ int width = Math.max(transmitOn.getWidth(null), transmitOff.getWidth(null)) + Math.max(receiveOn.getWidth(null), receiveOff.getWidth(null)); int height = Math.max(transmitOn.getHeight(null), transmitOff.getHeight(null)) + Math.max(receiveOn.getHeight(null), receiveOff.getHeight(null)); prefSize = new Dimension(width + (PADDING * 2) + 2, height); } catch (IOException ioe) { // TODO: handle this better ioe.printStackTrace(); } } public ActivityMonitorPanel() { setToolTipText(I18N.getString("ActivityMonitorPanel.colorDefinition")); //$NON-NLS-1$ } /* * (non-Javadoc) * * @see javax.swing.JComponent#paintComponent(java.awt.Graphics) */ @Override protected void paintComponent(Graphics g) { Image receiveImg = receiving ? receiveOn : receiveOff; Image transmitImg = transmitting ? transmitOn : transmitOff; g.drawImage(receiveImg, PADDING, (getSize().height - receiveImg.getHeight(null)) / 2, this); g.drawImage(transmitImg, getSize().width - transmitImg.getWidth(null) - PADDING, (getSize().height - transmitImg.getHeight(null)) / 2, this); } /* * (non-Javadoc) * * @see javax.swing.JComponent#getPreferredSize() */ @Override public Dimension getPreferredSize() { return getMinimumSize(); } /* * (non-Javadoc) * * @see javax.swing.JComponent#getMinimumSize() */ @Override public Dimension getMinimumSize() { return prefSize; } //// // ANIMATABLE @Override public void animate() { long now = System.currentTimeMillis(); boolean turnOff = false; if (transmitting && transmitComplete && now > transmitStart + ON_DELAY) { transmitting = false; turnOff = true; } if (receiving && receiveComplete && now > receiveStart + ON_DELAY) { turnOff = true; receiving = false; } if (!transmitting && !receiving && turnOff) { AnimationManager.removeAnimatable(this); repaint(); } } //// // ACTIVITY LISTENER /* * (non-Javadoc) * * @see com.t3.clientserver.ActivityListener#notify(com.t3.clientserver.ActivityListener.Direction, * com.t3.clientserver.ActivityListener.State, int, int) */ @Override public void notify(Direction direction, State state, int total, int current) { switch (direction) { case Inbound: switch (state) { case Start: { receiving = true; receiveComplete = false; receiveStart = System.currentTimeMillis(); AnimationManager.addAnimatable(this); repaint(); break; } case Complete: { receiveComplete = true; if (System.currentTimeMillis() > receiveStart + ON_DELAY) { receiving = false; } repaint(); break; } default: return; } break; case Outbound: switch (state) { case Start: { transmitting = true; transmitComplete = false; transmitStart = System.currentTimeMillis(); AnimationManager.addAnimatable(this); repaint(); break; } case Complete: { transmitComplete = true; if (System.currentTimeMillis() > transmitStart + ON_DELAY) { transmitting = false; } repaint(); break; } default: return; } break; } } }