rabbit.ui.internal.pages.CommandPage.java Source code

Java tutorial

Introduction

Here is the source code for rabbit.ui.internal.pages.CommandPage.java

Source

/*
 * Copyright 2010 The Rabbit Eclipse Plug-in Project
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package rabbit.ui.internal.pages;

import static rabbit.ui.internal.pages.Category.COMMAND;
import static rabbit.ui.internal.pages.Category.DATE;
import static rabbit.ui.internal.pages.Category.WORKSPACE;
import static rabbit.ui.internal.viewers.Viewers.newTreeViewerColumn;

import rabbit.data.access.IAccessor;
import rabbit.data.access.model.ICommandData;
import rabbit.data.access.model.WorkspaceStorage;
import rabbit.data.handler.DataHandler;
import rabbit.ui.Preference;
import rabbit.ui.internal.treebuilders.CommandDataTreeBuilder;
import rabbit.ui.internal.treebuilders.CommandDataTreeBuilder.ICommandDataProvider;
import rabbit.ui.internal.util.Categorizer;
import rabbit.ui.internal.util.CategoryProvider;
import rabbit.ui.internal.util.ICategorizer;
import rabbit.ui.internal.util.IConverter;
import rabbit.ui.internal.util.TreePathIntConverter;
import rabbit.ui.internal.util.TreePathValueProvider;
import rabbit.ui.internal.viewers.CommandDescriptionProvider;
import rabbit.ui.internal.viewers.CommandLabelProvider;
import rabbit.ui.internal.viewers.CompositeCellLabelProvider;
import rabbit.ui.internal.viewers.DateLabelProvider;
import rabbit.ui.internal.viewers.FilterableTreePathContentProvider;
import rabbit.ui.internal.viewers.TreePathContentProvider;
import rabbit.ui.internal.viewers.TreePathIntLabelProvider;
import rabbit.ui.internal.viewers.TreePathPatternFilter;
import rabbit.ui.internal.viewers.TreeViewerCellPainter;
import rabbit.ui.internal.viewers.TreeViewerColumnLabelSorter;
import rabbit.ui.internal.viewers.TreeViewerColumnSorter;
import rabbit.ui.internal.viewers.TreeViewerColumnValueSorter;
import rabbit.ui.internal.viewers.Viewers;
import rabbit.ui.internal.viewers.WorkspaceStorageLabelProvider;

import static com.google.common.base.Predicates.instanceOf;

import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;

import org.eclipse.core.commands.Command;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ColumnLabelProvider;
import org.eclipse.jface.viewers.DecoratingStyledCellLabelProvider;
import org.eclipse.jface.viewers.ILabelDecorator;
import org.eclipse.jface.viewers.TreePath;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jface.viewers.TreeViewerColumn;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.FilteredTree;
import org.joda.time.LocalDate;

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

/**
 * A page for displaying command usage.
 */
public class CommandPage extends AbsPage {

    private FilteredTree filteredTree;
    private CategoryProvider categoryProvider;
    private TreePathValueProvider valueProvider;
    private TreePathContentProvider contentProvider;

    public CommandPage() {
    }

