Package org.carrot2.workbench.core.ui

Source Code of org.carrot2.workbench.core.ui.BenchmarkView

/*
* Carrot2 project.
*
* Copyright (C) 2002-2014, Dawid Weiss, Stanisław Osiński.
* All rights reserved.
*
* Refer to the full license file "carrot2.LICENSE"
* in the root folder of the repository checkout or at:
* http://www.carrot2.org/carrot2.LICENSE
*/

package org.carrot2.workbench.core.ui;

import java.io.IOException;
import java.util.HashMap;

import org.carrot2.util.attribute.*;
import org.carrot2.util.attribute.BindableDescriptor.GroupingMethod;
import org.carrot2.workbench.core.helpers.*;
import org.carrot2.workbench.core.ui.widgets.CScrolledComposite;
import org.carrot2.workbench.editors.AttributeEvent;
import org.carrot2.workbench.editors.AttributeListenerAdapter;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.LayoutConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.*;
import org.eclipse.ui.part.*;

import com.google.common.collect.Maps;

/**
* {@link SearchEditor}-tied view for running benchmarks.
*/
public final class BenchmarkView extends PageBookViewBase
{
    /**
     * Public identifier of this view.
     */
    public static final String ID = "org.carrot2.workbench.core.views.benchmark";

    /** Current global benchmark settings. */
    private final BenchmarkSettings benchmarkSettings = new BenchmarkSettings();

    /**
     * Main GUI control of this view.
     */
    private CScrolledComposite mainControl;

    /**
     * Attribute groups panel.
     */
    private AttributeGroups attributeGroups;

    /**
     * State restoration.
     */
    private BenchmarkViewMemento restoreState;

    /**
     * Benchmark view is a composite of global attribute editors and editor-specific
     * part that shows the most recent benchmarking result.
     */
    @Override
    public void createPartControl(Composite parent)
    {
        final CScrolledComposite scroller =
            new CScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
        scroller.setExpandHorizontal(true);
        scroller.setExpandVertical(true);
        this.mainControl = scroller;

        final Composite innerComposite = GUIFactory.createSpacer(scroller);
        final GridLayout gridLayout = (GridLayout) innerComposite.getLayout();
        gridLayout.numColumns = 1;
        gridLayout.verticalSpacing = LayoutConstants.getSpacing().y;
        scroller.setContent(innerComposite);

        // Create editor-specific benchmark page.
        super.createPartControl(innerComposite);
        getPageBook().setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        // Create global editors.
        createSeparator(innerComposite);
        createSettingsPanel(innerComposite);
       
        // Restore GUI state.
        restoreState();
    }

    /*
     *
     */
    @Override
    protected void showPageRec(PageRec pageRec)
    {
        super.showPageRec(pageRec);
        mainControl.reflow(true);
    }

    /*
     *
     */
    @Override
    protected IPage createDefaultPage(PageBook book)
    {
        MessagePage defaultPage = new MessagePage();
        defaultPage.setMessage("No active search result.");
        initPage(defaultPage);
        defaultPage.createControl(book);
        return defaultPage;
    }
   
    /**
     * Create the benchmarking view for a given part.
     */
    @Override
    protected PageRec doCreatePage(IWorkbenchPart part)
    {
        final SearchEditor editor = (SearchEditor) part;

        final BenchmarkViewPage page = new BenchmarkViewPage(editor, this);
        initPage(page);
        page.createControl(getPageBook());

        return new PageRec(part, page);
    }

    /**
     * Only react to {@link SearchEditor} instances.
     */
    @Override
    protected boolean isImportant(IWorkbenchPart part)
    {
        return part instanceof SearchEditor;
    }

    /**
     * Restore state between runs.
     */
    @Override
    public void init(IViewSite site, IMemento memento) throws PartInitException
    {
        super.init(site, memento);

        try
        {
            if (memento != null)
            {
                restoreState = SimpleXmlMemento.getChild(BenchmarkViewMemento.class, memento);
            }
        }
        catch (IOException e)
        {
            Utils.logError(e, false);
        }
    }

    /**
     * Persist state between runs.
     */
    @Override
    public void saveState(IMemento memento)
    {
        super.saveState(memento);

        try
        {
            final BenchmarkViewMemento state = new BenchmarkViewMemento();
            state.settings = this.benchmarkSettings;
            state.sectionsExpansionState = this.attributeGroups.getExpansionStates();

            SimpleXmlMemento.addChild(memento, state);
        }
        catch (IOException e)
        {
            Utils.logError(e, false);
        }
    }
   
    /**
     * Restore GUI state. We can't do it in {@link #init(IViewSite, IMemento)}
     * because GUI elements are not available then.
     */
    @SuppressWarnings("unchecked")
    private void restoreState()
    {
        if (this.restoreState == null) return;

        try
        {
            final HashMap<String, Object> attrs = Maps.newHashMap();
            AttributeBinder.get(restoreState.settings, attrs, Input.class);
            this.attributeGroups.setAttributes(attrs);
            this.attributeGroups.setExpanded(restoreState.sectionsExpansionState);
        }
        catch (Exception e)
        {
            Utils.logError(e, false);
        }
    }
   
    /**
     * Create settings panel.
     */
    @SuppressWarnings("unchecked")
    private Control createSettingsPanel(Composite parent)
    {
        final BindableDescriptor descriptor =
            BindableDescriptorBuilder.buildDescriptor(benchmarkSettings);

        attributeGroups = new AttributeGroups(
            parent, descriptor, GroupingMethod.GROUP, null, descriptor.getDefaultValues());
        attributeGroups.setLayoutData(GridDataFactory.fillDefaults().grab(true, false).create());

        // Link changes in the editor to settings object.
        attributeGroups.addAttributeListener(new AttributeListenerAdapter()
        {
            public void valueChanged(AttributeEvent event)
            {
                try
                {
                    final HashMap<String, Object> attrs = Maps.newHashMap();
                    attrs.put(event.key, event.value);
                    AttributeBinder.set(benchmarkSettings, attrs, Input.class);
                }
                catch (InstantiationException e)
                {
                    Utils.logError(e, true);
                }
            }
        });
        attributeGroups.setExpanded(false);

        return attributeGroups;
    }

    /**
     * Create separator between settings and the benchmark panel.
     */
    private void createSeparator(Composite parent)
    {
        final Label label = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL);
        label.setLayoutData(
            GridDataFactory.fillDefaults().grab(true, false).create());
    }

    /**
     * @return Return a clone of the current settings.
     */
    @SuppressWarnings("unchecked")
    BenchmarkSettings getCurrentSettings()
    {
        final BenchmarkSettings cloned = new BenchmarkSettings();
        try
        {
            HashMap<String, Object> attrs = Maps.newHashMap();
            AttributeBinder.get(benchmarkSettings, attrs, Input.class);
            AttributeBinder.set(cloned, attrs, Input.class);
        }
        catch (Exception e)
        {
            Utils.logError(e, false);
        }
        return cloned;
    }
}
TOP

Related Classes of org.carrot2.workbench.core.ui.BenchmarkView

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.