/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package tufts.vue; import java.awt.Color; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.MouseEvent; import java.util.ArrayList; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; public class ExpandSelectionControl extends JPanel implements ExpandSelectionListener { public static final long serialVersionUID = 1; protected static final boolean DEBUG = false; protected static Icon iconFirstOff = VueResources.getImageIcon("expandselection.first.off"), iconFirstOn = VueResources.getImageIcon("expandselection.first.on"), iconFirstOver = VueResources.getImageIcon("expandselection.first.over"), iconRestOff = VueResources.getImageIcon("expandselection.rest.off"), iconRestOn = VueResources.getImageIcon("expandselection.rest.on"), iconRestOver = VueResources.getImageIcon("expandselection.rest.over"); protected int currentDepth = 0; protected JLabel labels[] = {new JLabel(iconFirstOff), new JLabel(iconRestOff), new JLabel(iconRestOff), new JLabel(iconRestOff), new JLabel(iconRestOff), new JLabel(iconRestOff)}; public ExpandSelectionControl() { GridBagConstraints gbc = new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0, GridBagConstraints.EAST, GridBagConstraints.NONE, new Insets(0, 0, 0, 0), 0, 0); setLayout(new GridBagLayout()); for (int index = 0; index < 6; index++) { labels[index].setFont(tufts.vue.gui.GUI.LabelFace); labels[index].putClientProperty("JComponent.sizeVariant", "small"); labels[index].setMinimumSize(labels[index].getPreferredSize()); labels[index].setToolTipText(VueResources.getString("interactionTools.depth.toolTip")); labels[index].addMouseListener(new ExpandSelectionMouseListener()); add(labels[index], gbc); gbc.gridx++; if (DEBUG) { labels[index].setBackground(Color.YELLOW); labels[index].setOpaque(true); } } if (DEBUG) { setBackground(Color.MAGENTA); setOpaque(true); } } public void redraw() { labels[0].setIcon(currentDepth > 0 ? iconFirstOn : iconFirstOff); for (int index = 1; index < 6; index++) { labels[index].setIcon(index <= currentDepth ? iconRestOn : iconRestOff); } } /* ExpandSelectionListener method */ public void depthChanged(ExpandSelectionEvent event) { currentDepth = event.getDepth(); redraw(); } public void addExpandSelectionListener(ExpandSelectionListener tel) { listenerList.add(ExpandSelectionListener.class, tel); } public void removeExpandSelectionListener(ExpandSelectionListener tel) { listenerList.remove(ExpandSelectionListener.class, tel); } public ExpandSelectionListener[] getExpandSelectionListeners() { return (ExpandSelectionListener[])listenerList.getListeners( ExpandSelectionListener.class); } protected void fireDepthChanged(int depth) { ExpandSelectionListener[] listeners = getExpandSelectionListeners(); ExpandSelectionEvent event = new ExpandSelectionEvent(this, depth); for (ExpandSelectionListener listener : listeners) { listener.depthChanged(event); } } protected class ExpandSelectionMouseListener extends MouseAdapter { ExpandSelectionMouseListener() {} public void mousePressed(MouseEvent event) { JLabel source = (JLabel)event.getSource(); int index; for (index = 0; index < 6; index++) { if (labels[index] == source) { break; } } currentDepth = index; redraw(); fireDepthChanged(currentDepth); } public void mouseEntered(MouseEvent event) { JLabel source = (JLabel)event.getSource(); Icon icon = iconRestOver; if ((labels[0] != source || currentDepth > 0)) { labels[0].setIcon(iconFirstOver); } if (labels[0] == source) { icon = iconRestOff; } for (int index = 1; index < 6; index++) { labels[index].setIcon(icon); if (labels[index] == source) { icon = iconRestOff; } } } public void mouseExited(MouseEvent event) { redraw(); } } }