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 * { public void valueChanged(ListSelectionEvent e)<BR> 043 * { 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 * { public void mouseClicked(MouseEvent e)<BR> 050 * { if(e.getClickCount()>1)<BR> 051 * 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}