import chemaxon.formats.MolImporter;
import chemaxon.struc.Molecule;
import chemaxon.marvin.MolPrinter;
import javax.swing.*;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.awt.event.ActionEvent;
import java.awt.*;
import java.io.File;
import java.io.IOException;
@author
@version
@since
public class JFileChooserAccessory extends JPanel
implements PropertyChangeListener {
private MolImporter molImporter;
private MoleculeRenderer renderer;
private int position=0;
private long moleculeCount=0;
private Action moveForward = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
if (position < moleculeCount-1) {
position++;
setMolecule();
}
}
};
private Action moveBackward = new AbstractAction() {
public void actionPerformed(ActionEvent e) {
if (0<position) {
position--;
setMolecule();
}
}
};
private JButton forwardButton = new JButton(moveForward);
private JButton backwardButton = new JButton(moveBackward);
public JFileChooserAccessory(JFileChooser fileChooser) {
molImporter = new MolImporter();
renderer = new MoleculeRenderer();
fileChooser.addPropertyChangeListener(
JFileChooser.SELECTED_FILE_CHANGED_PROPERTY, this);
setLayout(new BorderLayout());
add(renderer, BorderLayout.CENTER);
JPanel buttonHolderPanel=new JPanel();
backwardButton.setText("<<");
forwardButton.setText(">>");
buttonHolderPanel.add(backwardButton);
buttonHolderPanel.add(forwardButton);
add(buttonHolderPanel, BorderLayout.SOUTH);
}
public void propertyChange(PropertyChangeEvent evt) {
File selection = (File)(evt.getNewValue());
if(selection != null) {
try {
molImporter.setFileName(selection.getAbsolutePath());
moleculeCount=getMolCount();
position=0;
setMolecule();
} catch (IOException exception) {
renderer.setMolecule(new Molecule());
}
}
}
private int getMolCount(){
int i = 0;
MolImporter importer = molImporter;
try {
while(importer.skipRecord()) {
i++;
}
} catch (IOException e) {
i=-1;
}
return i;
}
private void setMolecule() {
try {
molImporter.seekRecord(position, null);
renderer.setMolecule(molImporter.nextDoc().getPrimaryMolecule());
renderer.repaint();
} catch (IOException exception) {
renderer.setMolecule(new Molecule());
}
}
private static void createAndShowGUI() {
JFileChooser fileChooser = new JFileChooser();
JFileChooserAccessory accessory = new JFileChooserAccessory(fileChooser);
fileChooser.setAccessory(accessory);
fileChooser.showOpenDialog(null);
System.exit(0);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run() {
createAndShowGUI();
}
});
}
private static class MoleculeRenderer extends JComponent {
private MolPrinter mPrinter = new MolPrinter();
public void setMolecule(Molecule molecule) {
mPrinter.setMol(molecule);
}
public void paintComponent(Graphics g) {
mPrinter.setScale(mPrinter.maxScale(getSize()));
mPrinter.setBackgroundColor(this.getBackground());
mPrinter.paint((Graphics2D) g, getSize());
}
}
}