/*******************************************************************************
* Copyright (c) 2012-2014 Pivotal Software, 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:
* Pivotal Software, Inc. - initial API and implementation
*******************************************************************************/
package org.grails.ide.eclipse.editor.gsp.actions;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.groovy.core.util.ReflectionUtils;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.IDialogSettings;
import org.eclipse.jface.dialogs.PopupDialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.IOpenListener;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.OpenEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.window.Window;
import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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 org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.model.WorkbenchLabelProvider;
import org.grails.ide.eclipse.core.GrailsCoreActivator;
import org.grails.ide.eclipse.editor.groovy.GrailsEditorGroovyActivator;
import org.grails.ide.eclipse.editor.groovy.elements.INavigableGrailsElement;
import org.grails.ide.eclipse.editor.gsp.wizard.NewGSPWizard;
/**
* @author Andrew Eisenberg
* @created Dec 3, 2010
*/
public class GoToGSPPopDialog extends PopupDialog {
private final INavigableGrailsElement elt;
private IFile result;
private TableViewer list;
public GoToGSPPopDialog(Shell parent, INavigableGrailsElement elt) {
super(parent, SWT.NO_TRIM, true, true, true,
true, true, "Go To GSP", "Select GSP");
this.elt = elt;
}
// its a shame that these variables are private in the super class
private final static GridLayoutFactory POPUP_LAYOUT_FACTORY = GridLayoutFactory
.fillDefaults().margins(POPUP_MARGINWIDTH, POPUP_MARGINHEIGHT)
.spacing(POPUP_HORIZONTALSPACING, POPUP_VERTICALSPACING);
private final static GridDataFactory LAYOUTDATA_GRAB_BOTH = GridDataFactory
.fillDefaults().grab(true, true);
@Override
protected Control createDialogArea(Composite parent) {
Composite composite = (Composite) super.createDialogArea(parent);
list = new TableViewer(composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
list.setLabelProvider(new WorkbenchLabelProvider());
list.addDoubleClickListener(new IDoubleClickListener() {
public void doubleClick(DoubleClickEvent event) {
remmberItemAndClose(event.getSelection());
}
});
POPUP_LAYOUT_FACTORY.applyTo(list.getTable());
LAYOUTDATA_GRAB_BOTH.applyTo(list.getTable());
list.addOpenListener(new IOpenListener() {
public void open(OpenEvent event) {
remmberItemAndClose(event.getSelection());
}
});
list.setContentProvider(new IStructuredContentProvider() {
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
public void dispose() {
}
public Object[] getElements(Object inputElement) {
if (inputElement instanceof IFolder) {
try {
List<IFile> files = NavigationUtils.findGSPsInFolder((IFolder) inputElement);
return files.toArray();
} catch (CoreException e1) {
GrailsCoreActivator.log(e1);
}
}
return new Object[0];
}
});
IFolder f = elt.getGSPFolder();
if (f.isAccessible()) {
list.setInput(f);
} else {
list.setInput(null);
}
Button b = new Button(composite, SWT.FLAT);
b.setBackground(composite.getBackground());
b.setText("Create...");
b.addSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent e) {
openNewGSPWizard();
}
public void widgetDefaultSelected(SelectionEvent e) {
openNewGSPWizard();
}
});
return composite;
}
protected void openNewGSPWizard() {
NewGSPWizard wizard = new NewGSPWizard();
IFolder gspFolder = elt.getGSPFolder();
if (gspFolder != null) {
wizard.init(PlatformUI.getWorkbench(), new StructuredSelection(gspFolder));
WizardDialog dialog = new WizardDialog(getParentShell(), wizard);
close();
dialog.open();
} else {
ErrorDialog.openError(getParentShell(), "Can't create GSP", "Can't create GSP file without Domain class.",
new Status(IStatus.ERROR, GrailsEditorGroovyActivator.PLUGIN_ID, "Domain Class doesn't exist."));
close();
}
}
public IFile getResult() {
return result;
}
protected void remmberItemAndClose(ISelection sel) {
if (! sel.isEmpty() && sel instanceof StructuredSelection) {
StructuredSelection ss = (StructuredSelection) sel;
if (ss.size() == 1) {
result = (IFile) ss.getFirstElement();
}
}
close();
}
@Override
public int open() {
// the super class is not modal.
// we want to block for the dialog
int res = super.open();
if (res == OK) {
this.setBlockOnOpen(true);
ReflectionUtils.executePrivateMethod(Window.class, "runEventLoop", new Class<?>[] { Shell.class }, this, new Object[] { getShell() });
}
return res;
}
@Override
protected IDialogSettings getDialogSettings() {
final IDialogSettings workbenchDialogSettings = WorkbenchPlugin
.getDefault().getDialogSettings();
IDialogSettings result = workbenchDialogSettings.getSection(getId());
if (result == null) {
result = workbenchDialogSettings.addNewSection(getId());
}
return result;
}
protected String getId() {
return "org.grails.ide.eclipse.editor.gsp.gotoGSP"; //$NON-NLS-1$
}
}