001/*
002 * Version 0.70 01/04/2002
003 *
004 * Visit my url for update: http://www.geocities.com/beapetrovicova/
005 * 
006 * jFtp was developed by Bea Petrovicova <beapetrovicova@yahoo.com>.
007 * The design and implementation of jFtp are available for royalty-free 
008 * adoption and use. This software is provided 'as is' without any 
009 * guarantees. Copyright is retained by Bea Petrovicova. Redistribution 
010 * of any part of jFtp or any derivative works must include this notice.
011 * 
012 */  
013
014package cz.dhl.swing;
015
016import cz.dhl.io.CoFile;
017import cz.dhl.io.CoSort;
018import java.awt.Dimension;
019import java.awt.event.InputEvent;
020import java.awt.event.KeyAdapter;
021import java.awt.event.KeyEvent;
022import javax.swing.Icon;
023import javax.swing.JTable;
024import javax.swing.UIManager;
025import javax.swing.table.TableColumn;
026import javax.swing.table.AbstractTableModel;
027import javax.swing.table.DefaultTableCellRenderer;
028
029/* Unmap standard JTable TAB and ENTER actions / Java v1.3+ only 
030import java.awt.event.ActionEvent;
031import java.beans.PropertyChangeListener;
032import javax.swing.Action;
033import javax.swing.ActionMap; */
034
035/** 
036 * Swing Directory Selector Combo Box Component.<BR><BR>
037 *  <IMG SRC="JCoFileTable.gif"><BR><BR>
038 *
039 * <P><I>To listen for file selection making events:</I><BR>
040 * <CODE>
041 * fileList.getSelectionModel().addListSelectionListener(new ListSelectionListener()<BR>
042 * {&nbsp; public void valueChanged(ListSelectionEvent e)<BR>
043 * &nbsp;&nbsp; { myFileSelectHandler(); } } );
044 * </CODE></P>
045 *
046 * <P><I>To listen for file selection entering (doubleclick) events:</I><BR>
047 * <CODE>
048 * fileList.addMouseListener(new MouseAdapter()<BR>
049 * {&nbsp; public void mouseClicked(MouseEvent e)<BR>
050 * &nbsp;&nbsp; {&nbsp; if(e.getClickCount()>1)<BR>
051 * &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; myFileEnterHandler(); } } );
052 * </CODE></P>
053 * 
054 * @Version 0.70 01/04/2002
055 * @author Bea Petrovicova <beapetrovicova@yahoo.com>
056 * @see java.io.File
057 */
058public class JCoFileTable extends JTable 
059{  private Icon directoryIcon = null;
060   private Icon fileIcon = null;
061
062   private CoFile files[] = new CoFile[0], 
063                  origfiles[] = new CoFile[0];
064
065   private int orderI = CoSort.ORDER_BY_NAME;
066   private String filterS[] = {};
067
068   private void installIcons() 
069   {  if(directoryIcon==null)
070      {  directoryIcon = UIManager.getIcon("FileView.directoryIcon"); }
071      if(fileIcon==null)
072      {  fileIcon = UIManager.getIcon("FileView.fileIcon"); } }
073
074   final private DefaultTableCellRenderer renderer = new DefaultTableCellRenderer()
075   {  public void setValue(Object value)
076      {  if(value instanceof CoFile) 
077         {  installIcons(); 
078            CoFile f = (CoFile)value; 
079            Icon icon;
080            if(f.isDirectory())
081               icon = directoryIcon;
082            else icon = fileIcon;
083            if(icon!=null)
084               setIcon(icon);
085            setText(f.getName()); 
086         } else super.setValue(value);
087      }
088   };
089
090   final private AbstractTableModel model = new AbstractTableModel() 
091   {  String names[] = {"File Name", "Property", "Last Modified"};
092      public int getColumnCount() 
093      {  return 3; }
094      public int getRowCount() 
095      {  return files.length; }
096      public Object getValueAt(int row, int col) 
097      {  Object item;
098         switch(col)
099         {  case 0: item = files[row]; break;
100            case 1: item = files[row].propertyString(); break;
101            case 2: item = files[row].lastModifiedString(); break;
102            default: item = "";
103         } return item;
104      }
105      public String getColumnName(int column) { return names[column]; }
106   };
107   
108   /* Unmap standard JTable TAB and ENTER actions / Java v1.3+ only 
109   static class NullAction implements Action
110   {  Action delegate; boolean setOnce = false;
111      public NullAction(JTable table, Action delegate)
112      {  this.delegate = delegate; }
113      public void addPropertyChangeListener(PropertyChangeListener listener)
114      {  delegate.addPropertyChangeListener(listener); }
115      public void removePropertyChangeListener(PropertyChangeListener listener)
116      {  delegate.removePropertyChangeListener(listener); }
117      public Object getValue(String key)
118      {  return delegate.getValue(key); }
119      public void putValue(String key, Object value)
120      {  delegate.putValue(key, value); }
121      public void setEnabled(boolean enabled)
122      {  delegate.setEnabled(enabled); }
123      public boolean isEnabled()
124      {  return delegate.isEnabled(); }
125      public void actionPerformed(ActionEvent event) { }
126   } */
127
128   public JCoFileTable() 
129   {  setModel(model);
130      TableColumn column = getColumn("File Name");
131      column.setCellRenderer(renderer);
132      setIntercellSpacing(new Dimension(0, 0)); 
133      setShowGrid(false);
134
135      /* Select file on character typed */
136      addKeyListener(new KeyAdapter()
137      {  public void keyTyped(KeyEvent e) 
138         {  char ch=e.getKeyChar(); int is[] = getSelectedRows();
139            if(e.getModifiers() != InputEvent.SHIFT_MASK)
140            {  for(int i=(is.length>0?is[is.length-1]+1:0);i<files.length;i++)
141                  if(files[i].startsWithIgnoreCase(ch))
142                  {  setSelectedFile(files[i]); return; }
143               for(int i=0;i<files.length;i++)
144                  if(files[i].startsWithIgnoreCase(ch))
145                  {  setSelectedFile(files[i]); return; } }
146            else
147            {  for(int i=(is.length>0?is[is.length-1]-1:0);i>=0;i--)
148                  if(files[i].startsWithIgnoreCase(ch))
149                  {  setSelectedFile(files[i]); return; }
150               for(int i=files.length-1;i>=0;i--)
151                  if(files[i].startsWithIgnoreCase(ch))
152                  {  setSelectedFile(files[i]); return; } }
153         } } ); 
154
155      /* Unmap standard JTable TAB and ENTER actions / Java v1.3+ only 
156      ActionMap map = getActionMap();
157      map.put("selectNextColumnCell", new NullAction(this,map.get("selectNextColumnCell"))); 
158      map.put("selectPreviousColumnCell", new NullAction(this,map.get("selectPreviousColumnCell"))); 
159      map.put("selectNextRowCell", new NullAction(this,map.get("selectNextRowCell"))); 
160      map.put("selectPreviousRowCell", new NullAction(this,map.get("selectPreviousRowCell"))); */
161   }
162
163   /** Gets files denoted by this component.
164    * @return files denoted by component or null */
165   public CoFile[] getFiles()
166   {  return origfiles; }
167
168   /** Sets files to be denoted by this component.
169    * @parameter files to be denoted by component or null */
170   public void setFiles(CoFile files[])
171   {  
172      if(files==null) 
173         origfiles = new CoFile[0];
174      else origfiles = files;
175      this.files = CoSort.listSplit(CoSort.listOrder
176           (CoSort.listFilter(origfiles,filterS),orderI)); 
177      setEnabled((this.files.length>0));
178      model.fireTableDataChanged();
179   }      
180
181   /** Gets file denoted by (user) selection. 
182    * @return file denoted by (user) selection 
183    * or null for no/multiple selection */
184   public CoFile getSelectedFile()
185   {  int is[] = getSelectedRows();
186      if(is!=null && is.length==1 &&
187         is[0]>=0 && is[0]<files.length)
188         return files[is[0]];
189      else return null;
190   }
191
192   /** Sets file denoted by selection. 
193    * @parameter file to be denoted by selection */
194   public void setSelectedFile(CoFile file)
195   {  clearSelection();
196      for(int j=0;j<this.files.length;j++)
197          if(this.files[j].equals(file))
198            {  addRowSelectionInterval(j,j); break; }
199   }
200   
201   /** Gets files denoted by (user) selection. 
202    * @return files denoted by (user) selection */
203   public CoFile[] getSelectedFiles()
204   {  int is[] = getSelectedRows();
205      CoFile fs[] = new CoFile[is.length];
206      for(int i=0;i<is.length;i++)
207         fs[i] = files[is[i]];
208      return fs;
209   }
210
211   /** Sets files denoted by selection. 
212    * @parameter files to be denoted by selection */
213   public void setSelectedFiles(CoFile files[])
214   {  clearSelection();
215      for(int i=0;i<files.length;i++)
216         for(int j=0;j<this.files.length;j++)
217            if(this.files[j].equals(files[i]))
218            {  addRowSelectionInterval(j,j); break; }
219   }
220
221   /** Deselects all files denoted by (user) selection. */
222   public void deselectAllFiles()
223   {  clearSelection(); }
224
225   /** Sets file order.
226    * @param must be one of following optional values:
227    * @see cz.dhl.io.CoSort#ORDER_BY_NAME
228    * @see cz.dhl.io.CoSort#ORDER_BY_TYPE
229    * @see cz.dhl.io.CoSort#ORDER_BY_SIZE
230    * @see cz.dhl.io.CoSort#ORDER_BY_DATE
231    * @see cz.dhl.io.CoSort#ORDER_BY_PATH
232    * @see cz.dhl.io.CoSort#ORDER_BY_NONE
233    * @see cz.dhl.io.CoSort#ORDER_INVERSE */
234   public void setOrder(int order)
235   {  this.orderI = order;
236      setFiles(origfiles); }
237
238   /** Sets file filter.
239    * @parameter filter must be array of uppercase strings with a leading '.' sign; 
240    * example: { ".TXT", ".HTM", ".HTML", etc ... } */
241   public void setFilter(String filter[])
242   {  this.filterS = filter;
243      setFiles(origfiles); }
244}