Subversion Repositories wimsdev

Rev

Rev 3662 | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. /*
  2.     Sketch Elements: Chemistry molecular diagram drawing tool.
  3.    
  4.     (c) 2008 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.ds;
  12.  
  13. import WIMSchem.*;
  14.  
  15. import java.io.*;
  16. import java.awt.*;
  17. import java.util.*;
  18. import java.awt.event.*;
  19. import javax.swing.*;
  20. import javax.swing.event.*;
  21. import javax.swing.table.*;
  22.  
  23. /*
  24.     A dialog box which allows the columns of a table to be edited, and then calculates the effect of such edits.
  25. */
  26.  
  27. public class DialogEditColumns extends JDialog implements ActionListener
  28. {
  29.     private JButton bappend,bdelete,bmoveup,bmovedn,baccept,breject;
  30.     private JTable table;
  31.     private SchemaDataModel model;
  32.     private DataSheet ds;
  33.  
  34.     private ArrayList<Integer> idx=new ArrayList<Integer>();
  35.     private ArrayList<String> name=new ArrayList<String>();
  36.     private ArrayList<Integer> type=new ArrayList<Integer>();
  37.     private ArrayList<String> descr=new ArrayList<String>();
  38.    
  39.     private int[] resultOldPos=null,resultNewPos=null,resultType=null;
  40.     private String[] resultName=null,resultDescr=null;
  41.    
  42.     public DialogEditColumns(Frame Parent,DataSheet DS)
  43.     {
  44.         super(Parent,"Edit Column Layout",true);
  45.         ds=DS;
  46.        
  47.         setLayout(new BorderLayout());
  48.        
  49.         for (int n=0;n<ds.numCols();n++)
  50.         {
  51.             idx.add(new Integer(n+1));
  52.             name.add(ds.colName(n));
  53.             type.add(new Integer(ds.colType(n)));
  54.             descr.add(ds.colDescr(n));
  55.         }
  56.         model=new SchemaDataModel(idx,name,type,descr);
  57.         table=new JTable(model);
  58.            
  59.         setColumnModel();
  60.        
  61.         JPanel buttons=new JPanel();
  62.         buttons.setLayout(new FlowLayout(FlowLayout.RIGHT));
  63.         bappend=new JButton("Append"); bappend.addActionListener(this); bappend.setMnemonic(KeyEvent.VK_P);
  64.         bdelete=new JButton("Delete"); bdelete.addActionListener(this); bdelete.setMnemonic(KeyEvent.VK_D);
  65.         bmoveup=new JButton("Move Up"); bmoveup.addActionListener(this); bmoveup.setMnemonic(KeyEvent.VK_U);
  66.         bmovedn=new JButton("Move Down"); bmovedn.addActionListener(this); bmovedn.setMnemonic(KeyEvent.VK_N);
  67.         baccept=new JButton("Accept"); baccept.addActionListener(this); baccept.setMnemonic(KeyEvent.VK_A);
  68.         breject=new JButton("Reject"); breject.addActionListener(this); breject.setMnemonic(KeyEvent.VK_R);
  69.  
  70.         buttons.add(bappend);
  71.         buttons.add(bdelete);
  72.         buttons.add(bmoveup);
  73.         buttons.add(bmovedn);
  74.         buttons.add(baccept);
  75.         buttons.add(breject);
  76.  
  77.         add(new JScrollPane(table),BorderLayout.CENTER);
  78.         add(buttons,BorderLayout.SOUTH);
  79.        
  80.         pack();
  81.     }
  82.  
  83.     private void setColumnModel()
  84.     {
  85.         JComboBox colTypes=new JComboBox();
  86.         colTypes.addItem(DataSheet.typeName(DataSheet.COLTYPE_MOLECULE));
  87.         colTypes.addItem(DataSheet.typeName(DataSheet.COLTYPE_STRING));
  88.         colTypes.addItem(DataSheet.typeName(DataSheet.COLTYPE_REAL));
  89.         colTypes.addItem(DataSheet.typeName(DataSheet.COLTYPE_INTEGER));
  90.         colTypes.addItem(DataSheet.typeName(DataSheet.COLTYPE_BOOLEAN));
  91.         table.getColumnModel().getColumn(2).setCellEditor(new DefaultCellEditor(colTypes));
  92.         table.setPreferredScrollableViewportSize(new Dimension(350,200));
  93.         table.getColumnModel().getColumn(0).setMaxWidth(40);
  94.         table.getColumnModel().getColumn(1).setMaxWidth(150);
  95.         table.getColumnModel().getColumn(2).setMaxWidth(100);
  96.     }
  97.  
  98.     private void actionAppend()
  99.     {
  100.         idx.add(0);
  101.         name.add("");
  102.         type.add(DataSheet.COLTYPE_STRING);
  103.         descr.add("");
  104.         model.fireTableStructureChanged();
  105.         setColumnModel();
  106.     }
  107.  
  108.     private void actionDelete()
  109.     {
  110.         int i=table.getSelectedRow();
  111.         if (i<0) return;
  112.         idx.remove(i);
  113.         name.remove(i);
  114.         type.remove(i);
  115.         descr.remove(i);
  116.         model.fireTableStructureChanged();
  117.         setColumnModel();
  118.     }
  119.    
  120.     private void actionMove(int Dir)
  121.     {
  122.         int i=table.getSelectedRow();
  123.         if (i<0 || i+Dir<0 || i+Dir>=idx.size()) return;
  124.  
  125.         idx.add(i+Dir,idx.remove(i));
  126.         name.add(i+Dir,name.remove(i));
  127.         type.add(i+Dir,type.remove(i));
  128.         descr.add(i+Dir,descr.remove(i));
  129.  
  130.         model.fireTableStructureChanged();
  131.         setColumnModel();
  132.         table.changeSelection(i+Dir,table.getSelectedColumn(),false,false);
  133.     }
  134.  
  135.     private void actionAccept()
  136.     {
  137.         for (int n=0;n<idx.size();n++) if (name.get(n).length()==0)
  138.         {
  139.             JOptionPane.showMessageDialog(null,"All columns must be named.","Invalid",JOptionPane.ERROR_MESSAGE);
  140.             return;
  141.         }
  142.  
  143.         // count retained+new+deleted
  144.         int nsz=ds.numCols();
  145.         boolean[] retained=new boolean[ds.numCols()];
  146.         for (int n=0;n<idx.size();n++)
  147.         {
  148.             int i=idx.get(n).intValue();
  149.             if (i==0) nsz++; else retained[i-1]=true;
  150.         }
  151.        
  152.         // build up the indices: add the retained and new columns first, then the deleted columns
  153.         int[] oldIdx=new int[nsz],newIdx=new int[nsz],newType=new int[nsz];
  154.         String[] newName=new String[nsz],newDescr=new String[nsz];
  155.        
  156.         int pos=0;
  157.         for (int n=0;n<idx.size();n++,pos++)
  158.         {
  159.             oldIdx[n]=idx.get(n).intValue()-1;
  160.             newIdx[n]=pos;
  161.             newName[n]=name.get(n);
  162.             newType[n]=type.get(n).intValue();
  163.             newDescr[n]=descr.get(n);
  164.         }
  165.         for (int n=0;n<retained.length;n++) if (!retained[n])
  166.         {
  167.             oldIdx[pos]=n;
  168.             newIdx[pos]=-1;
  169.             // (other fields left blank)
  170.             pos++;
  171.         }
  172.        
  173.         // make a string version of the to-do list
  174.         String explan="";
  175.         for (int n=0;n<oldIdx.length;n++)
  176.         {
  177.             if (oldIdx[n]<0 && newIdx[n]>=0)
  178.             {
  179.                 explan+="New column: ["+newName[n]+"], type: "+DataSheet.typeName(newType[n])+"\n";
  180.             }
  181.             else if (oldIdx[n]>=0 && newIdx[n]<0)
  182.             {
  183.                 explan+="Delete column: ["+ds.colName(oldIdx[n])+"]\n";
  184.             }
  185.             else if (oldIdx[n]>=0 && newIdx[n]>=0)
  186.             {
  187.                 if (newName[n].compareTo(ds.colName(oldIdx[n]))!=0)
  188.                     explan+="Rename ["+ds.colName(oldIdx[n])+"] to ["+newName[n]+"]\n";
  189.                 if (newDescr[n].compareTo(ds.colDescr(oldIdx[n]))!=0)
  190.                     explan+="Change description for ["+newName[n]+"]\n";
  191.                 if (ds.colType(oldIdx[n])!=newType[n])
  192.                     explan+="Change type of ["+newName[n]+"] to: "+DataSheet.typeName(newType[n])+"\n";
  193.                 if (newIdx[n]!=oldIdx[n])
  194.                     explan+="Reorder ["+newName[n]+"] from #"+(oldIdx[n]+1)+" to #"+(newIdx[n]+1)+"\n";
  195.             }
  196.         }
  197.         if (explan.length()==0) {setVisible(false); return;} // nothing to do, equivalent to reject
  198.        
  199.         String opt[]={"Yes","No"};
  200.         if (JOptionPane.showOptionDialog(null,explan,"Apply Changes?",
  201.                     JOptionPane.YES_NO_OPTION,JOptionPane.YES_NO_OPTION,null,opt,opt[0])!=JOptionPane.YES_OPTION) return;
  202.  
  203.         resultOldPos=oldIdx;
  204.         resultNewPos=newIdx;
  205.         resultName=newName;
  206.         resultType=newType;
  207.         resultDescr=newDescr;
  208.         setVisible(false);
  209.     }
  210.    
  211.     private void actionReject()
  212.     {
  213.         setVisible(false);
  214.     }
  215.  
  216.     // returns true if the datasheet has changed
  217.     public boolean execute()
  218.     {
  219.         setVisible(true);
  220.         return resultOldPos!=null;
  221.     }
  222.  
  223.     public int[] resultOldPos() {return resultOldPos;}
  224.     public int[] resultNewPos() {return resultNewPos;}
  225.     public String[] resultName() {return resultName;}
  226.     public int[] resultType() {return resultType;}
  227.     public String[] resultDescr() {return resultDescr;}
  228.  
  229.     public void actionPerformed(ActionEvent e)
  230.     {
  231.         if (e.getSource()==bappend) actionAppend();
  232.         else if (e.getSource()==bdelete) actionDelete();
  233.         else if (e.getSource()==bmoveup) actionMove(-1);
  234.         else if (e.getSource()==bmovedn) actionMove(1);
  235.         else if (e.getSource()==baccept) actionAccept();
  236.         else if (e.getSource()==breject) actionReject();
  237.     }
  238.    
  239.     // internal class for the underlying data
  240.    
  241.     class SchemaDataModel extends AbstractTableModel
  242.     {
  243.         ArrayList<Integer> idx;
  244.         ArrayList<String> name;
  245.         ArrayList<Integer> type;
  246.         ArrayList<String> descr;
  247.        
  248.         public SchemaDataModel(ArrayList<Integer> Idx,ArrayList<String> Name,ArrayList<Integer> Type,ArrayList<String> Descr)
  249.         {
  250.             idx=Idx;
  251.             name=Name;
  252.             type=Type;
  253.             descr=Descr;
  254.         }
  255.        
  256.         public String getColumnName(int col)
  257.         {
  258.             final String[] COLNAMES={"#","Name","Type","Description"};
  259.             return COLNAMES[col];
  260.         }
  261.         public int getRowCount() {return idx.size();}
  262.         public int getColumnCount() {return 4;}
  263.         public Object getValueAt(int row,int col)
  264.         {
  265.             if (col==0)
  266.             {
  267.                 int i=idx.get(row).intValue();
  268.                 return i==0 ? "" : ""+i;
  269.             }
  270.             else if (col==1) return name.get(row);
  271.             else if (col==2) return DataSheet.typeName(type.get(row).intValue());
  272.             else if (col==3) return descr.get(row);
  273.             return null;
  274.         }
  275.         public boolean isCellEditable(int row,int col) {return col>0;}
  276.         public void setValueAt(Object value,int row,int col)
  277.         {
  278.             if (col==1) name.set(row,(String)value);
  279.             else if (col==2)
  280.             {
  281.                 String t=(String)value;
  282.                 if (t.compareTo(DataSheet.typeName(DataSheet.COLTYPE_MOLECULE))==0) type.set(row,DataSheet.COLTYPE_MOLECULE);
  283.                 else if (t.compareTo(DataSheet.typeName(DataSheet.COLTYPE_STRING))==0) type.set(row,DataSheet.COLTYPE_STRING);
  284.                 else if (t.compareTo(DataSheet.typeName(DataSheet.COLTYPE_REAL))==0) type.set(row,DataSheet.COLTYPE_REAL);
  285.                 else if (t.compareTo(DataSheet.typeName(DataSheet.COLTYPE_INTEGER))==0) type.set(row,DataSheet.COLTYPE_INTEGER);
  286.                 else if (t.compareTo(DataSheet.typeName(DataSheet.COLTYPE_BOOLEAN))==0) type.set(row,DataSheet.COLTYPE_BOOLEAN);
  287.             }
  288.             else if (col==3) descr.set(row,(String)value);
  289.             fireTableCellUpdated(row,col);
  290.         }
  291.     }
  292.    
  293. }
  294.