org.fusesource.ide.commons.ui.actions.ConfigureColumnsDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.fusesource.ide.commons.ui.actions.ConfigureColumnsDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2010 JVM Monitor project. All rights reserved.
 * 
 * This code is distributed under the terms of the Eclipse Public License v1.0
 * which is available at http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.fusesource.ide.commons.ui.actions;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
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.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.preferences.ViewSettingsDialog;
import org.fusesource.ide.commons.Viewers;
import org.fusesource.ide.commons.ui.IConfigurableColumns;
import org.fusesource.ide.commons.ui.config.ColumnConfiguration;
import org.fusesource.ide.commons.ui.config.TableConfiguration;

/**
 * The dialog to configure columns.
 */
public class ConfigureColumnsDialog extends ViewSettingsDialog {

    /** The columns viewer. */
    CheckboxTableViewer columnsViewer;

    private Button upButton;
    private Button downButton;
    private Button topButton;
    private Button bottomButton;

    /** The select-all button. */
    private Button selectAllButton;

    /** The deselect-all button. */
    private Button deselectAllButton;

    /** The configurable columns. */
    private IConfigurableColumns columns;

    private TableConfiguration configuration;

    /**
     * The constructor.
     * 
     * @param columns
     *            The configurable columns
     */
    protected ConfigureColumnsDialog(IConfigurableColumns columns) {
        super(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell());
        this.columns = columns;
    }

    @Override
    protected boolean isResizable() {
        return true;
    }

