Changeset 1874

Show
Ignore:
Timestamp:
05/14/09 10:49:16 (3 years ago)
Author:
eitan
Message:

fixes and enhancements to compositetableview: renamed some variables; added dnd drop support; fixed an edt violation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • jmatter-complet/trunk/modules/swingvm/src/com/u2d/view/swing/list/CompositeTableView.java

    r1872 r1874  
    77import com.u2d.list.CompositeList; 
    88import com.u2d.model.EObject; 
     9import com.u2d.model.ComplexEObject; 
     10import com.u2d.model.ComplexType; 
    911import com.u2d.ui.IconButton; 
    1012import javax.swing.*; 
    11 import javax.swing.event.ListSelectionListener; 
    12 import javax.swing.event.ListSelectionEvent; 
    13 import javax.swing.event.ChangeEvent; 
    14 import javax.swing.event.ListDataEvent; 
     13import javax.swing.event.*; 
    1514import java.awt.*; 
     15import java.awt.datatransfer.Transferable; 
     16import java.awt.datatransfer.DataFlavor; 
     17import java.awt.datatransfer.UnsupportedFlavorException; 
     18import java.awt.dnd.DropTarget; 
     19import java.awt.dnd.DropTargetAdapter; 
    1620import java.awt.event.ActionListener; 
    1721import java.awt.event.ActionEvent; 
    1822import java.beans.PropertyChangeListener; 
    1923import java.beans.PropertyChangeEvent; 
     24import java.io.IOException; 
     25import java.util.TooManyListenersException; 
    2026 
    2127/** 
     
    3137   private TableView _tableView; 
    3238   private JButton _addBtn, _removeBtn; 
    33    private JPanel northPanel; 
    34    private PropertyChangeListener readOnlyChangeListener; 
     39   private JPanel _northPanel; 
     40   private PropertyChangeListener _readOnlyChangeListener; 
    3541 
    3642   public CompositeTableView(CompositeList leo) 
     
    4854 
    4955      add(northPanel(), BorderLayout.PAGE_START); 
    50       northPanel.setVisible(!_leo.field().isReadOnly()); 
    51       readOnlyChangeListener = new PropertyChangeListener() 
     56      _northPanel.setVisible(!_leo.field().isReadOnly()); 
     57      _readOnlyChangeListener = new PropertyChangeListener() 
    5258      { 
    5359         public void propertyChange(PropertyChangeEvent evt) 
    5460         { 
    55             northPanel.setVisible(!_leo.field().isReadOnly()); 
     61            _northPanel.setVisible(!_leo.field().isReadOnly()); 
    5662         } 
    5763      }; 
    58       _leo.field().addPropertyChangeListener("readOnly", readOnlyChangeListener); 
     64      _leo.field().addPropertyChangeListener("readOnly", _readOnlyChangeListener); 
    5965 
    6066      JScrollPane scrollPane = new JScrollPane(_tableView); 
     
    6874         { 
    6975            if (e.getValueIsAdjusting()) return; 
    70             adjustRemoveBtnEnabled(); 
    71          } 
    72       }); 
    73    } 
     76            SwingUtilities.invokeLater(new Runnable() { 
     77               public void run() { 
     78                  adjustRemoveBtnEnabled(); 
     79               } 
     80            }); 
     81         } 
     82      }); 
     83 
     84      setupDropHandler(); 
     85   } 
     86 
     87   protected void setupDropHandler() 
     88   { 
     89      DropTarget dropTarget = new DropTarget(); 
     90      try 
     91      { 
     92         dropTarget.addDropTargetListener(new DropTargetAdapter() 
     93         { 
     94            public void drop(final java.awt.dnd.DropTargetDropEvent dropTargetDropEvent) 
     95            { 
     96               Transferable t = dropTargetDropEvent.getTransferable(); 
     97 
     98               Object transferObject = null; 
     99               try 
     100               { 
     101                  DataFlavor flavor = t.getTransferDataFlavors()[0]; 
     102                  transferObject = t.getTransferData(flavor); 
     103               } 
     104               catch (UnsupportedFlavorException ex) 
     105               { 
     106                  System.err.println("UnsupportedFlavorException: "+ex.getMessage()); 
     107                  ex.printStackTrace(); 
     108                  dropTargetDropEvent.rejectDrop(); 
     109               } 
     110               catch (IOException ex) 
     111               { 
     112                  System.err.println("IOException: "+ex.getMessage()); 
     113                  ex.printStackTrace(); 
     114                  dropTargetDropEvent.rejectDrop(); 
     115               } 
     116 
     117               if (transferObject instanceof ComplexEObject) 
     118               { 
     119                  ComplexEObject droppedItem = (ComplexEObject) transferObject; 
     120                  ComplexType droppedType = droppedItem.type(); 
     121                  ComplexType listItemType = _leo.type(); 
     122 
     123                  if (listItemType.hasFieldOfType(droppedType.getJavaClass())) 
     124                  { 
     125                     ComplexEObject newItem = listItemType.instance(); 
     126                     listItemType.firstFieldOfType(droppedType.getJavaClass()).set(newItem, droppedItem); 
     127                     _leo.add(newItem); 
     128                     if (!_leo.parentObject().isEditableState()) 
     129                     { 
     130                        AppLoader.getInstance().newThread(new Runnable() { 
     131                           public void run() 
     132                           { 
     133                              _leo.parentObject().save(); 
     134                           } 
     135                        }).start(); 
     136                     } 
     137                     dropTargetDropEvent.dropComplete(true); 
     138                     return; 
     139                  } 
     140               } 
     141               // in all other cases reject drop.. 
     142               dropTargetDropEvent.rejectDrop(); 
     143            } 
     144         }); 
     145         _tableView.setDropTarget(dropTarget); 
     146         _tableView.getTableHeader().setDropTarget(dropTarget); 
     147      } 
     148      catch (TooManyListenersException ex) 
     149      { 
     150         System.err.println("TooManyListenersException: "+ex.getMessage()); 
     151         ex.printStackTrace(); 
     152      } 
     153   } 
     154 
    74155 
    75156   private void adjustRemoveBtnEnabled() 
     
    81162   private JPanel northPanel() 
    82163   { 
    83       northPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
    84       northPanel.setOpaque(false); 
    85       northPanel.add(addBtn()); 
    86       northPanel.add(removeBtn()); 
    87       return northPanel; 
     164      _northPanel = new JPanel(new FlowLayout(FlowLayout.LEADING)); 
     165      _northPanel.setOpaque(false); 
     166      _northPanel.add(addBtn()); 
     167      _northPanel.add(removeBtn()); 
     168      return _northPanel; 
    88169   } 
    89170 
     
    154235         _leo.parentObject().removeChangeListener(this); 
    155236      } 
    156       _leo.field().removePropertyChangeListener("readOnly", readOnlyChangeListener); 
     237      _leo.field().removePropertyChangeListener("readOnly", _readOnlyChangeListener); 
    157238   } 
    158239