use of org.vcell.model.rbm.RbmObject in project vcell by virtualcell.
the class RulebasedTransformer method parseBngOutput.
private void parseBngOutput(SimulationContext simContext, Set<ReactionRule> fromReactions, BNGOutput bngOutput) {
Model model = simContext.getModel();
Document bngNFSimXMLDocument = bngOutput.getNFSimXMLDocument();
bngRootElement = bngNFSimXMLDocument.getRootElement();
Element modelElement = bngRootElement.getChild("model", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
Element listOfReactionRulesElement = modelElement.getChild("ListOfReactionRules", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
List<Element> reactionRuleChildren = new ArrayList<Element>();
reactionRuleChildren = listOfReactionRulesElement.getChildren("ReactionRule", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (Element reactionRuleElement : reactionRuleChildren) {
ReactionRuleAnalysisReport rar = new ReactionRuleAnalysisReport();
boolean bForward = true;
String rule_id_str = reactionRuleElement.getAttributeValue("id");
ruleElementMap.put(rule_id_str, reactionRuleElement);
String rule_name_str = reactionRuleElement.getAttributeValue("name");
String symmetry_factor_str = reactionRuleElement.getAttributeValue("symmetry_factor");
Double symmetry_factor_double = Double.parseDouble(symmetry_factor_str);
ReactionRule rr = null;
if (rule_name_str.startsWith("_reverse_")) {
bForward = false;
rule_name_str = rule_name_str.substring("_reverse_".length());
rr = model.getRbmModelContainer().getReactionRule(rule_name_str);
RbmKineticLaw rkl = rr.getKineticLaw();
try {
if (symmetry_factor_double != 1.0 && fromReactions.contains(rr)) {
Expression expression = rkl.getLocalParameterValue(RbmKineticLawParameterType.MassActionReverseRate);
expression = Expression.div(expression, new Expression(symmetry_factor_double));
rkl.setLocalParameterValue(RbmKineticLawParameterType.MassActionReverseRate, expression);
}
} catch (ExpressionException | PropertyVetoException exc) {
exc.printStackTrace();
throw new RuntimeException("Unexpected transform exception: " + exc.getMessage());
}
rulesReverseMap.put(rr, rar);
} else {
rr = model.getRbmModelContainer().getReactionRule(rule_name_str);
RbmKineticLaw rkl = rr.getKineticLaw();
try {
if (symmetry_factor_double != 1.0 && fromReactions.contains(rr)) {
Expression expression = rkl.getLocalParameterValue(RbmKineticLawParameterType.MassActionForwardRate);
expression = Expression.div(expression, new Expression(symmetry_factor_double));
rkl.setLocalParameterValue(RbmKineticLawParameterType.MassActionForwardRate, expression);
}
} catch (ExpressionException | PropertyVetoException exc) {
exc.printStackTrace();
throw new RuntimeException("Unexpected transform exception: " + exc.getMessage());
}
rulesForwardMap.put(rr, rar);
}
rar.symmetryFactor = symmetry_factor_double;
System.out.println("rule id=" + rule_id_str + ", name=" + rule_name_str + ", symmetry factor=" + symmetry_factor_str);
keyMap.put(rule_id_str, rr);
Element listOfReactantPatternsElement = reactionRuleElement.getChild("ListOfReactantPatterns", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
List<Element> reactantPatternChildren = new ArrayList<Element>();
reactantPatternChildren = listOfReactantPatternsElement.getChildren("ReactantPattern", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (int i = 0; i < reactantPatternChildren.size(); i++) {
Element reactantPatternElement = reactantPatternChildren.get(i);
String pattern_id_str = reactantPatternElement.getAttributeValue("id");
ReactionRuleParticipant p = bForward ? rr.getReactantPattern(i) : rr.getProductPattern(i);
SpeciesPattern sp = p.getSpeciesPattern();
System.out.println(" reactant id=" + pattern_id_str + ", name=" + sp.toString());
keyMap.put(pattern_id_str, sp);
// list of molecules
extractMolecules(sp, model, reactantPatternElement);
// list of bonds (not implemented)
extractBonds(reactantPatternElement);
}
Element listOfProductPatternsElement = reactionRuleElement.getChild("ListOfProductPatterns", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
List<Element> productPatternChildren = new ArrayList<Element>();
productPatternChildren = listOfProductPatternsElement.getChildren("ProductPattern", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (int i = 0; i < productPatternChildren.size(); i++) {
Element productPatternElement = productPatternChildren.get(i);
String pattern_id_str = productPatternElement.getAttributeValue("id");
ReactionRuleParticipant p = bForward ? rr.getProductPattern(i) : rr.getReactantPattern(i);
SpeciesPattern sp = p.getSpeciesPattern();
System.out.println(" product id=" + pattern_id_str + ", name=" + sp.toString());
keyMap.put(pattern_id_str, sp);
extractMolecules(sp, model, productPatternElement);
extractBonds(productPatternElement);
}
// extract the Map for this rule
Element listOfMapElement = reactionRuleElement.getChild("Map", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
List<Element> mapChildren = new ArrayList<Element>();
mapChildren = listOfMapElement.getChildren("MapItem", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (Element mapElement : mapChildren) {
String target_id_str = mapElement.getAttributeValue("targetID");
String source_id_str = mapElement.getAttributeValue("sourceID");
System.out.println("Map: target=" + target_id_str + " source=" + source_id_str);
RbmObject target_object = keyMap.get(target_id_str);
RbmObject source_object = keyMap.get(source_id_str);
if (target_object == null)
System.out.println("!!! Missing map target " + target_id_str);
if (source_object == null)
System.out.println("!!! Missing map source " + source_id_str);
if (source_object != null) {
// target_object may be null
System.out.println(" target=" + target_object + " source=" + source_object);
Pair<RbmObject, RbmObject> mapEntry = new Pair<RbmObject, RbmObject>(target_object, source_object);
rar.objmappingList.add(mapEntry);
}
Pair<String, String> idmapEntry = new Pair<String, String>(target_id_str, source_id_str);
rar.idmappingList.add(idmapEntry);
}
// ListOfOperations
Element listOfOperationsElement = reactionRuleElement.getChild("ListOfOperations", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
List<Element> operationsChildren = new ArrayList<Element>();
operationsChildren = listOfOperationsElement.getChildren("StateChange", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
System.out.println("ListOfOperations");
for (Element operationsElement : operationsChildren) {
String finalState_str = operationsElement.getAttributeValue("finalState");
String site_str = operationsElement.getAttributeValue("site");
RbmObject site_object = keyMap.get(site_str);
if (site_object == null)
System.out.println("!!! Missing map object " + site_str);
if (site_object != null) {
System.out.println(" finalState=" + finalState_str + " site=" + site_object);
StateChangeOperation sco = new StateChangeOperation(finalState_str, site_str, site_object);
rar.operationsList.add(sco);
}
}
operationsChildren = listOfOperationsElement.getChildren("AddBond", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (Element operationsElement : operationsChildren) {
String site1_str = operationsElement.getAttributeValue("site1");
String site2_str = operationsElement.getAttributeValue("site2");
RbmObject site1_object = keyMap.get(site1_str);
RbmObject site2_object = keyMap.get(site2_str);
if (site1_object == null)
System.out.println("!!! Missing map object " + site1_str);
if (site2_object == null)
System.out.println("!!! Missing map object " + site2_str);
if (site1_object != null && site2_object != null) {
System.out.println(" site1=" + site1_object + " site2=" + site2_object);
AddBondOperation abo = new AddBondOperation(site1_str, site2_str, site1_object, site2_object);
rar.operationsList.add(abo);
}
}
operationsChildren = listOfOperationsElement.getChildren("DeleteBond", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (Element operationsElement : operationsChildren) {
String site1_str = operationsElement.getAttributeValue("site1");
String site2_str = operationsElement.getAttributeValue("site2");
RbmObject site1_object = keyMap.get(site1_str);
RbmObject site2_object = keyMap.get(site2_str);
if (site1_object == null)
System.out.println("!!! Missing map object " + site1_str);
if (site2_object == null)
System.out.println("!!! Missing map object " + site2_str);
if (site1_object != null && site2_object != null) {
System.out.println(" site1=" + site1_object + " site2=" + site2_object);
DeleteBondOperation dbo = new DeleteBondOperation(site1_str, site2_str, site1_object, site2_object);
rar.operationsList.add(dbo);
}
}
operationsChildren = listOfOperationsElement.getChildren("Add", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (Element operationsElement : operationsChildren) {
String id_str = operationsElement.getAttributeValue("id");
RbmObject id_object = keyMap.get(id_str);
if (id_object == null)
System.out.println("!!! Missing map object " + id_str);
if (id_object != null) {
System.out.println(" id=" + id_str);
AddOperation ao = new AddOperation(id_str, id_object);
rar.operationsList.add(ao);
}
}
operationsChildren = listOfOperationsElement.getChildren("Delete", Namespace.getNamespace("http://www.sbml.org/sbml/level3"));
for (Element operationsElement : operationsChildren) {
String id_str = operationsElement.getAttributeValue("id");
String delete_molecules_str = operationsElement.getAttributeValue("DeleteMolecules");
RbmObject id_object = keyMap.get(id_str);
if (id_object == null)
System.out.println("!!! Missing map object " + id_str);
int delete_molecules_int = 0;
if (delete_molecules_str != null) {
delete_molecules_int = Integer.parseInt(delete_molecules_str);
}
if (id_object != null) {
System.out.println(" id=" + id_str + ", DeleteMolecules=" + delete_molecules_str);
DeleteOperation dop = new DeleteOperation(id_str, id_object, delete_molecules_int);
rar.operationsList.add(dop);
}
}
}
System.out.println("done parsing xml file");
}
use of org.vcell.model.rbm.RbmObject in project vcell by virtualcell.
the class ReactionRuleEditorPropertiesPanel method showPopupMenu.
private void showPopupMenu(MouseEvent e, PointLocationInShapeContext locationContext) {
if (popupFromShapeMenu == null) {
popupFromShapeMenu = new JPopupMenu();
}
if (popupFromShapeMenu.isShowing()) {
return;
}
popupFromShapeMenu.removeAll();
Point mousePoint = e.getPoint();
final Object deepestShape = locationContext.getDeepestShape();
final RbmObject selectedObject;
if (deepestShape == null) {
selectedObject = null;
// when cursor is outside any species pattern we offer to add a new one
System.out.println("outside");
// popupFromShapeMenu.add(getAddSpeciesPatternFromShapeMenuItem());
} else if (deepestShape instanceof ComponentStateLargeShape) {
System.out.println("inside state");
if (((ComponentStateLargeShape) deepestShape).isHighlighted()) {
selectedObject = ((ComponentStateLargeShape) deepestShape).getComponentStatePattern();
} else {
return;
}
} else if (deepestShape instanceof MolecularComponentLargeShape) {
System.out.println("inside component");
if (((MolecularComponentLargeShape) deepestShape).isHighlighted()) {
selectedObject = ((MolecularComponentLargeShape) deepestShape).getMolecularComponentPattern();
} else {
return;
}
} else if (deepestShape instanceof MolecularTypeLargeShape) {
System.out.println("inside molecule");
if (((MolecularTypeLargeShape) deepestShape).isHighlighted()) {
selectedObject = ((MolecularTypeLargeShape) deepestShape).getMolecularTypePattern();
} else {
return;
}
} else if (deepestShape instanceof SpeciesPatternLargeShape) {
System.out.println("inside species pattern");
if (((SpeciesPatternLargeShape) deepestShape).isHighlighted()) {
selectedObject = ((SpeciesPatternLargeShape) deepestShape).getSpeciesPattern();
} else {
return;
}
} else if (deepestShape instanceof ReactionRulePatternLargeShape) {
System.out.println("inside reactant line or products line");
if (((ReactionRulePatternLargeShape) deepestShape).isHighlighted()) {
selectedObject = ((ReactionRulePatternLargeShape) deepestShape).getReactionRule();
} else {
return;
}
} else {
selectedObject = null;
System.out.println("inside something else?");
return;
}
boolean bReactantsZone = false;
int xExtent = SpeciesPatternLargeShape.calculateXExtent(shapePanel);
Rectangle2D reactantRectangle = new Rectangle2D.Double(xOffsetInitial - xExtent, yOffsetReactantInitial - 3, 3000, 80 - 2 + GraphConstants.ReactionRuleDisplay_ReservedSpaceForNameOnYAxis);
Rectangle2D productRectangle = new Rectangle2D.Double(xOffsetInitial - xExtent, yOffsetProductInitial - 3, 3000, 80 - 2 + GraphConstants.ReactionRuleDisplay_ReservedSpaceForNameOnYAxis);
if (locationContext.isInside(reactantRectangle)) {
// clicked inside the reactant rectangle (above yOffsetProductInitial)
bReactantsZone = true;
} else if (locationContext.isInside(productRectangle)) {
// clicked inside the product rectangle (below yOffsetProductInitial)
bReactantsZone = false;
} else {
return;
}
// -------------------------------- reactant zone --------------------------------------------------------
if (bReactantsZone) {
if (selectedObject == null) {
return;
} else if (selectedObject instanceof ReactionRule) {
// add reactant pattern
JMenuItem addMenuItem = new JMenuItem("Add Reactant");
addMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
reactionRule.addReactant(new ReactantPattern(new SpeciesPattern(), reactionRule.getStructure()));
shapePanel.repaint();
}
});
popupFromShapeMenu.add(addMenuItem);
} else if (selectedObject instanceof SpeciesPattern) {
// delete (pattern) / specify molecule
final SpeciesPattern sp = (SpeciesPattern) selectedObject;
JMenuItem deleteMenuItem = new JMenuItem("Delete");
deleteMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (ReactantPattern rp : reactionRule.getReactantPatterns()) {
if (rp.getSpeciesPattern() == sp) {
reactionRule.removeReactant(rp);
Structure st = rp.getStructure();
if (reactionRule.getReactantPatterns().isEmpty()) {
reactionRule.addReactant(new ReactantPattern(new SpeciesPattern(), st));
shapePanel.repaint();
}
}
}
}
});
popupFromShapeMenu.add(deleteMenuItem);
JMenu addMenuItem = new JMenu(VCellErrorMessages.SpecifyMolecularTypes);
popupFromShapeMenu.add(addMenuItem);
addMenuItem.removeAll();
for (final MolecularType mt : bioModel.getModel().getRbmModelContainer().getMolecularTypeList()) {
JMenuItem menuItem = new JMenuItem(mt.getName());
Graphics gc = shapePanel.getGraphics();
Icon icon = new MolecularTypeSmallShape(1, 4, mt, null, gc, mt, null, issueManager);
menuItem.setIcon(icon);
addMenuItem.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern molecularTypePattern = new MolecularTypePattern(mt);
for (MolecularComponentPattern mcp : molecularTypePattern.getComponentPatternList()) {
mcp.setBondType(BondType.Possible);
}
sp.addMolecularTypePattern(molecularTypePattern);
shapePanel.repaint();
}
});
}
JMenu compartmentMenuItem = new JMenu("Specify structure");
popupFromShapeMenu.add(compartmentMenuItem);
if (sp.getMolecularTypePatterns().isEmpty()) {
compartmentMenuItem.setEnabled(false);
}
compartmentMenuItem.removeAll();
for (final Structure struct : bioModel.getModel().getStructures()) {
JMenuItem menuItem = new JMenuItem(struct.getName());
compartmentMenuItem.add(menuItem);
for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
MolecularType mt = mtp.getMolecularType();
if (mt.isAnchorAll()) {
// no restrictions (no anchor exclusion) for this molecular type
continue;
}
if (!mt.getAnchors().contains(struct)) {
// sp can't be in this struct if any of its molecules is excluded (not anchored)
menuItem.setEnabled(false);
break;
}
}
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String nameStruct = e.getActionCommand();
Structure struct = bioModel.getModel().getStructure(nameStruct);
ReactantPattern rp = reactionRule.getReactantPattern(sp);
rp.setStructure(struct);
productTreeModel.populateTree();
shapePanel.repaint();
}
});
}
} else if (selectedObject instanceof MolecularTypePattern) {
// move left / right / delete molecule / reassign match
MolecularTypePattern mtp = (MolecularTypePattern) selectedObject;
int numMtp = locationContext.sps.getSpeciesPattern().getMolecularTypePatterns().size();
String moveRightMenuText = "Move <b>" + "right" + "</b>";
moveRightMenuText = "<html>" + moveRightMenuText + "</html>";
JMenuItem moveRightMenuItem = new JMenuItem(moveRightMenuText);
Icon icon = VCellIcons.moveRightIcon;
moveRightMenuItem.setIcon(icon);
moveRightMenuItem.setEnabled(numMtp < 2 ? false : true);
moveRightMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern from = (MolecularTypePattern) selectedObject;
SpeciesPattern sp = locationContext.sps.getSpeciesPattern();
sp.shiftRight(from);
reactantTreeModel.populateTree();
productTreeModel.populateTree();
shapePanel.repaint();
}
});
popupFromShapeMenu.add(moveRightMenuItem);
String moveLeftMenuText = "Move <b>" + "left" + "</b>";
moveLeftMenuText = "<html>" + moveLeftMenuText + "</html>";
JMenuItem moveLeftMenuItem = new JMenuItem(moveLeftMenuText);
icon = VCellIcons.moveLeftIcon;
moveLeftMenuItem.setIcon(icon);
moveLeftMenuItem.setEnabled(numMtp < 2 ? false : true);
moveLeftMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern from = (MolecularTypePattern) selectedObject;
SpeciesPattern sp = locationContext.sps.getSpeciesPattern();
sp.shiftLeft(from);
reactantTreeModel.populateTree();
productTreeModel.populateTree();
shapePanel.repaint();
}
});
popupFromShapeMenu.add(moveLeftMenuItem);
popupFromShapeMenu.add(new JSeparator());
String deleteMenuText = "Delete <b>" + mtp.getMolecularType().getName() + "</b>";
deleteMenuText = "<html>" + deleteMenuText + "</html>";
JMenuItem deleteMenuItem = new JMenuItem(deleteMenuText);
deleteMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern mtp = (MolecularTypePattern) selectedObject;
SpeciesPattern sp = locationContext.sps.getSpeciesPattern();
sp.removeMolecularTypePattern(mtp);
shapePanel.repaint();
}
});
popupFromShapeMenu.add(deleteMenuItem);
if (mtp.hasExplicitParticipantMatch()) {
String newKey = mtp.getParticipantMatchLabel();
List<String> keyCandidates = new ArrayList<String>();
List<MolecularTypePattern> mtpReactantList = reactionRule.populateMaps(mtp.getMolecularType(), ReactionRuleParticipantType.Reactant);
List<MolecularTypePattern> mtpProductList = reactionRule.populateMaps(mtp.getMolecularType(), ReactionRuleParticipantType.Product);
for (MolecularTypePattern mtpCandidate : mtpReactantList) {
// we can look for indexes in any list, we should find the same
if (mtpCandidate.hasExplicitParticipantMatch() && !mtpCandidate.getParticipantMatchLabel().equals(newKey)) {
keyCandidates.add(mtpCandidate.getParticipantMatchLabel());
}
}
if (!keyCandidates.isEmpty()) {
JMenu reassignMatchMenuItem = new JMenu();
reassignMatchMenuItem.setText("Reassign match to");
for (int i = 0; i < keyCandidates.size(); i++) {
JMenuItem menuItem = new JMenuItem(keyCandidates.get(i));
reassignMatchMenuItem.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String oldKey = e.getActionCommand();
MolecularTypePattern orphanReactant = reactionRule.findMatch(oldKey, mtpReactantList);
mtp.setParticipantMatchLabel(oldKey);
orphanReactant.setParticipantMatchLabel(newKey);
// TODO: replace the populate tree with reactantPatternShapeList.update() and productPatternShapeList.update()
// when the tree will be gone
reactantTreeModel.populateTree();
productTreeModel.populateTree();
shapePanel.repaint();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
reactantShape.flash(oldKey);
productShape.flash(oldKey);
}
});
}
});
}
popupFromShapeMenu.add(reassignMatchMenuItem);
}
}
} else if (selectedObject instanceof MolecularComponentPattern) {
// edit bond / edit state
manageComponentPatternFromShape(selectedObject, locationContext, reactantTreeModel, ShowWhat.ShowBond, bReactantsZone);
} else if (selectedObject instanceof ComponentStatePattern) {
// edit state
MolecularComponentPattern mcp = ((ComponentStateLargeShape) deepestShape).getMolecularComponentPattern();
manageComponentPatternFromShape(mcp, locationContext, reactantTreeModel, ShowWhat.ShowState, bReactantsZone);
}
// ---------------------------------------- product zone ---------------------------------------------
} else if (!bReactantsZone) {
if (selectedObject == null) {
return;
} else if (selectedObject instanceof ReactionRule) {
// add product pattern
JMenuItem addMenuItem = new JMenuItem("Add Product");
addMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
reactionRule.addProduct(new ProductPattern(new SpeciesPattern(), reactionRule.getStructure()));
shapePanel.repaint();
}
});
popupFromShapeMenu.add(addMenuItem);
} else if (selectedObject instanceof SpeciesPattern) {
// delete (pattern) / specify molecule
final SpeciesPattern sp = (SpeciesPattern) selectedObject;
JMenuItem deleteMenuItem = new JMenuItem("Delete");
deleteMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
for (ProductPattern pp : reactionRule.getProductPatterns()) {
if (pp.getSpeciesPattern() == sp) {
reactionRule.removeProduct(pp);
Structure st = pp.getStructure();
if (reactionRule.getProductPatterns().isEmpty()) {
reactionRule.addProduct(new ProductPattern(new SpeciesPattern(), st));
shapePanel.repaint();
}
}
}
}
});
popupFromShapeMenu.add(deleteMenuItem);
JMenu addMenuItem = new JMenu(VCellErrorMessages.SpecifyMolecularTypes);
popupFromShapeMenu.add(addMenuItem);
addMenuItem.removeAll();
for (final MolecularType mt : bioModel.getModel().getRbmModelContainer().getMolecularTypeList()) {
JMenuItem menuItem = new JMenuItem(mt.getName());
Graphics gc = shapePanel.getGraphics();
Icon icon = new MolecularTypeSmallShape(1, 4, mt, null, gc, mt, null, issueManager);
menuItem.setIcon(icon);
addMenuItem.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern molecularTypePattern = new MolecularTypePattern(mt);
for (MolecularComponentPattern mcp : molecularTypePattern.getComponentPatternList()) {
mcp.setBondType(BondType.Possible);
}
sp.addMolecularTypePattern(molecularTypePattern);
shapePanel.repaint();
}
});
}
// specify structure
JMenu compartmentMenuItem = new JMenu("Specify structure");
popupFromShapeMenu.add(compartmentMenuItem);
compartmentMenuItem.removeAll();
if (sp.getMolecularTypePatterns().isEmpty()) {
compartmentMenuItem.setEnabled(false);
}
for (final Structure struct : bioModel.getModel().getStructures()) {
JMenuItem menuItem = new JMenuItem(struct.getName());
compartmentMenuItem.add(menuItem);
for (MolecularTypePattern mtp : sp.getMolecularTypePatterns()) {
MolecularType mt = mtp.getMolecularType();
if (mt.isAnchorAll()) {
// no restrictions for this molecular type
continue;
}
if (!mt.getAnchors().contains(struct)) {
// sp can't be in this struct if any of its molecules is excluded (not anchored)
menuItem.setEnabled(false);
break;
}
}
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String nameStruct = e.getActionCommand();
Structure struct = bioModel.getModel().getStructure(nameStruct);
ProductPattern pp = reactionRule.getProductPattern(sp);
pp.setStructure(struct);
productTreeModel.populateTree();
shapePanel.repaint();
}
});
}
} else if (selectedObject instanceof MolecularTypePattern) {
// move left / right / delete molecule / reassign match
MolecularTypePattern mtp = (MolecularTypePattern) selectedObject;
int numMtp = locationContext.sps.getSpeciesPattern().getMolecularTypePatterns().size();
String moveRightMenuText = "Move <b>" + "right" + "</b>";
moveRightMenuText = "<html>" + moveRightMenuText + "</html>";
JMenuItem moveRightMenuItem = new JMenuItem(moveRightMenuText);
Icon icon = VCellIcons.moveRightIcon;
moveRightMenuItem.setIcon(icon);
moveRightMenuItem.setEnabled(numMtp < 2 ? false : true);
moveRightMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern from = (MolecularTypePattern) selectedObject;
SpeciesPattern sp = locationContext.sps.getSpeciesPattern();
sp.shiftRight(from);
reactantTreeModel.populateTree();
productTreeModel.populateTree();
shapePanel.repaint();
}
});
popupFromShapeMenu.add(moveRightMenuItem);
String moveLeftMenuText = "Move <b>" + "left" + "</b>";
moveLeftMenuText = "<html>" + moveLeftMenuText + "</html>";
JMenuItem moveLeftMenuItem = new JMenuItem(moveLeftMenuText);
icon = VCellIcons.moveLeftIcon;
moveLeftMenuItem.setIcon(icon);
moveLeftMenuItem.setEnabled(numMtp < 2 ? false : true);
moveLeftMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern from = (MolecularTypePattern) selectedObject;
SpeciesPattern sp = locationContext.sps.getSpeciesPattern();
sp.shiftLeft(from);
reactantTreeModel.populateTree();
productTreeModel.populateTree();
shapePanel.repaint();
}
});
popupFromShapeMenu.add(moveLeftMenuItem);
popupFromShapeMenu.add(new JSeparator());
String deleteMenuText = "Delete <b>" + mtp.getMolecularType().getName() + "</b>";
deleteMenuText = "<html>" + deleteMenuText + "</html>";
JMenuItem deleteMenuItem = new JMenuItem(deleteMenuText);
deleteMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
MolecularTypePattern mtp = (MolecularTypePattern) selectedObject;
SpeciesPattern sp = locationContext.sps.getSpeciesPattern();
sp.removeMolecularTypePattern(mtp);
shapePanel.repaint();
}
});
popupFromShapeMenu.add(deleteMenuItem);
if (mtp.hasExplicitParticipantMatch()) {
String newKey = mtp.getParticipantMatchLabel();
List<String> keyCandidates = new ArrayList<String>();
List<MolecularTypePattern> mtpReactantList = reactionRule.populateMaps(mtp.getMolecularType(), ReactionRuleParticipantType.Reactant);
List<MolecularTypePattern> mtpProductList = reactionRule.populateMaps(mtp.getMolecularType(), ReactionRuleParticipantType.Product);
for (MolecularTypePattern mtpCandidate : mtpReactantList) {
// we can look for indexes in any list, we should find the same
if (mtpCandidate.hasExplicitParticipantMatch() && !mtpCandidate.getParticipantMatchLabel().equals(newKey)) {
keyCandidates.add(mtpCandidate.getParticipantMatchLabel());
}
}
if (!keyCandidates.isEmpty()) {
JMenu reassignMatchMenuItem = new JMenu();
reassignMatchMenuItem.setText("Reassign match to");
for (int i = 0; i < keyCandidates.size(); i++) {
JMenuItem menuItem = new JMenuItem(keyCandidates.get(i));
reassignMatchMenuItem.add(menuItem);
menuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String oldKey = e.getActionCommand();
MolecularTypePattern orphanProduct = reactionRule.findMatch(oldKey, mtpProductList);
mtp.setParticipantMatchLabel(oldKey);
orphanProduct.setParticipantMatchLabel(newKey);
// TODO: replace the populate tree with reactantPatternShapeList.update() and productPatternShapeList.update()
// when the tree will be gone
reactantTreeModel.populateTree();
productTreeModel.populateTree();
shapePanel.repaint();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
reactantShape.flash(oldKey);
productShape.flash(oldKey);
}
});
}
});
}
popupFromShapeMenu.add(reassignMatchMenuItem);
}
}
} else if (selectedObject instanceof MolecularComponentPattern) {
// edit bond / edit state
manageComponentPatternFromShape(selectedObject, locationContext, productTreeModel, ShowWhat.ShowBond, bReactantsZone);
} else if (selectedObject instanceof ComponentStatePattern) {
// edit state
MolecularComponentPattern mcp = ((ComponentStateLargeShape) deepestShape).getMolecularComponentPattern();
manageComponentPatternFromShape(mcp, locationContext, productTreeModel, ShowWhat.ShowState, bReactantsZone);
}
}
popupFromShapeMenu.show(e.getComponent(), mousePoint.x, mousePoint.y);
}
Aggregations