org.eclipse.ecf.remoteservice.ui.serviceview.AbstractServicesView.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecf.remoteservice.ui.serviceview.AbstractServicesView.java

Source

/*******************************************************************************
 * Copyright (c) 2015 Composent, Inc. 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: Scott Lewis - initial API and implementation
 ******************************************************************************/
package org.eclipse.ecf.remoteservice.ui.serviceview;

import java.util.Collection;
import java.util.Map;

import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ecf.remoteservice.ui.internal.serviceview.Activator;
import org.eclipse.ecf.remoteservice.ui.services.IServicesView;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.AbstractServicesContentProvider;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.AbstractServicesNode;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.RegisteringBundleIdNode;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.ServiceNode;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.ServicesContentProvider;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.ServicesRootNode;
import org.eclipse.ecf.remoteservice.ui.serviceview.model.UsingBundleIdsNode;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ITreeSelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerComparator;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IViewSite;
import org.eclipse.ui.dialogs.FilteredTree;
import org.eclipse.ui.dialogs.PatternFilter;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.eclipse.ui.part.ViewPart;

public abstract class AbstractServicesView extends ViewPart implements IServicesView {

    private TreeViewer viewer;
    private AbstractServicesContentProvider contentProvider;
    private ServicesFilteredTree filteredTree;

    protected void fillContextMenu(IMenuManager manager) {

    }

    protected void makeActions() {

    }

    protected void log(int level, String message, Throwable e) {
        Activator.getDefault().getLog().log(new Status(level, Activator.PLUGIN_ID, message, e));
    }

    protected void logWarning(String message, Throwable e) {
        log(IStatus.WARNING, message, e);
    }

    protected void logError(String message, Throwable e) {
        log(IStatus.ERROR, message, e);
    }

    protected void logAndShowError(String message, Throwable exception) {
        logError(message, exception);
        MessageDialog.openInformation(viewer.getControl().getShell(), "Error",
                message + ((exception != null)
                        ? "\nException: " + exception.getMessage() + "\nSee Error Log for stack"
                        : ""));
    }

    protected void hookContextMenu() {
        MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
        menuMgr.setRemoveAllWhenShown(true);
        menuMgr.addMenuListener(new IMenuListener() {
            public void menuAboutToShow(IMenuManager manager) {
                AbstractServicesView.this.fillContextMenu(manager);
            }
        });
        Menu menu = menuMgr.createContextMenu(viewer.getControl());
        viewer.getControl().setMenu(menu);
        getSite().registerContextMenu(menuMgr, viewer);
    }

    @Override
    public void createPartControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = layout.marginWidth = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        this.contentProvider = createContentProvider(getViewSite());

        this.viewer = createTreeViewer(composite);

        makeActions();
        hookContextMenu();

