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

Java tutorial

Introduction

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

Source

/*******************************************************************************
 * Copyright (c) 2004, 2006 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.core.runtime.IAdaptable;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
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.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
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.events.KeyAdapter;
import org.eclipse.swt.events.KeyEvent;
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.Menu;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionFactory;
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.SVNException;
import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
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.actions.SVNPropertyDeleteAction;
import org.tigris.subversion.subclipse.ui.actions.SVNPropertyModifyAction;
import org.tigris.subversion.subclipse.ui.conflicts.PropertyConflict;
import org.tigris.subversion.subclipse.ui.wizards.dialogs.SvnWizard;
import org.tigris.subversion.subclipse.ui.wizards.dialogs.SvnWizardDialog;
import org.tigris.subversion.subclipse.ui.wizards.dialogs.SvnWizardSetPropertyPage;
import org.tigris.subversion.svnclientadapter.ISVNProperty;
import org.tigris.subversion.svnclientadapter.SVNStatusKind;

/**
 * 
 * The <code>SvnPropertiesView</code> shows the svn properties for a svn local resource 
 * 
 */
public class SvnPropertiesView extends ViewPart {

    public static final String VIEW_ID = "org.tigris.subversion.subclipse.ui.svnproperties.SvnPropertiesView"; //$NON-NLS-1$

    private TableViewer tableViewer;
    private TextViewer textViewer;
    private ISVNLocalResource resource;
    private Action refreshAction;
    private Action addPropertyAction;
    private Action modifyPropertyAction;
    private Action deletePropertyAction;
    private Label statusLabel;
    private ISelectionListener pageSelectionListener;
    private IResourceStateChangeListener resourceStateChangeListener;

    private PropertyConflict[] conflicts;

    private static SvnPropertiesView view;

    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 SvnPropertiesView() {
        view = this;
    }

    /*
     *  (non-Javadoc)
     * @see org.eclipse.ui.IWorkbenchPart#dispose()
     */
    public void dispose() {
        view = null;
        SVNProviderPlugin.removeResourceStateChangeListener(resourceStateChangeListener);
        resourceStateChangeListener = null;
        getSite().getPage().removePostSelectionListener(pageSelectionListener);
        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()) {
                        showSvnProperties(null);
                    } else {
                        ISVNLocalResource svnResource = (ISVNLocalResource) resource
                                .getAdapter(ISVNLocalResource.class);
                        showSvnProperties(svnResource);
                    }
                }
            }
        } 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() {
                    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;
    }

    private Action getAddPropertyAction() {
        if (addPropertyAction == null) {
            SVNUIPlugin plugin = SVNUIPlugin.getPlugin();
            addPropertyAction = new Action(Policy.bind("SvnPropertiesView.addPropertyLabel"), //$NON-NLS-1$
                    plugin.getImageDescriptor(ISVNUIConstants.IMG_MENU_PROPSET)) {
                public void run() {
                    SvnWizardSetPropertyPage setPropertyPage = new SvnWizardSetPropertyPage(resource);
                    SvnWizard wizard = new SvnWizard(setPropertyPage);
                    SvnWizardDialog dialog = new SvnWizardDialog(getSite().getShell(), wizard);
                    wizard.setParentDialog(dialog);
                    if (dialog.open() != SvnWizardDialog.OK)
                        return;

                    try {
                        if (setPropertyPage.getPropertyValue() != null) {
                            resource.setSvnProperty(setPropertyPage.getPropertyName(),
                                    setPropertyPage.getPropertyValue(), setPropertyPage.getRecurse());
                        } else {
                            resource.setSvnProperty(setPropertyPage.getPropertyName(),
                                    setPropertyPage.getPropertyFile(), setPropertyPage.getRecurse());
                        }
                        refresh();
                    } catch (SVNException e) {
                        if (!e.operationInterrupted()) {
                            SVNUIPlugin.openError(getSite().getShell(),
                                    Policy.bind("SvnPropertiesView.errorAddTitle"), //$NON-NLS-1$
                                    Policy.bind("SvnPropertiesView.errorAddMessage"), //$NON-NLS-1$ 
                                    e);
                        }
                    }

                }
            };
            addPropertyAction.setToolTipText(Policy.bind("SvnPropertiesView.addPropertyTooltip")); //$NON-NLS-1$
        }
        return addPropertyAction;
    }

    private Action getModifyPropertyAction() {
        if (modifyPropertyAction == null) {
            modifyPropertyAction = new Action(Policy.bind("SvnPropertiesView.modifyPropertyLabel")) { //$NON-NLS-1$
                public void run() {
                    SVNPropertyModifyAction delegate = new SVNPropertyModifyAction();
                    delegate.init(this);
                    delegate.selectionChanged(this, tableViewer.getSelection());
                    delegate.run(this);
                }
            };
        }
        return modifyPropertyAction;
    }

    private Action getDeletePropertyAction() {
        if (deletePropertyAction == null) {
            deletePropertyAction = new Action(Policy.bind("SvnPropertiesView.deletePropertyLabel")) { //$NON-NLS-1$
                public void run() {
                    SVNPropertyDeleteAction delegate = new SVNPropertyDeleteAction();
                    delegate.init(this);
                    delegate.selectionChanged(this, tableViewer.getSelection());
                    delegate.run(this);
                }
            };
        }
        return deletePropertyAction;
    }

    /**
     * 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();
        actionBars.setGlobalActionHandler(ActionFactory.DELETE.getId(), getDeletePropertyAction());
        IToolBarManager tbm = actionBars.getToolBarManager();
        tbm.add(getRefreshAction());
        tbm.update(false);

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

        tableViewer.addDoubleClickListener(new IDoubleClickListener() {
            public void doubleClick(DoubleClickEvent e) {
                getModifyPropertyAction().run();
            }
        });

        // 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()));
            }
        });

        tableViewer.getControl().addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent event) {
                if (event.character == SWT.DEL && event.stateMask == 0) {
                    getDeletePropertyAction().run();
                }
            }
        });

    }

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

        Action action = getAddPropertyAction();
        try {
            if (resource != null)
                action.setEnabled(resource.isManaged());
            else
                action.setEnabled(false);
        } catch (SVNException e) {
            action.setEnabled(false);
        }
        manager.add(action);

        manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
    }

    /**
     * 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 {
                    updateStatus();
                    tableViewer.setInput(getSvnProperties());
                    tableViewer.refresh();
                } catch (SVNException e) {
                    // silently ignore exception
                }
            }
        });
    }

    public static void refreshView() {
        if (view != null) {
            view.refresh();
        }
    }

    /**
     * update the status text
     *
     */
    private void updateStatus() {
        conflicts = null;
        if (resource == null) {
            statusLabel.setText(""); //$NON-NLS-1$
            return;
        }
        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$
        }
    }

    /**
     * Shows the properties for the given resource 
     */
    public void showSvnProperties(ISVNLocalResource resource) throws SVNException {
        this.resource = resource;
        if (resource != null) {
            setContentDescription(Policy.bind("SvnPropertiesView.titleWithArgument", resource.getName())); //$NON-NLS-1$
        } else {
            setContentDescription(""); //$NON-NLS-1$
        }
        refresh();
    }

    private ISVNProperty[] getSvnProperties() throws SVNException {

        if (resource == null) {
            // can be a null resource if we have the view open before we select anything
            return null;
        } else {
            if (resource.isManaged()) {
                return resource.getSvnProperties();
            } else {
                return null;
            }
        }
    }

}