org.eclipse.ecf.sync.resources.views.RemoteResourcesView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.sync.resources.views.RemoteResourcesView.java

Source

/*******************************************************************************
 * 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;
        }

    }
}