Ignore:
Timestamp:
2011-11-19T22:27:22+01:00 (12 years ago)
Author:
bastiK
Message:

history browser: changed selection of 2 compared version. WAS: double click and single click. NOW: 2 rows of radio buttons (inspired by Mediawiki)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java

    r4525 r4598  
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
     6import java.awt.Component;
    67import java.awt.event.ActionEvent;
     8import java.awt.event.ItemEvent;
     9import java.awt.event.ItemListener;
    710import java.awt.event.MouseAdapter;
    811import java.awt.event.MouseEvent;
     
    1013import java.util.Observer;
    1114
     15import javax.swing.DefaultCellEditor;
    1216import javax.swing.DefaultListSelectionModel;
     17import javax.swing.JCheckBox;
    1318import javax.swing.JPopupMenu;
     19import javax.swing.JRadioButton;
    1420import javax.swing.JTable;
    1521import javax.swing.ListSelectionModel;
     22import javax.swing.SwingConstants;
    1623import javax.swing.event.ListSelectionEvent;
    1724import javax.swing.event.ListSelectionListener;
    1825import javax.swing.event.TableModelEvent;
     26import javax.swing.table.TableCellRenderer;
    1927
    2028import org.openstreetmap.josm.actions.AbstractInfoAction;
     
    2533 * VersionTable shows a list of version in a {@see History} of an {@see OsmPrimitive}.
    2634 *
    27  *
    2835 */
    2936public class VersionTable extends JTable implements Observer{
     
    3138
    3239    protected void build() {
    33         setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    34         addMouseListener(new MouseHandler());
    35         getSelectionModel().addListSelectionListener(new SelectionHandler());
     40        setRowSelectionAllowed(false);
    3641        popupMenu = new VersionTablePopupMenu();
    3742        addMouseListener(new PopupMenuTrigger());
     
    4449    }
    4550
    46     protected void handleSelectReferencePointInTime(int row) {
    47         getVersionTableModel().setReferencePointInTime(row);
    48     }
    49 
    50     protected void handleSelectCurrentPointInTime(int row) {
    51         getVersionTableModel().setCurrentPointInTime(row);
    52     }
    53 
    5451    protected HistoryBrowserModel.VersionTableModel getVersionTableModel() {
    5552        return (HistoryBrowserModel.VersionTableModel) getModel();
    56     }
    57 
    58     class MouseHandler extends MouseAdapter {
    59         protected void handleDoubleClick(MouseEvent e) {
    60             int row = rowAtPoint(e.getPoint());
    61             handleSelectReferencePointInTime(row);
    62         }
    63 
    64         @Override
    65         public void mouseClicked(MouseEvent e) {
    66             switch(e.getClickCount()) {
    67             case 2: handleDoubleClick(e); break;
    68             }
    69         }
    70     }
    71 
    72     class SelectionHandler implements ListSelectionListener {
    73         public void valueChanged(ListSelectionEvent e) {
    74             DefaultListSelectionModel model = (DefaultListSelectionModel)e.getSource();
    75             // For some reason we receive multiple "adjusting" events here even when the source is a simple "set selection" action
    76             // The last and proper event will have getValueIsAdjusting() == false
    77             if (model.getMinSelectionIndex() >= 0 && e.getValueIsAdjusting() == false) {
    78                 handleSelectCurrentPointInTime(model.getMinSelectionIndex());
    79             }
    80         }
    8153    }
    8254
     
    8557    }
    8658
    87     /* (non-Javadoc)
    88      * @see javax.swing.JTable#tableChanged(javax.swing.event.TableModelEvent)
    89      */
    90     @Override
    91     public void tableChanged(TableModelEvent e) {
    92         int selectedRow = getSelectedRow();
    93         super.tableChanged(e);
    94         // Restore list selection (fix #6899)
    95         if (selectedRow > -1 && selectedRow < getRowCount()) {
    96             getSelectionModel().setSelectionInterval(0, selectedRow);
    97         }
    98     }
    99 
    10059    protected void showPopupMenu(MouseEvent evt) {
    10160        HistoryBrowserModel.VersionTableModel model = getVersionTableModel();
    102         int row = getSelectedRow();
    103         if (row == -1) {
    104             row = rowAtPoint(evt.getPoint());
    105         }
     61        int row = rowAtPoint(evt.getPoint());
    10662        if (!model.isLatest(row)) {
    10763            HistoryOsmPrimitive primitive = model.getPrimitive(row);
     
    10965            popupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
    11066        }
    111     }
    112 
    113     public void updateSelection() {
    114         final int row = getVersionTableModel().getRowCount() - 1;
    115         setRowSelectionInterval(row, row);
    11667    }
    11768
     
    180131        }
    181132    }
     133
     134    public static class RadioButtonRenderer extends JRadioButton implements TableCellRenderer {
     135
     136        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,int row,int column) {
     137            HistoryBrowserModel.VersionTableModel model = (HistoryBrowserModel.VersionTableModel)table.getModel();
     138            setSelected(value != null && (Boolean)value);
     139            setHorizontalAlignment(SwingConstants.CENTER);
     140            return this;
     141        }
     142    }
     143
     144    public static class RadioButtonEditor extends DefaultCellEditor implements ItemListener {
     145
     146        private JRadioButton btn;
     147
     148        public RadioButtonEditor() {
     149            super(new JCheckBox());
     150            btn = new JRadioButton();
     151            btn.setHorizontalAlignment(SwingConstants.CENTER);
     152        }
     153
     154        public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
     155            if (value == null) return null;
     156            boolean val = (Boolean) value;
     157            btn.setSelected(val);
     158            btn.addItemListener(this);
     159            return btn;
     160        }
     161
     162        public Object getCellEditorValue() {
     163            btn.removeItemListener(this);
     164            return btn.isSelected();
     165        }
     166
     167        public void itemStateChanged(ItemEvent e) {
     168            fireEditingStopped();
     169        }
     170    }
    182171}
Note: See TracChangeset for help on using the changeset viewer.