org.eclipse.papyrus.uml.profile.model.RefreshProfileDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.papyrus.uml.profile.model.RefreshProfileDialog.java

Source

/*****************************************************************************
 * Copyright (c) 2012 CEA LIST.
 * 
 * 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:
 *  Camille Letavernier (CEA LIST) camille.letavernier@cea.fr - Initial API and implementation
 *****************************************************************************/
package org.eclipse.papyrus.uml.profile.model;

import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.Map;

import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.TableLayout;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.papyrus.uml.profile.providers.AppliedProfileContentProvider;
import org.eclipse.papyrus.uml.profile.providers.AppliedProfileLabelProvider;
import org.eclipse.papyrus.uml.tools.utils.ProfileUtil;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.TreeEditor;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swt.widgets.TreeColumn;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Profile;

public class RefreshProfileDialog extends SelectionDialog {

    protected final Map<Package, Collection<Profile>> profilesToReapply;

    protected Runnable callback;

    protected Package rootPackage;

    protected RefreshProfileDialog(Shell parentShell, Package rootPackage) {
        super(parentShell);
        setBlockOnOpen(false);
        this.rootPackage = rootPackage;
        profilesToReapply = new HashMap<Package, Collection<Profile>>();
        setTitle("Some profiles have changed");
    }

    public void setCallback(Runnable callback) {
        this.callback = callback;
    }

    @Override
    public void create() {
        super.create();

        Label descriptionLabel = new Label(getDialogArea(), SWT.WRAP);
        descriptionLabel.setText("Some local profiles have changed. Select the ones you want to re-apply");

        TreeViewer viewer = new TreeViewer(getDialogArea());
        viewer.getTree().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

        Tree tree = viewer.getTree();

        TableLayout layout = new TableLayout();

        TreeColumn propertyColumn = new TreeColumn(tree, SWT.CENTER);
        propertyColumn.setText("Package");
        layout.addColumnData(new ColumnWeightData(30, 300, true));

        TreeColumn ownerColumn = new TreeColumn(tree, SWT.CENTER);
        ownerColumn.setText("Profile");
        layout.addColumnData(new ColumnWeightData(60, 150, true));

        TreeColumn checkColumn = new TreeColumn(tree, SWT.CENTER);
        checkColumn.setText("Reapply");
        layout.addColumnData(new ColumnWeightData(10, 70, true));

        tree.setLayout(layout);
        tree.setHeaderVisible(true);

        viewer.setContentProvider(new AppliedProfileContentProvider(rootPackage));
        viewer.setLabelProvider(new AppliedProfileLabelProvider());

        viewer.setInput(new Object());

        installEditors(viewer);

        getDialogArea().layout();

        getShell().pack();
    }

    protected void installEditors(TreeViewer viewer) {
        viewer.expandAll();
        for (TreeItem item : viewer.getTree().getItems()) {
            installEditors(item, rootPackage);
        }
    }

    protected void installEditors(TreeItem treeItem, final Package parentPackage) {
        Package currentPackage = (Package) treeItem.getData();
        if (currentPackage instanceof Profile) {

            final Profile profile = (Profile) currentPackage;

            if (ProfileUtil.isDirty(parentPackage, profile)) {
                Tree tree = treeItem.getParent();

                final Button checkbox = new Button(tree, SWT.CHECK);

                checkbox.setSelection(true);
                getProfilesToReapply(parentPackage).add(profile);

                checkbox.addSelectionListener(new SelectionListener() {

                    public void widgetSelected(SelectionEvent e) {
                        if (checkbox.getSelection()) {
                            getProfilesToReapply(parentPackage).add(profile);
                        } else {
                            getProfilesToReapply(parentPackage).remove(profile);
                        }
                    }

                    public void widgetDefaultSelected(SelectionEvent e) {
                        //Nothing
                    }

                });

                TreeEditor editor = new TreeEditor(tree);
                editor.horizontalAlignment = SWT.CENTER;
                editor.grabHorizontal = true;

                editor.setEditor(checkbox, treeItem, 2);
            }
        }

        for (TreeItem subitem : treeItem.getItems()) {
            installEditors(subitem, currentPackage);
        }
    }

    @Override
    protected Composite getDialogArea() {
        return (Composite) super.getDialogArea();
    }

    protected Collection<Profile> getProfilesToReapply(Package currentPackage) {
        if (!profilesToReapply.containsKey(currentPackage)) {
            profilesToReapply.put(currentPackage, new LinkedHashSet<Profile>());
        }

        return profilesToReapply.get(currentPackage);
    }

    @Override
    protected void okPressed() {
        setSelectionResult(profilesToReapply.values().toArray());
        if (callback != null) {
            callback.run();
        }
        super.okPressed();
    }

    public Map<Package, Collection<Profile>> getProfilesToReapply() {
        return profilesToReapply;
    }

}