org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView.java Source code

Java tutorial

Introduction

Here is the source code for org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView.java

Source

/*******************************************************************************
 * Copyright (c) 2004, 2010 Subclipse project 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:
 *     Subclipse project committers - initial API and implementation
 ******************************************************************************/

package org.tigris.subversion.subclipse.ui.svnproperties;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.text.Document;
import org.eclipse.jface.text.TextViewer;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.tigris.subversion.subclipse.core.IResourceStateChangeListener;
import org.tigris.subversion.subclipse.core.ISVNLocalResource;
import org.tigris.subversion.subclipse.core.ISVNRemoteResource;
import org.tigris.subversion.subclipse.core.SVNException;
import org.tigris.subversion.subclipse.core.resources.LocalResourceStatus;
import org.tigris.subversion.subclipse.ui.IHelpContextIds;
import org.tigris.subversion.subclipse.ui.ISVNUIConstants;
import org.tigris.subversion.subclipse.ui.Policy;
import org.tigris.subversion.subclipse.ui.SVNUIPlugin;
import org.tigris.subversion.subclipse.ui.conflicts.PropertyConflict;
import org.tigris.subversion.subclipse.ui.settings.UnversionedCustomProperty;
import org.tigris.subversion.svnclientadapter.ISVNProperty;
import org.tigris.subversion.svnclientadapter.SVNRevision;
import org.tigris.subversion.svnclientadapter.SVNStatusKind;

public class SvnRevPropertiesView extends ViewPart {
    public static final String VIEW_ID = "org.tigris.subversion.subclipse.ui.svnproperties.SvnRevPropertiesView"; //$NON-NLS-1$

    private TableViewer tableViewer;
    private TextViewer textViewer;
    private ISVNLocalResource resource;
    private ISVNRemoteResource remoteResource;
    private Action refreshAction;
    private Label statusLabel;
    //  private ISelectionListener pageSelectionListener;
    //  private ISelectionChangedListener historyRevisionListener;
    //  private IResourceStateChangeListener resourceStateChangeListener;

    private PropertyConflict[] conflicts;

    class ResourceStateChangeListener implements IResourceStateChangeListener {
        /**
         * the svn status of some resources changed. Refresh if we are concerned
         */
        public void resourceSyncInfoChanged(IResource[] changedResources) {
            for (int i = 0; i < changedResources.length; i++) {
                if (resource != null && changedResources[i].equals(resource.getIResource())) {
                    refresh();
                }
            }
        }

        public void resourceModified(IResource[] changedResources) {
        }

        public void projectConfigured(IProject project) {
        }

        public void projectDeconfigured(IProject project) {
        }

        public void initialize() {
        }
    }

    public SvnRevPropertiesView() {
    }

    /*
     *  (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#dispose()
     */
    //  public void dispose() {
    //      SVNProviderPlugin.removeResourceStateChangeListener(resourceStateChangeListener);
    //      resourceStateChangeListener = null;
    //      getSite().getPage().removePostSelectionListener(pageSelectionListener);
    //      if (historyRevisionListener != null) {
    //    
    //      }
    //      super.dispose();
    //  }

    class PropertiesLabelProvider implements ITableLabelProvider {

        public PropertiesLabelProvider() {
        }

        /**
         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnImage(java.lang.Object, int)
         */
        public Image getColumnImage(Object element, int columnIndex) {
            if (columnIndex == 0 && element != null && conflicts != null) {
                ISVNProperty svnProperty = (ISVNProperty) element;
                for (int i = 0; i < conflicts.length; i++) {
                    if (conflicts[i].getPropertyName().equals(svnProperty.getName())) {
                        return SVNUIPlugin.getImage(ISVNUIConstants.IMG_PROPERTY_CONFLICTED);
                    }
                }
            }
            return null;
        }

