Ticket #13250: memberTable_performance.patch
| File memberTable_performance.patch, 4.6 KB (added by , 10 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
3 3 4 4 import java.util.ArrayList; 5 5 import java.util.Arrays; 6 import java.util.BitSet; 6 7 import java.util.Collection; 7 8 import java.util.Collections; 8 9 import java.util.EnumSet; … … 266 267 fireTableDataChanged(); 267 268 getSelectionModel().setValueIsAdjusting(true); 268 269 getSelectionModel().clearSelection(); 270 BitSet selected = new BitSet(); 269 271 for (int row : selectedRows) { 270 272 row--; 271 getSelectionModel().addSelectionInterval(row,row);273 selected.set(row); 272 274 } 275 addToSelectedMembers(selected); 273 276 getSelectionModel().setValueIsAdjusting(false); 274 277 fireMakeMemberVisible(selectedRows[0] - 1); 275 278 } … … 289 292 getSelectionModel(); 290 293 getSelectionModel().setValueIsAdjusting(true); 291 294 getSelectionModel().clearSelection(); 295 BitSet selected = new BitSet(); 292 296 for (int row : selectedRows) { 293 297 row++; 294 getSelectionModel().addSelectionInterval(row,row);298 selected.set(row); 295 299 } 300 addToSelectedMembers(selected); 296 301 getSelectionModel().setValueIsAdjusting(false); 297 302 fireMakeMemberVisible(selectedRows[0] + 1); 298 303 } … … 529 534 members.add(row, newMember); 530 535 } 531 536 fireTableDataChanged(); 537 BitSet selected = new BitSet(); 532 538 for (int row : idx) { 533 getSelectionModel().addSelectionInterval(row, row); 539 // getSelectionModel().addSelectionInterval(row, row); 540 selected.set(row); 534 541 } 542 addToSelectedMembers(selected); 535 543 } 536 544 537 545 /** … … 615 623 // 616 624 getSelectionModel().setValueIsAdjusting(true); 617 625 getSelectionModel().clearSelection(); 626 BitSet selected = new BitSet(); 618 627 for (int row : selectedIndices) { 619 getSelectionModel().addSelectionInterval(row,row);628 selected.set(row); 620 629 } 630 addToSelectedMembers(selected); 621 631 getSelectionModel().setValueIsAdjusting(false); 622 632 // make the first selected member visible 623 633 // … … 627 637 } 628 638 629 639 /** 630 * Replies true if the index-th relation members referrs 640 * Add one or more members indices to the selection. 641 * Detect groups of consecutive indices. 642 * Only one costly call of addSelectionInterval is performed for each group 643 644 * @param selectedIndices 645 * @return number of groups 646 */ 647 private int addToSelectedMembers(BitSet selectedIndices){ 648 if (selectedIndices == null || selectedIndices.isEmpty()) { 649 return 0; 650 } 651 // select the members 652 // 653 int start = selectedIndices.nextSetBit(0); 654 int end; 655 int steps = 0; 656 int last = selectedIndices.length(); 657 while (start >= 0){ 658 end = selectedIndices.nextClearBit(start); 659 steps++; 660 getSelectionModel().addSelectionInterval(start,end-1); 661 start = selectedIndices.nextSetBit(end); 662 if (start < 0 || end == last) 663 break; 664 } 665 return steps; 666 } 667 /** 668 * Replies true if the index-th relation members refers 631 669 * to an editable relation, i.e. a relation which is not 632 670 * incomplete. 633 671 * 634 672 * @param index the index 635 * @return true, if the index-th relation members refer rs673 * @return true, if the index-th relation members refers 636 674 * to an editable relation, i.e. a relation which is not 637 675 * incomplete 638 676 */ … … 693 731 if (primitives == null) return; 694 732 getSelectionModel().setValueIsAdjusting(true); 695 733 getSelectionModel().clearSelection(); 734 BitSet selected = new BitSet(); 696 735 for (int i = 0; i < members.size(); i++) { 697 736 RelationMember m = members.get(i); 698 737 if (primitives.contains(m.getMember())) { 699 this.getSelectionModel().addSelectionInterval(i, i); 738 // this.getSelectionModel().addSelectionInterval(i, i); 739 selected.set(i); 700 740 } 701 741 } 742 addToSelectedMembers(selected); 702 743 getSelectionModel().setValueIsAdjusting(false); 703 744 if (!getSelectedIndices().isEmpty()) { 704 745 fireMakeMemberVisible(getSelectedIndices().get(0));
