com.buildml.eclipse.packages.handlers.MoveToPackageDialog.java Source code

Java tutorial

Introduction

Here is the source code for com.buildml.eclipse.packages.handlers.MoveToPackageDialog.java

Source

/*******************************************************************************
 * Copyright (c) 2013 Arapiki Solutions Inc.
 * 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:
 *    psmith - initial API and 
 *        implementation and/or initial documentation
 *******************************************************************************/

package com.buildml.eclipse.packages.handlers;

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.ITreeSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;

import com.buildml.eclipse.bobj.UIPackage;
import com.buildml.eclipse.bobj.UIPackageFolder;
import com.buildml.eclipse.outline.OutlineContentProvider;
import com.buildml.eclipse.outline.OutlineLabelProvider;
import com.buildml.eclipse.utils.BmlTitleAreaDialog;
import com.buildml.model.IBuildStore;
import com.buildml.model.IPackageMgr;

/**
 * A Dialog class for allowing the user to select a package they want to 
 * move package members into.
 * 
 * @author Peter Smith <psmith@arapiki.com>
 */
public class MoveToPackageDialog extends BmlTitleAreaDialog {

    /*=====================================================================================*
     * FIELDS/TYPES
     *=====================================================================================*/

    /** The IBuildStore that contains all our package information */
    private IBuildStore buildStore;

    /** The TreeViewer used for displaying the hierarchy of packages */
    private TreeViewer viewer;

    /** 
     * The ID of the package that was selected by the user. This should only be queried
     * by calling getPackageId() after the "OK" button is pressed.
     */
    private int savedPackageId = -1;

    /*=====================================================================================*
     * CONSTRUCTORS
     *=====================================================================================*/

    /**
     * Create a new MoveToPackageDialog box.
     * 
     * @param buildStore    The IBuildStore that we query information from.
     */
    public MoveToPackageDialog(IBuildStore buildStore) {
        super(new Shell(), 0.3, 0.5, 0.5, 0.5);

        this.buildStore = buildStore;
    }

    /*=====================================================================================*
     * PUBLIC METHODS
     *=====================================================================================*/

    /**
     * @return The package ID selected by the user, or -1 if no package has yet been selected.
     */
    public int getPackageId() {
        return savedPackageId;
    }

    /*=====================================================================================*
     * PROTECTED METHODS
     *=====================================================================================*/

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
     */
    @Override
    protected Control createDialogArea(Composite parent) {

        IPackageMgr pkgMgr = buildStore.getPackageMgr();

        setTitle("Select Package to Move Actions/Files into:");
        setHelpAvailable(false);

        Composite container = new Composite(parent, SWT.NULL);
        container.setLayout(new GridLayout());
        GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
        gd.verticalIndent = 20;
        gd.horizontalIndent = 0;
        container.setLayoutData(gd);

        /* display a single TreeViewer that lists all the packages */
        viewer = new TreeViewer(container, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER | SWT.SINGLE);
        viewer.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        viewer.setContentProvider(new OutlineContentProvider(pkgMgr, false));
        viewer.setLabelProvider(new OutlineLabelProvider(pkgMgr));
        viewer.setInput(new UIPackageFolder[] { new UIPackageFolder(pkgMgr.getRootFolder()) });
        viewer.expandToLevel(3);

        /*
         * When a node in the tree is selected, decide whether it's a package or a folder and
         * adjust the "OK" button enablement status accordingly.
         */
        viewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
            public void selectionChanged(SelectionChangedEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object node = selection.getFirstElement();
                getButton(OK).setEnabled(node instanceof UIPackage);
            }
        });

        /*
         * When the user double-clicks on a folder name, automatically expand the content
         * of that folder. If they double-click on a package name, they're essentially
         * pressing "OK".
         */
        viewer.addDoubleClickListener(new IDoubleClickListener() {
            @Override
            public void doubleClick(DoubleClickEvent event) {
                IStructuredSelection selection = (IStructuredSelection) event.getSelection();
                Object node = selection.getFirstElement();

                if (viewer.isExpandable(node)) {
                    viewer.setExpandedState(node, !viewer.getExpandedState(node));
                }

                /* else, perform the "OK" operation */
                else {
                    okPressed();
                }
            }
        });
        return container;
    }

    /*-------------------------------------------------------------------------------------*/

    /* (non-Javadoc)
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     */
    @Override
    protected void okPressed() {

        ITreeSelection selection = (ITreeSelection) viewer.getSelection();
        Object selectedNode = selection.getFirstElement();
        if (selectedNode instanceof UIPackage) {
            savedPackageId = ((UIPackage) selectedNode).getId();
        }

        /* now dispose the window */
        super.okPressed();
    }

    /*-------------------------------------------------------------------------------------*/

    /* 
     * (non-Javadoc)
     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
     */
    @Override
    protected void configureShell(Shell newShell) {
        super.configureShell(newShell);

        newShell.setText("Move Actions/Files Into Package");
    }

    /*-------------------------------------------------------------------------------------*/
}