VCS: correctly keep selection when asynchronously loading history
authorirengrig <Irina.Chernushina@jetbrains.com>
Mon, 1 Mar 2010 11:27:22 +0000 (14:27 +0300)
committerirengrig <Irina.Chernushina@jetbrains.com>
Mon, 1 Mar 2010 11:27:22 +0000 (14:27 +0300)
platform/platform-api/src/com/intellij/ui/dualView/DualView.java
platform/platform-api/src/com/intellij/ui/table/TableView.java
platform/vcs-impl/src/com/intellij/openapi/vcs/history/FileHistoryPanelImpl.java

index 4be8493975f5e451df9915d2aef1f34293c8886d..3ab63e05ef50163c56200424e27fd7601e0ae0ed 100644 (file)
@@ -392,22 +392,27 @@ public class DualView extends JPanel {
     BaseTableView.store(myTreeStorage, myTreeView);
   }
 
-  public void setRoot(final TreeNode node, final Object selection) {
+  public void setRoot(final TreeNode node, final List<Object> selection) {
     ListTableModel model = myFlatView.getListTableModel();
     final int column = model.getSortedColumnIndex();
     final int sortingType = model.getSortingType();
-    final Object obj = myFlatView.getSelectedObject() != null ? myFlatView.getSelectedObject() : selection;
+
+    final List<Object> currentlySelected = myFlatView.getSelectedObjects();
+    final List<Object> targetSelection = (currentlySelected != null && (! currentlySelected.isEmpty())) ? currentlySelected : selection;
+    //final Object obj = myFlatView.getSelectedObject() != null ? myFlatView.getSelectedObject() : selection;
 
     myTreeView.getTreeViewModel().setRoot(node);
 
     if (column != -1) {
       model.sortByColumn(column, sortingType);
     }
-    if (obj != null) {
+    if ((targetSelection != null) && (! targetSelection.isEmpty())) {
       final List items = myFlatView.getItems();
-      if (items.contains(obj)) {
-        final int idx = items.indexOf(obj);
-        setSelectionInterval(idx, idx);
+      for (Object selElement : targetSelection) {
+        if (items.contains(selElement)) {
+          final int idx = items.indexOf(selElement);
+          setSelectionInterval(idx, idx);
+        }
       }
     }
   }
index c708a592a83604594da6c493213cac9e31ad7328..ff8bd848b135db13867ca3bf568f506857766465 100644 (file)
@@ -28,10 +28,7 @@ import javax.swing.table.JTableHeader;
 import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
+import java.util.*;
 
 public class TableView<Item> extends BaseTableView implements ItemsProvider, SelectionProvider {
   public TableView() {
@@ -127,6 +124,18 @@ public class TableView<Item> extends BaseTableView implements ItemsProvider, Sel
     return row >= 0 && row < list.size() ? list.get(row) : null;    
   }
 
+  @Nullable
+  public List<Item> getSelectedObjects() {
+    final int[] selectedRows = getSelectedRows();
+    if (selectedRows == null || (selectedRows.length == 0)) return Collections.emptyList();
+    final List<Item> items = getItems();
+    final List<Item> result = new ArrayList<Item>();
+    for (int selectedRow : selectedRows) {
+      result.add(items.get(selectedRow));
+    }
+    return result;
+  }
+
   public void addSelection(Object item) {
     List items = getItems();
     if (!items.contains(item)) return;
index 53ae03f886fe75f454e4a39001620a7c825cfa98..517027ce429ab512904ed84c9fc12d0f3c88992e 100644 (file)
@@ -126,7 +126,7 @@ public class FileHistoryPanelImpl<S extends CommittedChangeList, U extends Chang
   private final String myRepositoryPath;
 
   private volatile boolean myInRefresh;
-  private Object myTargetSelection;
+  private List<Object> myTargetSelection;
   private final AsynchConsumer<VcsHistorySession> myHistoryPanelRefresh;
 
   private static final String COMMIT_MESSAGE_TITLE = VcsBundle.message("label.selected.revision.commit.message");
@@ -743,7 +743,7 @@ public class FileHistoryPanelImpl<S extends CommittedChangeList, U extends Chang
       public void run() {
         if (myInRefresh) return;
         myInRefresh = true;
-        myTargetSelection = myDualView.getFlatView().getSelectedObject();
+        myTargetSelection = myDualView.getFlatView().getSelectedObjects();
 
         myLoadingLabel.setVisible(true);
         mySplitter.revalidate();