Ticket #7671: 7671v2.patch

File 7671v2.patch, 5.1 KB (added by Don-vip, 10 months 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    }