pl.poznan.put.cs.gui4pddl.preferences.ui.PlannerPreferencesPageTabItem.java Source code

Java tutorial

Introduction

Here is the source code for pl.poznan.put.cs.gui4pddl.preferences.ui.PlannerPreferencesPageTabItem.java

Source

/*******************************************************************************
 * Copyright (c) 2014 Poznan University of Technology.
 * 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:
 *     Poznan University of Technology - initial API and implementation
 ******************************************************************************/
package pl.poznan.put.cs.gui4pddl.preferences.ui;

import java.util.Map;
import java.util.TreeMap;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.preference.FileFieldEditor;
import org.eclipse.jface.preference.PreferencePage;
import org.eclipse.jface.preference.StringFieldEditor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ControlAdapter;
import org.eclipse.swt.events.ControlEvent;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
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.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.TabItem;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

import pl.poznan.put.cs.gui4pddl.preferences.PlannerPreferencePage;
import pl.poznan.put.cs.gui4pddl.preferences.model.PlannerPreferences;
import pl.poznan.put.cs.gui4pddl.preferences.model.manager.PlannerPreferencesManager;

/**
 * TabFolder tab - planner arguments settings
 * 
 */
public class PlannerPreferencesPageTabItem {

    private FileFieldEditor plannerFile;
    private StringFieldEditor plannerName;
    private Button newArgumentButton;
    private Button editArgumentButton;
    private Button removeArgumentButton;
    private Button removePlannerButton;
    private Button planViewDialogButton;
    private PlannerArgumentsDialog addEditArgumentsDialog;
    private Table argumentsTable;
    private PlannerPreferences preferences;
    private PlannerPreferencePage page;
    private PlanFilenamePatternConfigurationDialog planViewDialog;

    private static final int PLANNER_NAME_TEXT_LIMIT = 30;

    public PlannerPreferencesPageTabItem(final PlannerPreferences preferences, final PlannerPreferencePage page,
            final TabFolder tabFolder) {

        this.preferences = preferences;
        this.page = page;

        TabItem item = new TabItem(tabFolder, SWT.NULL);

        Composite tabItemComposite = createAndSetCompositeOfTabItem(tabFolder, item);
        plannerName = createPlannerNameFieldEditor(tabItemComposite);
        plannerFile = createPlannerFileFieldEditor(tabItemComposite);

        plannerName.setTextLimit(PLANNER_NAME_TEXT_LIMIT);

        argumentsTable = createArgumentsTable(tabItemComposite);

        planViewDialog = new PlanFilenamePatternConfigurationDialog(tabItemComposite.getShell());
        planViewDialog.setRegexp(
                (preferences.getPlanViewFilePattern() != null) ? preferences.getPlanViewFilePattern() : "");

        Composite tableButtonsComposite = createTableButtonsComposite(tabItemComposite);

        newArgumentButton = createTableButton(tableButtonsComposite, "New Argument");
        editArgumentButton = createTableButton(tableButtonsComposite, "Edit Argument");
        removeArgumentButton = createTableButton(tableButtonsComposite, "Remove Argument");

        editArgumentButton.setEnabled(false);
        removeArgumentButton.setEnabled(false);

        createTableButtonsSeparator(tableButtonsComposite);

        removePlannerButton = createTableButton(tableButtonsComposite, "Remove Planner");

        createTableButtonsSeparator(tableButtonsComposite);

        planViewDialogButton = createTableButton(tableButtonsComposite, "Plan File Pattern");

        addPropertyChangeListenerToPlannerNameFieldEditor(tabFolder);
        addPropertyChangeListenerToPlannerFileFieldEditor();

        addListenersToArgumentsTable();

        addSelectionListenerToNewArgumentButton(tabItemComposite);
        addSelectionListenerToEditArgumentButton(tabItemComposite);
        addSelectionListenerToRemoveArgumentButton(tabItemComposite);

        addSelectionListenerToRemovePlannerButton(tabItemComposite, tabFolder, this);

        addSelectionListenerToPlanViewDialogButton();

        if (this.preferences.getArgumentsMap() != null)
            setArguments(this.preferences.getArgumentsMap());

        item.setControl(tabItemComposite);

    }