    /*
     * @see Window#configureShell(Shell)
     */
    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setText(Messages.configureColumnsTitle);
    }

    /*
     * @see Dialog#createDialogArea(Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {
        Composite composite = (Composite) super.createDialogArea(parent);

        Composite inner = new Composite(composite, SWT.NONE);
        inner.setLayoutData(new GridData(GridData.FILL_BOTH));
        GridLayout layout = new GridLayout();
        layout.numColumns = 2;
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        inner.setLayout(layout);

        createColumnsViewer(inner);
        createButtons(inner);

        loadPreference();
        applyDialogFont(composite);

        return composite;
    }

    /*
     * @see Dialog#okPressed()
     */
    @Override
    protected void okPressed() {
        storePreference();
        columns.updateColumnConfiguration(configuration);
        super.okPressed();
    }

    /*
     * @see ViewSettingsDialog#performDefaults()
     */
    @Override
    protected void performDefaults() {
        // lets zap the persistent configuration
        configuration.clear();

        // lets clear the configuration forcing a lazy reload
        columns.updateColumnConfiguration(null);

        loadPreference();
        Viewers.refresh(columnsViewer);
    }

    /**
     * Creates the columns viewer.
     * 
     * @param parent
     *            The parent composite
     */
    private void createColumnsViewer(Composite parent) {
        Label label = new Label(parent, SWT.NONE);
        label.setText(Messages.configureColumnsMessage);
        GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
        gridData.horizontalSpan = 2;
        label.setLayoutData(gridData);

        columnsViewer = CheckboxTableViewer.newCheckList(parent, SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION);
        columnsViewer.getTable().setLayoutData(new GridData(GridData.FILL_BOTH));
        columnsViewer.setLabelProvider(new LabelProvider() {
            @Override
            public String getText(Object element) {
                if (element instanceof ColumnConfiguration) {
                    ColumnConfiguration config = (ColumnConfiguration) element;
                    return config.getName();
                }
                return super.getText(element);
            }
        });
        columnsViewer.setContentProvider(new ArrayContentProvider());
    }

    /**
     * Creates the buttons.
     * 
     * @param parent
     *            The parent composite
     */
    private void createButtons(Composite parent) {
        Composite composite = new Composite(parent, SWT.NONE);
        composite.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        GridLayout layout = new GridLayout();
        layout.marginHeight = 0;
        layout.marginWidth = 0;
        composite.setLayout(layout);

        topButton = new Button(composite, SWT.PUSH);
        topButton.setText(Messages.topLabel);
        setButtonLayoutData(topButton);
        topButton.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings("unchecked")
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveTop(selectedList());
            }
        });

        upButton = new Button(composite, SWT.PUSH);
        upButton.setText(Messages.upLabel);
        setButtonLayoutData(upButton);
        upButton.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings("unchecked")
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveUp(selectedList());
            }
        });

        downButton = new Button(composite, SWT.PUSH);
        downButton.setText(Messages.downLabel);
        setButtonLayoutData(downButton);
        downButton.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings("unchecked")
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveDown(selectedList());
            }
        });

        bottomButton = new Button(composite, SWT.PUSH);
        bottomButton.setText(Messages.bottomLabel);
        setButtonLayoutData(bottomButton);
        bottomButton.addSelectionListener(new SelectionAdapter() {
            @SuppressWarnings("unchecked")
            @Override
            public void widgetSelected(SelectionEvent e) {
                moveBottom(selectedList());
            }
        });

        // lets add a separator
        new Label(composite, SWT.NONE);

        selectAllButton = new Button(composite, SWT.PUSH);
        selectAllButton.setText(Messages.selectAllLabel);
        setButtonLayoutData(selectAllButton);
        selectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                columnsViewer.setAllChecked(true);
            }
        });

        deselectAllButton = new Button(composite, SWT.PUSH);
        deselectAllButton.setText(Messages.deselectAllLabel);
        setButtonLayoutData(deselectAllButton);
        deselectAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                columnsViewer.setAllChecked(false);
            }
        });
    }

    /**
     * Loads the preference.
     */
    private void loadPreference() {
        configuration = columns.getConfiguration();
        List<ColumnConfiguration> columnList = configuration.getColumnConfigurations();

        List<ColumnConfiguration> checkedList = new ArrayList<ColumnConfiguration>(columnList.size());
        for (ColumnConfiguration column : columnList) {
            if (column.isVisible()) {
                checkedList.add(column);
            }
        }
        columnsViewer.setInput(columnList);
        columnsViewer.setCheckedElements(checkedList.toArray());
    }

    /**
     * Stores the current preference.
     */
    private void storePreference() {
        Set<Object> checkedColumns = new HashSet<Object>(Arrays.asList(columnsViewer.getCheckedElements()));

        List<ColumnConfiguration> list = getColumns();
        configuration.setColumnConfigurations(list);

        for (ColumnConfiguration column : list) {
            boolean checked = checkedColumns.contains(column);
            column.setVisible(checked);
        }
        configuration.flush();
    }

    /**
     * Gets the columns.
     * 
     * @return The columns
     */
    @SuppressWarnings("unchecked")
    private List<ColumnConfiguration> getColumns() {
        return (List<ColumnConfiguration>) columnsViewer.getInput();
    }

    /**
     * Moves the items up.
     * 
     * @param items
     *            The items to move up
     */
    void moveUp(List<ColumnConfiguration> items) {
        if (items.size() > 0 && !items.get(0).equals(getColumns().get(0))) {
            for (ColumnConfiguration item : items) {
                moveUp(item);
            }
        }
    }

    protected void moveTop(List<ColumnConfiguration> selectedList) {
        // use reverse order to preserve selection order
        List<ColumnConfiguration> reverseOrder = new ArrayList<ColumnConfiguration>(selectedList);
        Collections.reverse(reverseOrder);
        for (ColumnConfiguration config : reverseOrder) {
            moveTop(config);
        }
    }

    protected void moveBottom(List<ColumnConfiguration> selectedList) {
        for (ColumnConfiguration config : selectedList) {
            moveBottom(config);
        }
    }

    private void moveTop(ColumnConfiguration item) {
        List<ColumnConfiguration> newColumns = new ArrayList<ColumnConfiguration>();
        newColumns.add(item);
        for (ColumnConfiguration column : getColumns()) {
            if (!column.equals(item)) {
                newColumns.add(column);
            }
        }
        columnsViewer.setInput(newColumns);
    }

    private void moveBottom(ColumnConfiguration item) {
        List<ColumnConfiguration> newColumns = new ArrayList<ColumnConfiguration>();
        for (ColumnConfiguration column : getColumns()) {
            if (!column.equals(item)) {
                newColumns.add(column);
            }
        }
        newColumns.add(item);
        columnsViewer.setInput(newColumns);
    }

    /**
     * Moves the items down.
     * 
     * @param items
     *            The items to move down
     */
    void moveDown(List<ColumnConfiguration> items) {
        if (items.size() > 0 && !items.get(items.size() - 1).equals(getColumns().get(getColumns().size() - 1))) {
            for (int i = items.size() - 1; i >= 0; i--) {
                moveDown(items.get(i));
            }
        }
    }

    /**
     * Moves the item up.
     * 
     * @param item
     *            The item to move up
     */
    private void moveUp(ColumnConfiguration item) {
        ColumnConfiguration movedColumn = null;
        List<ColumnConfiguration> newColumns = new ArrayList<ColumnConfiguration>();
        for (ColumnConfiguration column : getColumns()) {
            if (!column.equals(item) || movedColumn == null) {
                newColumns.add(column);
                movedColumn = column;
                continue;
            }
            newColumns.remove(movedColumn);
            newColumns.add(column);
            newColumns.add(movedColumn);
        }
        columnsViewer.setInput(newColumns);
    }

    /**
     * Moves the item down.
     * 
     * @param item
     *            The item to move down
     */
    private void moveDown(ColumnConfiguration item) {
        ColumnConfiguration movedColumn = null;
        List<ColumnConfiguration> newColumns = new ArrayList<ColumnConfiguration>();
        for (ColumnConfiguration column : getColumns()) {

            if (column.equals(item)) {
                movedColumn = item;
                continue;
            }

            newColumns.add(column);

            if (movedColumn != null) {
                newColumns.add(movedColumn);
                movedColumn = null;
            }
        }
        columnsViewer.setInput(newColumns);
    }

    protected List selectedList() {
        return ((IStructuredSelection) columnsViewer.getSelection()).toList();
    }
}