/*
* 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 tufts.vue.gui.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.beans.*;
import javax.swing.*;
/**
* A property editor panel for LWLink's.
*
* @version $Revision: 1.12 $ / $Date: 2010-02-03 19:17:41 $ / $Author: mike $
*
*/
public class ArrowToolPanel extends ToolPanel
{
int headArrowState = LWLink.ARROW_NONE;
int tailArrowState = LWLink.ARROW_TAIL;
/**
* This isn't here for good but until we do something else, this is here so we
* don't loose the functionality with the loss of the contextual menu.
* @author mkorcy01
*
*/
private static class ArrowStyleButton extends JComboBox
{
Icon[] imageIcons;
public ArrowStyleButton(Object[] a, boolean isHead) {
super(a);
setFont(tufts.vue.VueConstants.FONT_SMALL); // does this have any effect? maybe on Windows?
// set the size of the icon that displays the current value:
//setButtonIcon(new LineIcon(ButtonWidth-18, 3)); // height really only needs to be 1 pixel
ComboBoxRenderer renderer= new ComboBoxRenderer();
setRenderer(renderer);
imageIcons = new Icon[1];
if (isHead)
imageIcons[0] = new GUI.ProxyEnabledIcon((Icon) VueResources.getIcon("leftarrow.raw"), this);
else
imageIcons[0] = new GUI.ProxyEnabledIcon((Icon) VueResources.getIcon("rightarrow.raw"), this);
//imageIcons[2] = (ImageIcon) VueResources.getIcon("botharrow.raw");
this.setMaximumRowCount(10);
}
//class ComboBoxRenderer extends JLabel implements ListCellRenderer {
class ComboBoxRenderer extends DefaultListCellRenderer {
public ComboBoxRenderer() {
setHorizontalAlignment(CENTER);
setVerticalAlignment(CENTER);
setBorder(BorderFactory.createEmptyBorder(3,1, 3,1));
}
public Component getListCellRendererComponent(
JList list,
Object value,
int index,
boolean isSelected,
boolean cellHasFocus) {
Color bg = GUI.getTextHighlightColor();
if (isSelected) {
setBackground(bg);
setForeground(Color.black);
} else {
setBackground(Color.white);
setForeground(list.getForeground());
}
int val = ((Integer)value).intValue();
if (val ==0)
{
setText(VueResources.getString("arrowtoolpanel.none"));
setIcon(null);
}
else
{ val--;
setText("");
setIcon(imageIcons[val]);
}
//System.out.println(this.getPreferredSize());
return this;
}
// protected Icon makeIcon(LWComponent.StrokeStyle style) {
// LineIcon li = new LineIcon(24, 3);
// li.setStroke(style.makeStroke(1));
// return li;
// }
}
}
public boolean isPreferredType(Object o) {
return o instanceof LWLink;
}
protected void buildBox()
{
// final AbstractButton mArrowStartButton = new VueButton.Toggle("link.button.arrow.start");
// final AbstractButton mArrowEndButton = new VueButton.Toggle("link.button.arrow.end");
//setting up tooltips for link specific buttons.
//mArrowStartButton.setToolTipText(VueResources.getString("linkToolPanel.startArrow.toolTip"));
//mArrowEndButton.setToolTipText(VueResources.getString("linkToolPanel.endArrow.toolTip"));
final Action[] LinkTypeActions = new Action[] {
Actions.LinkMakeStraight,
Actions.LinkMakeQuadCurved,
Actions.LinkMakeCubicCurved
};
Integer[] i = new Integer[2];
i[0]= new Integer(0);
i[1]= new Integer(1);
final ArrowStyleButton arrowHeadCombo = new ArrowStyleButton(i,true);
final ArrowStyleButton arrowTailCombo = new ArrowStyleButton(i,false);
//AbstractButton linkTypeMenu = new VuePopupMenu(LWKey.LinkCurves, LinkTypeActions);
// linkTypeMenu.setToolTipText("Link Style");
//linkTypeMenu.addPropertyChangeListener(this);
/*
final LWPropertyHandler arrowHeadPropertyHandler =
new LWPropertyHandler<Integer>(LWKey.LinkArrows, ArrowToolPanel.this) {
public Integer produceValue() {
if (arrowHeadCombo.getSelectedIndex() == 0)
headArrowState =LWLink.ARROW_NONE;
else if (arrowHeadCombo.getSelectedIndex() ==1)
headArrowState = LWLink.ARROW_HEAD;
// System.out.println(headArrowState + tailArrowState);
return headArrowState + tailArrowState;
}
public void displayValue(Integer i) {
//int arrowState = i;
}
};
arrowHeadCombo.addActionListener(arrowHeadPropertyHandler);
final LWPropertyHandler arrowTailPropertyHandler =
new LWPropertyHandler<Integer>(LWKey.LinkArrows, ArrowToolPanel.this) {
public Integer produceValue() {
if (arrowTailCombo.getSelectedIndex() == 0)
tailArrowState =LWLink.ARROW_NONE;
else if (arrowTailCombo.getSelectedIndex() ==1)
tailArrowState = LWLink.ARROW_TAIL;
//System.out.println(headArrowState + tailArrowState);
return headArrowState +tailArrowState;
}
public void displayValue(Integer i) {
// int arrowState = i;
}
};
arrowTailCombo.addActionListener(arrowTailPropertyHandler);
*/
// We can't just rely on the each handler hanging free without knowing about it.
// It works when the editor activates -- we can find which tool panel it's in
// (up the AWT chain), and could find the right default state to work with
// (node/link/text, etc). But when a selection happens and the tool panel needs
// to LOAD UP all these property editors, this is the only way we can know about
// it... Otherwise, we'd have to make every LWPropertyHandler a selection
// listener in it's own right (tho this wouldn't be instance, given that every
// single action in the system is also a selection listener!)
//super.addEditor(arrowPropertyHandler);
//mArrowStartButton.addActionListener(arrowPropertyHandler);
//mArrowEndButton.addActionListener(arrowPropertyHandler);
//mArrowStartButton.addItemListener(arrowPropertyHandler);
//mArrowEndButton.addItemListener(arrowPropertyHandler);
//mArrowStartButton.addItemListener(arrowPropertyHandler);
//mArrowEndButton.addItemListener(arrowPropertyHandler);
GridBagConstraints gbc = new GridBagConstraints();
//addComponent(linkTypeMenu);
mBox.setLayout(new GridBagLayout());
gbc.insets=new Insets(1,3,1,1);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth=1;
gbc.fill = GridBagConstraints.VERTICAL; // the label never grows
gbc.anchor = GridBagConstraints.EAST;
final JLabel headLabel = new JLabel(VueResources.getString("arrowtoolpanel.start"));
headLabel.setLabelFor(arrowHeadCombo);
headLabel.setForeground(new Color(51,51,51));
headLabel.setFont(tufts.vue.VueConstants.SmallFont);
mBox.add(headLabel,gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth=1;
gbc.fill = GridBagConstraints.VERTICAL; // the label never grows
gbc.anchor = GridBagConstraints.EAST;
final JLabel tailLabel = new JLabel(VueResources.getString("arrowtoolpanel.end"));
tailLabel.setLabelFor(arrowTailCombo);
tailLabel.setForeground(new Color(51,51,51));
tailLabel.setFont(tufts.vue.VueConstants.SmallFont);
mBox.add(tailLabel,gbc);
gbc.gridx = 1;
gbc.gridy = 0;
//gbc.insets = new Insets(1,1,1,1);
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.insets = new Insets(1,1,1,3);
gbc.fill = GridBagConstraints.BOTH; // the label never grows
gbc.anchor = GridBagConstraints.WEST;
mBox.add(arrowHeadCombo,gbc);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.insets = new Insets(1,1,1,3);
gbc.fill = GridBagConstraints.BOTH; // the label never grows
gbc.anchor = GridBagConstraints.WEST;
arrowTailCombo.setSelectedIndex(1);
mBox.add(arrowTailCombo,gbc);
final LWPropertyHandler arrowPropertyHandler =
new LWPropertyHandler<Integer>(LWKey.LinkArrows, arrowHeadCombo, arrowTailCombo) {
public Integer produceValue() {
int arrowState = 0;
if (arrowHeadCombo.getSelectedIndex() > 0)
arrowState |= LWLink.ARROW_HEAD;
if (arrowTailCombo.getSelectedIndex() > 0)
arrowState |= LWLink.ARROW_TAIL;
return arrowState;
}
public void displayValue(Integer arrowState) {
if ((arrowState & LWLink.ARROW_HEAD) == 0)
arrowHeadCombo.setSelectedIndex(0);
else
arrowHeadCombo.setSelectedIndex(1);
if ((arrowState & LWLink.ARROW_TAIL) == 0)
arrowTailCombo.setSelectedIndex(0);
else
arrowTailCombo.setSelectedIndex(1);
}
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
headLabel.setEnabled(enabled);
tailLabel.setEnabled(enabled);
}
};
arrowHeadCombo.addActionListener(arrowPropertyHandler);
arrowTailCombo.addActionListener(arrowPropertyHandler);
}
//protected VueBeanState getDefaultState() { return VueBeans.getState(LWLink.setDefaults(new LWLink())); }
protected LWComponent createDefaultStyle() {
LWLink l = new LWLink();
l.setLabel("defaultLinkStyle");
return LWLink.SetDefaults(l);
}
public static void main(String[] args) {
System.out.println("LinkToolPanel:main");
VUE.init(args);
VueUtil.displayComponent(new LinkToolPanel());
}
}