package uk.ac.lkl.migen.mockup.shapebuilder.ui;
import java.awt.*;
import java.util.*;
import javax.swing.*;
import org.apache.log4j.Logger;
import uk.ac.lkl.migen.mockup.shapebuilder.model.*;
import uk.ac.lkl.migen.mockup.shapebuilder.model.shape.*;
import uk.ac.lkl.migen.mockup.shapebuilder.ui.drag.PlaceHolder;
import uk.ac.lkl.migen.mockup.shapebuilder.ui.drag.event.*;
public class ShapeManifest extends JPanel {
Logger logger = Logger.getLogger(ShapeManifest.class);
private Expressed expressed;
@SuppressWarnings("unused")
// todo: use this to detect duplicates?
private HashMap<Expression, JLabel> labelMap;
// hack so that when read in, can set expression panels for each placeholder
private HashMap<String, PlaceHolder<ExpressionPanel>> placeHolderMap = new HashMap<String, PlaceHolder<ExpressionPanel>>();
private class ManifestPlaceHolderListener implements
PlaceHolderListener<ExpressionPanel> {
private PlaceHolder<ExpressionPanel> placeholder;
private String expressionHandle;
public ManifestPlaceHolderListener(
PlaceHolder<ExpressionPanel> placeholder,
String expressionHandle) {
this.placeholder = placeholder;
this.expressionHandle = expressionHandle;
}
public void placeFilled(PlaceHolderEvent<ExpressionPanel> e) {
ExpressionPanel expressionPanel = placeholder.getNestedComponent();
Expression expression = expressionPanel.getExpression();
logPlaceFilled(expression, e.getNestedComponent());
expressed.setExpression(expressionHandle, expression);
}
private void logPlaceFilled(Expression expression, ExpressionPanel panel) {
if (expressed instanceof ExpressedShape) {
ExpressedShape shape = (ExpressedShape) expressed;
logger.info("Expression ID:" + expression.getId() + " (name: "
+ expression.getName() + "," + " value: "
+ expression.getValue() + ")" + " in panel ID:"
+ panel.getId() + " is attached to shape ID:"
+ shape.getId() + ".");
} else if (expressed instanceof ShapeGroup) {
ShapeGroup group = (ShapeGroup) expressed;
ExpressedShape shape = group.getRepresentativeShape();
logger.info("Expression ID:" + expression.getId() + " (name: "
+ expression.getName() + "," + " value: "
+ expression.getValue() + ")" + " in panel ID:"
+ panel.getId()
+ " is attached to all the shapes related to"
+ " shape ID:" + shape.getId() + ".");
}
}
public void placeEmptied(PlaceHolderEvent<ExpressionPanel> e) {
expressed.setExpression(expressionHandle, null);
}
public void placeVacated(PlaceHolderEvent<ExpressionPanel> e) {
}
}
public ShapeManifest(ShapePlotter shapePlotter, Expressed expressed) {
this.expressed = expressed;
labelMap = new HashMap<Expression, JLabel>();
//int numExpressions = expressed.getNumParameters();
setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.BOTH;
c.insets = new Insets(4, 4, 4, 4);
// create placeholders first since swap buttons (when they were tried
// out) needed access to two
// consecutive instances
ArrayList<PlaceHolder<ExpressionPanel>> placeHolders = new ArrayList<PlaceHolder<ExpressionPanel>>();
Collection<String> namedExpressions = expressed.getParameterNames();
for (String namedExpression : namedExpressions) {
Expression expression = expressed
.getParameterExpression(namedExpression);
ExpressionPanel expressionPanel = expression == null ? null
: new ExpressionPanel(expression, shapePlotter);
PlaceHolder<ExpressionPanel> placeHolder = new PlaceHolder<ExpressionPanel>(
expressionPanel, ExpressionPanel.class);
placeHolders.add(placeHolder);
}
Collection<String> names = expressed.getParameterNames();
int i = 0;
for (String name : names) {
JLabel label = new JLabel(name);
c.gridx = 0;
c.gridy = i;
c.gridheight = 1;
c.weightx = 0.0f;
add(label, c);
PlaceHolder<ExpressionPanel> placeHolder = placeHolders.get(i);
placeHolder.addPlaceHolderListener(new ManifestPlaceHolderListener(
placeHolder, name));
placeHolder.setOverwriting(true);
placeHolderMap.put(name, placeHolder);
c.gridx = 1;
c.gridy = i;
c.gridheight = 1;
c.weightx = 1.0f;
add(placeHolder, c);
// c.gridx = 0;
// c.gridy = i * 2 + 1;
// c.gridheight = 1;
// c.weightx = 0.0f;
// ExpressionPanelValueComponent valueComponent = new
// BasicExpressionPanelValueComponent(true);
// ExpressionEvaluator evaluator = new ExpressionEvaluator(
// placeHolder, valueComponent);
// add(evaluator, c);
// 'swap' button
// if (i < numExpressions - 1) {
// c.gridx = 2;
// c.gridy = i * 2;
// c.gridheight = 4;
// c.fill = GridBagConstraints.HORIZONTAL;
// c.weightx = 0.0f;
// c.anchor = GridBagConstraints.CENTER;
// PlaceHolder<ExpressionPanel> nextPlaceHolder = placeHolders.get(i
// + 1);
// SwapButton swapButton = new SwapButton(placeHolder,
// nextPlaceHolder);
// add(swapButton, c);
// }
i++;
}
setBorder(BorderFactory.createEtchedBorder());
}
// hack so that can set these with appropriate expression panels when read
// back in
public PlaceHolder<ExpressionPanel> getPlaceHolder(String name) {
return placeHolderMap.get(name);
}
}
|