        initializeServices();
    }

    @Override
    public void setFocus() {
        FilteredTree filteredTree = getFilteredTree();
        if (filteredTree != null) {
            Text filterText = filteredTree.getFilterControl();
            if (filterText != null)
                filterText.setFocus();
        }
    }

    @Override
    public void dispose() {
        super.dispose();
        this.viewer = null;
        this.contentProvider = null;
    }

    protected TreeViewer getTreeViewer() {
        return viewer;
    }

    protected FilteredTree getFilteredTree() {
        return filteredTree;
    }

    protected TreeViewer createTreeViewer(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.marginHeight = layout.marginWidth = 0;
        composite.setLayout(layout);
        composite.setLayoutData(new GridData(GridData.FILL_BOTH));

        filteredTree = createFilteredTree(composite, SWT.H_SCROLL | SWT.V_SCROLL, new PatternFilter());

        TreeViewer viewer = filteredTree.getViewer();

        viewer.setContentProvider(contentProvider);
        viewer.setLabelProvider(new WorkbenchLabelProvider());
        viewer.setUseHashlookup(true);

        viewer.setInput(getViewSite());

        viewer.setComparator(new ViewerComparator() {
            @Override
            public int compare(Viewer viewer, Object e1, Object e2) {
                if (e1 instanceof ServiceNode && e2 instanceof ServiceNode) {
                    return new Long(((ServiceNode) e2).getServiceId() - ((ServiceNode) e1).getServiceId())
                            .intValue();
                }
                return super.compare(viewer, e1, e2);
            }
        });

        getViewSite().setSelectionProvider(viewer);
        return viewer;
    }

    protected ServicesFilteredTree createFilteredTree(Composite parent, int options, PatternFilter filter) {
        ServicesFilteredTree result = new ServicesFilteredTree(this, parent, options, filter);
        result.setBackground(parent.getDisplay().getSystemColor(SWT.COLOR_LIST_BACKGROUND));
        GridData gd = new GridData(GridData.FILL_BOTH);
        result.setLayoutData(gd);
        return result;
    }

    protected AbstractServicesContentProvider getContentProvider() {
        return contentProvider;
    }

    protected ServicesContentProvider createContentProvider(IViewSite viewSite) {
        return new ServicesContentProvider(viewSite);
    }

    protected void initializeServices() {
        // do nothing;
    }

    protected ServiceNode findServiceNode(long serviceId) {
        AbstractServicesNode[] services = getServicesRoot().getChildren();
        for (AbstractServicesNode asn : services) {
            if (asn instanceof ServiceNode) {
                ServiceNode sn = (ServiceNode) asn;
                if (serviceId == sn.getServiceId())
                    return sn;
            }
        }
        return null;
    }

    protected ServicesRootNode getServicesRoot() {
        return getContentProvider().getServicesRoot();
    }

    protected Tree getUndisposedTree() {
        if (viewer == null || viewer.getTree() == null || viewer.getTree().isDisposed())
            return null;
        return viewer.getTree();
    }

    protected String getTitleSummary() {
        Tree tree = getUndisposedTree();
        String type = "services";
        int total = getServicesRoot().getChildren().length;
        if (tree == null)
            return NLS.bind("Filter matched {0} of {1} {2}.", (new String[] { "0", "0", type })); //$NON-NLS-1$ //$NON-NLS-2$
        return NLS.bind("Filter matched {0} of {1} {2}.",
                (new String[] { Integer.toString(tree.getItemCount()), Integer.toString(total), type }));
    }

    protected void updateTitle() {
        setContentDescription(getTitleSummary());
    }

    protected AbstractServicesNode getSelectedNode() {
        return ((AbstractServicesNode) ((ITreeSelection) viewer.getSelection()).getFirstElement());
    }

    @Override
    public void selectService(final String remoteId, final long serviceId) {
        TreeViewer viewer = getTreeViewer();
        if (viewer == null)
            return;
        viewer.getControl().getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                TreeViewer tv = getTreeViewer();
                if (tv == null)
                    return;
                ServiceNode sn = findServiceNode(serviceId);
                if (sn != null)
                    tv.setSelection(new StructuredSelection(sn));
            }
        });
    }

    @Override
    public String getRemoteId() {
        // We are interested in the local services view, which means the
        // remote id is null
        return null;
    }

    protected ServiceNode createServiceNode(long serviceId, long bundleId, long[] usingBundleIds,
            Map<String, Object> properties) {
        ServiceNode result = new ServiceNode(bundleId, usingBundleIds, properties);
        result.addChild(new RegisteringBundleIdNode(bundleId));
        result.addChild(new UsingBundleIdsNode("Using Bundles", usingBundleIds));
        return result;
    }

    protected void addServiceNodes(final Collection<ServiceNode> sns) {
        TreeViewer viewer = getTreeViewer();
        if (viewer == null)
            return;
        viewer.getControl().getDisplay().asyncExec(new Runnable() {
            @Override
            public void run() {
                TreeViewer tv = getTreeViewer();
                if (tv == null)
                    return;
                ServicesRootNode srn = getServicesRoot();
                for (ServiceNode sn : sns)
                    srn.addChild(sn);
                tv.setExpandedState(getServicesRoot(), true);
                tv.refresh();
            }
        });
    }

}