Package rabbit.ui.internal.pages.java

Source Code of rabbit.ui.internal.pages.java.JavaPage

/*
* 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.java;

import static rabbit.ui.internal.pages.Category.DATE;
import static rabbit.ui.internal.pages.Category.JAVA_MEMBER;
import static rabbit.ui.internal.pages.Category.JAVA_METHOD;
import static rabbit.ui.internal.pages.Category.JAVA_PACKAGE;
import static rabbit.ui.internal.pages.Category.JAVA_PACKAGE_ROOT;
import static rabbit.ui.internal.pages.Category.JAVA_TYPE;
import static rabbit.ui.internal.pages.Category.JAVA_TYPE_ROOT;
import static rabbit.ui.internal.pages.Category.PROJECT;
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.IJavaData;
import rabbit.data.handler.DataHandler;
import rabbit.ui.Preference;
import rabbit.ui.internal.pages.AbsPage;
import rabbit.ui.internal.pages.Category;
import rabbit.ui.internal.pages.CommonToolBarBuilder;
import rabbit.ui.internal.pages.InternalTreeViewerColumnLabelSorter;
import rabbit.ui.internal.pages.UpdateJob;
import rabbit.ui.internal.treebuilders.JavaDataTreeBuilder;
import rabbit.ui.internal.treebuilders.JavaDataTreeBuilder.IJavaDataProvider;
import rabbit.ui.internal.util.CategoryProvider;
import rabbit.ui.internal.util.ICategorizer;
import rabbit.ui.internal.util.IConverter;
import rabbit.ui.internal.util.JavaVisualCategorizer;
import rabbit.ui.internal.util.TreePathDurationConverter;
import rabbit.ui.internal.util.TreePathValueProvider;
import rabbit.ui.internal.viewers.CompositeCellLabelProvider;
import rabbit.ui.internal.viewers.DateLabelProvider;
import rabbit.ui.internal.viewers.FilterableTreePathContentProvider;
import rabbit.ui.internal.viewers.JavaLabelProvider;
import rabbit.ui.internal.viewers.ResourceLabelProvider;
import rabbit.ui.internal.viewers.TreePathContentProvider;
import rabbit.ui.internal.viewers.TreePathDurationLabelProvider;
import rabbit.ui.internal.viewers.TreePathPatternFilter;
import rabbit.ui.internal.viewers.TreeViewerCellPainter;
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 org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IToolBarManager;
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.Duration;

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

/**
* A page for displaying time spent on java elements.
*/
public final class JavaPage extends AbsPage {

  // @formatter:off
  /*
   * The following categories are used to structure the data:
   *
   * Category.WORKSPACE
   * Category.DATE,
   * Category.PROJECT,
   * Category.JAVA_PACKAGE_ROOT,
   * Category.JAVA_PACKAGE,
   * Category.JAVA_TYPE_ROOT,
   * Category.JAVA_MEMBER,
   *
   * The following categories are used to paint the corresponding elements in
   * the viewer:
   *
   * Category.WORKSPACE
   * Category.DATE
   * Category.PROJECT,
   * Category.JAVA_PACKAGE_ROOT,
   * Category.JAVA_PACKAGE,
   * Category.JAVA_TYPE_ROOT,
   * Category.JAVA_TYPE,
   * Category.JAVA_METHOD,
   *
   * The difference between the two is that when we structure the data, we use
   * JAVA_MEMBER instead of JAVA_TYPE and JAVA_METHOD, JAVA_MEMBER includes
   * both TYPE and METHOD so that the structure of the class is maintained when
   * we build the tree.
   */
  // @formatter:on

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

  public JavaPage() {}

  @Override
  public void createContents(Composite parent) {
    Category[] supported = {
        WORKSPACE,
        DATE,
        PROJECT,
        JAVA_PACKAGE_ROOT,
        JAVA_PACKAGE,
        JAVA_TYPE_ROOT,
        JAVA_MEMBER,
        };
    categoryProvider = new CategoryProvider(supported,
        PROJECT, JAVA_PACKAGE_ROOT, JAVA_PACKAGE, JAVA_TYPE_ROOT, JAVA_MEMBER);
    categoryProvider.addObserver(this);

    contentProvider = new TreePathContentProvider(
        new JavaDataTreeBuilder(categoryProvider));
    contentProvider.addObserver(this);

    durationProvider = createDurationValueProvider();
    durationProvider.addObserver(this);

    // The main label provider for the first column:
    CompositeCellLabelProvider mainLabels = new CompositeCellLabelProvider(
        new JavaLabelProvider(),
        new ResourceLabelProvider(),
        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(Duration.class));
    viewer.setContentProvider(filteredContentProvider);

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

    // 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 durationColumn =
        newTreeViewerColumn(viewer, SWT.RIGHT, "Time Spent", 150);
    durationColumn.getColumn().addSelectionListener(durationSorter);
    durationColumn.setLabelProvider(new TreePathDurationLabelProvider(
        durationProvider, mainLabels));

    TreeViewerColumn durationGraphColumn =
        newTreeViewerColumn(viewer, SWT.LEFT, "", 100);
    durationGraphColumn.getColumn().addSelectionListener(durationSorter);
    durationGraphColumn.setLabelProvider(new TreeViewerCellPainter(
        durationProvider));
  }

  @Override
  public IContributionItem[] createToolBarItems(IToolBarManager toolBar) {
    List<IContributionItem> items = new CommonToolBarBuilder()
        .enableFilterControlAction(filteredTree, true)
        .enableTreeAction(filteredTree.getViewer())
        .enableGroupByAction(categoryProvider)
        .enableColorByAction(durationProvider)

        .addGroupByAction(
            PROJECT,
            JAVA_PACKAGE_ROOT,
            JAVA_PACKAGE,
            JAVA_TYPE_ROOT,
            JAVA_MEMBER)
        .addGroupByAction(
            DATE,
            PROJECT,
            JAVA_PACKAGE_ROOT,
            JAVA_PACKAGE,
            JAVA_TYPE_ROOT,
            JAVA_MEMBER)
        .addGroupByAction(
            WORKSPACE,
            PROJECT,
            JAVA_PACKAGE_ROOT,
            JAVA_PACKAGE,
            JAVA_TYPE_ROOT,
            JAVA_MEMBER)

        .addColorByAction(JAVA_METHOD)
        .addColorByAction(JAVA_TYPE)
        .addColorByAction(JAVA_TYPE_ROOT)
        .addColorByAction(JAVA_PACKAGE)
        .addColorByAction(JAVA_PACKAGE_ROOT)
        .addColorByAction(PROJECT)
        .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<IJavaData>(viewer, pref, getAccessor()) {
      @Override
      protected Object getInput(final Collection<IJavaData> data) {
        return new IJavaDataProvider() {
          @Override
          public Collection<IJavaData> 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) durationProvider.getVisualCategory();
  }

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

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

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

  private TreePathValueProvider createDurationValueProvider() {
    ICategorizer categorizer = new JavaVisualCategorizer();
    IConverter<TreePath> converter = new TreePathDurationConverter();
    return new TreePathValueProvider(
        categorizer, contentProvider, converter, JAVA_METHOD);
  }

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

}
TOP

Related Classes of rabbit.ui.internal.pages.java.JavaPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.