git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [EGIT PATCH] Sorting commit items by click on the table header in commit dialog.
@ 2009-01-04 22:46 Vasyl' Vavrychuk
  2009-01-05  7:35 ` Robin Rosenberg
  0 siblings, 1 reply; 3+ messages in thread
From: Vasyl' Vavrychuk @ 2009-01-04 22:46 UTC (permalink / raw)
  To: git

In order to implement new feature I have replaced class associated with every table row.
CommitItem class encapsulate data that commit dialog manipulates with.
Comparators are written using idiom from http://tobega.blogspot.com/2008/05/beautiful-enums.html.
Clicks on a certain column are handled in HeaderSelectionListener class.

Signed-off-by: Vasyl Vavrychuk <vvavrychuk@gmail.com>
---
 .../egit/ui/internal/actions/CommitAction.java     |    2 +-
 .../egit/ui/internal/dialogs/CommitDialog.java     |  248 ++++++++++++++------
 2 files changed, 176 insertions(+), 74 deletions(-)

diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java
index d703048..779596c 100644
--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/actions/CommitAction.java
@@ -139,7 +139,7 @@ private void loadPreviousCommit() {
 	private void performCommit(CommitDialog commitDialog, String commitMessage)
 			throws TeamException {
 		// System.out.println("Commit Message: " + commitMessage);
-		IFile[] selectedItems = commitDialog.getSelectedItems();
+		IFile[] selectedItems = commitDialog.getSelectedFiles();
 
 		HashMap<Repository, Tree> treeMap = new HashMap<Repository, Tree>();
 		try {
diff --git a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/CommitDialog.java b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/CommitDialog.java
index 4f932f2..a0598ff 100644
--- a/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/CommitDialog.java
+++ b/org.spearce.egit.ui/src/org/spearce/egit/ui/internal/dialogs/CommitDialog.java
@@ -15,6 +15,7 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 
 import org.eclipse.core.resources.IFile;
@@ -28,9 +29,11 @@
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyAdapter;
 import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
@@ -62,56 +65,38 @@
  */
 public class CommitDialog extends Dialog {
 
+	class CommitContentProvider implements IStructuredContentProvider {
+
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			// Empty
+		}
+
+		public void dispose() {
+			// Empty
+		}
+
+		public Object[] getElements(Object inputElement) {
+			return items.toArray();
+		}
+
+	}
+
 	class CommitLabelProvider extends WorkbenchLabelProvider implements
 			ITableLabelProvider {
 		public String getColumnText(Object obj, int columnIndex) {
-			IFile file = (IFile) obj;
-			if (columnIndex == 1)
-				return file.getProject().getName() + ": "
-						+ file.getProjectRelativePath();
+			CommitItem item = (CommitItem) obj;
 
-			else if (columnIndex == 0) {
-				String prefix = "Unknown";
+			switch (columnIndex) {
+			case 0:
+				return item.status;
 
-				try {
-					RepositoryMapping repositoryMapping = RepositoryMapping.getMapping(file.getProject());
-
-					Repository repo = repositoryMapping.getRepository();
-					GitIndex index = repo.getIndex();
-					Tree headTree = repo.mapTree("HEAD");
-
-					String repoPath = repositoryMapping
-							.getRepoRelativePath(file);
-					TreeEntry headEntry = headTree.findBlobMember(repoPath);
-					boolean headExists = headTree.existsBlob(repoPath);
-
-					Entry indexEntry = index.getEntry(repoPath);
-					if (headEntry == null) {
-						prefix = "Added";
-						if (indexEntry.isModified(repositoryMapping.getWorkDir()))
-							prefix = "Added, index diff";
-					} else if (indexEntry == null) {
-						prefix = "Removed";
-					} else if (headExists
-							&& !headEntry.getId().equals(
-									indexEntry.getObjectId())) {
-						prefix = "Modified";
-
-
-						if (indexEntry.isModified(repositoryMapping.getWorkDir()))
-							prefix = "Mod., index diff";
-					} else if (!new File(repositoryMapping.getWorkDir(), indexEntry.getName()).isFile()) {
-						prefix = "Rem., not staged";
-					} else if (indexEntry.isModified(repositoryMapping.getWorkDir())) {
-						prefix = "Mod., not staged";
-					}
-
-				} catch (Exception e) {
-				}
+			case 1:
+				return item.file.getProject().getName() + ": "
+						+ item.file.getProjectRelativePath();
 
-				return prefix;
+			default:
+				return null;
 			}
-			return null;
 		}
 
 		public Image getColumnImage(Object element, int columnIndex) {
@@ -121,7 +106,7 @@ public Image getColumnImage(Object element, int columnIndex) {
 		}
 	}
 
-	ArrayList<IFile> files;
+	ArrayList<CommitItem> items = new ArrayList<CommitItem>();
 
 	/**
 	 * @param parentShell
@@ -227,30 +212,17 @@ public void widgetDefaultSelected(SelectionEvent arg0) {
 		TableColumn statCol = new TableColumn(resourcesTable, SWT.LEFT);
 		statCol.setText("Status");
 		statCol.setWidth(150);
+		statCol.addSelectionListener(new HeaderSelectionListener(CommitItem.Order.ByStatus));
 
 		TableColumn resourceCol = new TableColumn(resourcesTable, SWT.LEFT);
 		resourceCol.setText("File");
 		resourceCol.setWidth(415);
+		resourceCol.addSelectionListener(new HeaderSelectionListener(CommitItem.Order.ByFile));
 
 		filesViewer = new CheckboxTableViewer(resourcesTable);
-		filesViewer.setContentProvider(new IStructuredContentProvider() {
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// Empty
-			}
-
-			public void dispose() {
-				// Empty
-			}
-
-			public Object[] getElements(Object inputElement) {
-				return files.toArray();
-			}
-
-		});
+		filesViewer.setContentProvider(new CommitContentProvider());
 		filesViewer.setLabelProvider(new CommitLabelProvider());
-		filesViewer.setInput(files);
+		filesViewer.setInput(items);
 		filesViewer.setAllChecked(true);
 		filesViewer.getTable().setMenu(getContextMenu());
 
@@ -271,15 +243,15 @@ public void handleEvent(Event arg0) {
 				try {
 					ArrayList<GitIndex> changedIndexes = new ArrayList<GitIndex>();
 					for (Iterator<Object> it = sel.iterator(); it.hasNext();) {
-						IFile file = (IFile) it.next();
+						CommitItem commitItem = (CommitItem) it.next();
 
-						IProject project = file.getProject();
+						IProject project = commitItem.file.getProject();
 						RepositoryMapping map = RepositoryMapping.getMapping(project);
 
 						Repository repo = map.getRepository();
 						GitIndex index = null;
 						index = repo.getIndex();
-						Entry entry = index.getEntry(map.getRepoRelativePath(file));
+						Entry entry = index.getEntry(map.getRepoRelativePath(commitItem.file));
 						if (entry != null && entry.isModified(map.getWorkDir())) {
 							entry.update(new File(map.getWorkDir(), entry.getName()));
 							if (!changedIndexes.contains(index))
@@ -302,6 +274,47 @@ public void handleEvent(Event arg0) {
 		return menu;
 	}
 
+	private static String getFileStatus(IFile file) {
+		String prefix = "Unknown";
+
+		try {
+			RepositoryMapping repositoryMapping = RepositoryMapping
+					.getMapping(file.getProject());
+
+			Repository repo = repositoryMapping.getRepository();
+			GitIndex index = repo.getIndex();
+			Tree headTree = repo.mapTree("HEAD");
+
+			String repoPath = repositoryMapping.getRepoRelativePath(file);
+			TreeEntry headEntry = headTree.findBlobMember(repoPath);
+			boolean headExists = headTree.existsBlob(repoPath);
+
+			Entry indexEntry = index.getEntry(repoPath);
+			if (headEntry == null) {
+				prefix = "Added";
+				if (indexEntry.isModified(repositoryMapping.getWorkDir()))
+					prefix = "Added, index diff";
+			} else if (indexEntry == null) {
+				prefix = "Removed";
+			} else if (headExists
+					&& !headEntry.getId().equals(indexEntry.getObjectId())) {
+				prefix = "Modified";
+
+				if (indexEntry.isModified(repositoryMapping.getWorkDir()))
+					prefix = "Mod., index diff";
+			} else if (!new File(repositoryMapping.getWorkDir(), indexEntry
+					.getName()).isFile()) {
+				prefix = "Rem., not staged";
+			} else if (indexEntry.isModified(repositoryMapping.getWorkDir())) {
+				prefix = "Mod., not staged";
+			}
+
+		} catch (Exception e) {
+		}
+
+		return prefix;
+	}
+
 	/**
 	 * @return The message the user entered
 	 */
@@ -323,7 +336,7 @@ public void setCommitMessage(String s) {
 	private boolean amending = false;
 	private boolean amendAllowed = true;
 
-	private ArrayList<IFile> selectedItems = new ArrayList<IFile>();
+	private ArrayList<IFile> selectedFiles = new ArrayList<IFile>();
 	private String previousCommitMessage = "";
 
 	/**
@@ -331,15 +344,51 @@ public void setCommitMessage(String s) {
 	 *
 	 * @param items
 	 */
-	public void setSelectedItems(IFile[] items) {
-		Collections.addAll(selectedItems, items);
+	public void setSelectedFiles(IFile[] items) {
+		Collections.addAll(selectedFiles, items);
 	}
 
 	/**
 	 * @return the resources selected by the user to commit.
 	 */
-	public IFile[] getSelectedItems() {
-		return selectedItems.toArray(new IFile[0]);
+	public IFile[] getSelectedFiles() {
+		return selectedFiles.toArray(new IFile[0]);
+	}
+
+	class HeaderSelectionListener extends SelectionAdapter {
+
+		private CommitItem.Order order;
+
+		private boolean reversed;
+
+		public HeaderSelectionListener(CommitItem.Order order) {
+			this.order = order;
+		}
+
+		@Override
+		public void widgetSelected(SelectionEvent e) {
+			TableColumn column = (TableColumn)e.widget;
+			Table table = column.getParent();
+
+			if (column == table.getSortColumn()) {
+				reversed = !reversed;
+			} else {
+				reversed = false;
+			}
+			table.setSortColumn(column);
+
+			Comparator<CommitItem> comparator;
+			if (reversed) {
+				comparator = order.descending();
+				table.setSortDirection(SWT.DOWN);
+			} else {
+				comparator = order;
+				table.setSortDirection(SWT.UP);
+			}
+
+			filesViewer.setComparator(new CommitViewerComparator(comparator));
+		}
+
 	}
 
 	@Override
@@ -350,9 +399,9 @@ protected void okPressed() {
 		amending = amendingButton.getSelection();
 		
 		Object[] checkedElements = filesViewer.getCheckedElements();
-		selectedItems.clear();
+		selectedFiles.clear();
 		for (Object obj : checkedElements)
-			selectedItems.add((IFile) obj);
+			selectedFiles.add(((CommitItem) obj).file);
 
 		if (commitMessage.trim().length() == 0) {
 			MessageDialog.openWarning(getShell(), "No message", "You must enter a commit message");
@@ -368,7 +417,7 @@ protected void okPressed() {
 			}
 		} else author = null;
 
-		if (selectedItems.isEmpty() && !amending) {
+		if (selectedFiles.isEmpty() && !amending) {
 			MessageDialog.openWarning(getShell(), "No items selected", "No items are currently selected to be committed.");
 			return;
 		}
@@ -382,7 +431,13 @@ protected void okPressed() {
 	 * @param files potentially affected by a new commit
 	 */
 	public void setFileList(ArrayList<IFile> files) {
-		this.files = files;
+		items.clear();
+		for (IFile file : files) {
+			CommitItem item = new CommitItem();
+			item.status = getFileStatus(file);
+			item.file = file;
+			items.add(item);
+		}
 	}
 
 	@Override
@@ -468,3 +523,50 @@ protected int getShellStyle() {
 		return super.getShellStyle() | SWT.RESIZE;
 	}
 }
+
+class CommitItem {
+	String status;
+
+	IFile file;
+
+	public static enum Order implements Comparator<CommitItem> {
+		ByStatus() {
+
+			public int compare(CommitItem o1, CommitItem o2) {
+				return o1.status.compareTo(o2.status);
+			}
+
+		},
+
+		ByFile() {
+
+			public int compare(CommitItem o1, CommitItem o2) {
+				return o1.file.getProjectRelativePath().toString().
+					compareTo(o2.file.getProjectRelativePath().toString());
+			}
+
+		};
+
+		public Comparator<CommitItem> ascending() {
+			return this;
+		}
+
+		public Comparator<CommitItem> descending() {
+			return Collections.reverseOrder(this);
+		}
+	}
+}
+
+class CommitViewerComparator extends ViewerComparator {
+
+	public CommitViewerComparator(Comparator comparator){
+		super(comparator);
+	}
+
+	@SuppressWarnings("unchecked")
+	@Override
+	public int compare(Viewer viewer, Object e1, Object e2) {
+		return getComparator().compare(e1, e2);
+	}
+
+}
-- 
1.5.6.1.1071.g76fb

^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [EGIT PATCH] Sorting commit items by click on the table header in commit dialog.
  2009-01-04 22:46 [EGIT PATCH] Sorting commit items by click on the table header in commit dialog Vasyl' Vavrychuk
@ 2009-01-05  7:35 ` Robin Rosenberg
  2009-01-06  0:49   ` Robin Rosenberg
  0 siblings, 1 reply; 3+ messages in thread
From: Robin Rosenberg @ 2009-01-05  7:35 UTC (permalink / raw)
  To: Vasyl' Vavrychuk, Shawn O. Pearce; +Cc: git

söndag 04 januari 2009 23:46:47 skrev Vasyl' Vavrychuk:
> In order to implement new feature I have replaced class associated with every table row.
> CommitItem class encapsulate data that commit dialog manipulates with.
> Comparators are written using idiom from http://tobega.blogspot.com/2008/05/beautiful-enums.html.
> Clicks on a certain column are handled in HeaderSelectionListener class.

Hmm. This one cannot be applied on top of master. There is only only one commit on Dec 8
that involves the same file, so If you could rebase that would be nice. Other than that it looks ok.

Please also Cc me and Shawn on patches to reduce the risk of them getting lost.

-- robin

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [EGIT PATCH] Sorting commit items by click on the table header in commit dialog.
  2009-01-05  7:35 ` Robin Rosenberg
@ 2009-01-06  0:49   ` Robin Rosenberg
  0 siblings, 0 replies; 3+ messages in thread
From: Robin Rosenberg @ 2009-01-06  0:49 UTC (permalink / raw)
  To: Vasyl' Vavrychuk; +Cc: Shawn O. Pearce, git


Seems this was trivial to apply after patchin the patch, so I did.

-- robin

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2009-01-06  0:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-04 22:46 [EGIT PATCH] Sorting commit items by click on the table header in commit dialog Vasyl' Vavrychuk
2009-01-05  7:35 ` Robin Rosenberg
2009-01-06  0:49   ` Robin Rosenberg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).