de.walware.statet.nico.ui.util.TrackingConfigurationComposite.java Source code

Java tutorial

Introduction

Here is the source code for de.walware.statet.nico.ui.util.TrackingConfigurationComposite.java

Source

/*=============================================================================#
 # Copyright (c) 2009-2015 Stephan Wahlbrink (WalWare.de) and others.
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License v1.0
 # which accompanies this distribution, and is available at
 # http://www.eclipse.org/legal/epl-v10.html
 # 
 # Contributors:
 #     Stephan Wahlbrink - initial API and implementation
 #=============================================================================*/

package de.walware.statet.nico.ui.util;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.core.databinding.UpdateValueStrategy;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.jface.databinding.swt.SWTObservables;
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.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Text;

import de.walware.ecommons.databinding.ComputedOnChangeValue;
import de.walware.ecommons.databinding.IntegerValidator;
import de.walware.ecommons.databinding.NotEmptyValidator;
import de.walware.ecommons.databinding.jface.DataBindingSupport;
import de.walware.ecommons.ui.util.DialogUtil;
import de.walware.ecommons.ui.util.LayoutUtil;
import de.walware.ecommons.ui.workbench.ResourceInputComposite;

import de.walware.statet.nico.core.util.TrackingConfiguration;
import de.walware.statet.nico.internal.ui.Messages;

/**
 * Composite to configure a track configuration.
 */
public class TrackingConfigurationComposite extends Composite {

    public static class SaveTemplate {

        private final String fLabel;
        private final String fFilePath;

        public SaveTemplate(final String label, final String path) {
            fLabel = label;
            fFilePath = path;
        }

        public String getLabel() {
            return fLabel;
        }

        public String getFilePath() {
            return fFilePath;
        }

    }

    private Text fNameControl;

    private Button fStreamInfoControl;
    private Button fStreamInputControl;
    private Button fStreamInputHistoryOnlyControl;
    private Button fStreamOutputErrorControl;
    private Button fStreamOutputErrorTruncateControl;
    private Text fStreamOutputErrorTruncateLinesControl;

    private SubmitTypeSelectionComposite fSubmitTypeControl;

    private ResourceInputComposite fFilePathControl;
    private Button fFileAppendControl;
    private Button fFileOverwriteControl;

    private Button fPrependTimestampControl;

    private final List<SaveTemplate> fSaveTemplates = new ArrayList<SaveTemplate>();

    private TrackingConfiguration fInput;

    public TrackingConfigurationComposite(final Composite parent) {
        super(parent, SWT.NONE);

        configure();
        create();
    }

    protected boolean enableFullMode() {
        return true;
    }

    protected boolean enableFilePathAsCombo() {
        return false;
    }

    protected void configure() {
    }

    protected void addSaveTemplate(final SaveTemplate template) {
        fSaveTemplates.add(template);
    }

    protected void create() {
        setLayout(LayoutUtil.applyCompositeDefaults(new GridLayout(), 1));

        if (enableFullMode()) {
            final Composite topComposite = createTopOptions(this);
            if (topComposite != null) {
                topComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
            }
        }

        final Composite contentComposite = createContentOptions(this);
        if (contentComposite != null) {
            contentComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        }

        final Composite saveComposite = createSaveOptions(this);
        if (saveComposite != null) {
            saveComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        }

        final Composite additionalComposite = createAdditionalOptions(this);
        if (additionalComposite != null) {
            additionalComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        }
    }

    private Composite createTopOptions(final Composite parent) {
        final Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayout(LayoutUtil.applyCompositeDefaults(new GridLayout(), 2));

        {
            final Label label = new Label(composite, SWT.NONE);
            label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
            label.setText(Messages.Tracking_Name_label);
        }
        {
            final Text text = new Text(composite, SWT.BORDER);
            final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
            gd.widthHint = LayoutUtil.hintWidth(text, 80);
            text.setLayoutData(gd);
            fNameControl = text;
        }

        return composite;
    }

