gov.nasa.arc.spife.ui.table.days.DaysEditor.java Source code

Java tutorial

Introduction

Here is the source code for gov.nasa.arc.spife.ui.table.days.DaysEditor.java

Source

/*******************************************************************************
 * Copyright 2014 United States Government as represented by the
 * Administrator of the National Aeronautics and Space Administration.
 * All Rights Reserved.
 * 
 * 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 gov.nasa.arc.spife.ui.table.days;

import gov.nasa.arc.spife.ui.table.days.filter.AbstractDaysFilter;
import gov.nasa.arc.spife.ui.table.days.filter.AllActivitiesDaysFilter;
import gov.nasa.ensemble.common.EnsembleProperties;
import gov.nasa.ensemble.common.extension.ClassRegistry;
import gov.nasa.ensemble.common.ui.IStructureModifier;
import gov.nasa.ensemble.common.ui.editor.EnsembleSelectionProvider;
import gov.nasa.ensemble.common.ui.operations.ClipboardCutOperation;
import gov.nasa.ensemble.common.ui.operations.DeleteOperation;
import gov.nasa.ensemble.common.ui.transfers.ITransferable;
import gov.nasa.ensemble.common.ui.treetable.TreeTableComposite;
import gov.nasa.ensemble.core.plan.editor.AbstractPlanEditorPart;
import gov.nasa.ensemble.core.plan.editor.merge.action.IToggleFlattenEditor;
import gov.nasa.ensemble.core.plan.editor.merge.decorator.IMergeRowHighlightDecorable;
import gov.nasa.ensemble.core.plan.editor.merge.decorator.MergeRowHighlightDecorator;
import gov.nasa.ensemble.core.plan.editor.merge.operations.MergePlanClipboardCutOperation;
import gov.nasa.ensemble.core.plan.editor.merge.operations.MergePlanDeleteOperation;

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IWorkbenchPartConstants;
import org.eclipse.ui.IWorkbenchPartSite;

/**
 * @author andrewb, ideliz
 *
 */
