- Timestamp:
- 2019-07-07T18:36:38+02:00 (6 years ago)
- Location:
- trunk
- Files:
-
- 5 added
- 9 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/openstreetmap/josm/data/osm/Filter.java
r14932 r15226 2 2 package org.openstreetmap.josm.data.osm; 3 3 4 import java.util.Comparator; 4 5 import java.util.Objects; 5 6 … … 15 16 * @since 2125 16 17 */ 17 public class Filter extends SearchSetting { 18 public class Filter extends SearchSetting implements Comparable<Filter> { 18 19 private static final String version = "1"; 19 20 … … 167 168 return e; 168 169 } 170 171 @Override 172 public int compareTo(Filter o) { 173 return Comparator 174 .<Filter, String>comparing(f -> f.text) 175 .thenComparing(f -> f.mode) 176 .thenComparing(f -> f.caseSensitive) 177 .thenComparing(f -> f.regexSearch) 178 .thenComparing(f -> f.mapCSSSearch) 179 .thenComparing(f -> f.enable) 180 .thenComparing(f -> f.hiding) 181 .thenComparing(f -> f.inverted) 182 .compare(this, o); 183 } 169 184 } -
trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java
r14992 r15226 8 8 import java.util.ArrayList; 9 9 import java.util.Collection; 10 import java.util.Collections; 10 11 import java.util.HashSet; 11 12 import java.util.LinkedList; … … 16 17 import javax.swing.JOptionPane; 17 18 19 import org.openstreetmap.josm.data.SortableModel; 18 20 import org.openstreetmap.josm.data.StructUtils; 19 21 import org.openstreetmap.josm.data.osm.Filter.FilterPreferenceEntry; … … 29 31 * @since 12400 30 32 */ 31 public class FilterModel { 33 public class FilterModel implements SortableModel<Filter> { 32 34 33 35 /** … … 236 238 237 239 /** 240 * Moves the filters in the given rows by a number of positions. 241 * @param delta negative or positive increment 242 * @param rowIndexes The filter rows 243 * @return true if the filters have been moved down 244 * @since 15226 245 */ 246 public boolean moveFilters(int delta, int... rowIndexes) { 247 if (!canMove(delta, filters::size, rowIndexes)) 248 return false; 249 doMove(delta, rowIndexes); 250 updateFilterMatcher(); 251 return true; 252 } 253 254 /** 238 255 * Moves down the filter in the given row. 239 256 * @param rowIndex The filter row … … 241 258 */ 242 259 public boolean moveDownFilter(int rowIndex) { 243 if (rowIndex >= filters.size() - 1) 244 return false; 245 filters.add(rowIndex + 1, filters.remove(rowIndex)); 246 updateFilterMatcher(); 247 return true; 260 return moveFilters(1, rowIndex); 248 261 } 249 262 … … 254 267 */ 255 268 public boolean moveUpFilter(int rowIndex) { 256 if (rowIndex <= 0 || rowIndex >= filters.size()) 257 return false; 258 filters.add(rowIndex - 1, filters.remove(rowIndex)); 259 updateFilterMatcher(); 260 return true; 269 return moveFilters(-1, rowIndex); 261 270 } 262 271 … … 277 286 * @param filter The filter that should be placed in that row 278 287 * @return the filter previously at the specified position 279 */ 288 * @deprecated Use {@link #setValue} 289 */ 290 @Deprecated 280 291 public Filter setFilter(int rowIndex, Filter filter) { 292 return setValue(rowIndex, filter); 293 } 294 295 @Override 296 public Filter setValue(int rowIndex, Filter filter) { 281 297 Filter result = filters.set(rowIndex, filter); 282 298 updateFilterMatcher(); … … 288 304 * @param rowIndex The row index 289 305 * @return The filter in that row 290 */ 306 * @deprecated Use {@link #getValue} 307 */ 308 @Deprecated 291 309 public Filter getFilter(int rowIndex) { 310 return getValue(rowIndex); 311 } 312 313 @Override 314 public Filter getValue(int rowIndex) { 292 315 return filters.get(rowIndex); 293 316 } … … 418 441 return result; 419 442 } 443 444 @Override 445 public void sort() { 446 Collections.sort(filters); 447 updateFilterMatcher(); 448 } 449 450 @Override 451 public void reverse() { 452 Collections.reverse(filters); 453 updateFilterMatcher(); 454 } 420 455 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
r15176 r15226 12 12 import java.util.Arrays; 13 13 import java.util.List; 14 import java.util.stream.Collectors; 14 15 15 16 import javax.swing.AbstractAction; 16 17 import javax.swing.DefaultCellEditor; 18 import javax.swing.DefaultListSelectionModel; 17 19 import javax.swing.JCheckBox; 18 20 import javax.swing.JTable; … … 62 64 63 65 private JTable userTable; 64 private final FilterTableModel filterModel = new FilterTableModel(); 65 66 private final EnableFilterAction enableFilterAction; 67 private final HidingFilterAction hidingFilterAction; 66 private final FilterTableModel filterModel = new FilterTableModel(new DefaultListSelectionModel()); 67 68 private final AddAction addAction = new AddAction(); 69 private final EditAction editAction = new EditAction(); 70 private final DeleteAction deleteAction = new DeleteAction(); 71 private final MoveUpAction moveUpAction = new MoveUpAction(); 72 private final MoveDownAction moveDownAction = new MoveDownAction(); 73 private final SortAction sortAction = new SortAction(); 74 private final ReverseAction reverseAction = new ReverseAction(); 75 private final EnableFilterAction enableFilterAction = new EnableFilterAction(); 76 private final HidingFilterAction hidingFilterAction = new HidingFilterAction(); 68 77 69 78 /** … … 75 84 KeyEvent.VK_F, Shortcut.ALT_SHIFT), 162); 76 85 build(); 77 enableFilterAction = new EnableFilterAction();78 hidingFilterAction = new HidingFilterAction();79 86 MultikeyActionsHandler.getInstance().addAction(enableFilterAction); 80 87 MultikeyActionsHandler.getInstance().addAction(hidingFilterAction); … … 112 119 }; 113 120 121 private abstract class FilterAction extends AbstractAction implements IEnabledStateUpdating { 122 123 FilterAction(String name, String description, String icon) { 124 putValue(NAME, name); 125 putValue(SHORT_DESCRIPTION, description); 126 new ImageProvider("dialogs", icon).getResource().attachImageIcon(this, true); 127 } 128 129 @Override 130 public void updateEnabledState() { 131 setEnabled(!filterModel.getSelectionModel().isSelectionEmpty()); 132 } 133 } 134 135 private class AddAction extends FilterAction { 136 AddAction() { 137 super(tr("Add"), tr("Add filter."), /* ICON(dialogs/) */ "add"); 138 } 139 140 @Override 141 public void actionPerformed(ActionEvent e) { 142 SearchSetting searchSetting = SearchAction.showSearchDialog(new Filter()); 143 if (searchSetting != null) { 144 filterModel.addFilter(new Filter(searchSetting)); 145 } 146 } 147 148 @Override 149 public void updateEnabledState() { 150 // Do nothing 151 } 152 } 153 154 private class EditAction extends FilterAction { 155 EditAction() { 156 super(tr("Edit"), tr("Edit filter."), /* ICON(dialogs/) */ "edit"); 157 } 158 159 @Override 160 public void actionPerformed(ActionEvent e) { 161 int index = filterModel.getSelectionModel().getMinSelectionIndex(); 162 if (index < 0) return; 163 Filter f = filterModel.getValue(index); 164 SearchSetting searchSetting = SearchAction.showSearchDialog(f); 165 if (searchSetting != null) { 166 filterModel.setValue(index, new Filter(searchSetting)); 167 } 168 } 169 } 170 171 private class DeleteAction extends FilterAction { 172 DeleteAction() { 173 super(tr("Delete"), tr("Delete filter."), /* ICON(dialogs/) */ "delete"); 174 } 175 176 @Override 177 public void actionPerformed(ActionEvent e) { 178 int index = filterModel.getSelectionModel().getMinSelectionIndex(); 179 if (index >= 0) { 180 filterModel.removeFilter(index); 181 } 182 } 183 } 184 185 private class MoveUpAction extends FilterAction { 186 MoveUpAction() { 187 super(tr("Up"), tr("Move filter up."), /* ICON(dialogs/) */ "up"); 188 } 189 190 @Override 191 public void actionPerformed(ActionEvent e) { 192 int index = userTable.convertRowIndexToModel(userTable.getSelectionModel().getMinSelectionIndex()); 193 if (index >= 0 && filterModel.moveUp(index)) { 194 filterModel.getSelectionModel().setSelectionInterval(index-1, index-1); 195 } 196 } 197 198 @Override 199 public void updateEnabledState() { 200 setEnabled(filterModel.canMoveUp()); 201 } 202 } 203 204 private class MoveDownAction extends FilterAction { 205 MoveDownAction() { 206 super(tr("Down"), tr("Move filter down."), /* ICON(dialogs/) */ "down"); 207 } 208 209 @Override 210 public void actionPerformed(ActionEvent e) { 211 int index = userTable.convertRowIndexToModel(userTable.getSelectionModel().getMinSelectionIndex()); 212 if (index >= 0 && filterModel.moveDown(index)) { 213 filterModel.getSelectionModel().setSelectionInterval(index+1, index+1); 214 } 215 } 216 217 @Override 218 public void updateEnabledState() { 219 setEnabled(filterModel.canMoveDown()); 220 } 221 } 222 223 private class SortAction extends FilterAction { 224 SortAction() { 225 super(tr("Sort"), tr("Sort filters."), /* ICON(dialogs/) */ "sort"); 226 } 227 228 @Override 229 public void actionPerformed(ActionEvent e) { 230 filterModel.sort(); 231 } 232 233 @Override 234 public void updateEnabledState() { 235 setEnabled(filterModel.getRowCount() > 1); 236 } 237 } 238 239 private class ReverseAction extends FilterAction { 240 ReverseAction() { 241 super(tr("Reverse"), tr("Reverse the filters order."), /* ICON(dialogs/) */ "reverse"); 242 } 243 244 @Override 245 public void actionPerformed(ActionEvent e) { 246 filterModel.reverse(); 247 } 248 249 @Override 250 public void updateEnabledState() { 251 setEnabled(filterModel.getRowCount() > 1); 252 } 253 } 254 114 255 /** 115 256 * Builds the GUI. … … 120 261 userTable.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); 121 262 userTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 122 userTable.set AutoCreateRowSorter(true);263 userTable.setSelectionModel(filterModel.getSelectionModel()); 123 264 124 265 TableHelper.adjustColumnWidth(userTable, 0, false); … … 130 271 userTable.setDefaultRenderer(String.class, new StringRenderer()); 131 272 userTable.setDefaultEditor(String.class, new DefaultCellEditor(new DisableShortcutsOnFocusGainedTextField())); 132 133 SideButton addButton = new SideButton(new AbstractAction() {134 {135 putValue(NAME, tr("Add"));136 putValue(SHORT_DESCRIPTION, tr("Add filter."));137 new ImageProvider("dialogs", "add").getResource().attachImageIcon(this, true);138 }139 140 @Override141 public void actionPerformed(ActionEvent e) {142 SearchSetting searchSetting = SearchAction.showSearchDialog(new Filter());143 if (searchSetting != null) {144 filterModel.addFilter(new Filter(searchSetting));145 }146 }147 });148 SideButton editButton = new SideButton(new AbstractAction() {149 {150 putValue(NAME, tr("Edit"));151 putValue(SHORT_DESCRIPTION, tr("Edit filter."));152 new ImageProvider("dialogs", "edit").getResource().attachImageIcon(this, true);153 }154 155 @Override156 public void actionPerformed(ActionEvent e) {157 int index = userTable.getSelectionModel().getMinSelectionIndex();158 if (index < 0) return;159 Filter f = filterModel.getFilter(index);160 SearchSetting searchSetting = SearchAction.showSearchDialog(f);161 if (searchSetting != null) {162 filterModel.setFilter(index, new Filter(searchSetting));163 }164 }165 });166 SideButton deleteButton = new SideButton(new AbstractAction() {167 {168 putValue(NAME, tr("Delete"));169 putValue(SHORT_DESCRIPTION, tr("Delete filter."));170 new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this, true);171 }172 173 @Override174 public void actionPerformed(ActionEvent e) {175 int index = userTable.getSelectionModel().getMinSelectionIndex();176 if (index >= 0) {177 filterModel.removeFilter(index);178 }179 }180 });181 SideButton upButton = new SideButton(new AbstractAction() {182 {183 putValue(NAME, tr("Up"));184 putValue(SHORT_DESCRIPTION, tr("Move filter up."));185 new ImageProvider("dialogs", "up").getResource().attachImageIcon(this, true);186 }187 188 @Override189 public void actionPerformed(ActionEvent e) {190 int index = userTable.getSelectionModel().getMinSelectionIndex();191 if (index >= 0) {192 filterModel.moveUpFilter(index);193 userTable.getSelectionModel().setSelectionInterval(index-1, index-1);194 }195 }196 });197 SideButton downButton = new SideButton(new AbstractAction() {198 {199 putValue(NAME, tr("Down"));200 putValue(SHORT_DESCRIPTION, tr("Move filter down."));201 new ImageProvider("dialogs", "down").getResource().attachImageIcon(this, true);202 }203 204 @Override205 public void actionPerformed(ActionEvent e) {206 int index = userTable.getSelectionModel().getMinSelectionIndex();207 if (index >= 0) {208 filterModel.moveDownFilter(index);209 userTable.getSelectionModel().setSelectionInterval(index+1, index+1);210 }211 }212 });213 273 214 274 // Toggle filter "enabled" on Enter … … 218 278 int index = userTable.getSelectedRow(); 219 279 if (index >= 0) { 220 Filter filter = filterModel.get Filter(index);280 Filter filter = filterModel.getValue(index); 221 281 filterModel.setValueAt(!filter.enable, index, FilterTableModel.COL_ENABLED); 222 282 } … … 230 290 int index = userTable.getSelectedRow(); 231 291 if (index >= 0) { 232 Filter filter = filterModel.get Filter(index);292 Filter filter = filterModel.getValue(index); 233 293 filterModel.setValueAt(!filter.hiding, index, FilterTableModel.COL_HIDING); 234 294 } … … 236 296 }); 237 297 238 createLayout(userTable, true, Arrays.asList( 239 addButton, editButton, deleteButton, upButton, downButton 240 )); 298 List<FilterAction> actions = Arrays.asList(addAction, editAction, deleteAction, moveUpAction, moveDownAction, sortAction, reverseAction); 299 for (FilterAction action : actions) { 300 TableHelper.adaptTo(action, filterModel); 301 TableHelper.adaptTo(action, filterModel.getSelectionModel()); 302 action.updateEnabledState(); 303 } 304 createLayout(userTable, true, actions.stream().map(a -> new SideButton(a, false)).collect(Collectors.toList())); 241 305 } 242 306 … … 384 448 385 449 for (int i = 0; i < filterModel.getRowCount(); i++) { 386 Filter filter = filterModel.getFilter(i); 387 MultikeyInfo info = new MultikeyInfo(i, filter.text); 388 result.add(info); 450 result.add(new MultikeyInfo(i, filterModel.getValue(i).text)); 389 451 } 390 452 … … 420 482 public void executeMultikeyAction(int index, boolean repeatLastAction) { 421 483 if (index >= 0 && index < filterModel.getRowCount()) { 422 Filter filter = filterModel.get Filter(index);484 Filter filter = filterModel.getValue(index); 423 485 filterModel.setValueAt(!filter.enable, index, FilterTableModel.COL_ENABLED); 424 486 lastFilter = filter; … … 444 506 public void executeMultikeyAction(int index, boolean repeatLastAction) { 445 507 if (index >= 0 && index < filterModel.getRowCount()) { 446 Filter filter = filterModel.get Filter(index);508 Filter filter = filterModel.getValue(index); 447 509 filterModel.setValueAt(!filter.hiding, index, FilterTableModel.COL_HIDING); 448 510 lastFilter = filter; -
trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
r15065 r15226 9 9 import java.util.List; 10 10 11 import javax.swing.ListSelectionModel; 11 12 import javax.swing.table.AbstractTableModel; 12 13 … … 17 18 import org.openstreetmap.josm.gui.MapFrame; 18 19 import org.openstreetmap.josm.gui.autofilter.AutoFilterManager; 20 import org.openstreetmap.josm.gui.util.SortableTableModel; 19 21 import org.openstreetmap.josm.gui.widgets.OSDLabel; 20 22 import org.openstreetmap.josm.tools.Logging; … … 24 26 * 25 27 * @author Petr_Dlouhý 28 * @since 2125 26 29 */ 27 public class FilterTableModel extends AbstractTableModel { 30 public class FilterTableModel extends AbstractTableModel implements SortableTableModel<Filter> { 28 31 29 32 /** … … 50 53 51 54 /** 52 * A helper for {@link #drawOSDText(Graphics2D)}. 55 * The selection model 56 */ 57 final ListSelectionModel selectionModel; 58 59 /** 60 * A helper for {@link #drawOSDText(Graphics2D)} 53 61 */ 54 62 private final OSDLabel lblOSD = new OSDLabel(""); … … 56 64 /** 57 65 * Constructs a new {@code FilterTableModel}. 58 */ 59 public FilterTableModel() { 66 * @param listSelectionModel selection model 67 */ 68 public FilterTableModel(ListSelectionModel listSelectionModel) { 69 this.selectionModel = listSelectionModel; 60 70 loadPrefs(); 61 71 } … … 134 144 } 135 145 146 @Override 147 public boolean doMove(int delta, int... selectedRows) { 148 return model.moveFilters(delta, selectedRows); 149 } 150 151 @Override 152 public boolean move(int delta, int... selectedRows) { 153 if (!SortableTableModel.super.move(delta, selectedRows)) 154 return false; 155 savePrefs(); 156 updateFilters(); 157 int rowIndex = selectedRows[0]; 158 if (delta < 0) 159 fireTableRowsUpdated(rowIndex + delta, rowIndex); 160 else if (delta > 0) 161 fireTableRowsUpdated(rowIndex, rowIndex + delta); 162 return true; 163 } 164 136 165 /** 137 166 * Moves down the filter in the given row. 138 167 * @param rowIndex The filter row 139 */ 168 * @deprecated Use {@link #moveDown(int...)} 169 */ 170 @Deprecated 140 171 public void moveDownFilter(int rowIndex) { 141 if (model.moveDownFilter(rowIndex)) { 142 savePrefs(); 143 updateFilters(); 144 fireTableRowsUpdated(rowIndex, rowIndex + 1); 145 } 172 moveDown(rowIndex); 146 173 } 147 174 … … 149 176 * Moves up the filter in the given row 150 177 * @param rowIndex The filter row 151 */ 178 * @deprecated Use {@link #moveUp(int...)} 179 */ 180 @Deprecated 152 181 public void moveUpFilter(int rowIndex) { 153 if (model.moveUpFilter(rowIndex)) { 154 savePrefs(); 155 updateFilters(); 156 fireTableRowsUpdated(rowIndex - 1, rowIndex); 157 } 182 moveUp(rowIndex); 158 183 } 159 184 … … 174 199 * @param rowIndex The row index 175 200 * @param filter The filter that should be placed in that row 176 */ 201 * @deprecated Use {@link #setValue} 202 */ 203 @Deprecated 177 204 public void setFilter(int rowIndex, Filter filter) { 178 model.setFilter(rowIndex, filter); 205 setValue(rowIndex, filter); 206 } 207 208 @Override 209 public Filter setValue(int rowIndex, Filter filter) { 210 Filter result = model.setValue(rowIndex, filter); 179 211 savePrefs(); 180 212 updateFilters(); 181 213 fireTableRowsUpdated(rowIndex, rowIndex); 214 return result; 182 215 } 183 216 … … 186 219 * @param rowIndex The row index 187 220 * @return The filter in that row 188 */ 221 * @deprecated Use {@link #getValue} 222 */ 223 @Deprecated 189 224 public Filter getFilter(int rowIndex) { 190 return model.getFilter(rowIndex); 225 return getValue(rowIndex); 226 } 227 228 @Override 229 public Filter getValue(int rowIndex) { 230 return model.getValue(rowIndex); 231 } 232 233 @Override 234 public ListSelectionModel getSelectionModel() { 235 return selectionModel; 191 236 } 192 237 … … 225 270 */ 226 271 public boolean isCellEnabled(int row, int column) { 227 return model.get Filter(row).enable || column == 0;272 return model.getValue(row).enable || column == 0; 228 273 } 229 274 … … 238 283 return; 239 284 } 240 Filter f = model.get Filter(row);285 Filter f = model.getValue(row); 241 286 switch (column) { 242 287 case COL_ENABLED: … … 254 299 default: // Do nothing 255 300 } 256 set Filter(row, f);301 setValue(row, f); 257 302 } 258 303 … … 262 307 return null; 263 308 } 264 Filter f = model.get Filter(row);309 Filter f = model.getValue(row); 265 310 switch (column) { 266 311 case COL_ENABLED: … … 308 353 return model.getFilters(); 309 354 } 355 356 @Override 357 public void sort() { 358 model.sort(); 359 fireTableDataChanged(); 360 } 361 362 @Override 363 public void reverse() { 364 model.reverse(); 365 fireTableDataChanged(); 366 } 310 367 } -
trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
r14993 r15226 17 17 import java.util.ArrayList; 18 18 import java.util.Arrays; 19 import java.util.Collections;20 19 import java.util.List; 21 20 import java.util.Objects; … … 74 73 import org.openstreetmap.josm.gui.util.MultikeyActionsHandler; 75 74 import org.openstreetmap.josm.gui.util.MultikeyShortcutAction.MultikeyInfo; 75 import org.openstreetmap.josm.gui.util.ReorderableTableModel; 76 import org.openstreetmap.josm.gui.util.TableHelper; 76 77 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField; 77 78 import org.openstreetmap.josm.gui.widgets.JosmTextField; … … 79 80 import org.openstreetmap.josm.gui.widgets.ScrollableTable; 80 81 import org.openstreetmap.josm.spi.preferences.Config; 82 import org.openstreetmap.josm.tools.ArrayUtils; 81 83 import org.openstreetmap.josm.tools.ImageProvider; 82 84 import org.openstreetmap.josm.tools.ImageProvider.ImageSizes; … … 268 270 // -- move up action 269 271 MoveUpAction moveUpAction = new MoveUpAction(model); 270 adaptTo(moveUpAction, model); 271 adaptTo(moveUpAction, selectionModel); 272 TableHelper.adaptTo(moveUpAction, model); 273 TableHelper.adaptTo(moveUpAction, selectionModel); 272 274 273 275 // -- move down action 274 276 MoveDownAction moveDownAction = new MoveDownAction(model); 275 adaptTo(moveDownAction, model); 276 adaptTo(moveDownAction, selectionModel); 277 TableHelper.adaptTo(moveDownAction, model); 278 TableHelper.adaptTo(moveDownAction, selectionModel); 277 279 278 280 // -- activate action … … 280 282 activateLayerAction.updateEnabledState(); 281 283 MultikeyActionsHandler.getInstance().addAction(activateLayerAction); 282 adaptTo(activateLayerAction, selectionModel); 284 TableHelper.adaptTo(activateLayerAction, selectionModel); 283 285 284 286 JumpToMarkerActions.initialize(); … … 287 289 showHideLayerAction = new ShowHideLayerAction(model); 288 290 MultikeyActionsHandler.getInstance().addAction(showHideLayerAction); 289 adaptTo(showHideLayerAction, selectionModel); 291 TableHelper.adaptTo(showHideLayerAction, selectionModel); 290 292 291 293 LayerVisibilityAction visibilityAction = new LayerVisibilityAction(model); 292 adaptTo(visibilityAction, selectionModel); 294 TableHelper.adaptTo(visibilityAction, selectionModel); 293 295 SideButton visibilityButton = new SideButton(visibilityAction, false); 294 296 visibilityAction.setCorrespondingSideButton(visibilityButton); … … 297 299 DeleteLayerAction deleteLayerAction = new DeleteLayerAction(model); 298 300 layerList.getActionMap().put("deleteLayer", deleteLayerAction); 299 adaptTo(deleteLayerAction, selectionModel); 301 TableHelper.adaptTo(deleteLayerAction, selectionModel); 300 302 getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put( 301 303 KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "delete" … … 365 367 * @param listener the listener 366 368 * @param listSelectionModel the source emitting {@link ListSelectionEvent}s 367 */ 369 * @deprecated Use {@link TableHelper#adaptTo} 370 */ 371 @Deprecated 368 372 protected void adaptTo(final IEnabledStateUpdating listener, ListSelectionModel listSelectionModel) { 369 listSelectionModel .addListSelectionListener(e -> listener.updateEnabledState());373 TableHelper.adaptTo(listener, listSelectionModel); 370 374 } 371 375 … … 377 381 * @param listener the listener 378 382 * @param listModel the source emitting {@link ListDataEvent}s 379 */ 383 * @deprecated Use {@link TableHelper#adaptTo} 384 */ 385 @Deprecated 380 386 protected void adaptTo(final IEnabledStateUpdating listener, LayerListModel listModel) { 381 listModel .addTableModelListener(e -> listener.updateEnabledState());387 TableHelper.adaptTo(listener, listModel); 382 388 } 383 389 … … 679 685 */ 680 686 public static final class LayerListModel extends AbstractTableModel 681 implements LayerChangeListener, ActiveLayerChangeListener, PropertyChangeListener { 687 implements LayerChangeListener, ActiveLayerChangeListener, PropertyChangeListener, ReorderableTableModel<Layer> { 682 688 /** manages list selection state*/ 683 689 private final DefaultListSelectionModel selectionModel; … … 801 807 */ 802 808 public List<Integer> getSelectedRows() { 803 List<Integer> selected = new ArrayList<>(); 804 for (int i = 0; i < getLayers().size(); i++) { 805 if (selectionModel.isSelectedIndex(i)) { 806 selected.add(i); 807 } 808 } 809 return selected; 809 return ArrayUtils.toList(TableHelper.getSelectedIndices(selectionModel)); 810 810 } 811 811 … … 820 820 layer.removePropertyChangeListener(this); 821 821 final int size = getRowCount(); 822 final List<Integer>rows = getSelectedRows();823 824 if (rows. isEmpty()&& size > 0) {822 final int[] rows = TableHelper.getSelectedIndices(selectionModel); 823 824 if (rows.length == 0 && size > 0) { 825 825 selectionModel.setSelectionInterval(size-1, size-1); 826 826 } … … 876 876 } 877 877 878 /** 879 * Replies true if the currently selected layers can move up by one position 880 * 881 * @return true if the currently selected layers can move up by one position 882 */ 883 public boolean canMoveUp() { 884 List<Integer> sel = getSelectedRows(); 885 return !sel.isEmpty() && sel.get(0) > 0; 886 } 887 888 /** 889 * Move up the currently selected layers by one position 890 * 891 */ 892 public void moveUp() { 893 if (!canMoveUp()) 894 return; 895 List<Integer> sel = getSelectedRows(); 896 List<Layer> layers = getLayers(); 897 MapView mapView = MainApplication.getMap().mapView; 898 for (int row : sel) { 899 Layer l1 = layers.get(row); 900 mapView.moveLayer(l1, row-1); 901 } 902 fireTableDataChanged(); 903 selectionModel.setValueIsAdjusting(true); 904 selectionModel.clearSelection(); 905 for (int row : sel) { 906 selectionModel.addSelectionInterval(row-1, row-1); 907 } 908 selectionModel.setValueIsAdjusting(false); 878 @Override 879 public DefaultListSelectionModel getSelectionModel() { 880 return selectionModel; 881 } 882 883 @Override 884 public Layer getValue(int index) { 885 return getLayer(index); 886 } 887 888 @Override 889 public Layer setValue(int index, Layer value) { 890 throw new UnsupportedOperationException(); 891 } 892 893 @Override 894 public boolean doMove(int delta, int... selectedRows) { 895 if (delta != 0) { 896 List<Layer> layers = getLayers(); 897 MapView mapView = MainApplication.getMap().mapView; 898 if (delta < 0) { 899 for (int row : selectedRows) { 900 mapView.moveLayer(layers.get(row), row + delta); 901 } 902 } else if (delta > 0) { 903 for (int i = selectedRows.length - 1; i >= 0; i--) { 904 mapView.moveLayer(layers.get(selectedRows[i]), selectedRows[i] + delta); 905 } 906 } 907 fireTableDataChanged(); 908 } 909 return delta != 0; 910 } 911 912 @Override 913 public boolean move(int delta, int... selectedRows) { 914 if (!ReorderableTableModel.super.move(delta, selectedRows)) 915 return false; 909 916 ensureSelectedIsVisible(); 910 } 911 912 /** 913 * Replies true if the currently selected layers can move down by one position 914 * 915 * @return true if the currently selected layers can move down by one position 916 */ 917 public boolean canMoveDown() { 918 List<Integer> sel = getSelectedRows(); 919 return !sel.isEmpty() && sel.get(sel.size()-1) < getLayers().size()-1; 920 } 921 922 /** 923 * Move down the currently selected layers by one position 924 */ 925 public void moveDown() { 926 if (!canMoveDown()) 927 return; 928 List<Integer> sel = getSelectedRows(); 929 Collections.reverse(sel); 930 List<Layer> layers = getLayers(); 931 MapView mapView = MainApplication.getMap().mapView; 932 for (int row : sel) { 933 Layer l1 = layers.get(row); 934 mapView.moveLayer(l1, row+1); 935 } 936 fireTableDataChanged(); 937 selectionModel.setValueIsAdjusting(true); 938 selectionModel.clearSelection(); 939 for (int row : sel) { 940 selectionModel.addSelectionInterval(row+1, row+1); 941 } 942 selectionModel.setValueIsAdjusting(false); 943 ensureSelectedIsVisible(); 917 return true; 944 918 } 945 919 -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
r14339 r15226 3 3 4 4 import java.util.ArrayList; 5 import java.util.Arrays;6 5 import java.util.BitSet; 7 6 import java.util.Collection; … … 45 44 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets; 46 45 import org.openstreetmap.josm.gui.util.GuiHelper; 46 import org.openstreetmap.josm.gui.util.SortableTableModel; 47 47 import org.openstreetmap.josm.gui.widgets.OsmPrimitivesTableModel; 48 import org.openstreetmap.josm.tools.ArrayUtils; 48 49 import org.openstreetmap.josm.tools.JosmRuntimeException; 49 50 import org.openstreetmap.josm.tools.bugreport.BugReport; … … 53 54 */ 54 55 public class MemberTableModel extends AbstractTableModel 55 implements TableModelListener, DataSelectionListener, DataSetListener, OsmPrimitivesTableModel { 56 implements TableModelListener, DataSelectionListener, DataSetListener, OsmPrimitivesTableModel, SortableTableModel<RelationMember> { 56 57 57 58 /** … … 181 182 /* --------------------------------------------------------------------------- */ 182 183 184 /** 185 * Add a new member model listener. 186 * @param listener member model listener to add 187 */ 183 188 public void addMemberModelListener(IMemberModelListener listener) { 184 189 if (listener != null) { … … 187 192 } 188 193 194 /** 195 * Remove a member model listener. 196 * @param listener member model listener to remove 197 */ 189 198 public void removeMemberModelListener(IMemberModelListener listener) { 190 199 listeners.remove(listener); … … 260 269 } 261 270 262 /** 263 * Move up selected rows, if possible. 264 * @param selectedRows rows to move up 265 * @see #canMoveUp 266 */ 267 public void moveUp(int... selectedRows) { 268 if (!canMoveUp(selectedRows)) 269 return; 270 271 for (int row : selectedRows) { 272 RelationMember member1 = members.get(row); 273 RelationMember member2 = members.get(row - 1); 274 members.set(row, member2); 275 members.set(row - 1, member1); 276 } 271 @Override 272 public boolean move(int delta, int... selectedRows) { 273 if (!canMove(delta, this::getRowCount, selectedRows)) 274 return false; 275 doMove(delta, selectedRows); 277 276 fireTableDataChanged(); 278 getSelectionModel().setValueIsAdjusting(true); 279 getSelectionModel().clearSelection(); 277 final ListSelectionModel selectionModel = getSelectionModel(); 278 selectionModel.setValueIsAdjusting(true); 279 selectionModel.clearSelection(); 280 280 BitSet selected = new BitSet(); 281 281 for (int row : selectedRows) { … … 284 284 } 285 285 addToSelectedMembers(selected); 286 getSelectionModel().setValueIsAdjusting(false); 287 fireMakeMemberVisible(selectedRows[0] - 1); 288 } 289 290 /** 291 * Move down selected rows, if possible. 292 * @param selectedRows rows to move down 293 * @see #canMoveDown 294 */ 295 public void moveDown(int... selectedRows) { 296 if (!canMoveDown(selectedRows)) 297 return; 298 299 for (int i = selectedRows.length - 1; i >= 0; i--) { 300 int row = selectedRows[i]; 301 RelationMember member1 = members.get(row); 302 RelationMember member2 = members.get(row + 1); 303 members.set(row, member2); 304 members.set(row + 1, member1); 305 } 306 fireTableDataChanged(); 307 getSelectionModel(); 308 getSelectionModel().setValueIsAdjusting(true); 309 getSelectionModel().clearSelection(); 310 BitSet selected = new BitSet(); 311 for (int row : selectedRows) { 312 row++; 313 selected.set(row); 314 } 315 addToSelectedMembers(selected); 316 getSelectionModel().setValueIsAdjusting(false); 317 fireMakeMemberVisible(selectedRows[0] + 1); 286 selectionModel.setValueIsAdjusting(false); 287 fireMakeMemberVisible(selectedRows[0] + delta); 288 return true; 318 289 } 319 290 … … 338 309 339 310 /** 340 * Checks that a range of rows can be moved up.341 * @param rows indexes of rows to move up342 * @return {@code true} if rows can be moved up343 */344 public boolean canMoveUp(int... rows) {345 if (rows == null || rows.length == 0)346 return false;347 Arrays.sort(rows);348 return rows[0] > 0 && rows[rows.length - 1] < members.size();349 }350 351 /**352 * Checks that a range of rows can be moved down.353 * @param rows indexes of rows to move down354 * @return {@code true} if rows can be moved down355 */356 public boolean canMoveDown(int... rows) {357 if (rows == null || rows.length == 0)358 return false;359 Arrays.sort(rows);360 return rows[0] >= 0 && rows[rows.length - 1] < members.size() - 1;361 }362 363 /**364 311 * Checks that a range of rows can be removed. 365 312 * @param rows indexes of rows to remove … … 370 317 } 371 318 372 /** 373 * Returns the selection model. 374 * @return the selection model (never null) 375 */ 319 @Override 376 320 public DefaultListSelectionModel getSelectionModel() { 377 321 if (listSelectionModel == null) { … … 382 326 } 383 327 328 @Override 329 public RelationMember getValue(int index) { 330 return members.get(index); 331 } 332 333 @Override 334 public RelationMember setValue(int index, RelationMember value) { 335 return members.set(index, value); 336 } 337 338 /** 339 * Remove members referring to the given list of primitives. 340 * @param primitives list of OSM primitives 341 */ 384 342 public void removeMembersReferringTo(List<? extends OsmPrimitive> primitives) { 385 343 if (primitives == null) 386 344 return; 387 members.removeIf(member -> primitives.contains(member.getMember())) ;388 fireTableDataChanged(); 345 if (members.removeIf(member -> primitives.contains(member.getMember()))) 346 fireTableDataChanged(); 389 347 } 390 348 … … 398 356 } 399 357 358 /** 359 * Determines if this model has the same members as the given relation. 360 * @param relation relation 361 * @return {@code true} if this model has the same members as {@code relation} 362 */ 400 363 public boolean hasSameMembersAs(Relation relation) { 401 if (relation == null) 402 return false; 403 if (relation.getMembersCount() != members.size()) 364 if (relation == null || relation.getMembersCount() != members.size()) 404 365 return false; 405 366 for (int i = 0; i < relation.getMembersCount(); i++) { … … 464 425 } 465 426 return false; 466 }467 468 protected List<Integer> getSelectedIndices() {469 List<Integer> selectedIndices = new ArrayList<>();470 for (int i = 0; i < members.size(); i++) {471 if (getSelectionModel().isSelectedIndex(i)) {472 selectedIndices.add(i);473 }474 }475 return selectedIndices;476 427 } 477 428 … … 773 724 addToSelectedMembers(selected); 774 725 getSelectionModel().setValueIsAdjusting(false); 775 if (!getSelectedIndices().isEmpty()) { 776 fireMakeMemberVisible(getSelectedIndices().get(0)); 726 int[] selectedIndices = getSelectedIndices(); 727 if (selectedIndices.length > 0) { 728 fireMakeMemberVisible(selectedIndices[0]); 777 729 } 778 730 } … … 793 745 * Sort the selected relation members by the way they are linked. 794 746 */ 747 @Override 795 748 public void sort() { 796 749 List<RelationMember> selectedMembers = new ArrayList<>(getSelectedMembers()); … … 802 755 } else { 803 756 sortedMembers = relationSorter.sortMembers(selectedMembers); 804 List<Integer> selectedIndices = getSelectedIndices(); 757 List<Integer> selectedIndices = ArrayUtils.toList(getSelectedIndices()); 805 758 newMembers = new ArrayList<>(); 806 759 boolean inserted = false; … … 861 814 * Reverse the relation members. 862 815 */ 816 @Override 863 817 public void reverse() { 864 List<Integer> selectedIndices = getSelectedIndices(); 865 List<Integer> selectedIndicesReversed = getSelectedIndices(); 818 List<Integer> selectedIndices = ArrayUtils.toList(getSelectedIndices()); 819 List<Integer> selectedIndicesReversed = ArrayUtils.toList(getSelectedIndices()); 866 820 867 821 if (selectedIndices.size() <= 1) { -
trunk/src/org/openstreetmap/josm/gui/dialogs/relation/actions/ReverseAction.java
r14030 r15226 23 23 24 24 putValue(SHORT_DESCRIPTION, tr("Reverse the order of the relation members")); 25 new ImageProvider("dialogs/ relation", "reverse").getResource().attachImageIcon(this, true);25 new ImageProvider("dialogs/", "reverse").getResource().attachImageIcon(this, true); 26 26 putValue(NAME, tr("Reverse")); 27 27 updateEnabledState(); -
trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
r15214 r15226 88 88 import org.openstreetmap.josm.gui.util.FileFilterAllFiles; 89 89 import org.openstreetmap.josm.gui.util.GuiHelper; 90 import org.openstreetmap.josm.gui.util.ReorderableTableModel; 90 91 import org.openstreetmap.josm.gui.util.TableHelper; 91 92 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser; … … 627 628 * Table model of active sources. 628 629 */ 629 protected class ActiveSourcesModel extends AbstractTableModel { 630 protected class ActiveSourcesModel extends AbstractTableModel implements ReorderableTableModel<SourceEntry> { 630 631 private transient List<SourceEntry> data; 631 632 private final DefaultListSelectionModel selectionModel; … … 767 768 } 768 769 769 public boolean canMove(int i) { 770 int[] sel = tblActiveSources.getSelectedRows(); 771 if (sel.length == 0) 772 return false; 773 if (i < 0) 774 return sel[0] >= -i; 775 else if (i > 0) 776 return sel[sel.length-1] <= getRowCount()-1 - i; 777 else 778 return true; 779 } 780 781 public void move(int i) { 782 if (!canMove(i)) return; 783 int[] sel = tblActiveSources.getSelectedRows(); 784 for (int row: sel) { 785 SourceEntry t1 = data.get(row); 786 SourceEntry t2 = data.get(row + i); 787 data.set(row, t2); 788 data.set(row + i, t1); 789 } 790 selectionModel.setValueIsAdjusting(true); 791 selectionModel.clearSelection(); 792 for (int row: sel) { 793 selectionModel.addSelectionInterval(row + i, row + i); 794 } 795 selectionModel.setValueIsAdjusting(false); 770 @Override 771 public DefaultListSelectionModel getSelectionModel() { 772 return selectionModel; 773 } 774 775 @Override 776 public SourceEntry getValue(int index) { 777 return data.get(index); 778 } 779 780 @Override 781 public SourceEntry setValue(int index, SourceEntry value) { 782 return data.set(index, value); 796 783 } 797 784 } -
trunk/src/org/openstreetmap/josm/gui/util/TableHelper.java
r15177 r15226 5 5 6 6 import javax.swing.JTable; 7 import javax.swing.ListSelectionModel; 8 import javax.swing.event.ListDataEvent; 9 import javax.swing.event.ListSelectionEvent; 10 import javax.swing.table.AbstractTableModel; 7 11 import javax.swing.table.TableCellRenderer; 8 12 import javax.swing.table.TableColumn; 13 14 import org.openstreetmap.josm.gui.dialogs.IEnabledStateUpdating; 9 15 10 16 /** … … 16 22 private TableHelper() { 17 23 // Hide default constructor for utils classes 24 } 25 26 /** 27 * Wires <code>listener</code> to <code>listSelectionModel</code> in such a way, that 28 * <code>listener</code> receives a {@link IEnabledStateUpdating#updateEnabledState()} 29 * on every {@link ListSelectionEvent}. 30 * 31 * @param listener the listener 32 * @param listSelectionModel the source emitting {@link ListSelectionEvent}s 33 * @since 15226 34 */ 35 public static void adaptTo(final IEnabledStateUpdating listener, ListSelectionModel listSelectionModel) { 36 listSelectionModel.addListSelectionListener(e -> listener.updateEnabledState()); 37 } 38 39 /** 40 * Wires <code>listener</code> to <code>listModel</code> in such a way, that 41 * <code>listener</code> receives a {@link IEnabledStateUpdating#updateEnabledState()} 42 * on every {@link ListDataEvent}. 43 * 44 * @param listener the listener 45 * @param listModel the source emitting {@link ListDataEvent}s 46 * @since 15226 47 */ 48 public static void adaptTo(final IEnabledStateUpdating listener, AbstractTableModel listModel) { 49 listModel.addTableModelListener(e -> listener.updateEnabledState()); 18 50 } 19 51 … … 83 115 } 84 116 } 117 118 /** 119 * Returns an array of all of the selected indices in the selection model, in increasing order. 120 * Unfortunately this method is not available in OpenJDK before version 11, see 121 * https://bugs.openjdk.java.net/browse/JDK-8199395 122 * Code taken from OpenJDK 11. To be removed when we switch to Java 11 or later. 123 * 124 * @param selectionModel list selection model. 125 * 126 * @return all of the selected indices, in increasing order, 127 * or an empty array if nothing is selected 128 * @since 15226 129 */ 130 public static int[] getSelectedIndices(ListSelectionModel selectionModel) { 131 int iMin = selectionModel.getMinSelectionIndex(); 132 int iMax = selectionModel.getMaxSelectionIndex(); 133 134 if (iMin < 0 || iMax < 0) { 135 return new int[0]; 136 } 137 138 int[] rvTmp = new int[1 + iMax - iMin]; 139 int n = 0; 140 for (int i = iMin; i <= iMax; i++) { 141 if (selectionModel.isSelectedIndex(i)) { 142 rvTmp[n++] = i; 143 } 144 } 145 int[] rv = new int[n]; 146 System.arraycopy(rvTmp, 0, rv, 0, n); 147 return rv; 148 } 85 149 }
Note:
See TracChangeset
for help on using the changeset viewer.