    private Composite createContentOptions(final Composite parent) {
        final Group composite = new Group(parent, SWT.NONE);
        composite.setText(Messages.Tracking_Content_label + ':');
        composite.setLayout(LayoutUtil.applyGroupDefaults(new GridLayout(), 1));

        {
            fStreamInfoControl = new Button(composite, SWT.CHECK);
            fStreamInfoControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
            fStreamInfoControl.setText(Messages.Tracking_InfoStream_label);
        }
        {
            fStreamInputControl = new Button(composite, SWT.CHECK);
            fStreamInputControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
            fStreamInputControl.setText(Messages.Tracking_InputStream_label);
        }
        if (enableFullMode()) {
            fStreamInputHistoryOnlyControl = new Button(composite, SWT.CHECK);
            final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
            gd.horizontalIndent = LayoutUtil.defaultIndent();
            fStreamInputHistoryOnlyControl.setLayoutData(gd);
            fStreamInputHistoryOnlyControl.setText(Messages.Tracking_InputStream_OnlyHistory_label);
            fStreamInputHistoryOnlyControl.setEnabled(false);
        }
        {
            fStreamOutputErrorControl = new Button(composite, SWT.CHECK);
            fStreamOutputErrorControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
            fStreamOutputErrorControl.setText(Messages.Tracking_OutputStream_label);
        }
        {
            final Composite truncateRow;
            {
                truncateRow = new Composite(composite, SWT.NONE);
                final GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
                gd.horizontalIndent = LayoutUtil.defaultIndent();
                truncateRow.setLayoutData(gd);
                truncateRow.setLayout(LayoutUtil.applyCompositeDefaults(new GridLayout(), 2));
            }
            {
                fStreamOutputErrorTruncateControl = new Button(truncateRow, SWT.CHECK);
                fStreamOutputErrorTruncateControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
                fStreamOutputErrorTruncateControl.setText(Messages.Tracking_OutputStream_TruncateLines_label);
                fStreamOutputErrorTruncateControl.setEnabled(false);
            }
            {
                fStreamOutputErrorTruncateLinesControl = new Text(truncateRow, SWT.RIGHT | SWT.BORDER);
                final GridData gd = new GridData(SWT.LEFT, SWT.CENTER, false, false);
                gd.widthHint = LayoutUtil.hintWidth(fStreamOutputErrorTruncateLinesControl, 10);
                fStreamOutputErrorTruncateLinesControl.setLayoutData(gd);
                fStreamOutputErrorTruncateLinesControl.setEnabled(false);
            }
        }

        if (enableFullMode()) {
            {
                final Label label = new Label(composite, SWT.NONE);
                label.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
                label.setText(Messages.Tracking_Sources_label);
            }
            {
                fSubmitTypeControl = new SubmitTypeSelectionComposite(composite);
                fSubmitTypeControl.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false));
            }
        }
        return composite;
    }

    private Composite createSaveOptions(final Composite parent) {
        final Group composite = new Group(parent, SWT.NONE);
        composite.setText(Messages.Tracking_File_label + ':');
        composite.setLayout(LayoutUtil.applyGroupDefaults(new GridLayout(), 1));

        fFilePathControl = new ResourceInputComposite(composite,
                enableFilePathAsCombo() ? ResourceInputComposite.STYLE_COMBO : ResourceInputComposite.STYLE_TEXT,
                ResourceInputComposite.MODE_FILE | ResourceInputComposite.MODE_SAVE, Messages.Tracking_File_label) {
            @Override
            protected void fillMenu(final Menu menu) {
                super.fillMenu(menu);

                if (!fSaveTemplates.isEmpty()) {
                    new MenuItem(menu, SWT.SEPARATOR);

                    for (final SaveTemplate template : fSaveTemplates) {
                        final MenuItem item = new MenuItem(menu, SWT.PUSH);
                        item.setText(template.getLabel());
                        item.addSelectionListener(new SelectionAdapter() {
                            @Override
                            public void widgetSelected(final SelectionEvent e) {
                                setText(template.getFilePath(), true);
                                getTextControl().setFocus();
                            }
                        });
                    }
                }
            }
        };
        fFilePathControl.setShowInsertVariable(true, DialogUtil.DEFAULT_NON_ITERACTIVE_FILTERS, null);
        fFilePathControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));

        fFileAppendControl = new Button(composite, SWT.CHECK);
        fFileAppendControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        fFileAppendControl.setText(Messages.Tracking_File_Append_label);

        fFileOverwriteControl = new Button(composite, SWT.CHECK);
        fFileOverwriteControl.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
        fFileOverwriteControl.setText(Messages.Tracking_File_Overwrite_label);

        return composite;
    }

    protected ResourceInputComposite getPathInput() {
        return fFilePathControl;
    }

    /**
     * Extended or overwritten this method to add additional options.
     * 
     * @return the composite containing the additional options
     */
    protected Composite createAdditionalOptions(final Composite parent) {
        final Group composite = new Group(parent, SWT.NONE);
        composite.setText(Messages.Tracking_Actions_label + ':');
        composite.setLayout(LayoutUtil.applyGroupDefaults(new GridLayout(), 1));

        addDefaultAdditionalOptions(composite);

        return composite;
    }

    protected Control addDefaultAdditionalOptions(final Composite composite) {
        final int columns = ((GridLayout) composite.getLayout()).numColumns;
        fPrependTimestampControl = new Button(composite, SWT.CHECK);
        fPrependTimestampControl.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, columns, 1));
        fPrependTimestampControl.setText(Messages.Tracking_Actions_PrependTimestamp_label);
        return fPrependTimestampControl;
    }

    protected void addBindings(final DataBindingSupport db) {
        if (fNameControl != null) {
            db.getContext().bindValue(SWTObservables.observeText(fNameControl, SWT.Modify),
                    BeansObservables.observeValue(fInput, "name"), //$NON-NLS-1$
                    new UpdateValueStrategy().setAfterGetValidator(
                            new NotEmptyValidator(Messages.Tracking_Name_error_Missing_message)),
                    null);
        }

        final IObservableValue infoUIObs = SWTObservables.observeSelection(fStreamInfoControl);
        db.getContext().bindValue(infoUIObs, BeansObservables.observeValue(fInput, "trackStreamInfo")); //$NON-NLS-1$

        final IObservableValue inputUIObs = SWTObservables.observeSelection(fStreamInputControl);
        db.getContext().bindValue(inputUIObs, BeansObservables.observeValue(fInput, "trackStreamInput")); //$NON-NLS-1$
        if (fStreamInputHistoryOnlyControl != null) {
            db.getContext().bindValue(SWTObservables.observeEnabled(fStreamInputHistoryOnlyControl), inputUIObs);
            db.getContext().bindValue(SWTObservables.observeSelection(fStreamInputHistoryOnlyControl),
                    BeansObservables.observeValue(fInput, "trackStreamInputHistoryOnly")); //$NON-NLS-1$
        }

        final IObservableValue outputUIObs = SWTObservables.observeSelection(fStreamOutputErrorControl);
        final IObservableValue outputModelObs = BeansObservables.observeValue(fInput, "trackStreamOutput"); //$NON-NLS-1$
        db.getContext().bindValue(outputUIObs, outputModelObs);
        if (fStreamOutputErrorTruncateControl != null) {
            final IObservableValue outputTruncateUIObs = SWTObservables
                    .observeSelection(fStreamOutputErrorTruncateControl);
            final IObservableValue outputTruncateModelObs = BeansObservables.observeValue(fInput,
                    "trackStreamOutputTruncate"); //$NON-NLS-1$
            db.getContext().bindValue(SWTObservables.observeEnabled(fStreamOutputErrorTruncateControl),
                    outputUIObs);
            db.getContext().bindValue(outputTruncateUIObs, outputTruncateModelObs);
            db.getContext().bindValue(SWTObservables.observeEnabled(fStreamOutputErrorTruncateLinesControl),
                    new ComputedOnChangeValue(Boolean.class, outputModelObs, outputTruncateModelObs) {
                        @Override
                        protected Object calculate() {
                            final Boolean one = (Boolean) outputModelObs.getValue();
                            final Boolean two = (Boolean) outputTruncateModelObs.getValue();
                            return Boolean.valueOf(one.booleanValue() && two.booleanValue());
                        }
                    });
            db.getContext().bindValue(
                    SWTObservables.observeText(fStreamOutputErrorTruncateLinesControl, SWT.Modify),
                    BeansObservables.observeValue(fInput, "trackStreamOutputTruncateLines"), //$NON-NLS-1$
                    new UpdateValueStrategy().setAfterGetValidator(new IntegerValidator(2, 1000000,
                            Messages.Tracking_OutputStream_TruncateLines_error_Invalid_message)),
                    null);
        }

        if (fSubmitTypeControl != null) {
            db.getContext().bindValue(fSubmitTypeControl.getObservable(),
                    BeansObservables.observeValue(fInput, "submitTypes")); //$NON-NLS-1$
        }

        db.getContext().bindValue(fFilePathControl.getObservable(),
                BeansObservables.observeValue(fInput, "filePath"), //$NON-NLS-1$
                new UpdateValueStrategy().setAfterGetValidator(fFilePathControl.getValidator()), null);
        final IObservableValue fileModeModelObs = BeansObservables.observeValue(fInput, "fileMode"); //$NON-NLS-1$
        db.getContext().bindValue(SWTObservables.observeSelection(fFileAppendControl),
                new ComputedOnChangeValue(Boolean.class, fileModeModelObs) {
                    @Override
                    protected Object calculate() {
                        final Integer mode = (Integer) fileModeModelObs.getValue();
                        return Boolean.valueOf((mode.intValue() & EFS.APPEND) == EFS.APPEND);
                    }

                    @Override
                    protected void extractAndSet(final Object value) {
                        final Boolean selected = (Boolean) value;
                        fileModeModelObs.setValue(selected.booleanValue() ? EFS.APPEND : EFS.NONE);
                    }
                });
        db.getContext().bindValue(SWTObservables.observeSelection(fFileOverwriteControl),
                new ComputedOnChangeValue(Boolean.class, fileModeModelObs) {
                    @Override
                    protected Object calculate() {
                        final Integer mode = (Integer) fileModeModelObs.getValue();
                        return Boolean.valueOf((mode.intValue() & EFS.OVERWRITE) == EFS.OVERWRITE);
                    }

                    @Override
                    protected void extractAndSet(final Object value) {
                        final Boolean selected = (Boolean) value;
                        fileModeModelObs.setValue(selected.booleanValue() ? EFS.OVERWRITE : EFS.NONE);
                    }
                });

        if (fPrependTimestampControl != null) {
            db.getContext().bindValue(SWTObservables.observeSelection(fPrependTimestampControl),
                    BeansObservables.observeValue(fInput, "prependTimestamp")); //$NON-NLS-1$
        }
    }

    public void setLabelEnabled(final boolean enabled) {
        fNameControl.setEnabled(enabled);
    }

    public void setStreamsEnabled(final boolean enabled) {
        fStreamInfoControl.setEnabled(enabled);
        fStreamInputControl.setEnabled(enabled);
        if (fStreamInputHistoryOnlyControl != null) {
            fStreamInputHistoryOnlyControl.setEnabled(enabled);
        }
        fStreamOutputErrorControl.setEnabled(enabled);
    }

    public boolean getStreamsEnabled() {
        return fStreamInfoControl.getEnabled();
    }

    public void setSubmitTypesEnabled(final boolean enabled) {
        fSubmitTypeControl.setEnabled(enabled);
    }

    public boolean getSubmitTypesEnabled() {
        return fSubmitTypeControl.getEnabled();
    }

    public void setInput(final TrackingConfiguration config) {
        fInput = config;
    }

    public TrackingConfiguration getInput() {
        return fInput;
    }

}