public class DaysEditor extends AbstractPlanEditorPart
        implements IToggleFlattenEditor, IMergeRowHighlightDecorable {

    private Combo filterCombo;
    protected DaysComposite daysComposite;
    private EnsembleSelectionProvider selectionProvider = new EnsembleSelectionProvider(this.toString());

    private final MergeRowHighlightDecorator rowHighlightDecorator = new MergeRowHighlightDecorator(
            getRowHighlightDecoratorKey());

    //filters
    private static final String DEFAULT_FILTER_NAME = EnsembleProperties.getProperty("days.filter.default",
            AllActivitiesDaysFilter.ALL_ACTIVITIES_DAYS_FILTER_NAME);
    private static Map<String, AbstractDaysFilter> FILTERS = createFiltersMap();
    private AbstractDaysFilter currentFilter = FILTERS.get(DEFAULT_FILTER_NAME);

    public DaysEditor() {
        super();
    }

    @Override
    public String getRowHighlightDecoratorKey() {
        return "days_row_highlight_property";
    }

    @Override
    public String getId() {
        return "days";
    }

    private static Map<String, AbstractDaysFilter> createFiltersMap() {
        Map<String, AbstractDaysFilter> map = new LinkedHashMap();
        List<AbstractDaysFilter> instances = ClassRegistry.createInstances(AbstractDaysFilter.class);
        for (AbstractDaysFilter filter : instances) {
            map.put(filter.getName(), filter);
        }
        return Collections.unmodifiableMap(map);
    }

    // 1st
    @Override
    protected void setSite(IWorkbenchPartSite newSite) {
        newSite.setSelectionProvider(selectionProvider);
        super.setSite(newSite);
    }

    // 2nd
    @Override
    public void setInput(IEditorInput input) {
        super.setInput(input);
        if (daysComposite != null) {
            daysComposite.setInput(input);
        }
        firePropertyChange(IWorkbenchPartConstants.PROP_INPUT);
    }

    @Override
    public void toggleFlatten() {
        daysComposite.toggleFlatten();
    }

    // 3rd
    /* (non-Javadoc)
     * @see org.eclipse.ui.part.WorkbenchPart#createPartControl(org.eclipse.swt.widgets.Composite)
     */
    @Override
    public void createPartControl(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.verticalSpacing = 0;
        layout.horizontalSpacing = 0;
        layout.marginWidth = 0;
        layout.marginHeight = 0;
        composite.setLayout(layout);

        createAdditionalControls(composite);

        // filter combo box!
        filterCombo = new Combo(composite, SWT.DROP_DOWN | SWT.READ_ONLY);
        String[] filterNames = new String[FILTERS.size()];
        int index = 0;
        for (Entry<String, AbstractDaysFilter> entry : FILTERS.entrySet()) {
            filterNames[index++] = entry.getKey();
        }
        filterCombo.setItems(filterNames);
        filterCombo.setText(currentFilter.getName());
        GridData comboLayoutData = new GridData(GridData.END, GridData.FILL, false, false, 1, 1);
        comboLayoutData.minimumWidth = 100;
        comboLayoutData.verticalIndent = 3;
        filterCombo.setLayoutData(comboLayoutData);
        filterCombo.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                daysComposite.removeDaysFilter(currentFilter);
                int index = filterCombo.getSelectionIndex();
                String item = filterCombo.getItem(index);
                currentFilter = FILTERS.get(item);
                daysComposite.addDaysFilter(currentFilter);
            }
        });

        daysComposite = new DaysComposite(composite, this);
        daysComposite.setInput(getEditorInput());
        daysComposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, layout.numColumns, 1));
        daysComposite.setupPreferenceListener();
        daysComposite.addDaysFilter(currentFilter);
    }

    AbstractDaysFilter getCurrentDaysFilter() {
        return currentFilter;
    }

    protected void createAdditionalControls(Composite parent) {
        // hook for adding additional controls to left of combo box
        // override in subclass
        new Label(parent, SWT.NONE);
    }

    protected void daySelected(int day) {
        // hook for propagating selection of a day using the DaysComposite scrollbar
    }

    @Override
    public void dispose() {
        daysComposite.dispose();
        selectionProvider.setSelection(StructuredSelection.EMPTY);
        super.dispose();
    }

    @Override
    public void refresh() {
        daysComposite.refreshDayViewers();
    }

    @Override
    public void setFocus() {
        if (daysComposite.setFocus()) {
            return;
        }
        filterCombo.setFocus();
    }

    @Override
    public void updateActionBars(IActionBars bars) {
        DaysComposite composite = daysComposite;
        if ((composite != null) && (bars != null)) {
            composite.setActionBars(bars);
        }
        super.updateActionBars(bars);
    }

    @Override
    public IStructureModifier getStructureModifier() {
        if (daysComposite != null) {
            DayViewer activeViewer = daysComposite.getActiveViewer();
            if (activeViewer != null) {
                DayContentProvider contentProvider = (DayContentProvider) activeViewer.getTreeTableViewer()
                        .getContentProvider();
                if (contentProvider != null) {
                    return contentProvider.getStructureModifier();
                }
            }
        }
        return super.getStructureModifier();
    }

    @Override
    protected ClipboardCutOperation getCutOperation(IStructureModifier modifier, ISelection selection,
            Event event) {
        ITransferable transferable = modifier.getTransferable(selection);
        Tree tree = getActiveTree();
        if (tree == null) {
            return null;
        }
        return new MergePlanClipboardCutOperation(transferable, modifier, getSelectionProvider(), tree);
    }

    @Override
    protected DeleteOperation getDeleteOperation(IStructureModifier modifier, ISelection selection, Event event) {
        ITransferable transferable = modifier.getTransferable(selection);
        Tree tree = getActiveTree();
        if (tree == null) {
            return null;
        }
        return new MergePlanDeleteOperation(transferable, modifier, getSelectionProvider(), tree);
    }

    private Tree getActiveTree() {
        if (daysComposite == null) {
            return null;
        }
        DayViewer activeViewer = daysComposite.getActiveViewer();
        if (activeViewer == null) {
            return null;
        }
        DayComposite control = activeViewer.getControl();
        TreeTableComposite treeTableComposite = control.getTreeTableComposite();
        return treeTableComposite.getTree();
    }

    @Override
    public boolean isFlattened() {
        return this.daysComposite.isFlattened();
    }

    @Override
    public Object getAdapter(Class clazz) {
        if (clazz.equals(MergeRowHighlightDecorator.class)) {
            return rowHighlightDecorator;
        }
        return super.getAdapter(clazz);
    }

    public void updateDayViewerConfiguration(int fontSize, int nameColumnWidth, int restColumnWidth) {
        daysComposite.updateDayViewerConfiguration(fontSize, nameColumnWidth, restColumnWidth);
    }

}