org.eclipse.paho.mqtt.ui.support.tree.TreeViewerBuilder.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.paho.mqtt.ui.support.tree.TreeViewerBuilder.java

Source

/*******************************************************************************
 * Copyright (c) 2013 IBM Corp.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution. 
 *
 * The Eclipse Public License is available at 
 *    http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at 
 *   http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *    Bin Zhang - initial API and implementation and/or initial documentation
 *******************************************************************************/
package org.eclipse.paho.mqtt.ui.support.tree;

import java.beans.PropertyDescriptor;
import java.util.Collections;
import java.util.Map;

import org.eclipse.jface.viewers.CheckboxTreeViewer;
import org.eclipse.jface.viewers.ColumnViewerEditor;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationEvent;
import org.eclipse.jface.viewers.ColumnViewerEditorActivationStrategy;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.IBaseLabelProvider;
import org.eclipse.jface.viewers.ICheckStateListener;
import org.eclipse.jface.viewers.IContentProvider;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerEditor;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.paho.mqtt.ui.util.Beans;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlListener;
import org.eclipse.swt.widgets.Composite;

/**
 * TreeViewer builder
 * 
 * @author Bin Zhang
 */
public final class TreeViewerBuilder {
    private final TreeViewer viewer;
    private final boolean checkable;
    private Map<String, PropertyDescriptor> mappings;

    /**
     * Creates a new TreeViewerBuilder.
     */
    public TreeViewerBuilder(Composite parent, int style) {
        mappings = Collections.emptyMap();
        checkable = (style & SWT.CHECK) == SWT.CHECK;

        if (checkable) {
            viewer = new CheckboxTreeViewer(parent, style);
        } else {
            viewer = new TreeViewer(parent, style);
        }

        // enable tooltip support
        ColumnViewerToolTipSupport.enableFor(viewer, ToolTip.NO_RECREATE);
    }

    /**
     * Creates a new TreeViewerBuilder with default SWT styles.
     */
    public TreeViewerBuilder(Composite parent) {
        this(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
    }

    /**
     * Default activationStrategy and ColumnViewerEditor feature
     */
    public TreeViewerBuilder makeEditable() {
        return makeEditable(null, -1);
    }

    /**
     * @param activationStrategy
     * @param feature
     */
    public TreeViewerBuilder makeEditable(ColumnViewerEditorActivationStrategy activationStrategy, int feature) {
        ColumnViewerEditorActivationStrategy defaultActivationStrategy = new ColumnViewerEditorActivationStrategy(
                viewer) {
            protected boolean isEditorActivationEvent(ColumnViewerEditorActivationEvent event) {
                return event.eventType == ColumnViewerEditorActivationEvent.MOUSE_DOUBLE_CLICK_SELECTION
                        || event.eventType == ColumnViewerEditorActivationEvent.PROGRAMMATIC;
            }
        };
        TreeViewerEditor.create(viewer, activationStrategy == null ? defaultActivationStrategy : activationStrategy,
                feature < 0 ? ColumnViewerEditor.DEFAULT : feature);
        return this;
    }

    /**
     * @param listener
     */
    public TreeViewerBuilder controlListener(ControlListener listener) {
        viewer.getControl().addControlListener(listener);
        return this;
    }

    /**
     * @param listener
     */
    public TreeViewerBuilder selectionChangedListener(ISelectionChangedListener listener) {
        viewer.addSelectionChangedListener(listener);
        return this;
    }

    /**
     * @param listener
     */
    public TreeViewerBuilder doubleClickListener(IDoubleClickListener listener) {
        viewer.addDoubleClickListener(listener);
        return this;
    }

    /**
     * @param listener
     */
    public TreeViewerBuilder checkStateListener(ICheckStateListener listener) {
        if (!checkable) {
            throw new IllegalStateException("The tree viewer is not a CheckboxTreeViewer!"); //$NON-NLS-1$
        }

        ((CheckboxTreeViewer) viewer).addCheckStateListener(listener);
        return this;
    }

    /**
     * @param modelClass
     */
    public TreeViewerBuilder modelClass(Class<?> modelClass) {
        mappings = Beans.introspect(modelClass);
        return this;
    }

    /**
     * @param modelClass
     */
    public TreeViewerBuilder contentProvider(IContentProvider contentProvider) {
        viewer.setContentProvider(contentProvider);
        return this;
    }

    /**
     * @param modelClass
     */
    public TreeViewerBuilder labelProvider(IBaseLabelProvider labelProvider) {
        viewer.setLabelProvider(labelProvider);
        return this;
    }

    /**
     * Sets the given collection as input object
     */
    public TreeViewerBuilder input(Object input) {
        viewer.setInput(input);
        return this;
    }

    /**
     * Returns the JFace viewer.
     */
    public TreeViewer build() {
        return viewer;
    }

    /**
     * Returns the JFace CheckboxTreeViewer.
     */
    public CheckboxTreeViewer buildCheckable() {
        if (!checkable) {
            throw new IllegalStateException("The tree viewer is not a CheckboxTreeViewer!"); //$NON-NLS-1$
        }

        return (CheckboxTreeViewer) viewer;
    }

    /**
     * Creates a new column builder that can be used to configure the column. When you have finished configuring the
     * column, call build() on the column builder to create the actual column.
     */
    public TreeViewerColumnBuilder columnBuilder(String headerText, int style) {
        return new TreeViewerColumnBuilder(this, headerText, style);
    }

    public TreeViewerColumnBuilder columnBuilder(int style) {
        return columnBuilder(null, style);
    }

    public TreeViewerColumnBuilder columnBuilder() {
        return columnBuilder(SWT.NONE);
    }

    TreeViewer getViewer() {
        return viewer;
    }

    PropertyDescriptor getPropertyDescriptor(String propertyName) {
        return mappings.get(propertyName);
    }

}