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