    private Composite createAndSetCompositeOfTabItem(TabFolder tabFolder, TabItem item) {

        item.setText(preferences.getPlannerName());
        Composite tabItemComposite = new Composite(tabFolder, SWT.NONE);
        GridLayout tabItemGridLayout = new GridLayout();
        tabItemGridLayout.numColumns = 3;

        tabItemComposite.setLayout(tabItemGridLayout);
        tabItemComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));

        return tabItemComposite;
    }

    private StringFieldEditor createPlannerNameFieldEditor(Composite tabItemComposite) {
        StringFieldEditor plannerName = new StringFieldEditor("Planner Name", "Planner Name", tabItemComposite);
        plannerName.fillIntoGrid(tabItemComposite, 3);
        plannerName.setEmptyStringAllowed(false);
        plannerName.setStringValue(preferences.getPlannerName());

        return plannerName;
    }

    private FileFieldEditor createPlannerFileFieldEditor(Composite tabItemComposite) {
        FileFieldEditor plannerFile = new FileFieldEditor("Planner File", "Planner File", true,
                StringFieldEditor.VALIDATE_ON_KEY_STROKE, tabItemComposite);
        plannerFile.fillIntoGrid(tabItemComposite, 3);
        plannerFile.setEmptyStringAllowed(false);
        plannerFile.setStringValue(preferences.getPlannerFilePath());
        Label infoLabel = new Label(tabItemComposite, SWT.NONE);
        infoLabel.setText(
                "Planner file arguments order: <domain_file_path> <problem_file_path> [<planner_arguments>]");
        GridData gd = new GridData(GridData.FILL_HORIZONTAL);
        gd.grabExcessHorizontalSpace = true;
        gd.horizontalSpan = 3;
        infoLabel.setLayoutData(gd);

        return plannerFile;
    }

    private Table createArgumentsTable(Composite tabItemComposite) {
        Composite tableComposite = new Composite(tabItemComposite, SWT.NONE);
        Table argumentsTable = new Table(tableComposite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
        GridData tableGridData = new GridData(GridData.FILL_BOTH);
        tableGridData.horizontalSpan = 2;
        tableComposite.setLayoutData(tableGridData);

        TableColumnLayout layout = new TableColumnLayout();
        tableComposite.setLayout(layout);

        argumentsTable.setLinesVisible(true);
        argumentsTable.setHeaderVisible(true);

        String[] titles = { "Name", "Text" };
        for (int i = 0; i < titles.length; i++) {
            final TableColumn column = new TableColumn(argumentsTable, SWT.CENTER);
            column.setText(titles[i]);
            layout.setColumnData(column, new ColumnWeightData(50));
            column.setResizable(true);
            column.setMoveable(false);
            column.addControlListener(new ControlAdapter() {
                public void controlResized(ControlEvent e) {
                    if (column.getWidth() < 5)
                        column.setWidth(5);

                }
            });
        }
        return argumentsTable;
    }

    private Composite createTableButtonsComposite(Composite tabItemComposite) {
        Composite tableButtonsComposite = new Composite(tabItemComposite, SWT.NONE);
        GridLayout tableButtonsGridLayout = new GridLayout();
        tableButtonsComposite.setLayout(tableButtonsGridLayout);
        GridData tableButtonsGridData = new GridData(
                GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_FILL);
        tableButtonsGridData.horizontalSpan = 1;
        tableButtonsComposite.setLayoutData(tableButtonsGridData);

        return tableButtonsComposite;
    }

    private Button createTableButton(Composite tableButtonsComposite, String text) {
        GridData buttonsGridData = new GridData(GridData.FILL_HORIZONTAL);
        buttonsGridData.minimumWidth = 150;

        Button button = new Button(tableButtonsComposite, SWT.PUSH);
        button.setText(text);
        button.setLayoutData(buttonsGridData);

        return button;
    }

    private void createTableButtonsSeparator(Composite tableButtonsComposite) {
        GridData buttonsGridData = new GridData(GridData.FILL_HORIZONTAL);
        buttonsGridData.minimumWidth = 150;

        Label separator = new Label(tableButtonsComposite, SWT.SEPARATOR | SWT.HORIZONTAL);
        separator.setLayoutData(buttonsGridData);
    }

    private void addPropertyChangeListenerToPlannerNameFieldEditor(final TabFolder tabFolder) {
        plannerName.setPropertyChangeListener(new IPropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent ev) {

                page.checkIfAllPageTabItemsAreValid();
                tabFolder.getSelection()[0].setText(plannerName.getStringValue());
            }
        });
    }

    private void addPropertyChangeListenerToPlannerFileFieldEditor() {
        plannerFile.setPropertyChangeListener(new IPropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent arg0) {
                page.checkIfAllPageTabItemsAreValid();
            }
        });
    }

    public boolean checkIfTabItemIsValidAndSetErrorMessages() {
        boolean valid = true;

        if (plannerName.isValid() && plannerFile.isValid() && plannerFile.getStringValue().trim().length() > 0) {

            // if plannerName has been changed to name that exists
            if (PlannerPreferencesManager.getManager().getPlannerPreferences()
                    .get(plannerName.getStringValue()) != null
                    && !plannerName.getStringValue().equals(preferences.getPlannerName())) {
                page.setErrorMessage("Planner name of " + plannerName.getStringValue() + " already exists");
                page.setValid(false);
                valid = false;
            } else {
                page.setErrorMessage(null);
                page.setValid(true);
                valid = true;
            }
        } else {
            page.setErrorMessage("Planner file/name of " + plannerName.getStringValue() + " is not correct");
            page.setValid(false);
            valid = false;
        }

        // if plannerName is correct
        String name = plannerName.getStringValue();
        boolean validString = true;
        for (char c : name.toCharArray()) {
            if (Character.isLetterOrDigit(c) || Character.isWhitespace(c) || c == '.' || c == '_' || c == '-') {
                validString = true;

            } else {
                validString = false;
                break;
            }
        }
        if (validString && valid) {
            page.setErrorMessage(null);
            page.setValid(true);
        } else if (!validString) {
            page.setErrorMessage("Planner name of " + plannerName.getStringValue() + " is not correct");
            page.setValid(false);
        }

        return validString && valid;
    }

    private void addListenersToArgumentsTable() {
        argumentsTable.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                if (argumentsTable.getSelectionIndex() < 0) {
                    editArgumentButton.setEnabled(false);
                    removeArgumentButton.setEnabled(false);
                } else {
                    editArgumentButton.setEnabled(true);
                    removeArgumentButton.setEnabled(true);
                }
            }
        });

        argumentsTable.addFocusListener(new FocusListener() {

            @Override
            public void focusLost(FocusEvent arg0) {
            }

            @Override
            public void focusGained(FocusEvent arg0) {
                if (argumentsTable.getSelectionIndex() < 0) {
                    editArgumentButton.setEnabled(false);
                    removeArgumentButton.setEnabled(false);
                } else {
                    editArgumentButton.setEnabled(true);
                    removeArgumentButton.setEnabled(true);
                }
            }
        });
    }

    private void addSelectionListenerToNewArgumentButton(final Composite fParent) {
        newArgumentButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                addEditArgumentsDialog = new PlannerArgumentsDialog(fParent.getShell());
                int result = addEditArgumentsDialog.open();
                if (result == Dialog.OK) {

                    if (isUniqueInTable(argumentsTable, addEditArgumentsDialog.getName())) {
                        TableItem tableItem = new TableItem(argumentsTable, SWT.CENTER);
                        tableItem.setText(new String[] { addEditArgumentsDialog.getName(),
                                addEditArgumentsDialog.getText() });
                        page.updateDefaultPlannerCombos();
                    } else {
                        MessageDialog.openError(fParent.getShell(), "Error", "Argument name already exsists!");
                    }
                }
            }
        });
    }

    private void addSelectionListenerToEditArgumentButton(final Composite fParent) {
        editArgumentButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent arg0) {
                addEditArgumentsDialog = new PlannerArgumentsDialog(fParent.getShell());
                TableItem item = argumentsTable.getItem(argumentsTable.getSelectionIndex());
                String oldName = item.getText(0);
                String oldText = item.getText(1);
                addEditArgumentsDialog.setName(oldName);
                addEditArgumentsDialog.setText(oldText);
                int result = addEditArgumentsDialog.open();

                if (result == Dialog.OK) {

                    if (isUniqueInTable(argumentsTable, addEditArgumentsDialog.getName())
                            || addEditArgumentsDialog.getName().equals(oldName)) {
                        item.setText(0, addEditArgumentsDialog.getName());
                        item.setText(1, addEditArgumentsDialog.getText());
                        page.updateDefaultPlannerCombos();
                    } else {
                        MessageDialog.openError(fParent.getShell(), "Error", "Argument name already exsists!");
                    }
                }
            }
        });
    }

    private void addSelectionListenerToRemoveArgumentButton(final Composite fParent) {
        removeArgumentButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                argumentsTable.remove(argumentsTable.getSelectionIndex());
                argumentsTable.forceFocus();
                page.updateDefaultPlannerCombos();
            }
        });
    }

    public boolean savePlannerPreferences() {
        boolean saveOk = PlannerPreferencesManager.getManager().savePlannerPreferences(plannerName.getStringValue(),
                plannerFile.getStringValue(), getArguments(), planViewDialog.getRegexp(), preferences);
        if (saveOk) {
            preferences = PlannerPreferencesManager.getManager().getPlannerPreferences()
                    .get(plannerName.getStringValue());
        }

        return saveOk;
    }

    public boolean preferencesChanged() {
        boolean temp = (!plannerName.getStringValue().equals(preferences.getPlannerName()))
                || (!plannerFile.getStringValue().equals(preferences.getPlannerFilePath()))
                || (!planViewDialog.getRegexp().equals(preferences.getPlanViewFilePattern()));

        Map<String, String> map = getArguments();

        boolean argsChanged = false;

        if (map != null && preferences.getArgumentsMap() != null) {
            if (map.size() != preferences.getArgumentsMap().size()) {
                argsChanged = true;
            } else {
                for (Map.Entry<String, String> entry : map.entrySet()) {
                    if (!preferences.getArgumentsMap().containsKey(entry.getKey())
                            || !preferences.getArgumentsMap().get(entry.getKey()).equals(entry.getValue())) {
                        argsChanged = true;
                        break;
                    }
                }
            }

        } else if (map == null && preferences.getArgumentsMap() == null) {
            argsChanged = false;
        } else {
            argsChanged = true;
        }

        return argsChanged || temp;
    }

    private void addSelectionListenerToRemovePlannerButton(final Composite fParent, final TabFolder tabFolder,
            final PlannerPreferencesPageTabItem item) {
        removePlannerButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {

                boolean dialogOk = MessageDialog.openConfirm(fParent.getShell(), "Remove planner preferences",
                        "Are you sure?");
                if (dialogOk) {
                    boolean removeOk = PlannerPreferencesManager.getManager().removePlannerPreferences(preferences);
                    if (removeOk) {
                        page.getTabsList().remove(page.getTabFolder().getSelectionIndex());
                        tabFolder.getSelection()[0].dispose();
                        page.updateDefaultPlannerCombos();
                        page.checkIfAllPageTabItemsAreValid();
                        if (tabFolder.getItemCount() == 0) {
                            tabFolder.setVisible(false);
                            page.setValid(true);
                            page.setErrorMessage(null);
                        }
                        MessageDialog.openInformation(fParent.getShell(), "Planner Preferences removed",
                                "Planner preferences has been removed");

                    } else {
                        MessageDialog.openError(fParent.getShell(), "Error while removing",
                                "Could not remove planner preferences. Check if the file is in use by another program.");
                        throw new RuntimeException("Could not remove planner preferences");
                    }
                }
            }
        });
    }

    private void addSelectionListenerToPlanViewDialogButton() {
        planViewDialogButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent arg0) {
                planViewDialog.open();

            }

        });
    }

    private boolean isUniqueInTable(Table table, String text) {
        TableItem[] items = table.getItems();
        for (TableItem item : items) {
            if (item.getText(0).equals(addEditArgumentsDialog.getName())) {
                return false;
            }
        }
        return true;
    }

    public String getPlannerName() {
        return plannerName.getStringValue();
    }

    public Map<String, String> getArguments() {
        Map<String, String> arguments = new TreeMap<String, String>();
        for (int i = 0; i < argumentsTable.getItemCount(); i++) {
            TableItem item = argumentsTable.getItem(i);
            arguments.put(item.getText(0), item.getText(1));
        }

        return arguments;
    }

    private void setArguments(Map<String, String> arguments) {
        for (String key : arguments.keySet()) {
            TableItem item = new TableItem(argumentsTable, SWT.CENTER);
            item.setText(0, key);
            item.setText(1, arguments.get(key));
        }
    }

}