        /**
         * @see org.eclipse.jface.viewers.ITableLabelProvider#getColumnText(java.lang.Object, int)
         */
        public String getColumnText(Object element, int columnIndex) {
            if (element == null)
                return ""; //$NON-NLS-1$
            ISVNProperty svnProperty = (ISVNProperty) element;

            String result = null;
            switch (columnIndex) {
            case 1:
                result = svnProperty.getName();
                break;
            case 2:
                result = svnProperty.getValue();
                break;
            }
            // This method must not return null
            if (result == null)
                result = ""; //$NON-NLS-1$
            return result;

        }

        /**
         * @see org.eclipse.jface.viewers.IBaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
         */
        public void addListener(ILabelProviderListener listener) {
        }

        /**
         * @see org.eclipse.jface.viewers.IBaseLabelProvider#dispose()
         */
        public void dispose() {
        }

        /**
         * @see org.eclipse.jface.viewers.IBaseLabelProvider#isLabelProperty(java.lang.Object, java.lang.String)
         */
        public boolean isLabelProperty(Object element, String property) {
            return false;
        }

        /**
         * @see org.eclipse.jface.viewers.IBaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
         */
        public void removeListener(ILabelProviderListener listener) {
        }

    }

    private TableViewer createTable(Composite parent) {
        Table table = new Table(parent, SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.MULTI);
        table.setHeaderVisible(true);
        table.setLinesVisible(true);

        GridData gridData = new GridData(GridData.FILL_BOTH);
        table.setLayoutData(gridData);
        TableLayout layout = new TableLayout();
        table.setLayout(layout);

        tableViewer = new TableViewer(table);
        createColumns(table, layout);

        tableViewer.setContentProvider(new ArrayContentProvider());
        tableViewer.setLabelProvider(new PropertiesLabelProvider());
        return tableViewer;
    }

    /**
     * Create the TextViewer 
     */
    protected TextViewer createText(Composite parent) {
        return new TextViewer(parent, SWT.V_SCROLL | SWT.WRAP | SWT.MULTI | SWT.READ_ONLY);
    }

    /**
     * @see org.eclipse.ui.IWorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    public void createPartControl(Composite parent) {
        GridLayout layout = new GridLayout();
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        layout.numColumns = 1;
        parent.setLayout(layout);
        statusLabel = new Label(parent, SWT.LEFT);
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.grabExcessHorizontalSpace = true;
        statusLabel.setLayoutData(gridData);

        SashForm sashForm = new SashForm(parent, SWT.VERTICAL);
        sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
        tableViewer = createTable(sashForm);
        textViewer = createText(sashForm);
        sashForm.setWeights(new int[] { 70, 30 });

        contributeActions();

        //      pageSelectionListener = new ISelectionListener() {
        //          public void selectionChanged(IWorkbenchPart part, ISelection selection) {
        //              handlePartSelectionChanged(part,selection);
        //          }
        //      };
        //      
        //      getSite().getPage().addPostSelectionListener(pageSelectionListener);
        //      resourceStateChangeListener = new ResourceStateChangeListener();
        //      SVNProviderPlugin.addResourceStateChangeListener(resourceStateChangeListener);

    }

    /**
     * called when the selection changed on another part  
     */
    //  private void handlePartSelectionChanged(IWorkbenchPart part, ISelection selection) {
    //      if (!(selection instanceof IStructuredSelection))
    //          return;
    //      
    //      try {
    //          Object first = ((IStructuredSelection)selection).getFirstElement(); 
    //
    //          if (first instanceof IAdaptable) {
    //              IAdaptable a = (IAdaptable) first;
    //              Object adapter = a.getAdapter(IResource.class);
    //              if (adapter instanceof IResource) {
    //                  IResource resource = (IResource)adapter;
    //                  
    //                  // If the resource isn't open or doesn't exist it won't have properties
    //                  if (!resource.isAccessible()) {
    //                      clearSvnProperties();
    //                      refresh();
    //                  } else {
    //                      ISVNLocalResource svnResource = (ISVNLocalResource)resource.getAdapter(ISVNLocalResource.class);
    //                      showSvnProperties(svnResource);
    //                      refresh();
    //                  }
    //              }
    //          }
    //      } catch (SVNException e) {
    //      }   
    //  }  

