Bug 259221 - [History View] History view should remember current sort column and sort direction
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryPage.java
index 0d535f7..2cfdbf0 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryPage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryPage.java
@@ -279,7 +279,7 @@
 	private void saveState() {
 		saveSashWeights(SASH_WEIGHTS, sashForm.getWeights());
 		saveSashWeights(INNER_SASH_WEIGHTS, innerSashForm.getWeights());
-		historyTableProvider.saveColumnWeights();
+		historyTableProvider.saveColumnLayout();
 	}
 
 	private int[] loadSashWeights(String key) {
@@ -906,9 +906,7 @@
 	protected TreeViewer createTree(Composite parent) {
 
 		historyTableProvider = new CVSHistoryTableProvider();
-		TreeViewer viewer = historyTableProvider
-				.createTree(parent, cvsFileHistory == null ? true
-						: cvsFileHistory.isIncludeLocal());
+		TreeViewer viewer = historyTableProvider.createTree(parent);
 
 		viewer.setContentProvider(new ITreeContentProvider() {
 			public Object[] getElements(Object inputElement) {
@@ -1559,7 +1557,7 @@
 			
 			Utils.asyncExec(new Runnable() {
 				public void run() {
-					historyTableProvider.setLocalRevisionsDisplayed(fileHistory.isIncludeLocal());
+					treeViewer.refresh();
 					historyTableProvider.setFile(fileHistory, workspaceFile);
 					//historyTableProvider.setWorkspaceFile(workspaceFile);
 					if (!selectOnly){
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryTableProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryTableProvider.java
index 49c6bcc..734894e 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryTableProvider.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/CVSHistoryTableProvider.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2008 IBM Corporation and others.
+ * Copyright (c) 2006, 2009 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -76,6 +76,8 @@
 	private static final String COL_COMMENT_NAME = "COL_COMMENT"; //$NON-NLS-1$
 
 	private static final String COL_NAME = "COLUMN_NAME"; //$NON-NLS-1$
+	private static final String SORT_COL_NAME = "SORT_COL_NAME"; //$NON-NLS-1$
+	private static final String SORT_COL_DIRECTION = "SORT_COL_DIRECTION"; //$NON-NLS-1$
 
 	public CVSHistoryTableProvider() {
 		IDialogSettings viewsSettings = CVSUIPlugin.getPlugin()
@@ -474,7 +476,7 @@
 	 * @param parent
 	 * @return TableViewer
 	 */
-	public TreeViewer createTree(Composite parent, boolean localIsDisplayed) {
+	public TreeViewer createTree(Composite parent) {
 		Tree tree = new Tree(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION);
 		tree.setHeaderVisible(true);
 		tree.setLinesVisible(true);
@@ -490,7 +492,7 @@
 		
 		// Initialize the sorting
 		ColumnViewerToolTipSupport.enableFor(viewer);
-		setLocalRevisionsDisplayed(localIsDisplayed);
+		viewer.refresh();
 
 		tree.addDisposeListener(new DisposeListener() {
 			public void widgetDisposed(DisposeEvent e) {
@@ -517,7 +519,6 @@
 		col.setResizable(true);
 		col.setText(TeamUIMessages.GenericHistoryTableProvider_Revision);
 		col.addSelectionListener(headerListener);
-		layout.addColumnData(loadColumnWeightData(COL_REVISIONID_NAME));
 
 		// tags
 		viewerCol = new TreeViewerColumn(tree, SWT.NONE);
@@ -527,7 +528,6 @@
 		col.setResizable(true);
 		col.setText(CVSUIMessages.HistoryView_tags); 
 		col.addSelectionListener(headerListener);
-		layout.addColumnData(loadColumnWeightData(COL_TAGS_NAME));
 
 		// creation date
 		viewerCol = new TreeViewerColumn(tree, SWT.NONE);
@@ -537,7 +537,6 @@
 		col.setResizable(true);
 		col.setText(TeamUIMessages.GenericHistoryTableProvider_RevisionTime);
 		col.addSelectionListener(headerListener);
-		layout.addColumnData(loadColumnWeightData(COL_DATE_NAME));
 
 		// author
 		viewerCol = new TreeViewerColumn(tree, SWT.NONE);
@@ -547,7 +546,6 @@
 		col.setResizable(true);
 		col.setText(TeamUIMessages.GenericHistoryTableProvider_Author);
 		col.addSelectionListener(headerListener);
-		layout.addColumnData(loadColumnWeightData(COL_AUTHOR_NAME));
 
 		//comment
 		viewerCol = new TreeViewerColumn(tree, SWT.NONE);
@@ -557,23 +555,60 @@
 		col.setResizable(true);
 		col.setText(TeamUIMessages.GenericHistoryTableProvider_Comment);
 		col.addSelectionListener(headerListener);
-		layout.addColumnData(loadColumnWeightData(COL_COMMENT_NAME));
+
+		loadColumnLayout(layout);
 	}
 
-	private ColumnLayoutData loadColumnWeightData(String key) {
+	public void loadColumnLayout(TableLayout layout) {
+		layout.addColumnData(getWeightData(settings.get(COL_REVISIONID_NAME)));
+		layout.addColumnData(getWeightData(settings.get(COL_TAGS_NAME)));
+		layout.addColumnData(getWeightData(settings.get(COL_DATE_NAME)));
+		layout.addColumnData(getWeightData(settings.get(COL_AUTHOR_NAME)));
+		layout.addColumnData(getWeightData(settings.get(COL_COMMENT_NAME)));
+
+		String sortName = settings.get(SORT_COL_NAME);
+		if (sortName == null) {
+			sortName = COL_DATE_NAME;
+		}
+		int sortDirection = SWT.DOWN;
 		try {
-			return new ColumnPixelData(settings.getInt(key), true);
+			sortDirection = settings.getInt(SORT_COL_DIRECTION);
+		} catch (NumberFormatException e) {
+			// Silently ignored
+		}
+		TreeColumn sortColumn = null;
+		int columnNumber = 0;
+		TreeColumn columns[] = viewer.getTree().getColumns();
+		for (int i = 0; i < columns.length; i++) {
+			if (columns[i].getData(COL_NAME).equals(sortName)) {
+				sortColumn = columns[i];
+				columnNumber = i;
+			}
+		}
+		viewer.getTree().setSortColumn(sortColumn);
+		viewer.getTree().setSortDirection(sortDirection);
+		HistoryComparator sorter = new HistoryComparator(columnNumber);
+		sorter.setReversed(sortDirection == SWT.DOWN);
+		viewer.setComparator(sorter);
+	}
+ 
+	private ColumnLayoutData getWeightData(String value) {
+		try {
+			return new ColumnPixelData(Integer.parseInt(value), true);
 		} catch (NumberFormatException e) {
 			return new ColumnWeightData(20, true);
 		}
 	}
 
-	public void saveColumnWeights() {
+	public void saveColumnLayout() {
 		TreeColumn columns[] = viewer.getTree().getColumns();
 		for (int i = 0; i < columns.length; i++) {
 			settings.put((String) columns[i].getData(COL_NAME), columns[i]
 					.getWidth());
 		}
+		settings.put(SORT_COL_NAME, (String) viewer.getTree().getSortColumn()
+				.getData(COL_NAME));
+		settings.put(SORT_COL_DIRECTION, viewer.getTree().getSortDirection());
 	}
 
 	/**
@@ -644,32 +679,6 @@
 
 		return null;
 	}
-	
-	/*
-	 * Used to reset the sorting for the table provider; if local files
-	 * are included in the table, then we sort by date. Otherwise we default
-	 * to sorting by revision 
-	 */
-	public void setLocalRevisionsDisplayed(boolean displayed){
-		//init sort to sort by revision
-		int column = COL_REVISIONID;
-		if (displayed){
-			//locals displayed, if the base has been modified then sort by DATE
-			column = COL_DATE;	
-		}
-		
-		HistoryComparator oldSorter = (HistoryComparator) viewer.getComparator();
-		if (oldSorter != null && column == oldSorter.getColumnNumber()) {
-			viewer.refresh();
-		} else {
-			HistoryComparator newSorter = new HistoryComparator(column);
-			newSorter.setReversed(true);
-			viewer.setComparator(newSorter);
-			viewer.getTree().setSortColumn(viewer.getTree().getColumn(column));
-			viewer.getTree().setSortDirection(newSorter.isReversed() ? SWT.DOWN : SWT.UP);
-		 
-		}
-	}
 
 	public void setBaseModified(boolean modified) {
 		this.baseModified=modified;