/**
* Aptana Studio
* Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved.
* Licensed under the terms of the GNU Public License (GPL) v3 (with exceptions).
* Please see the license.html included with this distribution for details.
* Any modifications to this file must keep this entire header intact.
*/
package com.aptana.deploy.capistrano.ui.wizard;
import java.net.URL;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.wizard.IWizardPage;
import org.eclipse.jface.wizard.WizardPage;
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.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.browser.IWebBrowser;
import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
import com.aptana.core.logging.IdeLog;
import com.aptana.deploy.capistrano.CapistranoPlugin;
//import com.aptana.terminal.widget.TerminalComposite;
public class CapifyProjectPage extends WizardPage
{
public static final String NAME = "CapifyProject"; //$NON-NLS-1$
// private TerminalComposite terminalComposite;
protected Job checkCapifiedJob;
protected CapifyProjectPage()
{
super(NAME, Messages.CapifyProjectPage_Title, null);
}
public void createControl(Composite parent)
{
Composite composite = new Composite(parent, SWT.NULL);
composite.setLayout(new GridLayout());
composite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
setControl(composite);
initializeDialogUnits(parent);
// TODO What if file already exists? Do we disable the button? do we even show this page?
// Actual contents
Label label = new Label(composite, SWT.WRAP);
label.setText(Messages.CapifyProjectPage_Description);
label.setLayoutData(new GridData(500, SWT.DEFAULT));
Button generateButton = new Button(composite, SWT.PUSH);
generateButton.setText(Messages.CapifyProjectPage_GenerateButtonLabel);
generateButton.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, false, false));
generateButton.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
// if (!terminalComposite.isEmpty())
// {
// terminalComposite.clear();
// }
// // Send "capify" command to terminal
// terminalComposite.sendInput("capify .\n"); //$NON-NLS-1$
// Poll to check if capistrano is installed
if (checkCapifiedJob == null)
{
checkCapifiedJob = new Job("Checking if config/deploy.rb exists") //$NON-NLS-1$
{
protected IStatus run(IProgressMonitor monitor)
{
if (monitor != null && monitor.isCanceled())
{
return Status.CANCEL_STATUS;
}
if (isPageComplete())
{
PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
{
public void run()
{
getContainer().updateButtons(); // ok update the wizard TODO Just finish for
// them?
}
});
}
else
{
schedule(1000); // check again in a second
}
return Status.OK_STATUS;
}
};
checkCapifiedJob.setSystem(true);
}
checkCapifiedJob.cancel();
checkCapifiedJob.schedule(1000);
}
});
// Terminal
// terminalComposite = new TerminalComposite(composite, SWT.NONE);
// terminalComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
//
// // TODO Can we prevent user input to this terminal?
// terminalComposite.setWorkingDirectory(getProject().getLocation());
// terminalComposite.connect();
// label/link
Link link = new Link(composite, SWT.NONE);
link.setText(Messages.CapifyProjectPage_LinkText);
link.addSelectionListener(new SelectionAdapter()
{
@Override
public void widgetSelected(SelectionEvent e)
{
// Open browser window inside studio to url without closing wizard!
IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
try
{
IWebBrowser browser = support.createBrowser(IWorkbenchBrowserSupport.AS_EDITOR, "capify", null, //$NON-NLS-1$
null);
browser.openURL(new URL(e.text));
}
catch (Exception e1)
{
IdeLog.logError(CapistranoPlugin.getDefault(), e1);
}
}
});
Dialog.applyDialogFont(composite);
}
@Override
public IWizardPage getNextPage()
{
// The end of the line
return null;
}
@Override
public boolean isPageComplete()
{
// Check if the config/deploy.rb file exists!
IProject project = getProject();
IFile deployFile = project.getFile(new Path("config").append("deploy.rb")); //$NON-NLS-1$ //$NON-NLS-2$
return deployFile != null && deployFile.exists();
}
protected IProject getProject()
{
return ((CapistranoDeployWizard) getWizard()).getProject();
}
@Override
public void dispose()
{
try
{
if (checkCapifiedJob != null)
{
checkCapifiedJob.cancel();
checkCapifiedJob = null;
}
}
finally
{
super.dispose();
}
}
}