Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: dr/davmgr/swingview/internalframes/views/UrlsTableViewController.java


1   package dr.davmgr.swingview.internalframes.views;
2   
3   import java.awt.Point;
4   import java.awt.event.*;
5   import java.awt.dnd.*;
6   import java.awt.Component;
7   import java.awt.Insets;
8   import java.awt.Rectangle;
9   import java.util.EventListener;
10  import java.util.List;
11  import java.util.Vector;
12  import javax.swing.*;
13  import javax.swing.table.JTableHeader;
14  import javax.swing.table.TableColumn;
15  import javax.swing.table.TableModel;
16  import javax.swing.event.TableModelListener;
17  import java.io.IOException;
18  
19  import java.awt.Graphics;
20  import java.awt.FontMetrics;
21  import java.awt.datatransfer.*;
22  import java.awt.Cursor;
23  
24  import dr.davmgr.protocol.Urls;
25  import dr.davmgr.swingview.*;
26  import dr.mime.*;
27  
28  public class UrlsTableViewController 
29   extends DefaultView
30   implements MouseListener, DragGestureListener, DropTargetListener,
31    DragSourceListener, KeyListener
32  {
33    private UrlsTableViewModel tableModel = null;
34    private JTable table = null;
35    
36    private Urls urls = null;
37    private EventListener eventListener =null;
38    private JScrollPane scrollPane=null;
39  
40    private DragSource dragSource = null;
41  
42    public void addEventListener(EventListener eventListener) {
43      this.eventListener=eventListener;
44      if (table!=null) {
45        if (eventListener instanceof MouseListener)
46    table.addMouseListener((MouseListener)eventListener);
47        if (eventListener instanceof MouseMotionListener) 
48    table.addMouseMotionListener(
49      (MouseMotionListener)eventListener);
50      }
51    }
52    public void removeEventListener(EventListener eventListener) {
53      if (eventListener==null) return;
54      if (table!=null)  {
55        if (eventListener instanceof MouseListener)
56    table.removeMouseListener((MouseListener)eventListener);
57        if (eventListener instanceof MouseMotionListener)
58    table.removeMouseMotionListener(
59      (MouseMotionListener)eventListener);
60      }
61      if (tableModel!=null)    
62        if (eventListener instanceof TableModelListener)
63    tableModel.removeTableModelListener(
64      (TableModelListener)eventListener);
65    }
66    public void setScrollPane(JScrollPane scrollPane) {
67      this.scrollPane=scrollPane;
68    }
69    public synchronized void modelChanged() {
70      tableModel.setUrls(tableModel.getUrls());
71    }
72    public Urls getUrls() {
73      return tableModel.getUrls();
74    }
75    public Component getComponent() {
76      return table;
77    }  
78    public void setUrls(Urls urls) {
79      if (tableModel==null) {
80        tableModel=new UrlsTableViewModel(urls);
81        if (eventListener instanceof TableModelListener)
82    tableModel.addTableModelListener((TableModelListener)eventListener);
83      } else tableModel.setUrls(urls);
84  
85      if (table==null) {
86        table=new MyJTable(tableModel);
87        
88        table.addKeyListener(this);
89        
90        if (useDnD()) {
91    dragSource=new DragSource();
92    dragSource.createDefaultDragGestureRecognizer( table, 
93      DnDConstants.ACTION_COPY_OR_MOVE, this);
94    table.setDropTarget(new DropTarget(table,this));  
95        }    
96  
97        
98        table.setDefaultRenderer(new Object().getClass(), 
99    new UrlsTableViewCellRenderer(tableModel));
100       table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
101 
102       JLabel l=new JLabel("");
103       FontMetrics fm = scrollPane.getGraphics().getFontMetrics();
104       TableColumn tc;
105       for (int i=0; i<tableModel.getColumnCount(); i++) {
106   tc = table.getColumn(tableModel.getColumnName(i));
107   tc.setWidth(fm.charsWidth("MMMMMMMMMMMMMM".toCharArray(), 0, 14));
108   table.sizeColumnsToFit(i);
109       } 
110       tc=null;
111 
112       table.setShowGrid(false);
113       table.getTableHeader().addMouseListener(this);
114       if (eventListener instanceof MouseListener)
115   table.addMouseListener((MouseListener)eventListener);
116       if (eventListener instanceof MouseMotionListener) 
117   table.addMouseMotionListener(
118     (MouseMotionListener)eventListener);
119     } else {
120       if (table.isEditing()) {
121   DefaultCellEditor ce = (DefaultCellEditor)table.getCellEditor();
122   ce.cancelCellEditing();
123       }
124       table.setModel(tableModel);
125     }  
126     if (tableModel.showLocked()) {
127       TableColumn tc = table.getColumn(tableModel.getColumnName(0));
128       tc.setMaxWidth(20);
129       tc.setMinWidth(20);
130     }
131       
132     if (scrollPane.getViewport().getView()!=table) 
133       scrollPane.setViewportView(table);
134     scrollPane.getViewport().setBackground(table.getBackground());  
135   }
136   public synchronized List getSelectedUrls() {
137     if ((table==null)||(tableModel==null)) return null;
138     if (table.getSelectedRowCount()==0) return null;
139     int rowsIdx[] = table.getSelectedRows();
140     Vector v = new Vector();
141     Urls urls ;
142     for (int i=0; i<rowsIdx.length; i++) {
143       if ((urls=tableModel.getRow(rowsIdx[i]))!=null) v.add(urls);
144     }  
145     if (v.size()==0) return null;
146     return v;
147   }
148   public void setSelection(boolean all) {
149     if (table==null) return;
150     if (!all) table.clearSelection();
151   }
152   public synchronized void setSelection(int x, int y) {
153     int row;
154     if (table.getSelectedRows().length==0)
155       if ((row=table.rowAtPoint(new Point(x,y)))>-1)
156   table.setRowSelectionInterval(row,row);
157   }
158   public void setOrder(String columnName, int order) {
159     if (table==null) return;
160     tableModel.newOrder(columnName, order);
161     
162   }
163   public void mouseClicked(MouseEvent e) {
164     Object source = e.getSource();
165     if (source instanceof JTableHeader) {
166     // if (e.getClickCount==2) 
167       if ((tableModel==null)||(table==null)) return;
168       tableModel.newOrder(
169   table.getColumnName(
170     table.columnAtPoint(new Point(e.getX(),e.getY()))
171   )
172       );
173     }//if
174   }//mouseClicked
175   public void mouseEntered(MouseEvent e)  { }
176   public void mouseExited(MouseEvent e) { }
177   public void mousePressed(MouseEvent e) { }
178   public void mouseReleased(MouseEvent e) { } 
179   private static DataFlavor[] dataFlavors = null;
180   private UrlsTransferData transferData = null;
181   public void dragGestureRecognized( DragGestureEvent event) {
182     InputEvent ie = event.getTriggerEvent();
183     Cursor cursor = DragSource.DefaultCopyDrop;
184     if (ie.isControlDown()) cursor=DragSource.DefaultMoveDrop;
185     transferData=null;
186     List dragList=getSelectedUrls();
187     if (dragList==null)  return;  
188     if (dragList.size()==0) return;
189     transferData=new UrlsTransferData(
190       getUrls(),
191       dragList, 
192       (ModelChangedListener)eventListener);
193 
194     try {
195       if (dataFlavors==null) {
196   try { 
197     dataFlavors=new DataFlavor[] { new 
198       DataFlavor("application/dr-davmgr-protocol-urls; class=dr.davmgr.swingview.internalframes.views.UrlsTransferData",null)};
199   } catch (IllegalArgumentException e) { 
200     e.printStackTrace();
201   }
202       }
203       dragSource.startDrag(event,
204   cursor,
205   this,
206   this);
207     } catch (InvalidDnDOperationException i) {
208     }
209   }
210 
211   public Object getTransferData(DataFlavor flavor)  {
212     return transferData;
213   }
214   public DataFlavor[] getTransferDataFlavors() {
215     return dataFlavors;
216   }
217   public boolean isDataFlavorSupported(DataFlavor flavor) {
218     return dataFlavors!=null;
219   }
220   public void finalize() {
221     removeEventListener(eventListener);
222     if (table!=null) table.setDropTarget(null);
223     if (tableModel!=null) tableModel.finalize();
224 
225     tableModel=null; 
226     if (urls!=null) urls.setUnread(); 
227     urls=null;
228     eventListener=null; table=null; scrollPane=null;
229   }
230   // DropTargetListener
231   public void drop(DropTargetDropEvent dtde) {
232     // System.err.println("Drop-Action:"+ dtde.getDropAction());
233     DataFlavor[] flavors = dtde.getCurrentDataFlavors();
234     Transferable t = dtde.getTransferable();
235     Object data = null;
236     try {
237       data= t.getTransferData(flavors[0]);
238     } catch (UnsupportedFlavorException ufe) { 
239     } catch (IOException ioe) { }
240     if ((data==null)&&(!(data instanceof UrlsTransferData))) {
241       dtde.rejectDrop();
242       return;
243     }  
244     // System.err.println(data+"->"+tableModel.getRow(table.getSelectedRow()));
245     Urls selectedRow=(Urls)tableModel.getRow(table.getSelectedRow());
246     dtde.acceptDrop(dtde.getDropAction());
247     fireDropAction(dtde.getDropAction(),(UrlsTransferData)data, selectedRow);
248   }
249   public void dragOver(DropTargetDragEvent dtde) {
250     DropTarget target = (DropTarget) dtde.getSource();
251     Point p = dtde.getLocation();
252     Component c = target.getComponent();
253     if (c instanceof JTable) {
254       JTable table = (JTable) c;
255       int row = table.rowAtPoint(p);
256       table.setRowSelectionInterval(row, row);
257     }
258   }
259   public void dragEnter(DropTargetDragEvent dtde) { }
260   public void dragExit(DropTargetEvent dte) { }
261   public void dropActionChanged(DropTargetDragEvent dtde) { }
262 
263   //DragSourceListener
264   public void dragDropEnd(DragSourceDropEvent dsde) { }
265   public void dragEnter(DragSourceDragEvent dsde) { }
266   public void dragExit(DragSourceEvent dse) { } 
267   public void dragOver(DragSourceDragEvent dsde) { }
268   public void dropActionChanged(DragSourceDragEvent dsde) { }
269 
270   private void fireDropAction(int type, UrlsTransferData data, Urls target) {
271     if (eventListener instanceof DropActionListener)
272       ((DropActionListener)eventListener).dropActionPerformed(type, data, target);
273   }
274 
275   
276   class MyJTable extends JTable implements Autoscroll {
277     public MyJTable(TableModel tableModel) {
278       super(tableModel);
279     }
280     public final int xd=15, yd=15, xi=20, yi=20;
281 
282     public void autoscroll(Point c) {
283      Point p = new Point();
284       Rectangle r = scrollPane.getViewport().getViewRect();
285       // System.err.println("\tr="+r);
286       // System.err.println("\tc="+c);
287       int xoff=0, yoff=0; 
288       if (Math.abs(r.x + r.width - c.x)<=xi) xoff=xd;
289       else if (Math.abs(r.x - c.x)<=xi) xoff=-xd;
290       if (r.x+xoff<0) xoff=0; 
291 
292       if (Math.abs(r.y + r.height - c.y)<=yi) yoff=yd;
293       else if (Math.abs(r.y - c.y)<=yi) yoff=-yd; 
294       if (r.y+yoff<0) yoff=0; 
295       scrollPane.getViewport().setViewPosition(
296         new Point(r.x+xoff,r.y+yoff));
297     }
298     public Insets getAutoscrollInsets() {
299       return new Insets(yi,xi,scrollPane.getViewport().getViewSize().height-2*yi, scrollPane.getViewport().getViewSize().width-2*xi);
300     }
301     
302   }
303   public void keyPressed(KeyEvent e) { }
304   public void keyReleased(KeyEvent e) { }
305   public void keyTyped(KeyEvent e) { 
306     char c = e.getKeyChar();
307     char cs;
308     int row=0;
309     if ((row=table.getSelectedRow())>-1) {
310       cs = tableModel.getRow(row).toString().charAt(0);
311       if (cs == c) {
312   if (row<tableModel.getRowCount()-1) {
313     row++;
314     cs = tableModel.getRow(row).toString().charAt(0);
315     if (cs==c) { 
316       table.setRowSelectionInterval(row,row);
317       table.scrollRectToVisible(table.getCellRect(row,0,false));
318       return;
319     } else {
320       for (int i=row; i<tableModel.getRowCount(); i++) {
321         cs = tableModel.getRow(i).toString().charAt(0);
322         if (cs==c) {
323     table.setRowSelectionInterval(i,i);
324     table.scrollRectToVisible(table.getCellRect(i,0,false));
325     return;
326         }    
327       }
328     }
329   }
330       }
331     }  
332     for (int i=0; i<tableModel.getRowCount(); i++) {
333       cs=tableModel.getRow(i).toString().charAt(0);
334       if (cs == c) {
335   table.setRowSelectionInterval(i,i);
336   table.scrollRectToVisible(table.getCellRect(i,0,false));
337   return;
338       }  
339     }//for
340   }
341 }//class