package com.redhat.ceylon.eclipse.code.preferences; import static com.redhat.ceylon.eclipse.code.editor.Navigation.openInEditor; import static com.redhat.ceylon.eclipse.java2ceylon.Java2CeylonProxies.modelJ2C; import static org.eclipse.jface.layout.GridDataFactory.fillDefaults; import static org.eclipse.jface.layout.GridDataFactory.swtDefaults; import java.io.ByteArrayInputStream; import java.io.UnsupportedEncodingException; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.internal.ui.wizards.buildpaths.FolderSelectionDialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.PartInitException; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import com.redhat.ceylon.ide.common.model.BaseCeylonProject; import com.redhat.ceylon.ide.common.model.CeylonProjectConfig; public class CeylonModuleResolutionBlock { private IProject project; private ceylon.language.Boolean flatClasspath; private ceylon.language.Boolean autoExportMavenDependencies; private ceylon.language.Boolean fullyExportMavenDependencies; private Text overridesText; private Button overridesBrowseButton; private Button overridesCreateButton; private Button flatClasspathButton; private Button autoExportMavenDependenciesButton; private Button fullyExportMavenDependenciesButton; public CeylonModuleResolutionBlock() { } public IProject getProject() { return project; } public String getOverrides() { String overrides = overridesText.getText(); return overrides.isEmpty() ? null : overrides; } public Boolean getFlatClasspath() { return flatClasspath == null ? null : flatClasspath.booleanValue(); } public Boolean getAutoExportMavenDependencies() { return autoExportMavenDependencies == null ? null : autoExportMavenDependencies.booleanValue(); } public Boolean getFullyExportMavenDependencies() { return fullyExportMavenDependencies == null ? null : fullyExportMavenDependencies.booleanValue(); } public void performDefaults() { overridesText.setText(""); } public void initState(IProject project, boolean isCeylonNatureEnabled) { this.project = project; ceylon.language.String overrides = null; if (isCeylonNatureEnabled) { BaseCeylonProject ceylonProject = modelJ2C().ceylonModel().getProject(project); CeylonProjectConfig config = ceylonProject.getConfiguration(); overrides = config.getProjectOverrides(); flatClasspath = config.getProjectFlatClasspath(); autoExportMavenDependencies = config.getProjectAutoExportMavenDependencies(); fullyExportMavenDependencies = config.getProjectFullyExportMavenDependencies(); overridesText.setEnabled(true); flatClasspathButton.setEnabled(true); autoExportMavenDependenciesButton.setEnabled(true); fullyExportMavenDependenciesButton.setEnabled(true); } else { overridesText.setEnabled(false); flatClasspathButton.setEnabled(false); autoExportMavenDependenciesButton.setEnabled(false); fullyExportMavenDependenciesButton.setEnabled(false); } boolean flat = flatClasspath!=null && flatClasspath.booleanValue(); flatClasspathButton.setSelection(flat); flatClasspathButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { if (flatClasspath == null) { flatClasspath = ceylon.language.Boolean.instance(true); } else { flatClasspath = ceylon.language.Boolean.instance(!flatClasspath.booleanValue()); } } }); boolean autoExport = autoExportMavenDependencies!=null && autoExportMavenDependencies.booleanValue(); autoExportMavenDependenciesButton.setSelection(autoExport); autoExportMavenDependenciesButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { if (autoExportMavenDependencies == null) { autoExportMavenDependencies = ceylon.language.Boolean.instance(true); } else { autoExportMavenDependencies = ceylon.language.Boolean.instance(!autoExportMavenDependencies.booleanValue()); } } }); boolean fullyExport = fullyExportMavenDependencies!=null && fullyExportMavenDependencies.booleanValue(); fullyExportMavenDependenciesButton.setSelection(fullyExport); fullyExportMavenDependenciesButton.addListener(SWT.Selection, new Listener() { public void handleEvent(Event e) { if (fullyExportMavenDependencies == null) { fullyExportMavenDependencies = ceylon.language.Boolean.instance(true); } else { fullyExportMavenDependencies = ceylon.language.Boolean.instance(!fullyExportMavenDependencies.booleanValue()); } } }); if (overrides != null) { overridesText.setText(overrides.value.trim()); } else { overridesText.setText(""); } } private final String overridesTextWithoutLink = "Module overrides file (customize module resolution)"; private final String overridesTextWithLink = "Module <a>overrides file</a> (customize module resolution)"; public void initContents(Composite parent) { // final Group resolutionGroup = new Group(parent, SWT.NONE); // resolutionGroup.setText("Module Resolution"); // resolutionGroup.setLayoutData(fillDefaults().grab(true, false).create()); // resolutionGroup.setLayout(GridLayoutFactory.swtDefaults().create()); final Link overridesLabel = new Link(parent, SWT.LEFT | SWT.WRAP); overridesLabel.setText(overridesTextWithoutLink); overridesLabel.setToolTipText( "Choose the XML file used to specify module overrides"); overridesLabel.setLayoutData(swtDefaults() .span(2, 1) .grab(true, false) .align(SWT.FILL, SWT.CENTER) .create()); overridesLabel.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { final IPath overridesPath = new Path(overridesText.getText()); if (overridesPath.isAbsolute()) { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { openInEditor(overridesPath, true); } catch (PartInitException e) { e.printStackTrace(); } } }); } else { final IFile overridesResource = project.getFile(overridesPath); try { overridesResource.refreshLocal( IResource.DEPTH_ZERO, null); } catch (CoreException e1) { e1.printStackTrace(); } Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { openInEditor(overridesResource, true); } catch (PartInitException e) { e.printStackTrace(); } } }); } } }); overridesText = new Text(parent, SWT.SINGLE | SWT.BORDER); overridesText.setLayoutData(swtDefaults() .align(SWT.FILL, SWT.CENTER) .hint(250, SWT.DEFAULT) .grab(true, false) .create()); overridesText.setMessage("No overrides.xml"); overridesText.addModifyListener(new ModifyListener() { @Override public void modifyText(ModifyEvent e) { if (overridesText.getText().isEmpty()) { overridesLabel.setText(overridesTextWithoutLink); } else { overridesLabel.setText(overridesTextWithLink); } } }); Composite overridesComposite = new Composite(parent, SWT.NONE); overridesComposite.setLayout(new GridLayout(2, true)); overridesComposite.setLayoutData(swtDefaults() .grab(true, true) .align(SWT.FILL, SWT.FILL) .create()); initOverridesBrowseButton(overridesComposite); initOverridesCreateButton(overridesComposite); // Composite checkBoxesComposite = new Composite(parent, SWT.NONE); // checkBoxesComposite.setLayout(GridLayoutFactory.fillDefaults().equalWidth(false).create()); // checkBoxesComposite.setLayoutData(swtDefaults().grab(true, true).create()); flatClasspathButton = new Button(parent, SWT.CHECK); flatClasspathButton.setText("Use a flat classpath"); flatClasspathButton.setLayoutData(swtDefaults() .span(2, 1) .grab(true, false) .create()); autoExportMavenDependenciesButton = new Button(parent, SWT.CHECK); autoExportMavenDependenciesButton.setText( "Automatically export Maven dependencies"); autoExportMavenDependenciesButton.setLayoutData(fillDefaults() .span(2, 1) .grab(true, false) .create()); fullyExportMavenDependenciesButton = new Button(parent, SWT.CHECK); fullyExportMavenDependenciesButton.setText( "Fully export Maven dependencies"); fullyExportMavenDependenciesButton.setLayoutData(fillDefaults() .span(2, 1) .grab(true, false) .create()); performDefaults(); } private void initOverridesBrowseButton(final Composite composite) { overridesBrowseButton = new Button(composite, SWT.PUSH); overridesBrowseButton.setText("Browse..."); overridesBrowseButton.setLayoutData(swtDefaults() .grab(true, true) .align(SWT.FILL, SWT.CENTER) .create()); overridesBrowseButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { FileDialog fileDialog = new FileDialog(composite.getShell(), SWT.SHEET); fileDialog.setFilterExtensions( new String[] {"*.xml", "*.*"}); String path = project.getLocation().toFile() .getAbsolutePath(); fileDialog.setFilterPath(path); fileDialog.setFileName("overrides.xml"); String result = fileDialog.open(); if (result != null) { IPath overridesPath = new Path(result); IPath projectLocation = project.getLocation(); if (projectLocation.isPrefixOf(overridesPath)) { result = overridesPath .removeFirstSegments(projectLocation.segmentCount()) .toString(); } overridesText.setText(result); } } }); } private void initOverridesCreateButton(final Composite composite) { overridesCreateButton = new Button(composite, SWT.PUSH); overridesCreateButton.setText("Create..."); overridesCreateButton.setLayoutData(swtDefaults() .grab(true, true) .align(SWT.FILL, SWT.CENTER) .create()); overridesCreateButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { Shell shell = composite.getShell(); FolderSelectionDialog dialog = new FolderSelectionDialog(shell, new WorkbenchLabelProvider(), new WorkbenchContentProvider()); dialog.setTitle("Select Folder"); dialog.setMessage("Select a folder to contain the module overrides file:"); dialog.setAllowMultiple(false); dialog.addFilter(new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parentElement, Object element) { return (element instanceof IFolder || element instanceof IProject) && ((IContainer) element).getProject() .equals(project); } }); dialog.setInput(project.getParent()); dialog.setInitialSelection(project); if (dialog.open()==Window.CANCEL) { return; } IContainer folder = (IContainer) dialog.getFirstResult(); try { final IFile overridesResource = folder.getFile(Path.fromPortableString("overrides.xml")); try { overridesResource.refreshLocal( IResource.DEPTH_ZERO, null); } catch (CoreException e1) { e1.printStackTrace(); } if (overridesResource.exists()) { MessageDialog.openError(shell, "Overrides File Creation", "An 'overrides.xml' file already exists in this folder."); return; } try { overridesResource.create(new ByteArrayInputStream( ("<overrides xmlns=\"http://www.ceylon-lang.org/xsd/overrides\">\n" + "</overrides>").getBytes("ASCII")), true, null); } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } Display.getDefault().asyncExec(new Runnable() { @Override public void run() { try { openInEditor(overridesResource, true); } catch (PartInitException e) { e.printStackTrace(); } } }); String path = overridesResource.getProjectRelativePath() .toPortableString(); overridesText.setText(path); MessageDialog.openInformation(shell, "Overrides File Creation", "The 'overrides.xml' file was created."); } catch (CoreException e1) { e1.printStackTrace(); } } }); } }