package com.drawbridge.utils; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.LinkedList; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComponent; import com.drawbridge.Activity; /** * A class to allow people to select carousel position using circles * * @author Alistair Stead * */ public class Selector extends JComponent { private static final long serialVersionUID = -1445599836911520390L; private int mSelected = 0; private final int mSelectorSize; private Long mSelectorChangeTimestamp; private LinkedList<JButton> selectorButtons; /** * @param numberOfSelectors * - how many selectors are needed * @throws Exception */ public Selector(Activity activity, int numberOfSelectors) throws Exception { if (!validateSelectorNumber(numberOfSelectors)) { throw new Exception("Number of selectors is incorrect"); } mSelectorSize = numberOfSelectors; this.setLayout(new BoxLayout(this, BoxLayout.X_AXIS)); // Load all images JButton left = new JButton(); // Add Left Buttons left.setText("< Left"); this.add(left); left.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent me) { if(Activity.getInstance().scrollThread == null || (Activity.getInstance().scrollThread != null && !Activity.getInstance().scrollThread.isAlive())){ int newSelector = Math.max(0, mSelected - 1); logSelectorChange(mSelected, newSelector); mSelected = newSelector; notifyListenersSelectorChange(newSelector); for (int i = 0; i < selectorButtons.size(); i++) { if (i == newSelector) selectorButtons.get(i).setEnabled(false); else selectorButtons.get(i).setEnabled(true); } Selector.this.repaint(); } } }); // Add button for each Segment selectorButtons = new LinkedList<JButton>(); for (int i = 0; i < numberOfSelectors; i++) { JButton segmentButton = new JButton(); final int index = i; segmentButton.setText("" + (i + 1)); segmentButton.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent me) { if(Activity.getInstance().scrollThread == null || (Activity.getInstance().scrollThread != null && !Activity.getInstance().scrollThread.isAlive())){ Selector.this.notifyListenersSelectorChange(index); logSelectorChange(mSelected, index); mSelected = index; for (int i = 0; i < selectorButtons.size(); i++) { if (i == index) selectorButtons.get(i).setEnabled(false); else selectorButtons.get(i).setEnabled(true); } } } }); this.add(segmentButton); selectorButtons.add(segmentButton); } // Add Right Buttons JButton right = new JButton(); right.setText("Right >"); this.add(right); right.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent me) { if(Activity.getInstance().scrollThread == null || (Activity.getInstance().scrollThread != null && !Activity.getInstance().scrollThread.isAlive())){ int newSelector = Math.min(mSelectorSize - 1, mSelected + 1); logSelectorChange(mSelected, newSelector); mSelected = newSelector; notifyListenersSelectorChange(newSelector); for (int i = 0; i < selectorButtons.size(); i++) { if (i == newSelector) selectorButtons.get(i).setEnabled(false); else selectorButtons.get(i).setEnabled(true); } } } }); selectorButtons.get(0).setEnabled(false); mSelectorChangeTimestamp = System.currentTimeMillis(); } public int getSelected(){ return mSelected; } public interface SelectorListener { public void onSelectorChange(int selectorID); } private ArrayList<SelectorListener> selectorListeners = new ArrayList<SelectorListener>(); public void addSelectorListener(SelectorListener selectorListener) { selectorListeners.add(selectorListener); } private void notifyListenersSelectorChange(int index) { for (int i = 0; i < selectorListeners.size(); i++) { selectorListeners.get(i).onSelectorChange(index); } } private boolean validateSelectorNumber(int number) { if (number <= 0) return false; return true; } public void resetTimestamp(){ mSelectorChangeTimestamp = System.currentTimeMillis(); } /** * Check if any selector change is a view change, and log time differences in analytics * * @param mSelected * @param newSelector */ private void logSelectorChange(int oldIndex, int newIndex) { if (oldIndex != newIndex) { long timeNow = System.currentTimeMillis(); long timeDifference = timeNow - mSelectorChangeTimestamp; mSelectorChangeTimestamp = timeNow; AnalyticUtils.recordTimeOnRepresentation(oldIndex, timeDifference); } } public long getTimestamp() { return mSelectorChangeTimestamp; } }