    @Override
    public void createContents(Composite parent) {
        Category[] supported = { WORKSPACE, DATE, COMMAND };
        categoryProvider = new CategoryProvider(supported, COMMAND);
        categoryProvider.addObserver(this);
        contentProvider = new TreePathContentProvider(new CommandDataTreeBuilder(categoryProvider));
        contentProvider.addObserver(this);
        valueProvider = createValueProvider();
        valueProvider.addObserver(this);

        // The main label provider for the first column:
        CompositeCellLabelProvider mainLabels = new CompositeCellLabelProvider(new CommandLabelProvider(),
                new DateLabelProvider(), new WorkspaceStorageLabelProvider());

        // The viewer:
        filteredTree = Viewers.newFilteredTree(parent, new TreePathPatternFilter(mainLabels));
        TreeViewer viewer = filteredTree.getViewer();
        FilterableTreePathContentProvider filteredContentProvider = new FilterableTreePathContentProvider(
                contentProvider);
        filteredContentProvider.addFilter(instanceOf(Integer.class));
        viewer.setContentProvider(filteredContentProvider);

        // Column sorters:
        TreeViewerColumnSorter labelSorter = new InternalTreeViewerColumnLabelSorter(viewer, mainLabels);
        TreeViewerColumnSorter countSorter = new TreeViewerColumnValueSorter(viewer, valueProvider);

        // The columns:

        TreeViewerColumn mainColumn = newTreeViewerColumn(viewer, SWT.LEFT, "Name", 200);
        mainColumn.getColumn().addSelectionListener(labelSorter);
        ILabelDecorator decorator = PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator();
        mainColumn.setLabelProvider(new DecoratingStyledCellLabelProvider(mainLabels, decorator, null));

        TreeViewerColumn descriptionColumn = newTreeViewerColumn(viewer, SWT.LEFT, "Description", 200);
        ColumnLabelProvider descriptionLabels = new CommandDescriptionProvider();
        descriptionColumn.setLabelProvider(descriptionLabels);
        descriptionColumn.getColumn()
                .addSelectionListener(new TreeViewerColumnLabelSorter(viewer, descriptionLabels));

        TreeViewerColumn durationColumn = newTreeViewerColumn(viewer, SWT.RIGHT, "Usage Count", 150);
        durationColumn.getColumn().addSelectionListener(countSorter);
        durationColumn.setLabelProvider(new TreePathIntLabelProvider(valueProvider, mainLabels));

        TreeViewerColumn graphColumn = newTreeViewerColumn(viewer, SWT.LEFT, "", 100);
        graphColumn.getColumn().addSelectionListener(countSorter);
        graphColumn.setLabelProvider(new TreeViewerCellPainter(valueProvider));
    }

    @Override
    public IContributionItem[] createToolBarItems(IToolBarManager toolBar) {
        List<IContributionItem> items = new CommonToolBarBuilder().enableFilterControlAction(filteredTree, true)
                .enableTreeAction(filteredTree.getViewer()).enableGroupByAction(categoryProvider)
                .enableColorByAction(valueProvider).addGroupByAction(COMMAND).addGroupByAction(DATE, COMMAND)
                .addGroupByAction(WORKSPACE, COMMAND).addColorByAction(COMMAND).addColorByAction(DATE)
                .addColorByAction(WORKSPACE).build();

        for (IContributionItem item : items) {
            toolBar.add(item);
        }
        return items.toArray(new IContributionItem[items.size()]);
    }

    @Override
    public Job updateJob(Preference pref) {
        TreeViewer viewer = filteredTree.getViewer();
        return new UpdateJob<ICommandData>(viewer, pref, getAccessor()) {
            @Override
            protected Object getInput(final Collection<ICommandData> data) {
                return new ICommandDataProvider() {
                    @Override
                    public Collection<ICommandData> get() {
                        return data;
                    }
                };
            }
        };
    }

    @Override
    protected FilteredTree getFilteredTree() {
        return filteredTree;
    }

    @Override
    protected Category[] getSelectedCategories() {
        return categoryProvider.getSelected().toArray(new Category[0]);
    }

    @Override
    protected Category getVisualCategory() {
        return (Category) valueProvider.getVisualCategory();
    }

    @Override
    protected void setSelectedCategories(List<Category> categories) {
        categoryProvider.setSelected(categories.toArray(new Category[0]));
    }

    @Override
    protected void setVisualCategory(Category category) {
        valueProvider.setVisualCategory(category);
    }

    @Override
    protected void updateMaxValue() {
        valueProvider.setMaxValue(valueProvider.getVisualCategory());
    }

    private TreePathValueProvider createValueProvider() {
        Map<Predicate<Object>, Category> categories = ImmutableMap.of(instanceOf(Command.class), COMMAND,
                instanceOf(LocalDate.class), DATE, instanceOf(WorkspaceStorage.class), WORKSPACE);
        ICategorizer categorizer = new Categorizer(categories);
        IConverter<TreePath> converter = new TreePathIntConverter();
        return new TreePathValueProvider(categorizer, contentProvider, converter, COMMAND);
    }

    private IAccessor<ICommandData> getAccessor() {
        return DataHandler.getAccessor(ICommandData.class);
    }
}