Ticket #1988: toolbar_prefs_dnd.patch
File toolbar_prefs_dnd.patch, 11.8 KB (added by , 16 years ago) |
---|
-
src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
10 10 import java.awt.GridLayout; 11 11 import java.awt.LayoutManager; 12 12 import java.awt.Rectangle; 13 import java.awt.datatransfer.DataFlavor; 14 import java.awt.datatransfer.Transferable; 15 import java.awt.datatransfer.UnsupportedFlavorException; 13 16 import java.awt.event.ActionEvent; 14 17 import java.awt.event.ActionListener; 18 import java.io.IOException; 15 19 import java.util.HashMap; 16 import java.util.TreeMap;17 20 import java.util.Map; 18 21 22 import javax.swing.AbstractAction; 19 23 import javax.swing.Action; 20 24 import javax.swing.DefaultListCellRenderer; 21 25 import javax.swing.DefaultListModel; 22 26 import javax.swing.Icon; 23 27 import javax.swing.JButton; 28 import javax.swing.JComponent; 24 29 import javax.swing.JLabel; 25 30 import javax.swing.JList; 26 31 import javax.swing.JPanel; 27 32 import javax.swing.JScrollPane; 28 33 import javax.swing.JToolBar; 29 34 import javax.swing.ListCellRenderer; 35 import javax.swing.TransferHandler; 30 36 import javax.swing.event.ListSelectionEvent; 31 37 import javax.swing.event.ListSelectionListener; 32 38 33 39 import org.openstreetmap.josm.Main; 40 import org.openstreetmap.josm.gui.util.ReorderAndMoveListDndHandler; 34 41 import org.openstreetmap.josm.tools.GBC; 35 42 import org.openstreetmap.josm.tools.ImageProvider; 36 43 … … 107 114 @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 108 115 String s = tr("Separator"); 109 116 Icon i = ImageProvider.get("preferences/separator"); 110 if (value != null) { 111 s = (String)((Action)value).getValue(Action.NAME); 112 i = (Icon)((Action)value).getValue(Action.SMALL_ICON); 117 Action action = actions.get(value); 118 if (action != null) { 119 s = (String) action.getValue(Action.NAME); 120 i = (Icon) action.getValue(Action.SMALL_ICON); 113 121 } 114 122 JLabel l = (JLabel)oldRenderer.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus); 115 123 l.setIcon(i); … … 136 144 downButton.setEnabled(sel); 137 145 } 138 146 }); 147 148 selectedList.setDragEnabled(true); 149 selectedList.setTransferHandler(new ReorderAndMoveListDndHandler(ACTION_FLAVOR) { 150 @Override 151 protected Transferable createTransferable(JComponent c) { 152 return new ActionTransferable(((JList)c).getSelectedValues()); 153 } 154 }); 155 unselectedList.setDragEnabled(true); 156 unselectedList.setTransferHandler(new TransferHandler() { 157 private static final long serialVersionUID = 1L; 158 159 @Override 160 public int getSourceActions( JComponent c ){ 161 return TransferHandler.MOVE; 162 } 163 164 @Override 165 protected void exportDone(JComponent source, Transferable data, int action) { 166 } 167 168 @Override 169 protected Transferable createTransferable(JComponent c) { 170 return new ActionTransferable(((JList)c).getSelectedValues()); 171 } 172 }); 139 173 } 140 174 141 175 public void addGui(PreferenceDialog gui) { 142 selected.removeAllElements();143 unselected.removeAllElements();144 Map<String, Action> us = new TreeMap<String, Action>();145 for (Action a : actions.values())146 {147 us.put(a.getValue(Action.NAME).toString()+a.toString(), a);148 }149 for (String a : us.keySet())150 unselected.addElement(us.get(a));151 unselected.addElement(null);152 153 176 final JPanel left = new JPanel(new GridBagLayout()); 154 177 left.add(new JLabel(tr("Toolbar")), GBC.eol()); 155 178 left.add(new JScrollPane(selectedList), GBC.std().fill(GBC.BOTH)); … … 179 202 return new Dimension(l.width+b.width+10+r.width,l.height+b.height+10+r.height); 180 203 } 181 204 public Dimension preferredLayoutSize(Container parent) { 182 Dimension l = left.getPreferredSize();183 Dimension r = right.getPreferredSize();205 Dimension l = new Dimension(200, 200); //left.getPreferredSize(); 206 Dimension r = new Dimension(200, 200); //right.getPreferredSize(); 184 207 return new Dimension(l.width+r.width+10+buttons.getPreferredSize().width,Math.max(l.height, r.height)); 185 208 } 186 209 public void layoutContainer(Container parent) { … … 200 223 tr("Customize the elements on the toolbar."), false); 201 224 panel.add(p, GBC.eol().fill(GBC.BOTH)); 202 225 226 selected.removeAllElements(); 227 unselected.removeAllElements(); 228 for (String a : actions.keySet()) 229 unselected.addElement(a); 230 unselected.addElement(null); 203 231 for (String s : getToolString()) { 204 232 if (s.equals("|")) 205 233 selected.addElement(null); 206 234 else { 207 Action a = actions.get(s); 208 if (a != null) { 209 selected.addElement(a); 210 unselected.removeElement(a); 235 if (actions.get(s) != null) { 236 selected.addElement(s); 237 unselected.removeElement(s); 211 238 } 212 239 } 213 240 } 214 241 } 215 242 216 243 private String[] getToolString() { 217 String s = Main.pref.get("toolbar", "open;save;exportgpx;|;download;upload;|;undo;redo;|;preference"); 244 String s = Main.pref.get("toolbar", 245 "open;save;exportgpx;|;download;upload;|;undo;redo;|;preference"); 218 246 if (s == null || s.equals("null") || s.equals("")) 219 247 return new String[0]; 220 248 return s.split(";"); … … 239 267 if (selected.get(i) == null) 240 268 b.append("|"); 241 269 else 242 b.append(( (Action)selected.get(i)).getValue("toolbar"));270 b.append((actions.get(selected.get(i))).getValue("toolbar")); 243 271 b.append(";"); 244 272 } 245 273 String s = b.toString(); … … 276 304 } 277 305 control.setVisible(control.getComponentCount() != 0); 278 306 } 279 } 307 308 private static DataFlavor ACTION_FLAVOR = new DataFlavor( 309 AbstractAction.class, "ActionItem"); 310 311 private class ActionTransferable implements Transferable { 312 313 private DataFlavor[] flavors = new DataFlavor[] { ACTION_FLAVOR }; 314 315 private Object[] actions; 316 317 public ActionTransferable(Action action) { 318 this.actions = new Action[] { action }; 319 } 320 321 public ActionTransferable(Object[] actions) { 322 this.actions = actions; 323 } 324 325 public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 326 return actions; 327 } 328 329 public DataFlavor[] getTransferDataFlavors() { 330 return flavors; 331 } 332 333 public boolean isDataFlavorSupported(DataFlavor flavor) { 334 return flavors[0] == flavor; 335 } 336 } 337 } -
src/org/openstreetmap/josm/gui/util/ReorderAndMoveListDndHandler.java
1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.util; 3 4 import java.awt.datatransfer.DataFlavor; 5 import java.awt.datatransfer.Transferable; 6 7 import javax.swing.DefaultListModel; 8 import javax.swing.JComponent; 9 import javax.swing.JList; 10 import javax.swing.SwingUtilities; 11 import javax.swing.TransferHandler; 12 13 /** 14 * @author Igor Shubovych igor.shubovych@gmail.com 15 */ 16 public class ReorderAndMoveListDndHandler extends TransferHandler { 17 18 public ReorderAndMoveListDndHandler(DataFlavor flavor) { 19 this.flavor = flavor; 20 } 21 22 private DataFlavor flavor; 23 24 private static final long serialVersionUID = 1L; 25 26 public int getSourceActions( JComponent c ){ 27 return TransferHandler.MOVE; 28 } 29 30 @Override 31 public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) { 32 for (DataFlavor f : transferFlavors) { 33 if (flavor.equals(f)) { 34 return true; 35 } 36 } 37 return false; 38 } 39 40 @Override 41 public boolean importData(JComponent comp, Transferable t) { 42 try{ 43 // this is the index of the element onto which the dragged element, is dropped 44 final JList dragList = (JList) comp; 45 final int dropIndex = dragList.locationToIndex( dragList.getDropLocation().getDropPoint() ); 46 Object[] draggedData = (Object[]) t.getTransferData(flavor); 47 DefaultListModel dragModel = (DefaultListModel)dragList.getModel(); 48 DefaultListModel dropModel = (DefaultListModel)dragList.getModel(); 49 50 final Object leadItem = dropIndex >= 0 ? dropModel.elementAt( dropIndex ) : null; 51 final int dataLength = draggedData.length; 52 53 if( leadItem != null ) 54 for( int i = 0 ; i < dataLength ; i++ ) 55 if( draggedData[i].equals( leadItem ) ) 56 return false; 57 58 int dragLeadIndex = -1; 59 final boolean localDrop = dropModel.contains( draggedData[0] ); 60 61 if( localDrop ) 62 dragLeadIndex = dropModel.indexOf( draggedData[0] ); 63 64 for( int i = 0 ; i < dataLength ; i++ ) 65 dragModel.removeElement( draggedData[i] ); 66 67 if( localDrop ){ 68 final int adjustedLeadIndex = dropModel.indexOf( leadItem ); 69 final int insertionAdjustment = dragLeadIndex <= adjustedLeadIndex ? 1 : 0; 70 71 final int [] indices = new int[dataLength]; 72 for( int i = 0 ; i < dataLength ; i++ ){ 73 dropModel.insertElementAt( draggedData[i], adjustedLeadIndex + insertionAdjustment + i ); 74 indices[i] = adjustedLeadIndex + insertionAdjustment + i; 75 } 76 77 SwingUtilities.invokeLater( new Runnable(){ 78 public void run() { 79 dragList.clearSelection(); 80 dragList.setSelectedIndices( indices ); 81 } 82 }); 83 } 84 else{ 85 final int [] indices = new int[dataLength]; 86 for( int i = 0 ; i < dataLength ; i++ ){ 87 dropModel.insertElementAt( draggedData[i], dropIndex + 1 ); 88 indices[i] = dropIndex + 1 + i; 89 } 90 91 SwingUtilities.invokeLater( new Runnable(){ 92 public void run() { 93 dragList.clearSelection(); 94 dragList.setSelectedIndices( indices ); 95 dragList.clearSelection(); 96 } 97 }); 98 } 99 } 100 catch( Exception x ){ 101 x.printStackTrace(); 102 } 103 return false; 104 } 105 } 106 No newline at end of file