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;
}
}