com.microsoft.tfs.client.common.ui.wit.controls.WITClassificationControl.java Source code

Java tutorial

Introduction

Here is the source code for com.microsoft.tfs.client.common.ui.wit.controls.WITClassificationControl.java

Source

// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See License.txt in the repository root.

package com.microsoft.tfs.client.common.ui.wit.controls;

import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.ITreeViewerListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;

import com.microsoft.tfs.client.common.ui.framework.tree.TreeContentProvider;
import com.microsoft.tfs.client.common.ui.framework.tree.TreeViewerDoubleClickListener;
import com.microsoft.tfs.core.clients.workitem.node.Node;
import com.microsoft.tfs.core.clients.workitem.project.Project;

public class WITClassificationControl extends Composite {
    private final Project project;
    private final Node.TreeType treeType;

    private final TreeViewer treeViewer;
    private Object selectedObject;

    public WITClassificationControl(final Composite parent, final int style, final Project project,
            final Node.TreeType treeType, final String initialPath) {
        super(parent, style);
        this.project = project;
        this.treeType = treeType;

        final FillLayout layout = new FillLayout();
        setLayout(layout);

        treeViewer = new TreeViewer(this, SWT.NONE);
        treeViewer.setContentProvider(new WITClassificationControlContentProvider());
        treeViewer.setLabelProvider(new WITClassificationControlLabelProvider());
        treeViewer.addDoubleClickListener(new TreeViewerDoubleClickListener(treeViewer));
        treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(final SelectionChangedEvent event) {
                selectedObject = ((IStructuredSelection) event.getSelection()).getFirstElement();
            }
        });

        treeViewer.setInput(new Object());

        Object initialSelection = null;

        if (initialPath != null && initialPath.trim().length() > 0) {
            initialSelection = project.resolvePath(initialPath.trim(), treeType);
        }

        if (initialSelection == null) {
            initialSelection = project;
        }

        treeViewer.setSelection(new StructuredSelection(initialSelection), true);
        selectedObject = initialSelection;

        final Object[] currentExpandedElements = treeViewer.getExpandedElements();
        final Object[] newExpandedElements = new Object[currentExpandedElements.length + 1];
        System.arraycopy(currentExpandedElements, 0, newExpandedElements, 0, currentExpandedElements.length);
        newExpandedElements[newExpandedElements.length - 1] = selectedObject;

        treeViewer.setExpandedElements(newExpandedElements);
    }

    public void addSelectionChangedListener(final ISelectionChangedListener listener) {
        treeViewer.addSelectionChangedListener(listener);
    }

    public void addTreeListener(final ITreeViewerListener listener) {
        treeViewer.addTreeListener(listener);
    }

    public String getSelectedPath() {
        if (selectedObject instanceof Project) {
            return ((Project) selectedObject).getName();
        } else {
            return ((Node) selectedObject).getPath();
        }
    }

    private class WITClassificationControlContentProvider extends TreeContentProvider {
        @Override
        public Object[] getChildren(final Object parentElement) {
            if (parentElement instanceof Project) {
                if (treeType == Node.TreeType.AREA) {
                    return ((Project) parentElement).getAreaRootNodes().getNodes();
                } else {
                    return ((Project) parentElement).getIterationRootNodes().getNodes();
                }
            }

            if (parentElement instanceof Node) {
                return ((Node) parentElement).getChildNodes().getNodes();
            }

            return null;
        }

        @Override
        public boolean hasChildren(final Object element) {
            if (element instanceof Project) {
                if (treeType == Node.TreeType.AREA) {
                    return ((Project) element).getAreaRootNodes().size() > 0;
                } else {
                    return ((Project) element).getIterationRootNodes().size() > 0;
                }
            }

            if (element instanceof Node) {
                return ((Node) element).getChildNodes().size() > 0;
            }

            return false;
        }

        @Override
        public Object[] getElements(final Object inputElement) {
            return new Object[] { project };
        }

        @Override
        public Object getParent(final Object element) {
            if (element instanceof Node) {
                if (treeType == Node.TreeType.AREA) {
                    if (project.getAreaRootNodes().contains((Node) element)) {
                        return project;
                    }
                } else {
                    if (project.getIterationRootNodes().contains((Node) element)) {
                        return project;
                    }
                }

                return ((Node) element).getParent();
            }

            return null;
        }
    }

    private class WITClassificationControlLabelProvider extends LabelProvider {
        @Override
        public String getText(final Object element) {
            if (element instanceof Project) {
                return ((Project) element).getName();
            }
            if (element instanceof Node) {
                return ((Node) element).getName();
            }
            return null;
        }
    }
}