/**
* Copyright (c) 2005-2006 Aptana, 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. If redistributing this code,
* this entire header must remain intact.
*/
package com.aptana.ide.wizards;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.viewers.CheckboxTableViewer;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.wizard.WizardPage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.FontData;
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.Control;
import org.eclipse.swt.widgets.Label;
import org.osgi.framework.Bundle;
import com.aptana.ide.core.FileUtils;
import com.aptana.ide.core.IdeLog;
import com.aptana.ide.core.StringUtils;
import com.aptana.ide.core.ui.wizards.BaseWizard;
import com.aptana.ide.core.ui.wizards.IBaseWizardPage;
import com.aptana.ide.projects.ProjectsPlugin;
import com.aptana.ide.installer.Activator;
import com.aptana.ide.librarymanager.LibraryInfo;
import com.aptana.ide.librarymanager.LibraryManager;
/**
* Standard project reference page for a wizard that creates a project resource.
* <p>
* This page may be used by clients as-is; it may be also be subclassed to suit.
* </p>
* <p>
* Example useage:
*
* <pre>
* referencePage = new WizardNewProjectReferencePage("basicReferenceProjectPage");
* referencePage.setTitle("Project");
* referencePage.setDescription("Select referenced projects.");
* </pre>
*
* </p>
*/
public class LibraryWizardPage extends WizardPage implements IBaseWizardPage
{
// widgets
private CheckboxTableViewer referenceProjectsViewer;
private static final String JS_LIBS_TITLE = Messages.LibraryWizardPage_SelectAJAXLibraries;
private static final String INSTALL_JS_LIBS_LABEL = Messages.LibraryWizardPage_InstallJavascriptLibraries;
private static final int LIB_LIST_MULTIPLIER = 15;
private IStructuredContentProvider _contentProvider;
private ILabelProvider _labelProvider;
/**
* Creates a new project reference wizard page.
*
* @param pageName
* the name of this page
* @param contentProvider
* @param labelProvider
*/
public LibraryWizardPage(String pageName, IStructuredContentProvider contentProvider, ILabelProvider labelProvider)
{
super(pageName);
_contentProvider = contentProvider;
_labelProvider = labelProvider;
}
/**
* @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
*/
public void createControl(Composite parent)
{
Font font = parent.getFont();
Composite composite = new Composite(parent, SWT.NONE);
GridLayout layout = new GridLayout();
layout.marginHeight = 0;
layout.marginWidth = 0;
composite.setLayout(layout);
composite.setLayoutData(new GridData(GridData.FILL_BOTH));
composite.setFont(font);
// PlatformUI.getWorkbench().getHelpSystem().setHelp(composite,
// IIDEHelpContextIds.NEW_PROJECT_REFERENCE_WIZARD_PAGE);
LibraryInfo[] libraryInfoExtensions = LibraryManager.getInstance().getLibraryInfoExtensions();
if (libraryInfoExtensions.length == 0) {
Browser browser = new Browser(composite, SWT.BORDER);
browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
browser.setFont(font);
Bundle bundle = Platform.getBundle(ProjectsPlugin.PLUGIN_ID);
URL url = null;
try {
url = FileLocator.toFileURL(bundle.getEntry("html/librarywizardpage.html")); //$NON-NLS-1$
browser.setUrl(url.toString());
} catch (IOException e) {
IdeLog.logInfo(ProjectsPlugin.getDefault(), e.getMessage(), e);
}
} else {
Label referenceLabel = new Label(composite, SWT.NONE);
referenceLabel.setText(JS_LIBS_TITLE);
referenceLabel.setFont(font);
referenceProjectsViewer = CheckboxTableViewer.newCheckList(composite, SWT.BORDER);
referenceProjectsViewer.getTable().setFont(composite.getFont());
GridData data = new GridData();
data.horizontalAlignment = GridData.FILL;
data.verticalAlignment = GridData.FILL;
data.grabExcessHorizontalSpace = true;
data.grabExcessVerticalSpace = true;
data.heightHint = getDefaultFontHeight(referenceProjectsViewer.getTable(), LIB_LIST_MULTIPLIER);
referenceProjectsViewer.getTable().setLayoutData(data);
referenceProjectsViewer.setLabelProvider(new LabelProvider());
referenceProjectsViewer.setContentProvider(_contentProvider);
referenceProjectsViewer.setLabelProvider(_labelProvider);
referenceProjectsViewer.setInput(ResourcesPlugin.getWorkspace());
}
Button installLibrariesButton = new Button(composite, SWT.PUSH);
installLibrariesButton.setText(INSTALL_JS_LIBS_LABEL);
installLibrariesButton.setLayoutData(new GridData(SWT.END, SWT.CENTER, false, false));
installLibrariesButton.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent e) {
}
public void widgetSelected(SelectionEvent e) {
// Hide the wizard
getWizard().performCancel();
getWizard().getContainer().getShell().close();
// Show the installer wizard
Activator.launchWizard(false, new String[] {"installer.ajax"} ); //$NON-NLS-1$
}
});
setControl(composite);
}
/**
* Get the defualt widget height for the supplied control.
*
* @return int
* @param control -
* the control being queried about fonts
* @param lines -
* the number of lines to be shown on the table.
*/
private static int getDefaultFontHeight(Control control, int lines)
{
FontData[] viewerFontData = control.getFont().getFontData();
int fontHeight = 10;
// If we have no font data use our guess
if (viewerFontData.length > 0)
{
fontHeight = viewerFontData[0].getHeight();
}
return lines * fontHeight;
}
/**
* Returns the referenced projects selected by the user.
*
* @return the referenced projects
*/
public String[] getSelectedLibraries()
{
List<String> libs = new ArrayList<String>();
if (referenceProjectsViewer != null) {
Object[] elements = referenceProjectsViewer.getCheckedElements();
for (int i = 0; i < elements.length; i++)
{
LibraryInfo item = (LibraryInfo) elements[i];
URL resolved = item.getResolvedURL();
if (resolved != null)
{
libs.add(resolved.getFile());
}
}
}
return libs.toArray(new String[0]);
}
/**
* @see org.eclipse.jface.dialogs.DialogPage#setVisible(boolean)
*/
public void setVisible(boolean visible)
{
super.setVisible(visible);
if (visible)
{
setPageComplete(true);
}
}
/**
* @see com.aptana.ide.core.ui.wizards.IBaseWizardPage#performFinish()
*/
public void performFinish()
{
IProgressMonitor monitor = ((BaseWizard) getWizard()).getFinishProgressMonitor();
IProject p = ((BaseWizard) getWizard()).getCreatedProject();
String toOpen = null;
String[] selection = getSelectedLibraries();
for (int j = 0; j < selection.length; j++)
{
String destinationDir = p.getLocation().toOSString();
String sourceDir = selection[j];
try
{
File f = new File(sourceDir);
File[] files = f.listFiles();
if (monitor != null)
{
monitor.beginTask(StringUtils.format(Messages.LibraryProjectWizard_CopyingFiles, selection[j]),
files.length);
}
for (int i = 0; i < files.length; i++)
{
String name = files[i].getName();
if (monitor != null)
{
monitor.subTask(name);
}
FileUtils.copy(sourceDir, destinationDir, name);
if (toOpen == null && (name.toLowerCase().endsWith(".htm") || name.toLowerCase().endsWith(".html"))) //$NON-NLS-1$ //$NON-NLS-2$
{
toOpen = name;
}
if (monitor != null)
{
monitor.worked(1);
}
}
}
catch (Exception e)
{
IdeLog.logError(ProjectsPlugin.getDefault(),
Messages.LibraryProjectWizard_UnableToCopyFileToProject, e);
}
try
{
p.refreshLocal(IResource.DEPTH_INFINITE, null);
}
catch (CoreException e)
{
IdeLog.logError(ProjectsPlugin.getDefault(), Messages.LibraryProjectWizard_Error, e);
}
}
}
}