Clipboard sysClip = jcpPanel.getToolkit().getSystemClipboard();
if ("copy".equals(type)) {
handleSystemClipboard(sysClip);
IAtom atomInRange = null;
IChemObject object = getSource(e);
logger.debug("Source of call: ", object);
if (object instanceof IAtom) {
atomInRange = (IAtom) object;
} else {
atomInRange = renderModel.getHighlightedAtom();
}
if (atomInRange != null) {
IAtomContainer tocopyclone =
atomInRange.getBuilder().newInstance(IAtomContainer.class);
try {
tocopyclone.addAtom((IAtom) atomInRange.clone());
} catch (CloneNotSupportedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
addToClipboard(sysClip, tocopyclone);
}
else if(renderModel.getHighlightedBond()!=null){
IBond bond = renderModel.getHighlightedBond();
if (bond != null) {
IAtomContainer tocopyclone =
bond.getBuilder().newInstance(IAtomContainer.class);
try {
tocopyclone.addAtom((IAtom) bond.getAtom(0).clone());
tocopyclone.addAtom((IAtom) bond.getAtom(1).clone());
} catch (CloneNotSupportedException e1) {
e1.printStackTrace();
}
tocopyclone.addBond(bond.getBuilder().newInstance(IBond.class,tocopyclone.getAtom(0), tocopyclone.getAtom(1), bond.getOrder()));
addToClipboard(sysClip, tocopyclone);
}
}else if(renderModel.getSelection().getConnectedAtomContainer()!=null){
addToClipboard(sysClip,
renderModel.getSelection().getConnectedAtomContainer());
}else{
addToClipboard(sysClip, JChemPaintPanel.getAllAtomContainersInOne(chemModel));
}
} else if ("copyAsSmiles".equals(type)) {
handleSystemClipboard(sysClip);
try {
final IAtomContainer selection = renderModel.getSelection().getConnectedAtomContainer();
if(selection!=null){
final IChemObjectBuilder bldr = selection.getBuilder();
IChemModel selectionModel = bldr.newInstance(IChemModel.class);
selectionModel.setMoleculeSet(bldr.newInstance(IAtomContainerSet.class));
selectionModel.getMoleculeSet().addAtomContainer(selection);
sysClip.setContents(new SmilesSelection(CreateSmilesAction.getSmiles(selectionModel)), null);
}else{
sysClip.setContents(new SmilesSelection(CreateSmilesAction.getSmiles(chemModel)),null);
}
} catch (Exception e1) {
e1.printStackTrace();
}
} else if ("eraser".equals(type)) {
RemoveModule newActiveModule = new RemoveModule(jcpPanel.get2DHub());
newActiveModule.setID(type);
jcpPanel.get2DHub().setActiveDrawModule(newActiveModule);
IAtom atomInRange = null;
IBond bondInRange = null;
IChemObject object = getSource(e);
logger.debug("Source of call: ", object);
if (object instanceof IAtom) {
atomInRange = (IAtom) object;
} else {
atomInRange = renderModel.getHighlightedAtom();
}
if (object instanceof IBond) {
bondInRange = (IBond) object;
} else {
bondInRange = renderModel.getHighlightedBond();
}
if (atomInRange != null) {
jcpPanel.get2DHub().removeAtom(atomInRange);
renderModel.setHighlightedAtom(null);
} else if (bondInRange != null) {
jcpPanel.get2DHub().removeBond(bondInRange);
} else if(renderModel.getSelection()!=null && renderModel.getSelection().getConnectedAtomContainer()!=null){
IChemObjectSelection selection = renderModel.getSelection();
IAtomContainer selected = selection.getConnectedAtomContainer();
jcpPanel.get2DHub().deleteFragment(selected);
renderModel.setSelection(new LogicalSelection(
LogicalSelection.Type.NONE));
jcpPanel.get2DHub().updateView();
}
} else if(type.indexOf("pasteTemplate")>-1){
//if templates are shown, we extract the tab to show if any
String templatetab="";
if(type.indexOf("_")>-1){
templatetab=type.substring(type.indexOf("_")+1);
}
TemplateBrowser templateBrowser = new TemplateBrowser(templatetab);
if(templateBrowser.getChosenmolecule()!=null){
scaleStructure(templateBrowser.getChosenmolecule());
insertStructure(templateBrowser.getChosenmolecule(), renderModel);
jcpPanel.getRenderPanel().setZoomWide(true);
jcpPanel.get2DHub().getRenderer().getRenderer2DModel().setZoomFactor(1);
}
} else if ("paste".equals(type)) {
handleSystemClipboard(sysClip);
Transferable transfer = sysClip.getContents( null );
ISimpleChemObjectReader reader = null;
String content=null;
if (supported(transfer, molFlavor) ) {
StringBuffer sb = new StringBuffer();
try {
//StringBufferInputStream sbis=null;
//sbis = (StringBufferInputStream) transfer.getTransferData(molFlavor);
StringReader sbis=null;
sbis = (StringReader) transfer.getTransferData(molFlavor);
int x;
while((x=sbis.read())!=-1){
sb.append((char)x);
}
reader = new MDLReader(new StringReader(sb.toString()));
} catch (UnsupportedFlavorException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (Exception e1) {
reader = new RGroupQueryReader(new StringReader(sb.toString()));
}
} else if (supported(transfer, DataFlavor.stringFlavor) ) {
try {
content = (String) transfer.getTransferData(DataFlavor.stringFlavor);
reader = new ReaderFactory().createReader(new StringReader(content));
//System.out.println(reader.getClass());
} catch (Exception e1) {
e1.printStackTrace();
}
}
// if looks like CML - InputStream required. Reader throws error.
if(content!=null && content.indexOf("cml")>-1) {
reader = new CMLReader(new ByteArrayInputStream(content.getBytes()));
}
IAtomContainer toPaste = null;
boolean rgrpQuery=false;
if (reader != null) {
IAtomContainer readMolecule =
chemModel.getBuilder().newInstance(IAtomContainer.class);
try {
if (reader.accepts(IAtomContainer.class)) {
toPaste = (IAtomContainer) reader.read(readMolecule);
} else if (reader.accepts(ChemFile.class)) {
toPaste = readMolecule;
IChemFile file = (IChemFile) reader.read(new ChemFile());
for (IAtomContainer ac :
ChemFileManipulator.getAllAtomContainers(file)) {
toPaste.add(ac);
}
} else if (reader.accepts(RGroupQuery.class)) {
rgrpQuery=true;
IRGroupQuery rgroupQuery = (RGroupQuery) reader.read(new RGroupQuery(DefaultChemObjectBuilder.getInstance()));
chemModel = new ChemModel();
RGroupHandler rgHandler = new RGroupHandler(rgroupQuery, this.jcpPanel);
this.jcpPanel.get2DHub().setRGroupHandler(rgHandler);
chemModel.setMoleculeSet(rgHandler.getMoleculeSet(chemModel));
rgHandler.layoutRgroup();
}
} catch (CDKException e1) {
e1.printStackTrace();
}
}
//Attempt SMILES or InChI if no reader is found for content.
if(rgrpQuery!=true && toPaste == null &&
supported(transfer, DataFlavor.stringFlavor)) {
try{
if (content.toLowerCase().indexOf("inchi")>-1 ) {
toPaste = InChITool.parseInChI(content);
}
else {
SmilesParser sp = new SmilesParser(
DefaultChemObjectBuilder.getInstance());
toPaste = sp.parseSmiles(
((String) transfer.getTransferData(
DataFlavor.stringFlavor)).trim());
toPaste = new FixBondOrdersTool().kekuliseAromaticRings(toPaste);
IAtomContainerSet mols = ConnectivityChecker.partitionIntoMolecules(toPaste);
for(int i=0;i<mols.getAtomContainerCount();i++)
{
StructureDiagramGenerator sdg =
new StructureDiagramGenerator((IAtomContainer)mols.getAtomContainer(i));
sdg.setTemplateHandler(
new TemplateHandler(toPaste.getBuilder())
);
sdg.generateCoordinates();
}
//SMILES parser sets valencies, unset
for(int i=0;i<toPaste.getAtomCount();i++){
toPaste.getAtom(i).setValency(null);
}
}
} catch (Exception ex) {
jcpPanel.announceError(ex);
ex.printStackTrace();
}
}
if (toPaste != null || rgrpQuery==true) {
jcpPanel.getRenderPanel().setZoomWide(true);
jcpPanel.get2DHub().getRenderer().getRenderer2DModel().setZoomFactor(1);
if ( rgrpQuery==true) {
this.jcpPanel.setChemModel(chemModel);
}
else {
scaleStructure(toPaste);
insertStructure(toPaste, renderModel);
}
}
else{
JOptionPane.showMessageDialog(jcpPanel, GT.get("The content you tried to copy could not be read to any known format"), GT.get("Could not process content"), JOptionPane.WARNING_MESSAGE);
}
} else if (type.equals("cut")) {
handleSystemClipboard(sysClip);
IAtom atomInRange = null;
IBond bondInRange = null;
IChemObject object = getSource(e);
logger.debug("Source of call: ", object);
if (object instanceof IAtom) {
atomInRange = (IAtom) object;
} else {
atomInRange = renderModel.getHighlightedAtom();
}
if (object instanceof IBond) {
bondInRange = (IBond) object;
} else {
bondInRange = renderModel.getHighlightedBond();
}
IAtomContainer tocopyclone =
jcpPanel.getChemModel().getBuilder().newInstance(IAtomContainer.class);
if (atomInRange != null) {
tocopyclone.addAtom(atomInRange);
jcpPanel.get2DHub().removeAtom(atomInRange);
renderModel.setHighlightedAtom(null);
} else if (bondInRange != null) {
tocopyclone.addBond(bondInRange);
jcpPanel.get2DHub().removeBond(bondInRange);
}else if(renderModel.getSelection()!=null && renderModel.getSelection().getConnectedAtomContainer()!=null){
IChemObjectSelection selection = renderModel.getSelection();
IAtomContainer selected = selection.getConnectedAtomContainer();
tocopyclone.add(selected);
jcpPanel.get2DHub().deleteFragment(selected);
renderModel.setSelection(new LogicalSelection(
LogicalSelection.Type.NONE));
jcpPanel.get2DHub().updateView();
}
if(tocopyclone.getAtomCount()>0 || tocopyclone.getBondCount()>0)
addToClipboard(sysClip, tocopyclone);
}else if (type.equals("selectAll")) {
ControllerHub hub = jcpPanel.get2DHub();
IChemObjectSelection allSelection =
new LogicalSelection(LogicalSelection.Type.ALL);
allSelection.select(hub.getIChemModel());
renderModel.setSelection(allSelection);
SelectSquareModule succusorModule = new SelectSquareModule(hub);
succusorModule.setID("select");
MoveModule newActiveModule = new MoveModule(hub, succusorModule);
newActiveModule.setID("move");
hub.setActiveDrawModule(newActiveModule);
} else if (type.equals("selectFromChemObject")) {
// FIXME: implement for others than Reaction, Atom, Bond
IChemObject object = getSource(e);
if (object instanceof IAtom) {
SingleSelection<IAtom> container = new SingleSelection<IAtom>((IAtom)object);
renderModel.setSelection(container);
}
else if (object instanceof IBond) {
SingleSelection<IBond> container = new SingleSelection<IBond>((IBond)object);
renderModel.setSelection(container);
}
else if (object instanceof IReaction) {
IAtomContainer wholeModel =
jcpPanel.getChemModel().getBuilder().newInstance(IAtomContainer.class);
for (IAtomContainer container :
ReactionManipulator.getAllAtomContainers(
(IReaction)object)) {
wholeModel.add(container);
}
ShapeSelection container = new RectangleSelection();
for (IAtom atom : wholeModel.atoms()) {
container.atoms.add(atom);
}
for (IBond bond : wholeModel.bonds()) {
container.bonds.add(bond);
}
renderModel.setSelection(container);
}
else {
logger.warn("Cannot select everything in : ", object);
}
} else if (type.equals("selectReactionReactants")) {
IChemObject object = getSource(e);
if (object instanceof IReaction) {
IReaction reaction = (IReaction) object;
IAtomContainer wholeModel =
jcpPanel.getChemModel().getBuilder().newInstance(IAtomContainer.class);
for (IAtomContainer container :
MoleculeSetManipulator.getAllAtomContainers(
reaction.getReactants())) {
wholeModel.add(container);
}
ShapeSelection container = new RectangleSelection();
for (IAtom atom : wholeModel.atoms()) {
container.atoms.add(atom);
}
for (IBond bond : wholeModel.bonds()) {
container.bonds.add(bond);
}
renderModel.setSelection(container);
}
else {
logger.warn("Cannot select reactants from : ", object);
}
} else if (type.equals("selectReactionProducts")) {
IChemObject object = getSource(e);
if (object instanceof IReaction) {
IReaction reaction = (IReaction) object;
IAtomContainer wholeModel =
jcpPanel.getChemModel().getBuilder().newInstance(IAtomContainer.class);
for (IAtomContainer container :