de.topicmapslab.tmcledit.model.dialogs.TopicSelectionDialog.java Source code

Java tutorial

Introduction

Here is the source code for de.topicmapslab.tmcledit.model.dialogs.TopicSelectionDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2008, 2009 Topic Maps Lab 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:
 *     Hannes Niederhausen - initial API and implementation
 *******************************************************************************/
/**
 * 
 */
package de.topicmapslab.tmcledit.model.dialogs;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.ListViewer;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
import org.eclipse.jface.wizard.WizardDialog;
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.Shell;

import de.topicmapslab.tmcledit.model.KindOfTopicType;
import de.topicmapslab.tmcledit.model.TopicType;
import de.topicmapslab.tmcledit.model.index.ModelIndexer;
import de.topicmapslab.tmcledit.model.util.ImageConstants;
import de.topicmapslab.tmcledit.model.util.ImageProvider;

/**
 * Dialog to select topics from a list of porposals.
 * 
 * @author Hannes Niederhausen
 * 
 */
public class TopicSelectionDialog extends Dialog implements ISelectionChangedListener {

    private List<TopicType> selectedTopics = Collections.emptyList();

    private ListViewer availableTopicList;
    private ListViewer selectedTopicList;

    private TopicType workingTopicType;
    private boolean showWorkingTopicType;

    private KindOfTopicType kind;

    private Button addButton, addAllButton;

    private Button removeButton, removeAllButton;

    private String title;

    /**
     * Constructor
     * 
     * @param parentShell
     *            parent shell
     * @param workingTopicType
     *            type which will be modified with the selected types, e.g. isa
     *            associtioan
     */
    public TopicSelectionDialog(Shell parentShell, TopicType workingTopicType, boolean showWorkingTopicType) {
        this(parentShell, workingTopicType, showWorkingTopicType, KindOfTopicType.TOPIC_TYPE);
    }

    /**
     * Constructor
     * 
     * @param parentShell
     *            parent shell
     * @param workingTopicType
     *            type which will be modified with the selected types, e.g. isa
     *            associtioan
     * @param kind
     *            kind of topic of the porposals
     */
    public TopicSelectionDialog(Shell parentShell, TopicType workingTopicType, boolean showWorkingTopicType,
            KindOfTopicType kind) {
        super(parentShell);
        this.workingTopicType = workingTopicType;
        this.showWorkingTopicType = showWorkingTopicType;
        this.kind = kind;
    }

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite comp = new Composite(parent, SWT.NONE);
        comp.setLayout(new GridLayout(3, false));
        comp.setLayoutData(new GridData(GridData.FILL_BOTH));

        availableTopicList = new ListViewer(comp);
        GridData gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 150;
        availableTopicList.getList().setLayoutData(gd);
        availableTopicList.setContentProvider(new ArrayContentProvider());
        availableTopicList.setLabelProvider(new TopicLableProvider());

        if (showWorkingTopicType)
            availableTopicList.setInput(ModelIndexer.getTopicIndexer().getTopicTypes());
        else {
            List<TopicType> inputList = new ArrayList<TopicType>(ModelIndexer.getTopicIndexer().getTopicTypes());
            inputList.remove(workingTopicType);
            availableTopicList.setInput(inputList);
        }

