Ticket #13050: patch-fix-13050.patch
File patch-fix-13050.patch, 13.9 KB (added by , 9 years ago) |
---|
-
new file src/org/openstreetmap/josm/gui/datatransfer/TagTransferable.java
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/TagTransferable.java b/src/org/openstreetmap/josm/gui/datatransfer/TagTransferable.java new file mode 100644 index 0000000..b13f856
- + 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.datatransfer; 3 4 import java.awt.datatransfer.DataFlavor; 5 import java.awt.datatransfer.Transferable; 6 import java.awt.datatransfer.UnsupportedFlavorException; 7 import java.io.IOException; 8 import java.util.Map.Entry; 9 import java.util.stream.Stream; 10 11 import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData; 12 13 /** 14 * This is a transferable that only transfers the tags. 15 * @author Michael Zangl 16 * @since xxx 17 */ 18 public class TagTransferable implements Transferable { 19 private TagTransferData data; 20 21 /** 22 * Transfer the tag transfer data. 23 * @param data The data. 24 */ 25 public TagTransferable(TagTransferData data) { 26 this.data = data; 27 } 28 29 @Override 30 public DataFlavor[] getTransferDataFlavors() { 31 return new DataFlavor[] { TagTransferData.FLAVOR, DataFlavor.stringFlavor }; 32 } 33 34 @Override 35 public boolean isDataFlavorSupported(DataFlavor flavor) { 36 return Stream.of(getTransferDataFlavors()).anyMatch(f -> f.equals(flavor)); 37 } 38 39 @Override 40 public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { 41 if (DataFlavor.stringFlavor.equals(flavor)) { 42 return getStringData(); 43 } else if (TagTransferData.FLAVOR.equals(flavor)) { 44 return data; 45 } else { 46 throw new UnsupportedFlavorException(flavor); 47 } 48 } 49 50 private String getStringData() { 51 StringBuilder string = new StringBuilder(); 52 for (Entry<String, String> e : data.getTags().entrySet()) { 53 if (string.length() > 0) { 54 string.append("\n"); 55 } 56 string.append(e.getKey()); 57 string.append("="); 58 string.append(e.getValue()); 59 } 60 return string.toString(); 61 } 62 } -
src/org/openstreetmap/josm/gui/datatransfer/data/TagTransferData.java
diff --git a/src/org/openstreetmap/josm/gui/datatransfer/data/TagTransferData.java b/src/org/openstreetmap/josm/gui/datatransfer/data/TagTransferData.java index d05c010..db1fd10 100644
a b public class TagTransferData implements Serializable { 39 39 } 40 40 41 41 /** 42 * Create a new {@link TagTransferData} object with the given tags. 43 * @param tags The tags. 44 * @since xxx 45 */ 46 public TagTransferData(Map<String, String> tags) { 47 this.tags.putAll(tags); 48 } 49 50 /** 42 51 * Gets all tags contained in this data. 43 52 * @return The tags. 44 53 */ -
src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
diff --git a/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java b/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java index 08719e1..e30b43f 100644
a b public class HistoryBrowserModel extends ChangeNotifier implements ActiveLayerCh 581 581 582 582 @Override 583 583 public Object getValueAt(int row, int column) { 584 return getKeyAt(row); 585 } 586 587 /** 588 * Get the key for the given row. 589 * @param row The row 590 * @return The key in that row. 591 * @since xxx 592 */ 593 public String getKeyAt(int row) { 584 594 return keys.get(row); 585 595 } 586 596 … … public class HistoryBrowserModel extends ChangeNotifier implements ActiveLayerCh 636 646 637 647 @Override 638 648 public int getColumnCount() { 639 return 1;649 return 2; 640 650 } 641 651 } 642 652 -
src/org/openstreetmap/josm/gui/history/SelectionSynchronizer.java
diff --git a/src/org/openstreetmap/josm/gui/history/SelectionSynchronizer.java b/src/org/openstreetmap/josm/gui/history/SelectionSynchronizer.java index 00fa272..e60a354 100644
a b import javax.swing.event.ListSelectionListener; 12 12 public class SelectionSynchronizer implements ListSelectionListener { 13 13 14 14 private final Set<ListSelectionModel> participants; 15 private boolean preventRecursion = false; 15 16 16 17 /** 17 18 * Constructs a new {@code SelectionSynchronizer}. … … public class SelectionSynchronizer implements ListSelectionListener { 31 32 32 33 @Override 33 34 public void valueChanged(ListSelectionEvent e) { 35 if (preventRecursion) { 36 return; 37 } 38 preventRecursion = true; 34 39 DefaultListSelectionModel referenceModel = (DefaultListSelectionModel) e.getSource(); 35 40 int i = referenceModel.getMinSelectionIndex(); 36 41 for (ListSelectionModel model : participants) { … … public class SelectionSynchronizer implements ListSelectionListener { 39 44 } 40 45 model.setSelectionInterval(i, i); 41 46 } 47 preventRecursion = false; 42 48 } 43 49 } -
new file src/org/openstreetmap/josm/gui/history/TagInfoTransferHandler.java
diff --git a/src/org/openstreetmap/josm/gui/history/TagInfoTransferHandler.java b/src/org/openstreetmap/josm/gui/history/TagInfoTransferHandler.java new file mode 100644 index 0000000..31b7683
- + 1 // License: GPL. For details, see LICENSE file. 2 package org.openstreetmap.josm.gui.history; 3 4 import java.awt.datatransfer.Clipboard; 5 6 import javax.swing.JComponent; 7 import javax.swing.JTable; 8 import javax.swing.TransferHandler; 9 import javax.swing.table.TableModel; 10 11 import org.openstreetmap.josm.data.osm.TagMap; 12 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils; 13 import org.openstreetmap.josm.gui.datatransfer.TagTransferable; 14 import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData; 15 import org.openstreetmap.josm.gui.history.HistoryBrowserModel.TagTableModel; 16 17 /** 18 * This transfer handler allows to select and copy tags from a table with the {@link TagTableColumnModel}. 19 * @author Michael Zangl 20 * @since xxx 21 */ 22 public class TagInfoTransferHandler extends TransferHandler { 23 24 @Override 25 public void exportToClipboard(JComponent comp, Clipboard clip, int action) throws IllegalStateException { 26 if (comp instanceof JTable) { 27 TableModel model = ((JTable) comp).getModel(); 28 if (model instanceof TagTableModel) { 29 exportFromModel((JTable) comp, (TagTableModel) model); 30 } 31 } 32 } 33 34 private void exportFromModel(JTable comp, TagTableModel model) { 35 int[] selected = comp.getSelectedRows(); 36 TagMap tags = new TagMap(); 37 for (int row : selected) { 38 String key = model.getKeyAt(row); 39 String value = model.getValue(key); 40 if (value != null) { 41 tags.put(key, value); 42 } 43 } 44 TagTransferData data = new TagTransferData(tags); 45 ClipboardUtils.copy(new TagTransferable(data)); 46 } 47 } -
src/org/openstreetmap/josm/gui/history/TagInfoViewer.java
diff --git a/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java b/src/org/openstreetmap/josm/gui/history/TagInfoViewer.java index d354dde..4000099 100644
a b 1 1 // License: GPL. For details, see LICENSE file. 2 2 package org.openstreetmap.josm.gui.history; 3 3 4 import java.awt.event.FocusEvent; 5 import java.awt.event.FocusListener; 6 4 7 import javax.swing.JTable; 5 8 import javax.swing.ListSelectionModel; 6 9 … … import javax.swing.ListSelectionModel; 15 18 * 16 19 */ 17 20 public class TagInfoViewer extends HistoryViewerPanel { 21 private static final class RepaintOnFocusChange implements FocusListener { 22 @Override 23 public void focusLost(FocusEvent e) { 24 repaintSelected(e); 25 } 26 27 @Override 28 public void focusGained(FocusEvent e) { 29 repaintSelected(e); 30 } 31 32 private void repaintSelected(FocusEvent e) { 33 // we would only need the selected rows, but this is easier: 34 e.getComponent().repaint(); 35 } 36 } 37 38 /** 39 * Constructs a new {@code TagInfoViewer}. 40 * @param model The history browsing model 41 */ 42 public TagInfoViewer(HistoryBrowserModel model) { 43 super(model); 44 } 18 45 19 46 @Override 20 47 protected JTable buildReferenceTable() { … … public class TagInfoViewer extends HistoryViewerPanel { 23 50 new TagTableColumnModel() 24 51 ); 25 52 table.setName("table.referencetagtable"); 26 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 27 selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel()); 53 setUpDataTransfer(table); 28 54 return table; 29 55 } 30 56 … … public class TagInfoViewer extends HistoryViewerPanel { 35 61 new TagTableColumnModel() 36 62 ); 37 63 table.setName("table.currenttagtable"); 38 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 39 selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel()); 64 setUpDataTransfer(table); 40 65 return table; 41 66 } 42 67 43 /** 44 * Constructs a new {@code TagInfoViewer}. 45 * @param model The history browsing model 46 */ 47 public TagInfoViewer(HistoryBrowserModel model) { 48 super(model); 68 private void setUpDataTransfer(JTable table) { 69 table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 70 selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel()); 71 table.setTransferHandler(new TagInfoTransferHandler()); 72 table.addFocusListener(new RepaintOnFocusChange()); 49 73 } 50 74 } -
src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java
diff --git a/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java b/src/org/openstreetmap/josm/gui/history/TagTableCellRenderer.java index a773cae..d6fa655 100644
a b import org.openstreetmap.josm.gui.util.GuiHelper; 16 16 * 17 17 */ 18 18 public class TagTableCellRenderer extends JLabel implements TableCellRenderer { 19 public static final Color BGCOLOR_SELECTED = new Color(143, 170, 255); 19 /** 20 * The background color for a selected row that has the focus. 21 */ 22 public static final Color BGCOLOR_SELECTED_FOCUS = new Color(0xff8faaff); 23 /** 24 * The background color for a selected row while the table is not focused. 25 */ 26 public static final Color BGCOLOR_SELECTED = new Color(0xffafc2ff); 20 27 21 28 /** 22 29 * Constructs a new {@code TagTableCellRenderer}. … … public class TagTableCellRenderer extends JLabel implements TableCellRenderer { 25 32 setOpaque(true); 26 33 } 27 34 28 protected void setBackgroundReadable(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected, boolean isValue) {35 protected void setBackgroundReadable(String key, HistoryBrowserModel.TagTableModel model, boolean isSelected, boolean hasFocus, boolean isValue) { 29 36 Color bgColor = UIManager.getColor("Table.background"); 30 37 if (!model.hasTag(key) && model.isCurrentPointInTime() 31 38 || !model.oppositeHasTag(key) && model.isReferencePointInTime()) { … … public class TagTableCellRenderer extends JLabel implements TableCellRenderer { 37 44 bgColor = TwoColumnDiff.Item.DiffItemType.CHANGED.getColor(); 38 45 } 39 46 if (isSelected) { 40 bgColor = BGCOLOR_SELECTED; 47 if (hasFocus) { 48 bgColor = BGCOLOR_SELECTED_FOCUS; 49 } else { 50 bgColor = BGCOLOR_SELECTED; 51 } 41 52 } 42 53 43 54 GuiHelper.setBackgroundReadable(this, bgColor); … … public class TagTableCellRenderer extends JLabel implements TableCellRenderer { 53 64 String key = (String) value; 54 65 HistoryBrowserModel.TagTableModel model = getTagTableModel(table); 55 66 56 switch(column) { 57 case 0: 58 // the name column 59 setText(model.hasTag(key) ? key : ""); 60 setToolTipText(getText()); 61 setBackgroundReadable(key, model, isSelected, false); 62 break; 63 case 1: 64 // the value column 65 setText(model.hasTag(key) ? model.getValue(key) : ""); 66 setToolTipText(getText()); 67 setBackgroundReadable(key, model, isSelected, true); 68 break; 69 default: // Do nothing 67 String text = ""; 68 if (model.hasTag(key)) { 69 switch(column) { 70 case TagTableColumnModel.COLUMN_KEY: 71 // the name column 72 text = key; 73 break; 74 case TagTableColumnModel.COLUMN_VALUE: 75 // the value column 76 text = model.getValue(key); 77 break; 78 default: // Do nothing 79 } 70 80 } 71 81 82 setText(text); 83 setToolTipText(text); 84 setBackgroundReadable(key, model, isSelected, table.hasFocus(), column == TagTableColumnModel.COLUMN_VALUE); 72 85 return this; 73 86 } 74 87 -
src/org/openstreetmap/josm/gui/history/TagTableColumnModel.java
diff --git a/src/org/openstreetmap/josm/gui/history/TagTableColumnModel.java b/src/org/openstreetmap/josm/gui/history/TagTableColumnModel.java index 0c8eb16..3289439 100644
a b import javax.swing.table.TableColumn; 11 11 * @since 1709 12 12 */ 13 13 public class TagTableColumnModel extends DefaultTableColumnModel { 14 protected static final int COLUMN_KEY = 0; 15 protected static final int COLUMN_VALUE = 1; 14 16 15 17 /** 16 18 * Constructs a new {@code TagTableColumnModel}.