Subversion Repositories wimsdev

Rev

Rev 7246 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3662 schaersvoo 1
/*
7246 schaersvoo 2
    Sketch Elements: Chemistry molecular diagram drawing tool.
3662 schaersvoo 3
 
4
    (c) 2005 Dr. Alex M. Clark
5
 
6
    Released as GNUware, under the Gnu Public License (GPL)
7
 
8
    See www.gnu.org for details.
9
*/
10
 
11
package WIMSchem;
12
 
13
import java.util.*;
14
import java.text.*;
15
import java.awt.*;
16
import java.awt.geom.*;
17
import java.awt.event.*;
18
import javax.swing.*;
19
import javax.swing.event.*;
20
 
21
/*
22
    A dialog box which allows tabulated editing of molecular data, as an alternative to doing all editing graphically.
23
*/
24
 
25
public class DialogEdit extends JDialog implements ActionListener
26
{
27
    Molecule mol,retMol=null;
28
    ArrayList<Integer> aselidx,bselidx;
29
 
30
    JTabbedPane tabs;
31
    JButton accept,reject;
32
    JTable atoms,bonds;
33
 
34
    static final String BOND_TYPES[]={"Normal","Inclined","Declined","Unknown"};
35
 
36
    public DialogEdit(Frame Parent,Molecule Mol,ArrayList<Integer> SelIdx)
37
    {
38
        super(Parent,"Edit Molecule",true);
7246 schaersvoo 39
        mol=Mol.clone();
3662 schaersvoo 40
        aselidx=SelIdx;
41
        bselidx=new ArrayList<Integer>();
7246 schaersvoo 42
        for (int n=1;n<=mol.numBonds();n++) if (aselidx.indexOf(mol.bondFrom(n))>=0 && aselidx.indexOf(mol.bondTo(n))>=0) bselidx.add(n);
3662 schaersvoo 43
 
44
        setLayout(new BorderLayout());
45
 
7246 schaersvoo 46
        atoms=new JTable(compileAtomData(),new String[]{"#","El","X","Y","Charge","Unpaired","HExplicit","MapNum"})
3662 schaersvoo 47
            {public boolean isCellEditable(int row,int column) {return column>0;}};
7246 schaersvoo 48
        bonds=new JTable(compileBondData(),new String[]{"#","From","To","Order","Type"})
3662 schaersvoo 49
            {public boolean isCellEditable(int row,int column) {return column>2;}};
50
 
51
        atoms.getColumnModel().getColumn(0).setCellEditor(null);
52
        JComboBox bondTypes=new JComboBox();
53
        for (int n=0;n<BOND_TYPES.length;n++) bondTypes.addItem(BOND_TYPES[n]);
54
        bonds.getColumnModel().getColumn(4).setCellEditor(new DefaultCellEditor(bondTypes));
55
 
56
        JPanel tabAtoms=new JPanel(),tabBonds=new JPanel();
57
        tabAtoms.setLayout(new BorderLayout());
58
        tabBonds.setLayout(new BorderLayout());
59
 
60
        atoms.setPreferredScrollableViewportSize(new Dimension(350,200));
61
        bonds.setPreferredScrollableViewportSize(new Dimension(350,200));
62
 
63
        tabAtoms.add(new JScrollPane(atoms));
64
        tabBonds.add(new JScrollPane(bonds));
65
 
66
        tabs=new JTabbedPane();
67
        tabs.addTab("Atoms",tabAtoms);
68
        tabs.addTab("Bonds",tabBonds);
69
        add(tabs,BorderLayout.CENTER);
70
 
71
        JPanel buttons=new JPanel();
72
        buttons.setLayout(new FlowLayout(FlowLayout.RIGHT));
73
        accept=new JButton("Accept"); accept.addActionListener(this); accept.setMnemonic(KeyEvent.VK_A);
74
        reject=new JButton("Reject"); reject.addActionListener(this); reject.setMnemonic(KeyEvent.VK_R);
75
        buttons.add(accept);
76
        buttons.add(reject);
77
        add(buttons,BorderLayout.SOUTH);
78
 
79
        pack();
80
    }
81
 
82
    public Molecule exec()
83
    {
84
        setVisible(true);
85
        return retMol;
86
    }
87
 
88
    public void actionPerformed(ActionEvent e)
89
    {
90
        if (e.getSource()==accept)
91
        {
92
            if (!ReadData()) return;
93
            retMol=mol;
94
            setVisible(false);
95
        }
96
        if (e.getSource()==reject) setVisible(false);
97
    }
98
 
7246 schaersvoo 99
    private Object[][] compileAtomData()
3662 schaersvoo 100
    {
101
        Object[][] data=new Object[aselidx.size()][];
102
 
7292 schaersvoo 103
        DecimalFormat fmt = new DecimalFormat("0.0000",new DecimalFormatSymbols(Locale.US));
3662 schaersvoo 104
 
105
        for (int n=0;n<aselidx.size();n++)
106
        {
107
            int i=aselidx.get(n).intValue();
108
            Object[] da=new Object[8];
109
            da[0]=new Integer(i);
7246 schaersvoo 110
            da[1]=new String(mol.atomElement(i));
111
            da[2]=fmt.format(mol.atomX(i));
112
            da[3]=fmt.format(mol.atomY(i));
113
            da[4]=String.valueOf(mol.atomCharge(i));
114
            da[5]=String.valueOf(mol.atomUnpaired(i));
115
            da[6]=mol.atomHExplicit(i)==Molecule.HEXPLICIT_UNKNOWN ? "?" : String.valueOf(mol.atomHExplicit(i));
116
            da[7]=String.valueOf(mol.atomMapNum(i));
3662 schaersvoo 117
            data[n]=da;
118
        }
119
 
120
        return data;
121
    }
122
 
7246 schaersvoo 123
    private Object[][] compileBondData()
3662 schaersvoo 124
    {
125
        Object[][] data=new Object[bselidx.size()][];
126
 
127
        for (int n=0;n<bselidx.size();n++)
128
        {
129
            int i=bselidx.get(n).intValue();
130
            Object[] db=new Object[5];
131
            db[0]=new Integer(i);
7246 schaersvoo 132
            db[1]=new Integer(mol.bondFrom(i));
133
            db[2]=new Integer(mol.bondTo(i));
134
            db[3]=String.valueOf(mol.bondOrder(i));
135
            db[4]=new String(BOND_TYPES[mol.bondType(i)]);
3662 schaersvoo 136
            data[n]=db;
137
        }
138
 
139
        return data;
140
    }
141
 
7246 schaersvoo 142
    private boolean ReadData()
3662 schaersvoo 143
    {
144
        for (int n=0;n<atoms.getRowCount();n++)
145
        {
146
            int i=(Integer)atoms.getValueAt(n,0);
7246 schaersvoo 147
            mol.setAtomElement(i,(String)atoms.getValueAt(n,1));
148
            mol.setAtomPos(i,Util.safeDouble((String)atoms.getValueAt(n,2)),Util.safeDouble((String)atoms.getValueAt(n,3)));
3662 schaersvoo 149
 
7246 schaersvoo 150
            mol.setAtomCharge(i,Util.safeInt((String)atoms.getValueAt(n,4)));
151
            mol.setAtomUnpaired(i,Util.safeInt((String)atoms.getValueAt(n,5)));
3662 schaersvoo 152
            String hyStr=(String)atoms.getValueAt(n,6);
7246 schaersvoo 153
            int hy=Util.safeInt(hyStr);
154
            mol.setAtomHExplicit(i,hyStr.compareTo("0")==0 ? 0 : hy>0 ? hy : Molecule.HEXPLICIT_UNKNOWN);
155
            mol.setAtomMapNum(i,Util.safeInt((String)atoms.getValueAt(n,7)));
3662 schaersvoo 156
        }
157
        for (int n=0;n<bonds.getRowCount();n++)
158
        {
159
            int i=(Integer)bonds.getValueAt(n,0);
7246 schaersvoo 160
            mol.setBondOrder(i,new Integer((String)bonds.getValueAt(n,3)).intValue());
3662 schaersvoo 161
            int type;
162
            for (int j=BOND_TYPES.length-1;j>=0;j--) if (BOND_TYPES[j].compareTo((String)bonds.getValueAt(n,4))==0)
7246 schaersvoo 163
                {mol.setBondType(i,j); break;}
3662 schaersvoo 164
        }
165
        return true;
166
    }
167
}