Ticket #3475: filters_dialogs.2.diff

File filters_dialogs.2.diff, 28.9 KB (added by PetrDlouhy, 15 years ago)

new version without mathematic symbols

  • src/org/openstreetmap/josm/data/osm/Filter.java

     
     1package org.openstreetmap.josm.data.osm;
     2
     3import org.openstreetmap.josm.actions.search.SearchAction;
     4import org.openstreetmap.josm.actions.search.SearchAction.SearchSetting;
     5import org.openstreetmap.josm.actions.search.SearchAction.SearchMode;
     6
     7/**
     8 *
     9 * @author Petr_Dlouhý
     10 */
     11public class Filter extends SearchSetting {
     12   private final String version = "1";
     13   public String filterName = "";
     14   public Boolean filtered = false;
     15   public Boolean disabled = true;
     16   public Boolean inverted = false;
     17   public Boolean applyForChildren = true;
     18   public Filter() {
     19       super("", SearchMode.add, false, false);
     20   }
     21   public Filter(String text, SearchMode mode, boolean caseSensitive, boolean regexSearch, String filterName) {
     22       super(text, mode, caseSensitive, regexSearch);
     23       this.filterName = filterName;
     24   }
     25
     26   public Filter(String prefText){
     27      super("", SearchMode.add, false, false);
     28      String[] prfs = prefText.split(";");
     29      if(prfs.length != 10 && !prfs[0].equals(version))
     30         throw new Error("Incompatible filter preferences");
     31      text = prfs[1];
     32      if(prfs[2].equals("replace")) mode = SearchMode.replace;
     33      if(prfs[2].equals("add")) mode = SearchMode.add;
     34      if(prfs[2].equals("remove")) mode = SearchMode.remove;
     35      if(prfs[2].equals("in_selection")) mode = SearchMode.in_selection;
     36      caseSensitive = Boolean.parseBoolean(prfs[3]);
     37      regexSearch = Boolean.parseBoolean(prfs[4]);
     38      filterName = prfs[5];
     39      filtered = Boolean.parseBoolean(prfs[6]);
     40      disabled = Boolean.parseBoolean(prfs[7]);
     41      inverted = Boolean.parseBoolean(prfs[8]);
     42      applyForChildren = Boolean.parseBoolean(prfs[9]);
     43
     44   } 
     45
     46   public String getPrefString(){
     47      return version + ";" +
     48          text + ";" + mode + ";" + caseSensitive + ";" + regexSearch + ";" +
     49          filterName + ";" + filtered + ";" + disabled + ";" +
     50          inverted + ";" + applyForChildren;
     51   }
     52}
  • src/org/openstreetmap/josm/data/osm/Filters.java

     
     1package org.openstreetmap.josm.data.osm;
     2
     3import static org.openstreetmap.josm.tools.I18n.tr;
     4
     5import javax.swing.table.AbstractTableModel;
     6
     7import java.util.LinkedList;
     8import java.util.List;
     9import java.util.Collection;
     10import java.util.Map;
     11
     12import org.openstreetmap.josm.data.osm.Filter;
     13import org.openstreetmap.josm.Main;
     14import org.openstreetmap.josm.actions.search.SearchAction.Function;
     15import org.openstreetmap.josm.actions.search.SearchAction;
     16
     17/**
     18 *
     19 * @author Petr_Dlouhý
     20 */
     21public class Filters extends AbstractTableModel{
     22
     23   public Filters(){
     24      loadPrefs();
     25   }
     26
     27   private List<Filter> filters = new LinkedList<Filter>();
     28   public void filter(){
     29      Collection<OsmPrimitive> seld = new LinkedList<OsmPrimitive> ();
     30      Collection<OsmPrimitive> self = new LinkedList<OsmPrimitive> ();
     31      Main.main.getCurrentDataSet().setFiltered();
     32      Main.main.getCurrentDataSet().setDisabled();
     33      for (Filter flt : filters){
     34            if(flt.filtered){
     35               SearchAction.getSelection(flt, self, new Function(){
     36                  public Boolean isSomething(OsmPrimitive o){
     37                     return o.isFiltered();
     38                  }
     39               });
     40            }
     41            if(flt.disabled) {
     42               SearchAction.getSelection(flt, seld, new Function(){
     43                  public Boolean isSomething(OsmPrimitive o){
     44                     return o.isDisabled();
     45                  }
     46               });
     47            }
     48      }
     49      Main.main.getCurrentDataSet().setFiltered(self);
     50      Main.main.getCurrentDataSet().setDisabled(seld);
     51      Main.map.mapView.repaint();
     52   }
     53
     54   private void loadPrefs(){
     55      Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
     56      for (String value : prefs.values()) {
     57         Filter filter = new Filter(value);
     58         if(filter!=null)
     59            filters.add(filter);
     60      }
     61   }
     62
     63   private void savePrefs(){
     64      Map<String,String> prefs = Main.pref.getAllPrefix("filters.filter");
     65      for (String key : prefs.keySet()) {
     66         String[] sts = key.split("\\.");
     67         if (sts.length != 3)throw new Error("Incompatible filter preferences");
     68         Main.pref.put("filters.filter." + sts[2], null);
     69      }
     70
     71      int i = 0;
     72      for (Filter flt : filters){
     73         Main.pref.put("filters.filter." + i++, flt.getPrefString());
     74      }
     75   }
     76
     77   private void savePref(int i){
     78      if(i >= filters.size())
     79         Main.pref.put("filters.filter." + i, null);
     80      else
     81         Main.pref.put("filters.filter." + i, filters.get(i).getPrefString());
     82   }
     83
     84   public void addFilter(Filter f){
     85      filters.add(f);
     86      savePref(filters.size()-1);
     87      filter();
     88      fireTableRowsInserted(filters.size()-1, filters.size()-1);
     89   }
     90
     91   public void moveDownFilter(int i){
     92      if(i >= filters.size()-1) return;
     93      filters.add(i+1, filters.remove(i));
     94      savePref(i);
     95      savePref(i+1);
     96      filter();
     97      fireTableRowsUpdated(i, i+1);
     98   }
     99
     100   public void moveUpFilter(int i){
     101      if(i == 0) return;
     102      filters.add(i-1, filters.remove(i));
     103      savePref(i);
     104      savePref(i-1);
     105      filter();
     106      fireTableRowsUpdated(i-1, i);
     107   }
     108
     109   public void removeFilter(int i){
     110      filters.remove(i);
     111      savePrefs();
     112      filter();
     113      fireTableRowsDeleted(i, i);
     114   }
     115
     116   public void setFilter(int i, Filter f){
     117      filters.set(i, f);
     118      savePref(i);
     119      filter();
     120      fireTableRowsUpdated(i, i);
     121   }
     122
     123   public Filter getFilter(int i){
     124      return filters.get(i);
     125   }
     126
     127   public int getRowCount(){
     128      return filters.size();
     129   }
     130
     131   public int getColumnCount(){
     132      return 6;
     133   }
     134
     135   public String getColumnName(int column){
     136      String[] names = { tr("F"), tr("D"), tr("Name"), tr("C"), tr("I"), tr("M") };
     137      return names[column];
     138   }
     139
     140   public Class getColumnClass(int column){
     141      Class[] classes = { Boolean.class, Boolean.class, String.class, Boolean.class, Boolean.class, String.class };
     142      return classes[column];
     143   }
     144
     145   public boolean isCellEditable(int row, int column){
     146      if(column < 5)return true;
     147      return false;
     148   }
     149
     150   public void setValueAt(Object aValue, int row, int column){
     151      Filter f = filters.get(row);
     152      switch(column){
     153         case 0: f.filtered = (Boolean)aValue;
     154                 savePref(row);
     155                 filter();
     156                 return;
     157         case 1: f.disabled = (Boolean)aValue;
     158                 savePref(row);
     159                 filter();
     160                 return;
     161         case 2: f.filterName = (String)aValue;
     162                 savePref(row);
     163                 return;
     164         case 3: f.applyForChildren = (Boolean)aValue;
     165                 savePref(row);
     166                 filter();
     167                 return;
     168         case 4: f.inverted = (Boolean)aValue;
     169                 savePref(row);
     170                 filter();
     171                 return;
     172      }
     173   }
     174
     175   public Object getValueAt(int row, int column){
     176      Filter f = filters.get(row);
     177      switch(column){
     178         case 0: return f.filtered;
     179         case 1: return f.disabled;
     180         case 2: return f.filterName;
     181         case 3: return f.applyForChildren;
     182         case 4: return f.inverted;
     183         case 5:
     184                 switch(f.mode){
     185                    case replace: return tr("R");
     186                    case add: return tr("A");
     187                    case remove: return tr("D");
     188                    case in_selection: return tr("F");
     189                 }
     190      }
     191      return null;
     192   }
     193}
  • src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java

     
     1// License: GPL. Copyright 2007 by Immanuel Scholz and others
     2package org.openstreetmap.josm.gui.dialogs;
     3
     4import static org.openstreetmap.josm.tools.I18n.marktr;
     5import static org.openstreetmap.josm.tools.I18n.tr;
     6import static org.openstreetmap.josm.tools.I18n.trn;
     7
     8import javax.swing.JPanel;
     9import javax.swing.JTable;
     10import javax.swing.table.JTableHeader;
     11import javax.swing.ListSelectionModel;
     12import javax.swing.JPopupMenu;
     13import javax.swing.table.AbstractTableModel;
     14import javax.swing.JScrollPane;
     15
     16import java.awt.FlowLayout;
     17import java.awt.BorderLayout;
     18import java.awt.GridLayout;
     19import java.awt.event.KeyEvent;
     20import java.awt.event.ActionListener;
     21import java.awt.event.ActionEvent;
     22import java.awt.event.MouseEvent;
     23
     24import org.openstreetmap.josm.Main;
     25import org.openstreetmap.josm.gui.SideButton;
     26import org.openstreetmap.josm.gui.layer.Layer.LayerChangeListener;
     27import org.openstreetmap.josm.gui.layer.DataChangeListener;
     28import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     29import org.openstreetmap.josm.gui.layer.Layer;
     30import org.openstreetmap.josm.data.osm.Filters;
     31import org.openstreetmap.josm.data.osm.Filter;
     32import org.openstreetmap.josm.tools.Shortcut;
     33import org.openstreetmap.josm.data.osm.DataSet;
     34import org.openstreetmap.josm.actions.search.SearchAction;
     35
     36/**
     37 *
     38 * @author Petr_Dlouhý
     39 */
     40public class FilterDialog extends ToggleDialog implements DataChangeListener, LayerChangeListener {
     41    private JTable userTable;
     42    private Filters filters = new Filters();
     43    private SideButton addButton;
     44    private SideButton editButton;
     45    private SideButton deleteButton;
     46    private SideButton upButton;
     47    private SideButton downButton;
     48    private JPopupMenu popupMenu;
     49
     50    public FilterDialog(){
     51       super(tr("Filter"), "filter", tr("Filter objects and hide/disable them."),
     52               Shortcut.registerShortcut("subwindow:filter", tr("Toggle: {0}", tr("Filter")), KeyEvent.VK_F, Shortcut.GROUP_LAYER, Shortcut.SHIFT_DEFAULT), 162);
     53
     54       Layer.listeners.add(this);
     55       build();
     56    }
     57
     58    protected JPanel buildButtonRow() {
     59        JPanel pnl = new JPanel(new GridLayout(1, 4));
     60
     61        addButton = new SideButton(marktr("Add"), "add", "SelectionList", tr("Add filter."),
     62              new ActionListener(){
     63                 public void actionPerformed(ActionEvent evt){
     64                    Filter filter = (Filter)SearchAction.showSearchDialog(new Filter());
     65                    if(filter != null){
     66                       filters.addFilter(filter);
     67                       filters.filter();
     68                    }
     69                 }
     70              });
     71        pnl.add(addButton);
     72
     73        editButton = new SideButton(marktr("Edit"), "edit", "SelectionList", tr("Edit filter."),
     74              new ActionListener(){
     75                 public void actionPerformed(ActionEvent evt){
     76                    int index = userTable.getSelectionModel().getMinSelectionIndex();
     77                    if(index < 0) return;
     78                    Filter f = filters.getFilter(index);
     79                    Filter filter = (Filter)SearchAction.showSearchDialog(f);
     80                    if(filter != null){
     81                       filters.setFilter(index, filter);
     82                       filters.filter();
     83                    }
     84                 }
     85              });
     86        pnl.add(editButton);
     87
     88        deleteButton = new SideButton(marktr("Delete"), "delete", "SelectionList", tr("Delete filter."),
     89              new ActionListener(){
     90                 public void actionPerformed(ActionEvent evt){
     91                    int index = userTable.getSelectionModel().getMinSelectionIndex();
     92                    if(index < 0) return;
     93                    filters.removeFilter(index);
     94                 }
     95              });
     96        pnl.add(deleteButton);
     97
     98        upButton = new SideButton(marktr("Up"), "up", "SelectionList", tr("Move filter up."),
     99              new ActionListener(){
     100                 public void actionPerformed(ActionEvent evt){
     101                    int index = userTable.getSelectionModel().getMinSelectionIndex();
     102                    if(index < 0) return;
     103                    filters.moveUpFilter(index);
     104                    userTable.getSelectionModel().setSelectionInterval(index-1, index-1);
     105                 }
     106              });
     107        pnl.add(upButton);
     108       
     109        downButton = new SideButton(marktr("Down"), "down", "SelectionList", tr("Move filter down."),
     110              new ActionListener(){
     111                 public void actionPerformed(ActionEvent evt){
     112                    int index = userTable.getSelectionModel().getMinSelectionIndex();
     113                    if(index < 0) return;
     114                    filters.moveDownFilter(index);
     115                    userTable.getSelectionModel().setSelectionInterval(index+1, index+1);
     116                 }
     117              });
     118        pnl.add(downButton);
     119        return pnl;
     120    }
     121
     122    protected String[] columnToolTips = {
     123        tr("Filter elements"),
     124        tr("Disable elements"),
     125        tr("Apply also for children"),
     126        tr("Inverse filter"),
     127        null,
     128        tr("Filter mode")
     129    };
     130
     131    protected void build() {
     132        JPanel pnl = new JPanel();
     133        pnl.setLayout(new BorderLayout());
     134        userTable = new JTable(filters){
     135            protected JTableHeader createDefaultTableHeader() {
     136                return new JTableHeader(columnModel) {
     137                   public String getToolTipText(MouseEvent e) {
     138                       String tip = null;
     139                       java.awt.Point p = e.getPoint();
     140                       int index = columnModel.getColumnIndexAtX(p.x);
     141                       int realIndex = columnModel.getColumn(index).getModelIndex();
     142                       return columnToolTips[realIndex];
     143                   }
     144               };
     145           }
     146        };   
     147 
     148        userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
     149
     150        userTable.getColumnModel().getColumn(0).setMaxWidth(1);
     151        userTable.getColumnModel().getColumn(1).setMaxWidth(1);
     152        userTable.getColumnModel().getColumn(3).setMaxWidth(1);
     153        userTable.getColumnModel().getColumn(4).setMaxWidth(1);
     154        userTable.getColumnModel().getColumn(5).setMaxWidth(1);
     155
     156        userTable.getColumnModel().getColumn(0).setResizable(false);
     157        userTable.getColumnModel().getColumn(1).setResizable(false);
     158        userTable.getColumnModel().getColumn(3).setResizable(false);
     159        userTable.getColumnModel().getColumn(4).setResizable(false);
     160        userTable.getColumnModel().getColumn(5).setResizable(false);
     161
     162        pnl.add(new JScrollPane(userTable), BorderLayout.CENTER);
     163
     164        // -- the button row
     165        pnl.add(buildButtonRow(), BorderLayout.SOUTH);
     166        /*userTable.addMouseListener(new DoubleClickAdapter());*/
     167        add(pnl, BorderLayout.CENTER);
     168    }
     169
     170    public void layerRemoved(Layer a) {
     171        if (a instanceof OsmDataLayer) {
     172            ((OsmDataLayer)a).listenerDataChanged.remove(this);
     173        }
     174    }
     175
     176    public void layerAdded(Layer a) {
     177        if (a instanceof OsmDataLayer) {
     178            ((OsmDataLayer)a).listenerDataChanged.add(this);
     179        }
     180    }
     181
     182   public void activeLayerChange(Layer oldLayer, Layer newLayer) {
     183      filters.filter();
     184   }
     185
     186   public void dataChanged(OsmDataLayer l){
     187      filters.filter();
     188   }
     189}
  • src/org/openstreetmap/josm/actions/search/SearchAction.java

     
    2424import org.openstreetmap.josm.gui.ExtendedDialog;
    2525import org.openstreetmap.josm.tools.GBC;
    2626import org.openstreetmap.josm.tools.Shortcut;
     27import org.openstreetmap.josm.data.osm.Filter;
    2728
    2829public class SearchAction extends JosmAction{
    2930
    3031    public static final int SEARCH_HISTORY_SIZE = 10;
    3132
    3233    public static enum SearchMode {
    33         replace, add, remove
     34        replace, add, remove, in_selection
    3435    }
    3536
    3637    public static final LinkedList<SearchSetting> searchHistory = new LinkedList<SearchSetting>();
     
    5657        }
    5758        SearchSetting s = lastSearch;
    5859        if (s == null) {
    59             s = new SearchSetting("", false, false, SearchMode.replace);
     60            s = new SearchSetting("", SearchMode.replace, false, false);
    6061        }
    61         showSearchDialog(s);
     62        SearchSetting se = showSearchDialog(s);
     63        if(se != null) searchWithHistory(se);
    6264    }
    6365
    64     public void showSearchDialog(SearchSetting initialValues) {
    65         JLabel label = new JLabel(tr("Please enter a search string."));
     66    public static SearchSetting showSearchDialog(SearchSetting initialValues) {
     67        JLabel label = new JLabel( initialValues instanceof Filter ? tr("Please enter a filter string.") : tr("Please enter a search string."));
    6668        final JTextField input = new JTextField(initialValues.text);
    6769        input.selectAll();
    6870        input.requestFocusInWindow();
    6971        JRadioButton replace = new JRadioButton(tr("replace selection"), initialValues.mode == SearchMode.replace);
    7072        JRadioButton add = new JRadioButton(tr("add to selection"), initialValues.mode == SearchMode.add);
    7173        JRadioButton remove = new JRadioButton(tr("remove from selection"), initialValues.mode == SearchMode.remove);
     74        JRadioButton in_selection = new JRadioButton(tr("find in selection"), initialValues.mode == SearchMode.in_selection);
    7275        ButtonGroup bg = new ButtonGroup();
    7376        bg.add(replace);
    7477        bg.add(add);
    7578        bg.add(remove);
     79        bg.add(in_selection);
    7680
    7781        JCheckBox caseSensitive = new JCheckBox(tr("case sensitive"), initialValues.caseSensitive);
    7882        JCheckBox regexSearch   = new JCheckBox(tr("regular expression"), initialValues.regexSearch);
    7983
    8084        JPanel left = new JPanel(new GridBagLayout());
     85
     86        JTextField finput = null;
     87        if(initialValues instanceof Filter){
     88           JLabel fLabel = new JLabel(tr("Please enter a filter name."));
     89           finput = new JTextField(((Filter)initialValues).filterName);
     90           left.add(fLabel, GBC.eop());
     91           left.add(finput, GBC.eop().fill(GBC.HORIZONTAL));
     92        }
     93
    8194        left.add(label, GBC.eop());
    8295        left.add(input, GBC.eop().fill(GBC.HORIZONTAL));
    8396        left.add(replace, GBC.eol());
    8497        left.add(add, GBC.eol());
    85         left.add(remove, GBC.eop());
     98        left.add(remove, GBC.eol());
     99        left.add(in_selection, GBC.eop());
    86100        left.add(caseSensitive, GBC.eol());
    87101        left.add(regexSearch, GBC.eol());
    88102
     
    119133        p.add(right);
    120134        ExtendedDialog dialog = new ExtendedDialog(
    121135                Main.parent,
    122                 tr("Search"),
    123                 new String[] {tr("Start Search"), tr("Cancel")}
     136                initialValues instanceof Filter ? tr("Filter") : tr("Search"),
     137                new String[] {
     138                   initialValues instanceof Filter ? tr("Make filter") : tr("Start Search"),
     139                tr("Cancel")}
    124140        );
    125141        dialog.setButtonIcons(new String[] {"dialogs/search.png", "cancel.png"});
    126142        dialog.setContent(p);
    127143        dialog.showDialog();
    128144        int result = dialog.getValue();
    129145
    130         if(result != 1) return;
     146        if(result != 1) return null;
    131147
    132148        // User pressed OK - let's perform the search
    133149        SearchMode mode = replace.isSelected() ? SearchAction.SearchMode.replace
    134                 : (add.isSelected() ? SearchAction.SearchMode.add : SearchAction.SearchMode.remove);
    135         SearchSetting setting = new SearchSetting(input.getText(), caseSensitive.isSelected(), regexSearch.isSelected(), mode);
    136         searchWithHistory(setting);
     150                : (add.isSelected() ? SearchAction.SearchMode.add
     151                : (remove.isSelected() ? SearchAction.SearchMode.remove : SearchAction.SearchMode.in_selection));
     152        if(initialValues instanceof Filter){
     153           return new Filter(input.getText(), mode, caseSensitive.isSelected(), regexSearch.isSelected(), finput.getText());
     154        } else {
     155           return new SearchSetting(input.getText(), mode, caseSensitive.isSelected(), regexSearch.isSelected());
     156        }
    137157    }
    138158
    139159    /**
     
    150170            searchHistory.removeLast();
    151171        }
    152172        lastSearch = s;
    153         search(s.text, s.mode, s.caseSensitive, s.regexSearch);
     173        search(s);
    154174    }
    155175
    156176    public static void searchWithoutHistory(SearchSetting s) {
    157177        lastSearch = s;
    158         search(s.text, s.mode, s.caseSensitive, s.regexSearch);
     178        search(s);
    159179    }
    160180
    161     public static void search(String search, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
    162         // FIXME: This is confusing. The GUI says nothing about loading primitives from an URL. We'd like to *search*
    163         // for URLs in the current data set.
    164         // Disabling until a better solution is in place
    165         //
    166         //        if (search.startsWith("http://") || search.startsWith("ftp://") || search.startsWith("https://")
    167         //                || search.startsWith("file:/")) {
    168         //            SelectionWebsiteLoader loader = new SelectionWebsiteLoader(search, mode);
    169         //            if (loader.url != null && loader.url.getHost() != null) {
    170         //                Main.worker.execute(loader);
    171         //                return;
    172         //            }
    173         //        }
     181    public interface Function{
     182       public Boolean isSomething(OsmPrimitive o);
     183    }
     184
     185    public static Integer getSelection(SearchSetting s, Collection<OsmPrimitive> sel, Function f) {
     186        Integer foundMatches = 0;
    174187        try {
    175             Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
    176             SearchCompiler.Match matcher = SearchCompiler.compile(search, caseSensitive, regexSearch);
    177             int foundMatches = 0;
     188            String searchText = s.text;
     189            if(s instanceof Filter){
     190               searchText = ((Filter)s).inverted ? "-" : "";
     191               searchText = searchText + "(" + ((Filter)s).text + ")" + (((Filter)s).applyForChildren ? ("| child (" + ((Filter)s).text + ")"): "");
     192            }
     193            /*System.out.println(searchText);  */
     194            SearchCompiler.Match matcher = SearchCompiler.compile(searchText, s.caseSensitive, s.regexSearch);
     195            foundMatches = 0;
    178196            for (OsmPrimitive osm : Main.main.getCurrentDataSet().allNonDeletedCompletePrimitives()) {
    179                 if (mode == SearchMode.replace) {
     197                if (s.mode == SearchMode.replace) {
    180198                    if (matcher.match(osm)) {
    181199                        sel.add(osm);
    182200                        ++foundMatches;
    183201                    } else {
    184202                        sel.remove(osm);
    185203                    }
    186                 } else if (mode == SearchMode.add && !osm.isSelected() && matcher.match(osm)) {
     204                } else if (s.mode == SearchMode.add && !f.isSomething(osm) && matcher.match(osm)) {
    187205                    sel.add(osm);
    188206                    ++foundMatches;
    189                 } else if (mode == SearchMode.remove && osm.isSelected() && matcher.match(osm)) {
     207                } else if (s.mode == SearchMode.remove && f.isSomething(osm) && matcher.match(osm)) {
    190208                    sel.remove(osm);
    191209                    ++foundMatches;
     210                } else if (s.mode == SearchMode.in_selection &&  f.isSomething(osm)&& !matcher.match(osm)) {
     211                    sel.remove(osm);
     212                    ++foundMatches;
    192213                }
    193214            }
    194             Main.main.getCurrentDataSet().setSelected(sel);
    195             if (foundMatches == 0) {
    196                 String msg = null;
    197                 if (mode == SearchMode.replace) {
    198                     msg = tr("No match found for ''{0}''", search);
    199                 } else if (mode == SearchMode.add) {
    200                     msg = tr("Nothing added to selection by searching for ''{0}''", search);
    201                 } else if (mode == SearchMode.remove) {
    202                     msg = tr("Nothing removed from selection by searching for ''{0}''", search);
    203                 }
    204                 Main.map.statusLine.setHelpText(msg);
    205                 JOptionPane.showMessageDialog(
    206                         Main.parent,
    207                         msg,
    208                         tr("Warning"),
    209                         JOptionPane.WARNING_MESSAGE
    210                 );
    211             } else {
    212                 Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
    213             }
    214215        } catch (SearchCompiler.ParseError e) {
    215216            JOptionPane.showMessageDialog(
    216217                    Main.parent,
     
    220221
    221222            );
    222223        }
     224        return foundMatches;
    223225    }
     226 
     227    public static void search(String search, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
     228       search(new SearchSetting(search, mode, caseSensitive, regexSearch));
     229    }
    224230
     231    public static void search(SearchSetting s) {
     232        // FIXME: This is confusing. The GUI says nothing about loading primitives from an URL. We'd like to *search*
     233        // for URLs in the current data set.
     234        // Disabling until a better solution is in place
     235        //
     236        //        if (search.startsWith("http://") || search.startsWith("ftp://") || search.startsWith("https://")
     237        //                || search.startsWith("file:/")) {
     238        //            SelectionWebsiteLoader loader = new SelectionWebsiteLoader(search, mode);
     239        //            if (loader.url != null && loader.url.getHost() != null) {
     240        //                Main.worker.execute(loader);
     241        //                return;
     242        //            }
     243        //        }
     244         
     245       Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
     246       int foundMatches = getSelection(s, sel, new Function(){
     247          public Boolean isSomething(OsmPrimitive o){
     248             return o.isSelected();
     249          }
     250       });
     251       Main.main.getCurrentDataSet().setSelected(sel);
     252       if (foundMatches == 0) {
     253           String msg = null;
     254           if (s.mode == SearchMode.replace) {
     255               msg = tr("No match found for ''{0}''", s.text);
     256           } else if (s.mode == SearchMode.add) {
     257               msg = tr("Nothing added to selection by searching for ''{0}''", s.text);
     258           } else if (s.mode == SearchMode.remove) {
     259               msg = tr("Nothing removed from selection by searching for ''{0}''", s.text);
     260           } else if (s.mode == SearchMode.in_selection) {
     261               msg = tr("Nothing find in selection by searching for ''{0}''", s.text);
     262           }
     263           Main.map.statusLine.setHelpText(msg);
     264           JOptionPane.showMessageDialog(
     265                   Main.parent,
     266                   msg,
     267                   tr("Warning"),
     268                   JOptionPane.WARNING_MESSAGE
     269           );
     270       } else {
     271           Main.map.statusLine.setHelpText(tr("Found {0} matches", foundMatches));
     272       }
     273    }
     274
    225275    public static class SearchSetting {
    226         String text;
    227         SearchMode mode;
    228         boolean caseSensitive;
    229         boolean regexSearch;
     276        public String text;
     277        public SearchMode mode;
     278        public boolean caseSensitive;
     279        public boolean regexSearch;
    230280
    231         public SearchSetting(String text, boolean caseSensitive, boolean regexSearch, SearchMode mode) {
     281        public SearchSetting(String text, SearchMode mode, boolean caseSensitive, boolean regexSearch) {
    232282            super();
    233283            this.caseSensitive = caseSensitive;
    234284            this.regexSearch = regexSearch;
  • src/org/openstreetmap/josm/gui/MapFrame.java

     
    2828import org.openstreetmap.josm.gui.dialogs.PropertiesDialog;
    2929import org.openstreetmap.josm.gui.dialogs.RelationListDialog;
    3030import org.openstreetmap.josm.gui.dialogs.SelectionListDialog;
     31import org.openstreetmap.josm.gui.dialogs.FilterDialog;
    3132import org.openstreetmap.josm.gui.dialogs.ToggleDialog;
    3233import org.openstreetmap.josm.gui.dialogs.UserListDialog;
    3334import org.openstreetmap.josm.tools.Destroyable;
     
    103104        addToggleDialog(new PropertiesDialog(this));
    104105        addToggleDialog(new HistoryDialog());
    105106        addToggleDialog(new SelectionListDialog());
     107        addToggleDialog(new FilterDialog());
    106108        addToggleDialog(new UserListDialog());
    107109        addToggleDialog(conflictDialog = new ConflictDialog());
    108110        addToggleDialog(new CommandStackDialog(this));