ch.acanda.eclipse.pmd.properties.RuleSetConfigurationTable.java Source code

Java tutorial

Introduction

Here is the source code for ch.acanda.eclipse.pmd.properties.RuleSetConfigurationTable.java

Source

// =====================================================================
//
// Copyright (C) 2012 - 2016, Philip Graf
//
// 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
//
// =====================================================================

package ch.acanda.eclipse.pmd.properties;

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.beans.BeansObservables;
import org.eclipse.core.databinding.observable.Realm;
import org.eclipse.core.databinding.observable.list.IObservableList;
import org.eclipse.core.databinding.observable.set.IObservableSet;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.jface.databinding.swt.SWTObservables;
import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
import org.eclipse.jface.databinding.viewers.ViewersObservables;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ColumnPixelData;
import org.eclipse.jface.viewers.ColumnViewerToolTipSupport;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

import ch.acanda.eclipse.pmd.properties.PMDPropertyPageViewModel.RuleSetViewModel;
import ch.acanda.eclipse.pmd.swtbot.SWTBotID;

/**
 * A composite containing a single checkbox table viewer showing the rule set configurations.
 *
 * @author Philip Graf
 */
final class RuleSetConfigurationTable extends Composite {

    private final CheckboxTableViewer tableViewer;
    private final Table table;
    private final PMDPropertyPageViewModel model;

    public RuleSetConfigurationTable(final Composite parent, final PMDPropertyPageViewModel model) {
        super(parent, SWT.NONE);
        this.model = model;

        setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 2, 2));
        final TableColumnLayout tableColumnLayout = new TableColumnLayout();
        setLayout(tableColumnLayout);

        tableViewer = CheckboxTableViewer.newCheckList(this, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI);
        table = tableViewer.getTable();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        ColumnViewerToolTipSupport.enableFor(tableViewer, ToolTip.NO_RECREATE);
        SWTBotID.set(table, SWTBotID.RULESETS);

        final TableViewerColumn nameViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        final TableColumn nameColumn = nameViewerColumn.getColumn();
        tableColumnLayout.setColumnData(nameColumn, new ColumnWeightData(1, 50, true));
        nameColumn.setText("Name");
        nameViewerColumn.setLabelProvider(new NameLabelProvider(model));

        final TableViewerColumn typeViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        final TableColumn typeColumn = typeViewerColumn.getColumn();
        tableColumnLayout.setColumnData(typeColumn, new ColumnPixelData(75, true, true));
        typeColumn.setText("Type");
        typeViewerColumn.setLabelProvider(new TypeLabelProvider(model));

        final TableViewerColumn locationViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
        final TableColumn locationColumn = locationViewerColumn.getColumn();
        tableColumnLayout.setColumnData(locationColumn, new ColumnWeightData(2, 50, true));
        locationColumn.setText("Location");
        locationViewerColumn.setLabelProvider(new LocationLabelProvider(model));

        initDataBindings();
        initListeners();
    }

    private void initDataBindings() {
        final DataBindingContext bindingContext = new DataBindingContext();
        //
        final ObservableListContentProvider listContentProvider = new ObservableListContentProvider();
        tableViewer.setContentProvider(listContentProvider);
        //
        final IObservableList ruleSetsObserveList = BeansObservables.observeList(Realm.getDefault(), model,
                "ruleSets");
        tableViewer.setInput(ruleSetsObserveList);
        //
        final IObservableValue tableObserveEnabledObserveWidget = SWTObservables.observeEnabled(table);
        final IObservableValue modelPMDEnabledObserveValue = BeansObservables.observeValue(model, "PMDEnabled");
        bindingContext.bindValue(tableObserveEnabledObserveWidget, modelPMDEnabledObserveValue, null, null);
        //
        final IObservableList tableViewerObserveMultiSelection = ViewersObservables
                .observeMultiSelection(tableViewer);
        final IObservableList selectedRuleSetsObserveList = BeansObservables.observeList(Realm.getDefault(), model,
                "selectedRuleSets");
        bindingContext.bindList(tableViewerObserveMultiSelection, selectedRuleSetsObserveList, null, null);
        //
        final IObservableSet tableViewerObserveCheckedElements = ViewersObservables
                .observeCheckedElements(tableViewer, RuleSetViewModel.class);
        final IObservableSet activeConfigurationsObserveSet = BeansObservables.observeSet(Realm.getDefault(), model,
                "activeRuleSets");
        bindingContext.bindSet(tableViewerObserveCheckedElements, activeConfigurationsObserveSet, null, null);
    }

    private void initListeners() {
        model.addPropertyChangeListener(PMDPropertyPageViewModel.ACTIVE_RULE_SETS, new PropertyChangeListener() {
            @Override
            public void propertyChange(final PropertyChangeEvent evt) {
                // this updates the column image of invalid configurations when their checked state changes
                tableViewer.refresh(true);
            }
        });
    }

}