/******************************************************************************* * Copyright (c) 2009 Remy Chi Jian Suen 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Remy Chi Jian Suen <remy.suen@gmail.com> - initial API and implementation ******************************************************************************/ package org.eclipse.ecf.sync.resources.views; import java.text.SimpleDateFormat; import java.util.Date; import org.eclipse.compare.CompareConfiguration; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceDelta; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.ecf.internal.sync.resources.core.BatchModelChange; import org.eclipse.ecf.internal.sync.resources.core.IView; import org.eclipse.ecf.internal.sync.resources.core.ResourceChangeMessage; import org.eclipse.ecf.internal.sync.resources.core.SyncResourcesCore; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ColumnLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.TreeViewerColumn; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.team.core.synchronize.SyncInfo; import org.eclipse.ui.ISharedImages; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.part.ViewPart; public class RemoteResourcesView extends ViewPart implements IView { public static final String ID = "org.eclipse.ecf.sync.resources.core.views.RemoteResourcesView"; private TreeViewer viewer; private ILabelProvider labelProvider; public void createPartControl(Composite parent) { viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); viewer.setContentProvider(new ViewContentProvider()); viewer.setComparator(new ViewerComparator() { public int compare(Viewer viewer, Object e1, Object e2) { if (e1 instanceof BatchModelChange) { BatchModelChange c1 = (BatchModelChange) e1; BatchModelChange c2 = (BatchModelChange) e2; // newest goes last return (int) (c2.getTime() - c1.getTime()); } // no sorting for resource changes return 0; } }); viewer.getTree().setHeaderVisible(true); viewer.getTree().setLinesVisible(true); labelProvider = WorkbenchLabelProvider.getDecoratingWorkbenchLabelProvider(); final SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss"); //$NON-NLS-1$ final CompareConfiguration config = new CompareConfiguration(); TreeViewerColumn resourceColumn = new TreeViewerColumn(viewer, SWT.LEAD); resourceColumn.getColumn().setText("Changes"); resourceColumn.getColumn().setWidth(100); resourceColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof BatchModelChange) { StringBuffer buffer = new StringBuffer(); BatchModelChange batchChange = (BatchModelChange) element; buffer.append(batchChange.isOutgoing() ? "Outgoing" : "Incoming"); buffer.append(" ("); buffer.append(formatter.format(new Date(batchChange .getTime()))); buffer.append(')'); return buffer.toString(); } else { return new Path(((ResourceChangeMessage) element).getPath()) .lastSegment(); } } public Image getImage(Object element) { if (element instanceof BatchModelChange) { Image image = PlatformUI.getWorkbench().getSharedImages() .getImage(ISharedImages.IMG_OBJ_FOLDER); int kind = 0; if (((BatchModelChange) element).isOutgoing()) { kind = (kind & ~SyncInfo.OUTGOING) | SyncInfo.INCOMING | SyncInfo.CHANGE; } else { kind = (kind & ~SyncInfo.OUTGOING) | SyncInfo.OUTGOING | SyncInfo.CHANGE; } return config.getImage(image, kind); } else { ResourceChangeMessage message = (ResourceChangeMessage) element; int type = message.getType(); IPath path = new Path(message.getPath()); Image image = null; if (type == IResource.FILE) { image = labelProvider.getImage(ResourcesPlugin .getWorkspace().getRoot().getFile(path)); } else { image = labelProvider.getImage(ResourcesPlugin .getWorkspace().getRoot().getFolder(path)); } if (message.isConflicted()) { return config.getImage(image, SyncInfo.CHANGE | SyncInfo.CONFLICTING); } int imageKind = 0; switch (message.getKind()) { case IResourceDelta.ADDED: imageKind = (imageKind & ~SyncInfo.CHANGE) | SyncInfo.DELETION; break; case IResourceDelta.CHANGED: imageKind = (imageKind & ~SyncInfo.CHANGE) | SyncInfo.CHANGE; break; case IResourceDelta.REMOVED: imageKind = (imageKind & ~SyncInfo.CHANGE) | SyncInfo.ADDITION; break; default: return null; } return config.getImage(image, imageKind); } } }); TreeViewerColumn pathColumn = new TreeViewerColumn(viewer, SWT.LEAD); pathColumn.getColumn().setText("Path"); pathColumn.getColumn().setWidth(200); pathColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof BatchModelChange) { return null; } else { return ((ResourceChangeMessage) element).getPath(); } } }); TreeViewerColumn typeColumn = new TreeViewerColumn(viewer, SWT.LEAD); typeColumn.getColumn().setText("Type"); typeColumn.getColumn().setWidth(75); typeColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof BatchModelChange) { return null; } else { switch (((ResourceChangeMessage) element).getKind()) { case IResourceDelta.ADDED: return "Added"; case IResourceDelta.CHANGED: return "Changed"; case IResourceDelta.REMOVED: return "Removed"; default: return null; } } } }); TreeViewerColumn resolutionColumn = new TreeViewerColumn(viewer, SWT.LEAD); resolutionColumn.getColumn().setText("Resolution"); resolutionColumn.getColumn().setWidth(100); resolutionColumn.setLabelProvider(new ColumnLabelProvider() { public String getText(Object element) { if (element instanceof BatchModelChange) { return null; } else { return ((ResourceChangeMessage) element).isIgnored() ? "Ignored" : "Committed"; } } }); SyncResourcesCore.setView(this); } public void dispose() { if (labelProvider != null) { labelProvider.dispose(); labelProvider = null; } SyncResourcesCore.setView(null); super.dispose(); } public void setInput(Object input) { viewer.setInput(input); viewer.expandToLevel(2); } public void add(final Object object) { final Control control = viewer.getControl(); if (!control.isDisposed()) { control.getDisplay().asyncExec(new Runnable() { public void run() { if (!control.isDisposed()) { viewer.add(viewer.getInput(), object); viewer.expandToLevel(object, 2); } } }); } } public void remove(final Object object) { final Control control = viewer.getControl(); if (!control.isDisposed()) { control.getDisplay().asyncExec(new Runnable() { public void run() { if (!control.isDisposed()) { viewer.remove(object); } } }); } } public void setFocus() { viewer.getControl().setFocus(); } static class ViewContentProvider extends ArrayContentProvider implements ITreeContentProvider { public Object[] getChildren(Object parentElement) { return ((BatchModelChange) parentElement).getMessages(); } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return element instanceof BatchModelChange; } } }