        availableTopicList.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                addSelection();
            }
        });
        availableTopicList.addFilter(new ViewerFilter() {

            @Override
            public boolean select(Viewer viewer, Object parentElement, Object element) {

                if (kind != KindOfTopicType.TOPIC_TYPE) {
                    if (((TopicType) element).getKind() != kind)
                        return false;
                }

                if (selectedTopics.contains(element))
                    return false;

                return true;
            }

        });

        availableTopicList.addSelectionChangedListener(this);
        createButtonRow(comp);

        selectedTopicList = new ListViewer(comp);
        gd = new GridData(GridData.FILL_BOTH);
        gd.widthHint = 150;
        selectedTopicList.getList().setLayoutData(gd);
        selectedTopicList.setContentProvider(new ArrayContentProvider());
        selectedTopicList.setLabelProvider(new TopicLableProvider());
        selectedTopicList.setInput(selectedTopics);
        selectedTopicList.addSelectionChangedListener(this);
        selectedTopicList.addDoubleClickListener(new IDoubleClickListener() {

            public void doubleClick(DoubleClickEvent event) {
                removeSelection();
            }
        });

        validate();
        return comp;
    }

    private void createButtonRow(Composite parent) {
        Composite comp = new Composite(parent, SWT.NONE);
        comp.setLayout(new GridLayout());
        comp.setLayoutData(new GridData(GridData.FILL_VERTICAL));
        GridDataFactory fac = GridDataFactory.createFrom(new GridData());

        addButton = new Button(comp, SWT.PUSH);
        addButton.setText("");
        addButton.setImage(ImageProvider.getImage(ImageConstants.ADD_ONE));
        addButton.setToolTipText("Add selected Topics");
        fac.applyTo(addButton);
        addButton.setEnabled(false);
        addButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addSelection();
            }
        });

        addAllButton = new Button(comp, SWT.PUSH);
        addAllButton.setText("");
        addAllButton.setImage(ImageProvider.getImage(ImageConstants.ADD_ALL));
        addAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                addAll();
            }
        });
        addAllButton.setToolTipText("Add all Topics");

        fac.applyTo(addAllButton);

        removeButton = new Button(comp, SWT.PUSH);
        removeButton.setText("");
        removeButton.setImage(ImageProvider.getImage(ImageConstants.REMOVE_ONE));
        removeButton.setEnabled(false);
        removeButton.setToolTipText("Remove selected Topics");
        fac.applyTo(removeButton);
        removeButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                removeSelection();
            }
        });

        removeAllButton = new Button(comp, SWT.PUSH);
        removeAllButton.setText("");
        removeAllButton.setImage(ImageProvider.getImage(ImageConstants.REMOVE_ALL));
        removeAllButton.addSelectionListener(new SelectionAdapter() {
            @Override
            public void widgetSelected(SelectionEvent e) {
                removeAll();
            }
        });
        removeAllButton.setToolTipText("Remove all Topics");
        fac.applyTo(removeAllButton);

        Button createButton = new Button(comp, SWT.PUSH);
        createButton.setToolTipText("Create new Topic");
        createButton.setText("");
        createButton.setImage(ImageProvider.getImage(ImageConstants.NEW_TOPICTYPE));
        createButton.addSelectionListener(new SelectionAdapter() {

            @Override
            public void widgetSelected(SelectionEvent e) {
                NewTopicTypeWizard wizard = new NewTopicTypeWizard(KindOfTopicType.TOPIC_TYPE);
                WizardDialog dlg = new WizardDialog(availableTopicList.getList().getShell(), wizard);

                if (dlg.open() == Dialog.OK) {
                    TopicType tt = wizard.getNewTopicType();
                    ModelIndexer.getInstance().getTopicMapSchema().getTopicTypes().add(tt);
                    selectedTopics.add(tt);
                    selectedTopicList.refresh();
                }
            }
        });
        fac.applyTo(createButton);
    }

    private void addSelection() {
        IStructuredSelection sel = (IStructuredSelection) availableTopicList.getSelection();
        for (Iterator it = sel.iterator(); it.hasNext();) {
            selectedTopics.add((TopicType) it.next());
        }
        validate();
        availableTopicList.refresh();
        selectedTopicList.refresh();
    }

    @SuppressWarnings("unchecked")
    private void addAll() {
        selectedTopics.addAll((Collection<? extends TopicType>) availableTopicList.getInput());
        validate();
        availableTopicList.refresh();
        selectedTopicList.refresh();
    }

    private void removeSelection() {
        IStructuredSelection sel = (IStructuredSelection) selectedTopicList.getSelection();
        for (Iterator it = sel.iterator(); it.hasNext();) {
            selectedTopics.remove((TopicType) it.next());
        }
        validate();
        availableTopicList.refresh();
        selectedTopicList.refresh();

    }

    private void removeAll() {
        selectedTopics.clear();
        validate();
        availableTopicList.refresh();
        selectedTopicList.refresh();
    }

    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);
        newShell.setSize(500, 400);
        newShell.setText(getTitle());
    }

    /**
     * The list of selected topics
     * 
     * @return
     */
    public List<TopicType> getSelectedTopics() {
        return selectedTopics;
    }

    /**
     * Sets the initial selected topics
     * 
     * @param selectedTopics
     *            the list of topics which are selected
     */
    public void setSelectedTopics(List<TopicType> selectedTopics) {
        this.selectedTopics = new ArrayList<TopicType>();
        this.selectedTopics.addAll(selectedTopics);
    }

    private class TopicLableProvider extends LabelProvider {
        @Override
        public String getText(Object element) {
            if (element instanceof TopicType)
                return ((TopicType) element).getName();

            return super.getText(element);
        }
    }

    /**
     * 
     * @return returns the title
     */
    public String getTitle() {
        return title == null ? "" : title;
    }

    /**
     * Sets the title
     * 
     * @param title
     *            the new title
     */
    public void setTitle(String title) {
        this.title = title;
    }

    public void selectionChanged(SelectionChangedEvent event) {
        if (event.getSelectionProvider().equals(availableTopicList)) {
            if (event.getSelection().isEmpty()) {
                addButton.setEnabled(false);
            } else {
                addButton.setEnabled(true);
            }
        } else if (event.getSelectionProvider().equals(selectedTopicList)) {
            if (event.getSelection().isEmpty()) {
                removeButton.setEnabled(false);
            } else {
                removeButton.setEnabled(true);
            }
        }

    }

    private void validate() {

        if (selectedTopics.size() <= 0)
            removeAllButton.setEnabled(false);
        else
            removeAllButton.setEnabled(true);

        if (selectedTopics.size() == ((List) availableTopicList.getInput()).size())
            addAllButton.setEnabled(false);
        else
            addAllButton.setEnabled(true);

    }
}