/******************************************************************************* * 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"); } /*-------------------------------------------------------------------------------------*/ }