Java tutorial
/* * 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.DATE; import static rabbit.ui.internal.pages.Category.FILE; import static rabbit.ui.internal.pages.Category.FOLDER; 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.IFileData; import rabbit.data.access.model.WorkspaceStorage; import rabbit.data.handler.DataHandler; import rabbit.ui.Preference; import rabbit.ui.internal.treebuilders.FileDataTreeBuilder; import rabbit.ui.internal.treebuilders.FileDataTreeBuilder.IFileDataProvider; 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.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.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 com.google.common.base.Predicate; import com.google.common.collect.ImmutableMap; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; 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.graphics.Color; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.FilteredTree; import org.joda.time.Duration; import org.joda.time.LocalDate; import java.util.Collection; import java.util.List; import java.util.Map; /** * A page for displaying time spent on files. */ public class ResourcePage extends AbsPage { private FilteredTree filteredTree; private CategoryProvider categoryProvider; private TreePathValueProvider durationProvider; private TreePathContentProvider contentProvider; public ResourcePage() { } @Override public void createContents(Composite parent) { Category[] supported = { WORKSPACE, DATE, PROJECT, FOLDER, FILE }; categoryProvider = new CategoryProvider(supported, PROJECT, FOLDER, FILE); categoryProvider.addObserver(this); contentProvider = new TreePathContentProvider(new FileDataTreeBuilder(categoryProvider)); contentProvider.addObserver(this); durationProvider = createDurationValueProvider(); durationProvider.addObserver(this); // The main label provider for the first column: CompositeCellLabelProvider mainLabels = new CompositeCellLabelProvider(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 protected Color createColor(Display display) { return new Color(display, 136, 177, 231); } }); } @Override public IContributionItem[] createToolBarItems(IToolBarManager toolBar) { List<IContributionItem> items = new CommonToolBarBuilder().enableFilterControlAction(filteredTree, true) .enableTreeAction(filteredTree.getViewer()).enableGroupByAction(categoryProvider) .enableColorByAction(durationProvider) .addGroupByAction(FILE.getText(), FILE.getImageDescriptor(), PROJECT, FOLDER, FILE) .addGroupByAction(FOLDER.getText(), FOLDER.getImageDescriptor(), PROJECT, FOLDER) .addGroupByAction(PROJECT).addGroupByAction(DATE, PROJECT, FOLDER, FILE) .addGroupByAction(WORKSPACE, PROJECT, FOLDER, FILE) .addColorByAction(FILE).addColorByAction(FOLDER).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<IFileData>(viewer, pref, getAccessor()) { @Override protected Object getInput(final Collection<IFileData> data) { return new IFileDataProvider() { @Override public Collection<IFileData> 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 ICategorizer createCategorizer() { Map<Predicate<Object>, Category> categories = ImmutableMap.of(instanceOf(IFile.class), FILE, instanceOf(IFolder.class), FOLDER, instanceOf(IProject.class), PROJECT, instanceOf(LocalDate.class), DATE, instanceOf(WorkspaceStorage.class), WORKSPACE); ICategorizer categorizer = new Categorizer(categories); return categorizer; } private TreePathValueProvider createDurationValueProvider() { ICategorizer categorizer = createCategorizer(); IConverter<TreePath> converter = new TreePathDurationConverter(); return new TreePathValueProvider(categorizer, contentProvider, converter, PROJECT); } private IAccessor<IFileData> getAccessor() { return DataHandler.getAccessor(IFileData.class); } }