Ignore:
Timestamp:
04.09.2009 10:49:53 (3 years ago)
Author:
Gubaer
Message:

Improved auto completion
fixed #2729: Auto completion with numbers sometimes annoying (only fixed in presets, relation editor, not in property dialog)
fixed #2320: Preset dialog for house numbers should have autocompletion (auto completion now supported in all preset dialogs)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java

    r2017 r2048  
    1818import java.util.Collection; 
    1919import java.util.HashMap; 
    20 import java.util.HashSet; 
    2120import java.util.LinkedHashMap; 
    2221import java.util.LinkedList; 
    2322import java.util.List; 
    24 import java.util.Set; 
     23import java.util.TreeSet; 
    2524 
    2625import javax.swing.AbstractAction; 
     
    4544import org.openstreetmap.josm.gui.ExtendedDialog; 
    4645import org.openstreetmap.josm.gui.QuadStateCheckBox; 
     46import org.openstreetmap.josm.gui.layer.OsmDataLayer; 
     47import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionCache; 
     48import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPritority; 
     49import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList; 
    4750import org.openstreetmap.josm.io.MirroredInputStream; 
    4851import org.openstreetmap.josm.tools.GBC; 
     
    6669 
    6770    public static abstract class Item { 
     71        protected void initAutoCompletionField(AutoCompletingTextField field, String key) { 
     72            OsmDataLayer layer = Main.main.getEditLayer(); 
     73            if (layer == null) return; 
     74            AutoCompletionCache cache = AutoCompletionCache.getCacheForLayer(layer); 
     75            AutoCompletionList list = new AutoCompletionList(); 
     76            cache.populateWithValues(list, false /* don't append */); 
     77            field.setAutoCompletionList(list); 
     78        } 
     79 
    6880        public boolean focus = false; 
    6981        abstract boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel); 
     
    7385 
    7486    public static class Usage { 
    75         Set<String> values; 
    76         Boolean hadKeys = false; 
    77         Boolean hadEmpty = false; 
    78         public Boolean allSimilar() 
    79         { 
     87        TreeSet<String> values; 
     88        boolean hadKeys = false; 
     89        boolean hadEmpty = false; 
     90        public boolean hasUniqueValue() { 
    8091            return values.size() == 1 && !hadEmpty; 
    8192        } 
    82         public Boolean unused() 
    83         { 
     93 
     94        public boolean unused() { 
    8495            return values.size() == 0; 
    8596        } 
    86         public String getFirst() 
    87         { 
    88             return (String)(values.toArray()[0]); 
    89         } 
    90         public Boolean hadKeys() 
    91         { 
     97        public String getFirst() { 
     98            return values.first(); 
     99        } 
     100 
     101        public boolean hadKeys() { 
    92102            return hadKeys; 
    93103        } 
     
    98108    static Usage determineTextUsage(Collection<OsmPrimitive> sel, String key) { 
    99109        Usage returnValue = new Usage(); 
    100         returnValue.values = new HashSet<String>(); 
     110        returnValue.values = new TreeSet<String>(); 
    101111        for (OsmPrimitive s : sel) { 
    102112            String v = s.get(key); 
     
    106116                returnValue.hadEmpty = true; 
    107117            } 
    108             returnValue.hadKeys = returnValue.hadKeys | s.hasKeys(); 
     118            returnValue.hadKeys = ! returnValue.values.isEmpty() | returnValue.hadEmpty; 
    109119        } 
    110120        return returnValue; 
     
    114124 
    115125        Usage returnValue = new Usage(); 
    116         returnValue.values = new HashSet<String>(); 
     126        returnValue.values = new TreeSet<String>(); 
    117127        for (OsmPrimitive s : sel) { 
    118128            returnValue.values.add(OsmUtils.getNamedOsmBoolean(s.get(key))); 
     
    133143        private JComponent value; 
    134144 
     145 
    135146        @Override public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel) { 
    136147 
    137148            // find out if our key is already used in the selection. 
    138149            Usage usage = determineTextUsage(sel, key); 
    139             if (usage.unused()) 
    140             { 
    141                 value = new JTextField(); 
     150            if (usage.unused()){ 
     151                AutoCompletingTextField textField = new AutoCompletingTextField(); 
     152                initAutoCompletionField(textField, key); 
    142153                if (use_last_as_default && lastValue.containsKey(key)) { 
    143                     ((JTextField)value).setText(lastValue.get(key)); 
     154                    textField.setText(lastValue.get(key)); 
    144155                } else { 
    145                     ((JTextField)value).setText(default_); 
    146                 } 
     156                    textField.setText(default_); 
     157                } 
     158                value = textField; 
    147159                originalValue = null; 
    148             } else if (usage.allSimilar()) { 
     160            } else if (usage.hasUniqueValue()) { 
    149161                // all objects use the same value 
    150                 value = new JTextField(); 
    151                 for (String s : usage.values) { 
    152                     ((JTextField) value).setText(s); 
    153                 } 
    154                 originalValue = ((JTextField)value).getText(); 
     162                AutoCompletingTextField textField = new AutoCompletingTextField(); 
     163                initAutoCompletionField(textField, key); 
     164                textField.setText(usage.getFirst()); 
     165                value = textField; 
     166                originalValue = usage.getFirst(); 
    155167            } else { 
    156168                // the objects have different values 
    157                 value = new JComboBox(usage.values.toArray()); 
    158                 ((JComboBox)value).setEditable(true); 
    159                 ((JComboBox)value).getEditor().setItem(DIFFERENT); 
     169                AutoCompletingTextField textField = new AutoCompletingTextField(); 
     170                initAutoCompletionField(textField, key); 
     171                JComboBox comboBox = new JComboBox(usage.values.toArray()); 
     172                comboBox.setEditable(true); 
     173                comboBox.setEditor(textField); 
     174                comboBox.getEditor().setItem(DIFFERENT); 
     175                value=comboBox; 
    160176                originalValue = DIFFERENT; 
    161177            } 
     
    300316 
    301317            lhm = new LinkedHashMap<String,String>(); 
    302             if (!usage.allSimilar() && !usage.unused()) 
    303             { 
     318            if (!usage.hasUniqueValue() && !usage.unused()){ 
    304319                lhm.put(DIFFERENT, DIFFERENT); 
    305320            } 
     
    309324                                tr(display_array[i]) : display_array[i]); 
    310325            } 
    311             if(!usage.unused()) 
    312             { 
     326            if(!usage.unused()){ 
    313327                for (String s : usage.values) { 
    314328                    if (!lhm.containsKey(s)) { 
     
    326340            combo = new JComboBox(lhm.values().toArray()); 
    327341            combo.setEditable(editable); 
    328             if (usage.allSimilar() && !usage.unused()) 
    329             { 
     342            AutoCompletingTextField tf = new AutoCompletingTextField(); 
     343            initAutoCompletionField(tf, key); 
     344            tf.getAutoCompletionList().add(Arrays.asList(display_array), AutoCompletionItemPritority.IS_IN_STANDARD); 
     345            combo.setEditor(tf); 
     346 
     347            if (usage.hasUniqueValue() && !usage.unused()){ 
    330348                originalValue=usage.getFirst(); 
    331349                combo.setSelectedItem(lhm.get(originalValue)); 
    332350            } 
    333351            // use default only in case it is a totally new entry 
    334             else if(default_ != null && !usage.hadKeys()) 
    335             { 
     352            else if(default_ != null && !usage.hadKeys()) { 
    336353                combo.setSelectedItem(default_); 
    337354                originalValue=DIFFERENT; 
    338355            } 
    339             else if(usage.unused()) 
    340             { 
     356            else if(usage.unused()){ 
    341357                combo.setSelectedItem(""); 
    342358                originalValue=""; 
    343359            } 
    344             else 
    345             { 
     360            else{ 
    346361                combo.setSelectedItem(DIFFERENT); 
    347362                originalValue=DIFFERENT; 
     
    628643        if (data == null) 
    629644            return null; 
     645        OsmDataLayer layer = Main.main.getEditLayer(); 
     646        if (layer != null) { 
     647            AutoCompletionCache.getCacheForLayer(layer).initFromDataSet(); 
     648        } 
    630649        PresetPanel p = new PresetPanel(); 
    631650        LinkedList<Item> l = new LinkedList<Item>(); 
    632         if(types != null) 
    633         { 
     651        if(types != null){ 
    634652            JPanel pp = new JPanel(); 
    635             for(String t : types) 
    636             { 
     653            for(String t : types){ 
    637654                JLabel la = new JLabel(ImageProvider.get("Mf_" + t)); 
    638655                la.setToolTipText(tr("Elements of type {0} are supported.", tr(t))); 
     
    642659        } 
    643660 
    644         for (Item i : data) 
    645         { 
     661        for (Item i : data){ 
    646662            if(i instanceof Link) { 
    647663                l.add(i); 
    648             } else 
    649             { 
     664            } else { 
    650665                if(i.addToPanel(p, selected)) { 
    651666                    p.hasElements = true; 
     
    683698                            true); 
    684699                    contentConstraints = GBC.eol().fill().insets(5,10,5,0); 
    685                     setupDialog(content, new String[] {"ok.png", "cancel.png" }); 
     700                    setButtonIcons(new String[] {"ok.png", "cancel.png" }); 
     701                    setContent(content); 
     702                    setupDialog(); 
    686703                    buttons.get(0).setEnabled(!disableApply); 
    687704                    buttons.get(0).setToolTipText(title); 
Note: See TracChangeset for help on using the changeset viewer.