Ticket #7671: 7671v2.patch

File 7671v2.patch, 5.1 KB (added by Don-vip, 13 years ago)
  • core/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java

     
    66
    77import java.awt.BorderLayout;
    88import java.awt.Component;
     9import java.awt.Cursor;
    910import java.awt.Dimension;
    1011import java.awt.Font;
    1112import java.awt.GridBagLayout;
     
    1819import java.awt.event.ActionListener;
    1920import java.awt.event.FocusAdapter;
    2021import java.awt.event.FocusEvent;
    21 import java.awt.event.InputEvent;
    2222import java.awt.event.KeyEvent;
    2323import java.awt.event.MouseAdapter;
    2424import java.awt.event.MouseEvent;
     
    3434import java.util.HashMap;
    3535import java.util.HashSet;
    3636import java.util.Iterator;
     37import java.util.LinkedHashMap;
    3738import java.util.LinkedList;
    3839import java.util.List;
    3940import java.util.Map;
     
    4748import javax.swing.Action;
    4849import javax.swing.Box;
    4950import javax.swing.DefaultListCellRenderer;
    50 import javax.swing.InputMap;
    5151import javax.swing.JComboBox;
    5252import javax.swing.JComponent;
    5353import javax.swing.JDialog;
     
    6161import javax.swing.JTable;
    6262import javax.swing.KeyStroke;
    6363import javax.swing.ListSelectionModel;
    64 import javax.swing.SwingUtilities;
    6564import javax.swing.event.ListSelectionEvent;
    6665import javax.swing.event.ListSelectionListener;
    6766import javax.swing.event.PopupMenuListener;
     
    456455
    457456    private static String lastAddKey = null;
    458457    private static String lastAddValue = null;
     458    // LRU cache for recently added tags (http://java-planet.blogspot.com/2005/08/how-to-set-up-simple-lru-cache-using.html)
     459    private static final Map<Tag, Void> recentTags = new LinkedHashMap<Tag, Void>(5, 1.1f, true);
     460   
    459461    /**
    460462     * Open the add selection dialog and add a new key/value to the table (and
    461463     * to the dataset, of course).
     
    466468        Collection<OsmPrimitive> sel = ds.getSelected();
    467469        if (sel.isEmpty()) return;
    468470
    469         JPanel p = new JPanel(new BorderLayout());
     471        JPanel p = new JPanel(new GridBagLayout());
    470472        p.add(new JLabel("<html>"+trn("This will change up to {0} object.",
    471473                "This will change up to {0} objects.", sel.size(),sel.size())
    472                 +"<br><br>"+tr("Please select a key")), BorderLayout.NORTH);
     474                +"<br><br>"+tr("Please select a key")), GBC.eol());
    473475        final AutoCompletingComboBox keys = new AutoCompletingComboBox();
    474476        AutoCompletionManager autocomplete = Main.main.getEditLayer().data.getAutoCompletionManager();
    475477        List<AutoCompletionListItem> keyList = autocomplete.getKeys();
     
    497499        keys.setPossibleACItems(keyList);
    498500        keys.setEditable(true);
    499501
    500         p.add(keys, BorderLayout.CENTER);
     502        p.add(keys, GBC.eop().fill());
    501503
    502         JPanel p2 = new JPanel(new BorderLayout());
    503         p.add(p2, BorderLayout.SOUTH);
    504         p2.add(new JLabel(tr("Please select a value")), BorderLayout.NORTH);
     504        p.add(new JLabel(tr("Please select a value")), GBC.eol());
    505505        final AutoCompletingComboBox values = new AutoCompletingComboBox();
    506506        values.setEditable(true);
    507         p2.add(values, BorderLayout.CENTER);
     507        p.add(values, GBC.eop().fill());
    508508        if (itemToSelect != null) {
    509509            keys.setSelectedItem(itemToSelect);
    510510            /* don't add single chars, as they are no properly selected */
     
    512512                values.setSelectedItem(lastAddValue);
    513513            }
    514514        }
     515       
     516        if (!recentTags.isEmpty()) {
     517            p.add(new JLabel(tr("Recently added tags")), GBC.eol());
     518        }
    515519
     520        int count = 1;
     521        for (final Tag t : recentTags.keySet()) {
     522            final JLabel l = new JLabel("<html>"
     523                + "<style>td{border:1px solid gray; font-weight:normal;}</style>"
     524                + "<table><tr><td>" + t.toString() + "</td></tr></table></html>");
     525            l.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
     526            l.setToolTipText(tr("Click to use this tag again"));
     527            l.addMouseListener(new MouseAdapter() {
     528                @Override
     529                public void mouseClicked(MouseEvent e) {
     530                    keys.getEditor().setItem(t.getKey());
     531                    values.getEditor().setItem(t.getValue());
     532                }
     533            });
     534            p.add(new JLabel(Integer.toString(count++)+". "));
     535            p.add(l, GBC.eol());
     536        }
     537
    516538        FocusAdapter focus = addFocusAdapter(-1, keys, values, autocomplete, defaultACItemComparator);
    517539        // fire focus event in advance or otherwise the popup list will be too small at first
    518540        focus.focusGained(null);
     
    544566            return;
    545567        lastAddKey = key;
    546568        lastAddValue = value;
     569        recentTags.put(new Tag(key, value), null);
    547570        Main.main.undoRedo.add(new ChangePropertyCommand(sel, key, value));
    548571        btnAdd.requestFocusInWindow();
    549572    }