use of cbit.vcell.model.ReactantPattern in project vcell by virtualcell.
the class BioModelEditorModelPanel method makeReactionRule.
private Object makeReactionRule(Structure structure) {
ReactionRule rr = bioModel.getModel().getRbmModelContainer().createReactionRule(structure);
if (rr != null) {
try {
rr.setReversible(false);
bioModel.getModel().getRbmModelContainer().addReactionRule(rr);
SpeciesPattern sp = new SpeciesPattern();
ReactantPattern rp = new ReactantPattern(sp, rr.getStructure());
rr.addReactant(rp);
sp = new SpeciesPattern();
ProductPattern pp = new ProductPattern(sp, rr.getStructure());
rr.addProduct(pp);
return rr;
} catch (Exception e) {
e.printStackTrace();
DialogUtils.showErrorDialog(this, e.getMessage(), e);
}
} else {
throw new RuntimeException("Reaction Rule is null");
}
return null;
}
use of cbit.vcell.model.ReactantPattern in project vcell by virtualcell.
the class BioModelEditorModelPanel method initialize.
private void initialize() {
newButton = new JButton("New");
newButton2 = new JButton("New Rule");
newMemButton = new JButton("New Membrane");
deleteButton = new JButton("Delete");
duplicateButton = new JButton("Duplicate");
pathwayButton = new JButton("Pathway Links", new DownArrowIcon());
pathwayButton.setHorizontalTextPosition(SwingConstants.LEFT);
textFieldSearch = new JTextField();
textFieldSearch.putClientProperty("JTextField.variant", "search");
structuresTable = new EditorScrollTable();
reactionsTable = new EditorScrollTable();
speciesTable = new EditorScrollTable();
molecularTypeTable = new EditorScrollTable();
observablesTable = new EditorScrollTable();
structureTableModel = new BioModelEditorStructureTableModel(structuresTable);
reactionTableModel = new BioModelEditorReactionTableModel(reactionsTable);
speciesTableModel = new BioModelEditorSpeciesTableModel(speciesTable);
molecularTypeTableModel = new MolecularTypeTableModel(molecularTypeTable);
observableTableModel = new ObservableTableModel(observablesTable);
structuresTable.setModel(structureTableModel);
reactionsTable.setModel(reactionTableModel);
speciesTable.setModel(speciesTableModel);
molecularTypeTable.setModel(molecularTypeTableModel);
observablesTable.setModel(observableTableModel);
reactionCartoonEditorPanel = new ReactionCartoonEditorPanel();
reactionCartoonEditorPanel.addPropertyChangeListener(eventHandler);
reactionCartoonEditorPanel.getReactionCartoonFull().addPropertyChangeListener(eventHandler);
reactionCartoonEditorPanel.getReactionCartoonMolecule().addPropertyChangeListener(eventHandler);
reactionCartoonEditorPanel.getReactionCartoonRule().addPropertyChangeListener(eventHandler);
// cartoonEditorPanel = new CartoonEditorPanelFixed();
// cartoonEditorPanel.getStructureCartoon().addPropertyChangeListener(eventHandler);
/* button panel */
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.anchor = GridBagConstraints.LINE_END;
buttonPanel.add(newButton, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.anchor = GridBagConstraints.LINE_END;
buttonPanel.add(newButton2, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 2;
gbc.gridy = 0;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.anchor = GridBagConstraints.LINE_END;
buttonPanel.add(newMemButton, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 3;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
buttonPanel.add(duplicateButton, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 4;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
buttonPanel.add(deleteButton, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 5;
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
buttonPanel.add(pathwayButton, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 6;
gbc.gridy = 0;
gbc.weightx = 0.5;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(4, 4, 4, 4);
buttonPanel.add(Box.createRigidArea(new Dimension(5, 5)), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 7;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.LINE_END;
gbc.insets = new Insets(4, 4, 4, 4);
buttonPanel.add(new JLabel("Search "), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 8;
gbc.gridy = 0;
gbc.weightx = 1.5;
gbc.anchor = GridBagConstraints.LINE_START;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.insets = new Insets(4, 4, 4, 4);
buttonPanel.add(textFieldSearch, gbc);
/* button panel */
tabbedPane = new JTabbedPaneEnhanced();
tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);
modelPanelTabs[ModelPanelTabID.reaction_diagram.ordinal()] = new ModelPanelTab(ModelPanelTabID.reaction_diagram, reactionCartoonEditorPanel, VCellIcons.diagramIcon);
// modelPanelTabs[ModelPanelTabID.structure_diagram.ordinal()] = new ModelPanelTab(ModelPanelTabID.structure_diagram, cartoonEditorPanel, VCellIcons.structureIcon);
modelPanelTabs[ModelPanelTabID.reaction_table.ordinal()] = new ModelPanelTab(ModelPanelTabID.reaction_table, reactionsTable.getEnclosingScrollPane(), VCellIcons.tableIcon);
modelPanelTabs[ModelPanelTabID.structure_table.ordinal()] = new ModelPanelTab(ModelPanelTabID.structure_table, structuresTable.getEnclosingScrollPane(), VCellIcons.tableIcon);
modelPanelTabs[ModelPanelTabID.species_table.ordinal()] = new ModelPanelTab(ModelPanelTabID.species_table, speciesTable.getEnclosingScrollPane(), VCellIcons.tableIcon);
modelPanelTabs[ModelPanelTabID.species_definitions_table.ordinal()] = new ModelPanelTab(ModelPanelTabID.species_definitions_table, molecularTypeTable.getEnclosingScrollPane(), VCellIcons.tableIcon);
modelPanelTabs[ModelPanelTabID.observables_table.ordinal()] = new ModelPanelTab(ModelPanelTabID.observables_table, observablesTable.getEnclosingScrollPane(), VCellIcons.tableIcon);
tabbedPane.addChangeListener(eventHandler);
tabbedPane.addMouseListener(eventHandler);
for (ModelPanelTab tab : modelPanelTabs) {
tab.getComponent().setBorder(GuiConstants.TAB_PANEL_BORDER);
tabbedPane.addTab(tab.getName(), tab.getIcon(), tab.getComponent());
}
// tabbedPane.addChangeListener(changeListener);
setLayout(new BorderLayout());
add(tabbedPane, BorderLayout.CENTER);
add(buttonPanel, BorderLayout.SOUTH);
newButton.addActionListener(eventHandler);
newButton2.addActionListener(eventHandler);
newMemButton.addActionListener(eventHandler);
duplicateButton.addActionListener(eventHandler);
duplicateButton.setEnabled(false);
deleteButton.addActionListener(eventHandler);
deleteButton.setEnabled(false);
pathwayButton.addActionListener(eventHandler);
pathwayButton.setEnabled(false);
textFieldSearch.addActionListener(eventHandler);
textFieldSearch.getDocument().addDocumentListener(eventHandler);
structuresTable.getSelectionModel().addListSelectionListener(eventHandler);
reactionsTable.getSelectionModel().addListSelectionListener(eventHandler);
speciesTable.getSelectionModel().addListSelectionListener(eventHandler);
molecularTypeTable.getSelectionModel().addListSelectionListener(eventHandler);
observablesTable.getSelectionModel().addListSelectionListener(eventHandler);
DefaultScrollTableCellRenderer tableRenderer = new DefaultScrollTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (value instanceof Structure) {
setText(((Structure) value).getName());
} else if (value instanceof Kinetics) {
setText(((Kinetics) value).getKineticsDescription().getDescription());
} else if (value instanceof RbmKineticLaw) {
setText(((RbmKineticLaw) value).getRateLawType().name());
}
return this;
}
};
RbmTableRenderer rbmTableRenderer = new RbmTableRenderer();
structuresTable.setDefaultRenderer(Structure.class, tableRenderer);
speciesTable.setDefaultRenderer(Structure.class, tableRenderer);
reactionsTable.setDefaultRenderer(Structure.class, tableRenderer);
reactionsTable.setDefaultRenderer(Kinetics.class, tableRenderer);
reactionsTable.setDefaultRenderer(RbmKineticLaw.class, tableRenderer);
reactionsTable.setDefaultRenderer(ModelProcessDynamics.class, tableRenderer);
DefaultScrollTableCellRenderer tableCellRenderer = new DefaultScrollTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
BioModelEntityObject bioModelEntityObject = null;
if (table.getModel() instanceof VCellSortTableModel<?>) {
if (table.getModel() == reactionTableModel && reactionTableModel.getValueAt(row) instanceof BioModelEntityObject) {
bioModelEntityObject = (BioModelEntityObject) reactionTableModel.getValueAt(row);
} else if (table.getModel() == speciesTableModel) {
bioModelEntityObject = speciesTableModel.getValueAt(row);
} else if (table.getModel() == molecularTypeTableModel) {
bioModelEntityObject = molecularTypeTableModel.getValueAt(row);
}
if (bioModelEntityObject != null) {
Set<RelationshipObject> relationshipSet = bioModel.getRelationshipModel().getRelationshipObjects(bioModelEntityObject);
if (relationshipSet.size() > 0) {
StringBuilder tooltip = new StringBuilder("<html>Links to Pathway objects:<br>");
for (RelationshipObject ro : relationshipSet) {
tooltip.append("<li>" + ro.getBioPaxObject() + "</li>");
}
if (!isSelected) {
setForeground(Color.blue);
}
String finalName = null;
BioPaxObject bioPaxObject = relationshipSet.iterator().next().getBioPaxObject();
if (bioPaxObject instanceof EntityImpl && ((EntityImpl) bioPaxObject).getName() != null && ((EntityImpl) bioPaxObject).getName().size() > 0) {
finalName = ((EntityImpl) bioPaxObject).getName().get(0);
} else if (bioPaxObject instanceof Conversion) {
Conversion mp = (Conversion) bioPaxObject;
finalName = "[" + bioPaxObject.getIDShort() + "]";
} else {
finalName = bioModelEntityObject.getName();
}
final int LIMIT = 40;
final String DOTS = "...";
if (finalName != null && finalName.length() > LIMIT) {
finalName = finalName.substring(0, LIMIT - DOTS.length() - 1) + DOTS;
}
setText("<html><u>" + finalName + "</u></html>");
setToolTipText(tooltip.toString());
}
}
}
return this;
}
};
DefaultScrollTableCellRenderer rbmReactionExpressionCellRenderer = new DefaultScrollTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == reactionTableModel) {
selectedObject = reactionTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof ReactionRule && value instanceof ModelProcessEquation) {
String text = "<html>";
text += "Reaction Rule";
text += "</html>";
setText(text);
} else {
// plain reaction, check if reactants have species pattern
ReactionStep rs = (ReactionStep) selectedObject;
String text = "<html>";
for (int i = 0; i < rs.getNumReactants(); i++) {
Reactant p = rs.getReactant(i);
if (p.getSpeciesContext().hasSpeciesPattern()) {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
// text += "<b>" + p.getName() + "</b>";
text += p.getName();
} else {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
text += p.getName();
}
if (i < rs.getNumReactants() - 1) {
text += " + ";
}
}
text += " -> ";
for (int i = 0; i < rs.getNumProducts(); i++) {
Product p = rs.getProduct(i);
if (p.getSpeciesContext().hasSpeciesPattern()) {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
// text += "<b>" + p.getName() + "</b>";
text += p.getName();
} else {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
text += p.getName();
}
if (i < rs.getNumProducts() - 1) {
text += " + ";
}
}
text += "</html>";
setText(text);
}
}
}
return this;
}
};
DefaultScrollTableCellRenderer rbmReactionDefinitionCellRenderer = new DefaultScrollTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == reactionTableModel) {
selectedObject = reactionTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof ReactionRule && value instanceof ModelProcessEquation) {
ReactionRule rr = (ReactionRule) selectedObject;
String text = "<html>";
for (int i = 0; i < rr.getReactantPatterns().size(); i++) {
ReactantPattern rp = rr.getReactantPattern(i);
if (rp.getStructure() != null && !rp.getSpeciesPattern().getMolecularTypePatterns().isEmpty()) {
text += "@" + rp.getStructure().getName() + ":";
}
text += RbmUtils.toBnglString(rp.getSpeciesPattern(), null, CompartmentMode.hide, 0);
// text += RbmTableRenderer.toHtml(rp.getSpeciesPattern(), isSelected);
if (i < rr.getReactantPatterns().size() - 1) {
text += "+";
}
}
if (rr.isReversible()) {
// <-> <->
text += " <-> ";
} else {
text += " -> ";
}
for (int i = 0; i < rr.getProductPatterns().size(); i++) {
ProductPattern pp = rr.getProductPattern(i);
if (pp.getStructure() != null && !pp.getSpeciesPattern().getMolecularTypePatterns().isEmpty()) {
text += "@" + pp.getStructure().getName() + ":";
}
text += RbmUtils.toBnglString(pp.getSpeciesPattern(), null, CompartmentMode.hide, 0);
if (i < rr.getProductPatterns().size() - 1) {
text += "+";
}
}
text += "</html>";
setText(text);
} else {
// plain reaction, check if reactants have species pattern
ReactionStep rs = (ReactionStep) selectedObject;
String text = "<html>";
for (int i = 0; i < rs.getNumReactants(); i++) {
Reactant p = rs.getReactant(i);
if (p.getSpeciesContext().hasSpeciesPattern()) {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
text += p.getName();
} else {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
text += p.getName();
}
if (i < rs.getNumReactants() - 1) {
text += " + ";
}
}
if (rs.isReversible()) {
// <-> <->
text += " <-> ";
} else {
text += " -> ";
}
for (int i = 0; i < rs.getNumProducts(); i++) {
Product p = rs.getProduct(i);
if (p.getSpeciesContext().hasSpeciesPattern()) {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
text += p.getName();
} else {
text += p.getStoichiometry() > 1 ? (p.getStoichiometry() + "") : "";
text += p.getName();
}
if (i < rs.getNumProducts() - 1) {
text += " + ";
}
}
text += "</html>";
setText(text);
}
}
}
return this;
}
};
DefaultScrollTableCellRenderer rbmObservablePatternCellRenderer = new DefaultScrollTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == observableTableModel) {
selectedObject = observableTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof RbmObservable && value instanceof String) {
RbmObservable o = (RbmObservable) selectedObject;
String text = "<html>";
for (int i = 0; i < o.getSpeciesPatternList().size(); i++) {
SpeciesPattern sp = o.getSpeciesPattern(i);
text += RbmTableRenderer.toHtml(sp, isSelected);
if (i < o.getSpeciesPatternList().size() - 1) {
text += " ";
}
}
text = RbmUtils.appendSequence(text, o);
text += "</html>";
setText(text);
}
}
}
return this;
}
};
DefaultScrollTableCellRenderer rbmSpeciesNameCellRenderer = new DefaultScrollTableCellRenderer() {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == speciesTableModel) {
selectedObject = speciesTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof SpeciesContext) {
SpeciesContext sc = (SpeciesContext) selectedObject;
String text = "<html>";
if (sc.hasSpeciesPattern()) {
text += "<b>" + sc.getName() + "</b>";
} else {
text += sc.getName();
}
text += "</html>";
setText(text);
}
}
}
return this;
}
};
//
// this renderer only paints the molecular type small shape in the MolecularType Table
//
DefaultScrollTableCellRenderer rbmMolecularTypeShapeDepictionCellRenderer = new DefaultScrollTableCellRenderer() {
MolecularTypeSmallShape stls = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == molecularTypeTableModel) {
selectedObject = molecularTypeTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof MolecularType) {
MolecularType mt = (MolecularType) selectedObject;
Graphics cellContext = table.getGraphics();
if (mt != null) {
stls = new MolecularTypeSmallShape(4, 3, mt, null, cellContext, mt, null, issueManager);
}
}
} else {
stls = null;
}
}
return this;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (stls != null) {
stls.paintSelf(g);
}
}
};
// painting of species patterns small shapes inside the species context table
DefaultScrollTableCellRenderer rbmSpeciesShapeDepictionCellRenderer = new DefaultScrollTableCellRenderer() {
SpeciesPatternSmallShape spss = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == speciesTableModel) {
selectedObject = speciesTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof SpeciesContext) {
SpeciesContext sc = (SpeciesContext) selectedObject;
// sp may be null for "plain" species contexts
SpeciesPattern sp = sc.getSpeciesPattern();
Graphics panelContext = table.getGraphics();
spss = new SpeciesPatternSmallShape(4, 2, sp, panelContext, sc, isSelected, issueManager);
}
} else {
spss = null;
}
}
setText("");
return this;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (spss != null) {
spss.paintSelf(g);
}
}
};
// ---------------------------------------------------------------------------------------------------------------------------------
DefaultScrollTableCellRenderer rbmReactionShapeDepictionCellRenderer = new DefaultScrollTableCellRenderer() {
List<SpeciesPatternSmallShape> spssList = new ArrayList<SpeciesPatternSmallShape>();
SpeciesPatternSmallShape spss = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == reactionTableModel) {
selectedObject = reactionTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof ReactionRule) {
ReactionRule rr = (ReactionRule) selectedObject;
Graphics panelContext = table.getGraphics();
spssList.clear();
List<ReactantPattern> rpList = rr.getReactantPatterns();
int xPos = 4;
for (int i = 0; i < rpList.size(); i++) {
SpeciesPattern sp = rr.getReactantPattern(i).getSpeciesPattern();
spss = new SpeciesPatternSmallShape(xPos, 2, sp, null, panelContext, rr, isSelected, issueManager);
if (i < rpList.size() - 1) {
spss.addEndText("+");
} else {
if (rr.isReversible()) {
spss.addEndText("<->");
xPos += 7;
} else {
spss.addEndText("->");
}
}
xPos += spss.getWidth() + 15;
spssList.add(spss);
}
List<ProductPattern> ppList = rr.getProductPatterns();
xPos += 7;
for (int i = 0; i < ppList.size(); i++) {
SpeciesPattern sp = rr.getProductPattern(i).getSpeciesPattern();
spss = new SpeciesPatternSmallShape(xPos, 2, sp, null, panelContext, rr, isSelected, issueManager);
if (i < ppList.size() - 1) {
spss.addEndText("+");
}
xPos += spss.getWidth() + 15;
spssList.add(spss);
}
} else {
ReactionStep rs = (ReactionStep) selectedObject;
Graphics panelContext = table.getGraphics();
spssList.clear();
int xPos = 4;
int extraSpace = 0;
for (int i = 0; i < rs.getNumReactants(); i++) {
SpeciesPattern sp = rs.getReactant(i).getSpeciesContext().getSpeciesPattern();
spss = new SpeciesPatternSmallShape(xPos, 2, sp, panelContext, rs, isSelected, issueManager);
if (i < rs.getNumReactants() - 1) {
spss.addEndText("+");
} else {
if (rs.isReversible()) {
spss.addEndText("<->");
extraSpace += 7;
} else {
spss.addEndText("->");
}
}
int offset = sp == null ? 17 : 15;
offset += extraSpace;
int w = spss.getWidth();
xPos += w + offset;
spssList.add(spss);
}
xPos += 8;
for (int i = 0; i < rs.getNumProducts(); i++) {
SpeciesPattern sp = rs.getProduct(i).getSpeciesContext().getSpeciesPattern();
if (i == 0 && rs.getNumReactants() == 0) {
xPos += 14;
}
spss = new SpeciesPatternSmallShape(xPos, 2, sp, panelContext, rs, isSelected, issueManager);
if (i == 0 && rs.getNumReactants() == 0) {
spss.addStartText("->");
}
if (i < rs.getNumProducts() - 1) {
spss.addEndText("+");
}
int offset = sp == null ? 17 : 15;
int w = spss.getWidth();
xPos += w + offset;
spssList.add(spss);
}
}
} else {
spssList.clear();
}
}
setText("");
return this;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (SpeciesPatternSmallShape spss : spssList) {
if (spss == null) {
continue;
}
spss.paintSelf(g);
}
}
};
// -------------------------------------------------------------------------------------------------------------------------------
DefaultScrollTableCellRenderer rbmObservableShapeDepictionCellRenderer = new DefaultScrollTableCellRenderer() {
List<SpeciesPatternSmallShape> spssList = new ArrayList<SpeciesPatternSmallShape>();
SpeciesPatternSmallShape spss = null;
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
if (table.getModel() instanceof VCellSortTableModel<?>) {
Object selectedObject = null;
if (table.getModel() == observableTableModel) {
selectedObject = observableTableModel.getValueAt(row);
}
if (selectedObject != null) {
if (selectedObject instanceof RbmObservable) {
RbmObservable observable = (RbmObservable) selectedObject;
Graphics panelContext = table.getGraphics();
int xPos = 4;
spssList.clear();
for (int i = 0; i < observable.getSpeciesPatternList().size(); i++) {
SpeciesPattern sp = observable.getSpeciesPatternList().get(i);
spss = new SpeciesPatternSmallShape(xPos, 2, sp, panelContext, observable, isSelected, issueManager);
xPos += spss.getWidth() + 6;
spssList.add(spss);
}
}
} else {
spssList.clear();
}
}
setText("");
return this;
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (SpeciesPatternSmallShape spss : spssList) {
if (spss == null) {
continue;
}
spss.paintSelf(g);
}
}
};
// TODO: here are the renderers associated with the columns
reactionsTable.getColumnModel().getColumn(BioModelEditorReactionTableModel.COLUMN_LINK).setCellRenderer(tableCellRenderer);
reactionsTable.getColumnModel().getColumn(BioModelEditorReactionTableModel.COLUMN_EQUATION).setCellRenderer(rbmReactionExpressionCellRenderer);
reactionsTable.getColumnModel().getColumn(BioModelEditorReactionTableModel.COLUMN_DEFINITION).setCellRenderer(rbmReactionDefinitionCellRenderer);
speciesTable.getColumnModel().getColumn(BioModelEditorSpeciesTableModel.COLUMN_NAME).setCellRenderer(rbmSpeciesNameCellRenderer);
speciesTable.getColumnModel().getColumn(BioModelEditorSpeciesTableModel.COLUMN_LINK).setCellRenderer(tableCellRenderer);
molecularTypeTable.getColumnModel().getColumn(MolecularTypeTableModel.Column.link.ordinal()).setCellRenderer(tableCellRenderer);
observablesTable.getColumnModel().getColumn(ObservableTableModel.Column.species_pattern.ordinal()).setCellRenderer(rbmObservablePatternCellRenderer);
observablesTable.getColumnModel().getColumn(ObservableTableModel.Column.structure.ordinal()).setCellRenderer(tableRenderer);
// all "depictions" have their own renderer
molecularTypeTable.getColumnModel().getColumn(MolecularTypeTableModel.Column.depiction.ordinal()).setCellRenderer(rbmMolecularTypeShapeDepictionCellRenderer);
molecularTypeTable.getColumnModel().getColumn(MolecularTypeTableModel.Column.depiction.ordinal()).setMaxWidth(180);
speciesTable.getColumnModel().getColumn(BioModelEditorSpeciesTableModel.COLUMN_DEPICTION).setCellRenderer(rbmSpeciesShapeDepictionCellRenderer);
speciesTable.getColumnModel().getColumn(BioModelEditorSpeciesTableModel.COLUMN_DEFINITION).setCellRenderer(rbmTableRenderer);
observablesTable.getColumnModel().getColumn(ObservableTableModel.Column.depiction.ordinal()).setCellRenderer(rbmObservableShapeDepictionCellRenderer);
reactionsTable.getColumnModel().getColumn(BioModelEditorReactionTableModel.COLUMN_DEPICTION).setCellRenderer(rbmReactionShapeDepictionCellRenderer);
reactionsTable.getColumnModel().getColumn(BioModelEditorReactionTableModel.COLUMN_DEPICTION).setPreferredWidth(180);
observablesTable.getColumnModel().getColumn(ObservableTableModel.Column.type.ordinal()).setCellEditor(observableTableModel.getObservableTypeComboBoxEditor());
observableTableModel.updateObservableTypeComboBox();
reactionsTable.addMouseListener(eventHandler);
reactionsTable.addKeyListener(eventHandler);
speciesTable.addMouseListener(eventHandler);
speciesTable.addKeyListener(eventHandler);
molecularTypeTable.addMouseListener(eventHandler);
molecularTypeTable.addKeyListener(eventHandler);
observablesTable.addMouseListener(eventHandler);
observablesTable.addKeyListener(eventHandler);
structuresTable.addKeyListener(eventHandler);
}
use of cbit.vcell.model.ReactantPattern in project vcell by virtualcell.
the class RbmUtils method parseReactionRule.
public static ReactionRule parseReactionRule(String inputString, String name, Structure structure, BioModel bioModel) throws ParseException {
try {
String label = name;
// int labelIndex = inputString.indexOf(':'); // TODO: the way we edit reaction rules now, we have no labels here
// String label = "";
// if(labelIndex>=0) {
// label = inputString.substring(0, labelIndex);
// inputString = inputString.substring(labelIndex+1);
// }
// if(label.isEmpty() || (reactionRuleNames.indexOf(label) != -1)) {
// do { // no label or label in use, we generate new label
// label = generateReactionRuleName();
// } while(reactionRuleNames.indexOf(label) != -1);
// reactionRuleNames.add(label);
// } else {
// reactionRuleNames.add(label);
// }
int arrowIndex = inputString.indexOf("<->");
boolean bReversible = true;
if (arrowIndex < 0) {
arrowIndex = inputString.indexOf("->");
bReversible = false;
}
String left = inputString.substring(0, arrowIndex).trim();
String right = inputString.substring(arrowIndex + (bReversible ? 3 : 2)).trim();
if (left.length() == 0 && right.length() == 0) {
return null;
}
// note that the constructor will try to honor the label from the editor but will generate a new one if already in use
ReactionRule reactionRule = bioModel.getModel().getRbmModelContainer().createReactionRule(label, structure, bReversible);
String regex = "[^!]\\+";
String[] patterns = left.split(regex);
for (String sp : patterns) {
SpeciesPattern speciesPattern = parseSpeciesPattern(sp, bioModel.getModel());
reactionRule.addReactant(new ReactantPattern(speciesPattern, reactionRule.getStructure()));
}
patterns = right.split(regex);
for (String sp : patterns) {
SpeciesPattern speciesPattern = parseSpeciesPattern(sp, bioModel.getModel());
reactionRule.addProduct(new ProductPattern(speciesPattern, reactionRule.getStructure()));
}
return reactionRule;
} catch (Throwable ex) {
ex.printStackTrace();
throw new ParseException(ex.getMessage());
}
}
use of cbit.vcell.model.ReactantPattern in project vcell by virtualcell.
the class ReactionRuleEditorPropertiesPanel method addReactant.
public void addReactant() {
ReactantPattern reactant = new ReactantPattern(new SpeciesPattern(), reactionRule.getStructure());
reactionRule.addReactant(reactant);
final TreePath path = reactantTreeModel.findObjectPath(null, reactant);
reactantTree.setSelectionPath(path);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
reactantTree.scrollPathToVisible(path);
// productTreeModel.populateTree();
}
});
}
use of cbit.vcell.model.ReactantPattern 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