// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/omGraphics/EditableOMAbstractLine.java,v $
// $RCSfile: EditableOMAbstractLine.java,v $
// $Revision: 1.1.2.2 $
// $Date: 2005/08/10 22:45:13 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.omGraphics;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JMenu;
import javax.swing.JRadioButtonMenuItem;
import com.bbn.openmap.Environment;
import com.bbn.openmap.I18n;
/**
* The EditableOMAbstractLine encompasses an OMAbstractLine, providing
* a mechanism for adding an arrowhead menu in the line editor menu.
*/
public abstract class EditableOMAbstractLine extends EditableOMGraphic {
protected JMenu arrowheadMenu = null;
protected I18n i18n = Environment.getI18n();
public Component getGUI(GraphicAttributes graphicAttributes) {
if (graphicAttributes != null) {
JMenu ahm = getArrowHeadMenu();
graphicAttributes.setLineMenuAdditions(new JMenu[] { ahm });
return graphicAttributes.getGUI();
}
return null;
}
public JMenu getArrowHeadMenu() {
if (arrowheadMenu == null) {
arrowheadMenu = new JMenu(i18n.get(EditableOMAbstractLine.class, "Arrows", "Arrows"));
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent ae) {
String command = ae.getActionCommand();
try {
int what = Integer.parseInt(command);
if (what < 0) {
((OMAbstractLine) getGraphic()).addArrowHead(false);
} else {
((OMAbstractLine) getGraphic()).addArrowHead(what);
}
generate(getProjection());
repaint();
} catch (NumberFormatException e) {
}
}
};
boolean doArrowHead = ((OMAbstractLine) getGraphic()).hasArrowHead();
int currentDirection = OMArrowHead.ARROWHEAD_DIRECTION_FORWARD;
if (doArrowHead) {
currentDirection = ((OMAbstractLine) getGraphic()).getArrowHead().getArrowDirectionType();
}
int descDir = -1; // this description direction
ButtonGroup group = new ButtonGroup();
ImageIcon ii = createArrowIcon(new BasicStroke(1), 50, 20, descDir);
JRadioButtonMenuItem button = new JRadioButtonMenuItem(ii, !doArrowHead);
button.setActionCommand(String.valueOf(descDir));
group.add(button);
button.addActionListener(listener);
arrowheadMenu.add(button);
for (descDir = OMArrowHead.ARROWHEAD_DIRECTION_FORWARD; descDir <= OMArrowHead.ARROWHEAD_DIRECTION_BOTH; descDir++) {
ii = createArrowIcon(new BasicStroke(1), 50, 20, descDir);
button = new JRadioButtonMenuItem(ii, doArrowHead
&& currentDirection == descDir);
button.setActionCommand(String.valueOf(descDir));
group.add(button);
button.addActionListener(listener);
arrowheadMenu.add(button);
}
}
return arrowheadMenu;
}
/**
* Given some arrowhead parameters, create an ImageIcon that shows
* it.
*
* @param stroke the BasicStroke to draw on the Icon.
* @param width the width of the icon.
* @param height the height of the icon.
* @param arrowHeadType -1 for no arrowhead, use the OMArrowHead
* directions for other versions.
*/
public ImageIcon createArrowIcon(BasicStroke stroke, int width, int height,
int arrowHeadType) {
BufferedImage bigImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g = (Graphics2D) bigImage.getGraphics();
int middleY = height / 2;
g.setBackground(OMColor.clear);
g.setPaint(OMColor.clear);
g.fillRect(0, 0, width, height);
g.setPaint(Color.black);
g.setStroke(stroke);
g.drawLine(0, middleY, width, middleY);
int upTip = (int) ((float) height * .25);
int downTip = (int) ((float) height * .75);
Polygon poly = null;
if (arrowHeadType == OMArrowHead.ARROWHEAD_DIRECTION_FORWARD
|| arrowHeadType == OMArrowHead.ARROWHEAD_DIRECTION_BOTH) {
int rightWingX = (int) ((float) width * .75);
poly = new Polygon(new int[] { width, rightWingX, rightWingX }, new int[] {
middleY, upTip, downTip }, 3);
g.fill(poly);
g.draw(poly); // Seems to help with rendering problem.
}
if (arrowHeadType == OMArrowHead.ARROWHEAD_DIRECTION_BACKWARD
|| arrowHeadType == OMArrowHead.ARROWHEAD_DIRECTION_BOTH) {
int leftWingX = (int) ((float) width * .25);
poly = new Polygon(new int[] { 0, leftWingX, leftWingX }, new int[] {
middleY, upTip, downTip }, 3);
g.fill(poly);
g.draw(poly); // Seems to help with rendering problem.
}
return new ImageIcon(bigImage);
}
}