    private Action getRefreshAction() {
        if (refreshAction == null) {
            SVNUIPlugin plugin = SVNUIPlugin.getPlugin();
            refreshAction = new Action(Policy.bind("SvnPropertiesView.refreshLabel"), //$NON-NLS-1$
                    plugin.getImageDescriptor(ISVNUIConstants.IMG_REFRESH_ENABLED)) {
                public void run() {
                    try {
                        if (resource != null)
                            showSvnProperties(resource);
                        else if (remoteResource != null)
                            showSvnProperties(remoteResource);
                    } catch (SVNException e) {
                        ;
                    } // eat it
                    refresh();
                }
            };
            refreshAction.setToolTipText(Policy.bind("SvnPropertiesView.refresh")); //$NON-NLS-1$
            refreshAction
                    .setDisabledImageDescriptor(plugin.getImageDescriptor(ISVNUIConstants.IMG_REFRESH_DISABLED));
            refreshAction.setHoverImageDescriptor(plugin.getImageDescriptor(ISVNUIConstants.IMG_REFRESH));
        }
        return refreshAction;
    }

    // TODO: Add, modify and Delete actions, this rev is just view only for now  

    /**
     * Adds the action contributions for this view.
     */
    public void contributeActions() {
        // Contribute actions to popup menu for the table
        //    MenuManager menuMgr = new MenuManager();
        //    Menu menu = menuMgr.createContextMenu(tableViewer.getTable());
        //    menuMgr.addMenuListener(new IMenuListener() {
        //        public void menuAboutToShow(IMenuManager menuMgr) {
        //            fillTableMenu(menuMgr);
        //        }
        //    });
        //    menuMgr.setRemoveAllWhenShown(true);
        //    tableViewer.getTable().setMenu(menu);
        //    getSite().registerContextMenu(menuMgr, tableViewer); 

        // Create the local tool bar
        IActionBars actionBars = getViewSite().getActionBars();
        IToolBarManager tbm = actionBars.getToolBarManager();
        tbm.add(getRefreshAction());
        tbm.update(false);

        // set F1 help
        PlatformUI.getWorkbench().getHelpSystem().setHelp(tableViewer.getControl(),
                IHelpContextIds.REV_PROPERTIES_VIEW);

        // set the selectionchanged listener for the table
        // updates property value when selection changes
        tableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            public void selectionChanged(SelectionChangedEvent event) {
                ISelection selection = event.getSelection();
                if (selection == null || !(selection instanceof IStructuredSelection)) {
                    textViewer.setDocument(new Document("")); //$NON-NLS-1$
                    return;
                }
                IStructuredSelection ss = (IStructuredSelection) selection;
                if (ss.size() != 1) {
                    textViewer.setDocument(new Document("")); //$NON-NLS-1$
                    return;
                }
                ISVNProperty property = (ISVNProperty) ss.getFirstElement();
                textViewer.setDocument(new Document(property.getValue()));
            }
        });
    }

    /**
     * fill the popup menu for the table
     */
    //private void fillTableMenu(IMenuManager manager) {
    //    manager.add(getRefreshAction());
    // }

    /**
     * Method createColumns.
     * @param table
     * @param layout
     * @param viewer
     */
    private void createColumns(Table table, TableLayout layout) {

        TableColumn col;

        // name
        col = new TableColumn(table, SWT.NONE);
        col.setResizable(false);
        layout.addColumnData(new ColumnWeightData(1, true));

        // name
        col = new TableColumn(table, SWT.NONE);
        col.setResizable(true);
        col.setText(Policy.bind("SvnPropertiesView.propertyName")); //$NON-NLS-1$
        layout.addColumnData(new ColumnWeightData(60, true));

        // value
        col = new TableColumn(table, SWT.NONE);
        col.setResizable(true);
        col.setText(Policy.bind("SvnPropertiesView.propertyValue")); //$NON-NLS-1$
        layout.addColumnData(new ColumnWeightData(120, true));
    }

    /**
     * @see org.eclipse.ui.IWorkbenchPart#setFocus()
     */
    public void setFocus() {
        tableViewer.getControl().setFocus();
    }

    /**
     * refresh the view
     */
    public void refresh() {

        Display.getDefault().syncExec(new Runnable() {
            public void run() {
                try {
                    ISVNProperty[] props = getSvnRevProperties();
                    tableViewer.setInput(props);
                    tableViewer.refresh();
                } catch (SVNException e) {
                    // silently ignore exception
                }
            }
        });
    }

    /**
     * update the status text
     *
     */
    private void updateStatus() {
        conflicts = null;
        if (resource == null && remoteResource == null) {
            statusLabel.setText(""); //$NON-NLS-1$
            return;
        }
        if (resource != null) {
            try {
                LocalResourceStatus status = resource.getStatus();
                if (!resource.isManaged()) {
                    statusLabel.setText(Policy.bind("SvnPropertiesView.resourceNotManaged")); //$NON-NLS-1$
                } else if (status.getPropStatus().equals(SVNStatusKind.MODIFIED)) {
                    statusLabel.setText(Policy.bind("SvnPropertiesView.somePropertiesModified")); //$NON-NLS-1$
                } else if (status.getPropStatus().equals(SVNStatusKind.NORMAL)) {
                    statusLabel.setText(Policy.bind("SvnPropertiesView.noPropertiesModified")); //$NON-NLS-1$
                } else if (status.getPropStatus().equals(SVNStatusKind.CONFLICTED)) {
                    statusLabel.setText(Policy.bind("SvnPropertiesView.conflictOnProperties")); //$NON-NLS-1$
                    try {
                        conflicts = PropertyConflict.getPropertyConflicts(resource);
                    } catch (Exception e) {
                    }
                } else {
                    statusLabel.setText(""); //$NON-NLS-1$
                }
            } catch (SVNException e) {
                statusLabel.setText(Policy.bind("SvnPropertiesView.errorGettingStatus")); //$NON-NLS-1$
            }
        }
    }

    public void clearSvnProperties() {
        setContentDescription("");
        updateStatus();
    }

    /**
     * Shows the properties for the given resource 
     */
    public void showSvnProperties(ISVNLocalResource resource) throws SVNException {
        this.resource = resource;
        this.remoteResource = null;

        if (resource != null) {
            if (resource.isManaged()) {
                if (resource.getRevision() != null) {
                    setContentDescription(Policy.bind("SvnRevPropertiesView.titleWithTwoArguments", //$NON-NLS-1$
                            resource.getRevision().toString(), resource.getName()));
                }
            } else {
                setContentDescription(Policy.bind("SvnRevPropertiesView.titleWithOneArgument", resource.getName())); //$NON-NLS-1$
            }
        } else {
            setContentDescription(""); //$NON-NLS-1$
        }
        updateStatus();
    }

    /**
     * Shows the properties for the given resource 
     */
    public void showSvnProperties(ISVNRemoteResource resource) throws SVNException {
        this.remoteResource = resource;
        this.resource = null;
        if (remoteResource != null) {
            if (remoteResource.getRevision() != null) {
                setContentDescription(Policy.bind("SvnRevPropertiesView.titleWithTwoArguments", //$NON-NLS-1$
                        remoteResource.getRevision().toString(), remoteResource.getName()));
            }
        } else {
            setContentDescription(""); //$NON-NLS-1$
        }
        updateStatus();
    }

    private ISVNProperty[] getSvnRevProperties() throws SVNException {

        if (resource != null && resource.isManaged()) {
            SVNRevision rev = resource.getRevision();
            ISVNRemoteResource remoteResource = resource.getRemoteResource(rev);
            return UnversionedCustomProperty.getSvnRevisionProperties(remoteResource.getUrl(), rev, null);
        }

        if (remoteResource != null) {
            SVNRevision rev = remoteResource.getRevision();
            return UnversionedCustomProperty.getSvnRevisionProperties(remoteResource.getUrl(), rev, null);
        }

        return null;
    }

}