}
/* User has indicated that a certain atom in a substituent needs to become attachment point 1 or 2 */
else if (type.startsWith("setAtomApoAction")) {
rGroupHandler=hub.getRGroupHandler();
IAtom apoAtom = (IAtom) eventSource;
apoLoop:
for (Iterator<Integer> rnumItr=rGroupHandler.getrGroupQuery().getRGroupDefinitions().keySet().iterator(); rnumItr.hasNext();) {
for (RGroup rgrp: rGroupHandler.getrGroupQuery().getRGroupDefinitions().get(rnumItr.next()).getRGroups()) {
if(rgrp.getGroup().contains(apoAtom)) {
existingRGroupApo= new HashMap <RGroup,Map<Integer,IAtom>>();
HashMap<Integer,IAtom> map = new HashMap<Integer,IAtom>();
map.put(1, rgrp.getFirstAttachmentPoint());
map.put(2, rgrp.getSecondAttachmentPoint());
existingRGroupApo.put(rgrp,map);
boolean firstApo = type.endsWith("1");
if (firstApo) {
rgrp.setFirstAttachmentPoint(apoAtom);
}
else {
rgrp.setSecondAttachmentPoint(apoAtom);
}
break apoLoop;
}
}
}
}
/* User action : certain bond in the root needs to become attachment bond 1 or 2 */
else if (type.startsWith("setBondApoAction")) {
rGroupHandler=hub.getRGroupHandler();
IBond apoBond = (IBond) eventSource;
Map<Integer, IBond> apoBonds=null;
//Undo/redo business______
IAtom pseudo=null;
if (apoBond.getAtom(0) instanceof IPseudoAtom)
pseudo=apoBond.getAtom(0);
else
pseudo=apoBond.getAtom(1);
Map<Integer, IBond> keepApoBonds = new HashMap<Integer, IBond>();
if (rGroupHandler.getrGroupQuery().getRootAttachmentPoints()!=null &&
rGroupHandler.getrGroupQuery().getRootAttachmentPoints().get(pseudo)!=null) {
apoBonds= rGroupHandler.getrGroupQuery().getRootAttachmentPoints().get(pseudo);
for (Iterator<Integer> apoItr =apoBonds.keySet().iterator(); apoItr.hasNext();) {
int apoNum=apoItr.next();
keepApoBonds.put(apoNum,apoBonds.get(apoNum));
}
}
existingRootAttachmentPoints = new HashMap<IAtom, Map<Integer, IBond>>();
existingRootAttachmentPoints.put(pseudo, keepApoBonds);
//________________________
//Set the new Root APO
if (rGroupHandler.getrGroupQuery().getRootAttachmentPoints()==null) {
rGroupHandler.getrGroupQuery().setRootAttachmentPoints(new HashMap<IAtom, Map<Integer, IBond>>());
}
Map<IAtom, Map<Integer, IBond>> rootApo=rGroupHandler.getrGroupQuery().getRootAttachmentPoints();
if (rootApo.get(pseudo)==null) {
apoBonds=new HashMap<Integer,IBond>();
rootApo.put(pseudo, apoBonds);
}
else
apoBonds=rGroupHandler.getrGroupQuery().getRootAttachmentPoints().get(pseudo);
if (type.endsWith("1")) {
apoBonds.put(1, apoBond);
if (apoBonds.get(2)!=null && apoBonds.get(2).equals(apoBond))
apoBonds.remove(2);
}
if (type.endsWith("2")) {
apoBonds.put(2, apoBond);
if (apoBonds.get(1)!=null && apoBonds.get(1).equals(apoBond))
apoBonds.remove(1);
}
}
/* User action: certain atom+bond selection is to be the root structure. */
else if (type.equals("setRoot")) {
IAtomContainer atc =selection.getConnectedAtomContainer();
if (!isProperSelection(atc)) {
JOptionPane.showMessageDialog(jcpPanel, GT.get("Please do not make a fragmented selection."));
return;
}
molecule = createMolecule (atc,existingAtomDistr,existingBondDistr);
hub.getChemModel().getMoleculeSet().addAtomContainer(molecule);
if (hub.getRGroupHandler() == null) {
isNewRgroup=true;
rgrpQuery = newRGroupQuery(molecule.getBuilder());
rGroupHandler = new RGroupHandler(rgrpQuery, this.jcpPanel);
hub.setRGroupHandler(rGroupHandler);
}
else {
rGroupHandler=hub.getRGroupHandler();
rgrpQuery = hub.getRGroupHandler().getrGroupQuery();
if(rgrpQuery.getRootStructure()!=null) {
existingRoot=rgrpQuery.getRootStructure();
rgrpQuery.getRootStructure().removeProperty(CDKConstants.TITLE);
}
}
molecule.setProperty(CDKConstants.TITLE,RGroup.ROOT_LABEL);
rgrpQuery.setRootStructure(molecule);
//Remove old root apo's
existingRootAttachmentPoints = rgrpQuery.getRootAttachmentPoints();
rgrpQuery.setRootAttachmentPoints(null);
//Define new root apo's
Map<IAtom, Map<Integer, IBond>> apoBonds= new HashMap<IAtom, Map<Integer, IBond>>();
for (IAtom atom : molecule.atoms()) {
if (atom instanceof IPseudoAtom) {
IPseudoAtom pseudo = (IPseudoAtom)atom;
if (pseudo.getLabel()!=null && RGroupQuery.isValidRgroupQueryLabel(pseudo.getLabel())) {
chooseRootAttachmentBonds(pseudo,molecule,apoBonds);
}
}
}
rgrpQuery.setRootAttachmentPoints(apoBonds);
}
/* User action: certain atom+bond selection is to be a substituent. */
else if (type.equals("setSubstitute")) {
if (hub.getRGroupHandler() == null || hub.getRGroupHandler().getrGroupQuery()==null ||
hub.getRGroupHandler().getrGroupQuery().getRootStructure()==null) {
JOptionPane.showMessageDialog(jcpPanel, GT.get("Please define a root structure first."));
return;
}
IAtomContainer atc =selection.getConnectedAtomContainer();
if (!isProperSelection(atc)) {
JOptionPane.showMessageDialog(jcpPanel, GT.get("Please do not make a fragmented selection."));
return;
}
// Check - are there any R-groups -> collect them so that user input can be validated
Map<Integer,Integer> validRnumChoices=new HashMap<Integer,Integer>();
for (IAtom atom : hub.getRGroupHandler().getrGroupQuery().getRootStructure().atoms()) {
if (atom instanceof IPseudoAtom) {
IPseudoAtom pseudo = (IPseudoAtom)atom;
if (pseudo.getLabel()!=null && RGroupQuery.isValidRgroupQueryLabel(pseudo.getLabel())) {
int bondCnt=0;
int rNum=new Integer(pseudo.getLabel().substring(1));
for (IBond b : hub.getRGroupHandler().getrGroupQuery().getRootStructure().bonds())
if (b.contains(atom))
bondCnt++;
if ((!validRnumChoices.containsKey(rNum))||