Change-Id: Ia5603fe8917a9b567603328996e2dfbb56f38b73
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/FileAssociationDialog.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/FileAssociationDialog.java
new file mode 100644
index 0000000..09adca5
--- /dev/null
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/FileAssociationDialog.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2016 Eike Stepper (Berlin, Germany) and others.
+ * 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:
+ * Eike Stepper - initial API and implementation
+ */
+package org.eclipse.oomph.setup.internal.installer;
+
+import org.eclipse.oomph.setup.ui.AbstractConfirmDialog;
+import org.eclipse.oomph.util.PropertiesUtil;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+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;
+
+/**
+ * @author Eike Stepper
+ */
+public class FileAssociationDialog extends AbstractConfirmDialog
+{
+ private boolean register = true;
+
+ public FileAssociationDialog()
+ {
+ super("Register File Association", 560, 270, "Check on each startup");
+ setShellStyle(getShellStyle() & ~SWT.MIN & ~SWT.MAX);
+ }
+
+ public boolean isRegister()
+ {
+ return register;
+ }
+
+ @Override
+ protected String getShellText()
+ {
+ return PropertiesUtil.getProductName();
+ }
+
+ @Override
+ protected String getDefaultMessage()
+ {
+ return "Do you want to associate this installer with '.setup' files?";
+ }
+
+ @Override
+ protected boolean getRememberButtonDefaultValue()
+ {
+ return FileAssociationUtil.isCheckRegistration();
+ }
+
+ @Override
+ protected void createUI(Composite parent)
+ {
+ initializeDialogUnits(parent);
+
+ Composite composite = new Composite(parent, SWT.NONE);
+ composite.setLayoutData(new GridData(SWT.CENTER, SWT.CENTER, true, true));
+ composite.setLayout(new GridLayout(1, false));
+
+ Button yesButton = new Button(composite, SWT.RADIO);
+ yesButton.setText("Yes, associate this installer with '.setup' files.");
+ yesButton.setLayoutData(new GridData(GridData.BEGINNING));
+ yesButton.setSelection(register);
+ Dialog.applyDialogFont(yesButton);
+ yesButton.addSelectionListener(new SelectionAdapter()
+ {
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ register = true;
+ }
+ });
+
+ Button noButton = new Button(composite, SWT.RADIO);
+ noButton.setText("No, skip association.");
+ noButton.setLayoutData(new GridData(GridData.BEGINNING));
+ yesButton.setSelection(!register);
+ Dialog.applyDialogFont(noButton);
+ noButton.addSelectionListener(new SelectionAdapter()
+ {
+ @Override
+ public void widgetSelected(SelectionEvent e)
+ {
+ register = false;
+ }
+ });
+ }
+
+ @Override
+ protected void doCreateButtons(Composite parent)
+ {
+ createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, false);
+ }
+}
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/FileAssociationUtil.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/FileAssociationUtil.java
new file mode 100644
index 0000000..f9e137c
--- /dev/null
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/FileAssociationUtil.java
@@ -0,0 +1,297 @@
+/*
+ * Copyright (c) 2016 Eike Stepper (Berlin, Germany) and others.
+ * 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:
+ * Stepper - initial API and implementation
+ */
+package org.eclipse.oomph.setup.internal.installer;
+
+import org.eclipse.oomph.util.IOUtil;
+import org.eclipse.oomph.util.OS;
+import org.eclipse.oomph.util.OomphPlugin.Preference;
+import org.eclipse.oomph.util.PropertiesUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Eike Stepper
+ */
+public class FileAssociationUtil
+{
+ public static final FileAssociationUtil INSTANCE = create();
+
+ private static final String LAUNCHER = OS.getCurrentLauncher(false);
+
+ private static final Preference PREF_CHECK_REGISTATION = SetupInstallerPlugin.INSTANCE.getConfigurationPreference("checkRegistration");
+
+ private FileAssociationUtil()
+ {
+ }
+
+ public final boolean canBeRegistered()
+ {
+ return LAUNCHER != null && !LAUNCHER.startsWith(PropertiesUtil.getTmpDir()) && !isRegistered();
+ }
+
+ public boolean isRegistered()
+ {
+ // Subclasses may override.
+ return false;
+ }
+
+ public final void register()
+ {
+ register(LAUNCHER);
+ }
+
+ public void register(String launcher)
+ {
+ // Subclasses may override.
+ }
+
+ public static boolean isCheckRegistration()
+ {
+ return PREF_CHECK_REGISTATION.get(true);
+ }
+
+ public static void setCheckRegistration(boolean checkRegistration)
+ {
+ PREF_CHECK_REGISTATION.set(checkRegistration);
+ }
+
+ private static FileAssociationUtil create()
+ {
+ if (OS.INSTANCE.isWin())
+ {
+ return new Win();
+ }
+
+ if (OS.INSTANCE.isMac())
+ {
+ return new Mac();
+ }
+
+ if (OS.INSTANCE.isLinux())
+ {
+ return new Linux();
+ }
+
+ return new FileAssociationUtil();
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class Win extends FileAssociationUtil
+ {
+ private static final String EXTENSION = ".setup";
+
+ private static final String TYPE = "Oomph.setup.1";
+
+ // private static final String HKEY_CLASSES = "HKEY_CLASSES_ROOT";
+
+ private static final String HKEY_CLASSES = "HKEY_CURRENT_USER\\Software\\Classes";
+
+ private static final String REG_SZ = "REG_SZ";
+
+ private static final int SUCCESS = 0;
+
+ public Win()
+ {
+ }
+
+ @Override
+ public boolean isRegistered()
+ {
+ String type = queryRegistryDefaultValue(HKEY_CLASSES + "\\" + EXTENSION);
+ if (!TYPE.equals(type))
+ {
+ return false;
+ }
+
+ int xxx;
+ // TODO Do we want to check for the "Content Type" value?
+
+ String openCommand = queryRegistryDefaultValue(HKEY_CLASSES + "\\" + TYPE + "\\shell\\open\\command");
+ if (!("\"" + LAUNCHER + "\" \"%1\"").equals(openCommand))
+ {
+ return false;
+ }
+
+ return true;
+ }
+
+ @Override
+ public void register(String launcher)
+ {
+ File regFile = null;
+
+ try
+ {
+ launcher = launcher.replace("\\", "\\\\");
+
+ List<String> lines = new ArrayList<String>();
+ lines.add("Windows Registry Editor Version 5.00");
+ lines.add("");
+ lines.add("[" + HKEY_CLASSES + "\\" + EXTENSION + "]");
+ lines.add("@=\"" + TYPE + "\"");
+ lines.add("\"Content Type\"=\"application/x-oomph-setup+xml\"");
+ lines.add("");
+ lines.add("[" + HKEY_CLASSES + "\\" + TYPE + "]");
+ lines.add("@=\"Oomph Setup\"");
+ lines.add("");
+ lines.add("[" + HKEY_CLASSES + "\\" + TYPE + "\\DefaultIcon]");
+ lines.add("@=\"\\\"" + launcher + "\\\"\"");
+ lines.add("");
+ lines.add("[" + HKEY_CLASSES + "\\" + TYPE + "\\shell\\edit\\command]");
+ // Does not work: lines.add("@=REG_EXPAND_SZ:\"\\\"%SystemRoot%\\\\System32\\\\notepad.exe\\\" \\\"%1\\\"\"");
+ lines.add("@=hex(2):22,00,25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,\\");
+ lines.add(" 74,00,25,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6e,\\");
+ lines.add(" 00,6f,00,74,00,65,00,70,00,61,00,64,00,2e,00,65,00,78,00,65,00,22,00,20,00,\\");
+ lines.add(" 22,00,25,00,31,00,22,00,00,00");
+ lines.add("");
+ lines.add("[" + HKEY_CLASSES + "\\" + TYPE + "\\shell\\open]");
+ lines.add("\"MUIVerb\"=\"Install...\"");
+ lines.add("");
+ lines.add("[" + HKEY_CLASSES + "\\" + TYPE + "\\shell\\open\\command]");
+ lines.add("@=\"\\\"" + launcher + "\\\" \\\"%1\\\"\"");
+ lines.add("");
+
+ regFile = File.createTempFile("oomph-", ".reg");
+ IOUtil.writeLines(regFile, "ASCII", lines);
+
+ exec("reg.exe", "import", regFile.getAbsolutePath());
+ exec("ie4uinit.exe", "-ClearIconCache");
+ }
+ catch (Throwable ex)
+ {
+ SetupInstallerPlugin.INSTANCE.log(ex);
+ }
+ finally
+ {
+ if (regFile != null)
+ {
+ IOUtil.deleteBestEffort(regFile, true);
+ }
+ }
+ }
+
+ private String queryRegistryDefaultValue(String key)
+ {
+ try
+ {
+ List<String> lines = exec("reg.exe", "query", key, "/ve");
+ if (lines != null && lines.size() >= 3)
+ {
+ String line = lines.get(2);
+ int pos = line.indexOf(REG_SZ);
+ if (pos != -1)
+ {
+ return line.substring(pos + REG_SZ.length()).trim();
+ }
+ }
+ }
+ catch (Throwable ex)
+ {
+ //$FALL-THROUGH$
+ }
+
+ return null;
+ }
+
+ private List<String> exec(String... command)
+ {
+ Process process = null;
+
+ try
+ {
+ process = new ProcessBuilder(command).start();
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+ List<String> lines = new ArrayList<String>();
+ String line;
+
+ while ((line = bufferedReader.readLine()) != null)
+ {
+ lines.add(line);
+ }
+
+ if (process.waitFor() != SUCCESS)
+ {
+ return null;
+ }
+
+ return lines;
+ }
+ catch (Throwable ex)
+ {
+ return null;
+ }
+ finally
+ {
+ if (process != null)
+ {
+ IOUtil.closeSilent(process.getInputStream());
+ IOUtil.closeSilent(process.getOutputStream());
+ IOUtil.closeSilent(process.getErrorStream());
+ }
+ }
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class Mac extends FileAssociationUtil
+ {
+ public Mac()
+ {
+ }
+ }
+
+ /**
+ * @author Eike Stepper
+ */
+ private static final class Linux extends FileAssociationUtil
+ {
+ public Linux()
+ {
+ }
+
+ @Override
+ public void register(String launcher)
+ {
+ // desktop-file-validate ~/.local/share/applications/eclipse-inst.desktop
+
+ // ~/.local/share/mime/packages/application-x-foobar.xml
+
+ // <?xml version="1.0" encoding="UTF-8"?>
+ // <mime-info xmlns="http://www.freedesktop.org/standards/shared-mime-info">
+ // <mime-type type="application/x-foobar">
+ // <comment>foo file</comment>
+ // <icon name="application-x-foobar"/>
+ // <glob-deleteall/>
+ // <glob pattern="*.foo"/>
+ // </mime-type>
+ // </mime-info>
+
+ // update-mime-database ~/.local/share/mime
+
+ // gsettings get com.canonical.Unity.Launcher favorites
+
+ // gsettings set com.canonical.Unity.Launcher favorites "['application://org.gnome.Nautilus.desktop', 'application://firefox.desktop',
+ // 'application://ubuntu-software-center.desktop', 'application://unity-control-center.desktop', 'application://gnome-terminal.desktop',
+ // 'unity://running-apps', 'application://eclipse-inst.desktop', 'application://gedit.desktop', 'unity://expo-icon', 'unity://devices']"
+
+ // gtk-launch eclipse-inst
+ }
+ }
+}
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java
index f2b821c..b93e40a 100644
--- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/InstallerApplication.java
@@ -16,6 +16,7 @@
import org.eclipse.oomph.p2.core.P2Util;
import org.eclipse.oomph.p2.core.ProfileTransaction.Resolution;
import org.eclipse.oomph.setup.internal.core.SetupContext;
+import org.eclipse.oomph.setup.internal.core.util.SetupCoreUtil;
import org.eclipse.oomph.setup.ui.wizards.SetupWizard.SelectionMemento;
import org.eclipse.oomph.ui.ErrorDialog;
import org.eclipse.oomph.ui.UIUtil;
@@ -27,6 +28,7 @@
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -51,12 +53,15 @@
import org.osgi.framework.Bundle;
import java.io.File;
+import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
/**
@@ -131,7 +136,7 @@
List<Image> images = new ArrayList<Image>();
for (String windowImageValue : StringUtil.explode(windowImages, ","))
{
- URI windowImageURI = URI.createURI(windowImageValue);
+ URI windowImageURI = getConfigurationResourceURI(windowImageValue);
if (windowImageURI.isRelative())
{
URL url = brandingBundle.getEntry(windowImageValue);
@@ -153,6 +158,24 @@
}
}
+ // Check if the file association is registered, prompt if not, and register if requested.
+ if (FileAssociationUtil.isCheckRegistration())
+ {
+ if (FileAssociationUtil.INSTANCE.canBeRegistered())
+ {
+ FileAssociationDialog dialog = new FileAssociationDialog();
+ if (dialog.open() == FileAssociationDialog.OK)
+ {
+ FileAssociationUtil.setCheckRegistration(dialog.isRemember());
+
+ if (dialog.isRegister())
+ {
+ FileAssociationUtil.INSTANCE.register();
+ }
+ }
+ }
+ }
+
boolean restarted = false;
File restarting = new File(SetupContext.CONFIGURATION_STATE_LOCATION_URI.appendSegment("restarting").toFileString());
SelectionMemento selectionMemento = null;
@@ -202,7 +225,11 @@
mode = Mode.valueOf(modeName.toUpperCase());
- Collection<? extends Resource> configurationResources = Collections.emptySet();
+ @SuppressWarnings("rawtypes")
+ Map arguments = context.getArguments();
+ String[] applicationArgs = arguments == null ? null : (String[])arguments.get("application.args");
+ Collection<? extends Resource> configurationResources = getConfigurationResources(applicationArgs);
+
for (;;)
{
if (selectionMemento == null)
@@ -270,7 +297,7 @@
try
{
// EXIT_RESTART often makes the new process come up behind other windows, so try a fresh native process first.
- Runtime.getRuntime().exec(launcher);
+ launch(launcher);
return EXIT_OK;
}
catch (Throwable ex)
@@ -292,6 +319,69 @@
PREF_MODE.set(mode.name());
}
+ private Set<Resource> getConfigurationResources(String[] applicationArgs)
+ {
+ Set<Resource> resources = new HashSet<Resource>();
+ ResourceSet resourceSet = null;
+
+ for (String arg : applicationArgs)
+ {
+ URI uri;
+
+ try
+ {
+ uri = getConfigurationResourceURI(arg);
+ }
+ catch (Throwable ex)
+ {
+ SetupInstallerPlugin.INSTANCE.log(ex);
+ continue;
+ }
+
+ if (resourceSet == null)
+ {
+ resourceSet = SetupCoreUtil.createResourceSet();
+ }
+
+ Resource resource;
+
+ try
+ {
+ resource = resourceSet.getResource(uri, true);
+ }
+ catch (Throwable ex)
+ {
+ SetupInstallerPlugin.INSTANCE.log(ex);
+ continue;
+ }
+
+ if (resource != null)
+ {
+ resources.add(resource);
+ }
+ }
+
+ return resources;
+ }
+
+ private URI getConfigurationResourceURI(String arg)
+ {
+ try
+ {
+ File file = new File(arg);
+ if (file.isFile() && file.canRead())
+ {
+ return URI.createFileURI(arg);
+ }
+ }
+ catch (Throwable ex)
+ {
+ //$FALL-THROUGH$
+ }
+
+ return URI.createURI(arg);
+ }
+
private void handleCocoaMenu(final Display display, final InstallerUI[] installerDialog)
{
if (!SKIP_COCOA_MENU && Platform.WS_COCOA.equals(Platform.getWS()))
@@ -454,6 +544,16 @@
// Do nothing.
}
+ static void launch(String launcher) throws IOException
+ {
+ String[] args = Platform.getCommandLineArgs();
+ String[] cmdarray = new String[1 + args.length];
+ cmdarray[0] = launcher;
+ System.arraycopy(args, 0, cmdarray, 1, args.length);
+
+ Runtime.getRuntime().exec(cmdarray);
+ }
+
/**
* @author Eike Stepper
*/
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerDialog.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerDialog.java
index 86ee2eb..8a3d7a3 100644
--- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerDialog.java
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerDialog.java
@@ -51,6 +51,8 @@
private Button desktopButton;
+ private Button registerButton;
+
public KeepInstallerDialog(Shell parentShell, boolean startPermanentInstaller)
{
super(parentShell, PropertiesUtil.getProductName(), 560, 270, SetupInstallerPlugin.INSTANCE, false);
@@ -173,6 +175,13 @@
desktopButton.setSelection(true);
}
+ new Label(parent, SWT.NONE);
+ registerButton = new Button(parent, SWT.CHECK);
+ registerButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 2, 1));
+ registerButton.setText("Register file association");
+ registerButton.setToolTipText("Associate this installer with '.setup' files");
+ registerButton.setSelection(true);
+
setDefaultLocation(locationText);
}
@@ -184,6 +193,7 @@
{
final boolean startMenu = startMenuButton == null ? false : startMenuButton.getSelection();
final boolean desktop = desktopButton == null ? false : desktopButton.getSelection();
+ final boolean register = registerButton.getSelection();
ProgressMonitorDialog progressMonitorDialog = new ProgressMonitorDialog((Shell)getShell().getParent());
@@ -194,7 +204,13 @@
public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException
{
monitor.beginTask("Copying installer to " + location, IProgressMonitor.UNKNOWN);
- KeepInstallerUtil.keepInstaller(location, startPermanentInstaller, launcher, startMenu, desktop, false);
+ String permanentLauncher = KeepInstallerUtil.keepInstaller(location, startPermanentInstaller, launcher, startMenu, desktop, false);
+
+ if (register)
+ {
+ FileAssociationUtil.INSTANCE.register(permanentLauncher);
+ }
+
monitor.done();
}
});
@@ -226,6 +242,7 @@
{
File home = new File(PropertiesUtil.getUserHome());
String folderName = PropertiesUtil.getProductName().toLowerCase().replace(' ', '-');
+
for (int i = 1; i < Integer.MAX_VALUE; i++)
{
File folder = new File(home, folderName + (i > 1 ? i : ""));
diff --git a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java
index 989c68b..80ede5b 100644
--- a/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java
+++ b/plugins/org.eclipse.oomph.setup.installer/src/org/eclipse/oomph/setup/internal/installer/KeepInstallerUtil.java
@@ -43,35 +43,28 @@
{
try
{
- String powerShell = KeepInstallerUtil.getPowerShell();
+ String powerShell = getPowerShell();
if (powerShell != null)
{
if (groupName != null)
{
- Runtime.getRuntime().exec(
- new String[] {
- powerShell,
- "-command",
- "& { " + "$folderPath = Join-Path ([Environment]::GetFolderPath('" + specialFolder + "')) '" + groupName + "';"
- + //
- "[system.io.directory]::CreateDirectory($folderPath); "
- + //
+ Runtime.getRuntime()
+ .exec(new String[] { powerShell, "-command",
+ "& { " + "$folderPath = Join-Path ([Environment]::GetFolderPath('" + specialFolder + "')) '" + groupName + "';" + //
+ "[system.io.directory]::CreateDirectory($folderPath); " + //
"$linkPath = Join-Path $folderPath '" + shortcutName + ".lnk'; $targetPath = '" + target
+ "'; $link = (New-Object -ComObject WScript.Shell).CreateShortcut( $linkpath ); $link.TargetPath = $targetPath; $link.Save()}" });
}
else
{
- Runtime.getRuntime().exec(
- new String[] {
- powerShell,
- "-command",
+ Runtime.getRuntime()
+ .exec(new String[] { powerShell, "-command",
"& {$linkPath = Join-Path ([Environment]::GetFolderPath('" + specialFolder + "')) '" + shortcutName + ".lnk'; $targetPath = '" + target
+ "'; $link = (New-Object -ComObject WScript.Shell).CreateShortcut( $linkpath ); $link.TargetPath = $targetPath; $link.Save()}" });
}
}
- // [system.io.directory]::CreateDirectory("C:\test")
}
catch (IOException ex)
{
@@ -83,12 +76,11 @@
{
try
{
- String powerShell = KeepInstallerUtil.getPowerShell();
+ String powerShell = getPowerShell();
if (powerShell != null)
{
- Runtime.getRuntime().exec(
- new String[] { powerShell, "-command",
- "& { (new-object -c shell.application).namespace('" + location + "').parsename('" + launcherName + "').invokeverb('taskbarpin') }" });
+ Runtime.getRuntime().exec(new String[] { powerShell, "-command",
+ "& { (new-object -c shell.application).namespace('" + location + "').parsename('" + launcherName + "').invokeverb('taskbarpin') }" });
}
}
catch (IOException ex)
@@ -160,7 +152,7 @@
return powerShell;
}
- public static void keepInstaller(String targetLocation, boolean startPermanentInstaller, String launcher, boolean startMenu, boolean desktop,
+ public static String keepInstaller(String targetLocation, boolean startPermanentInstaller, String launcher, boolean startMenu, boolean desktop,
boolean quickLaunch)
{
File source = new File(launcher).getParentFile();
@@ -174,7 +166,7 @@
{
try
{
- Runtime.getRuntime().exec(permanentLauncher);
+ InstallerApplication.launch(permanentLauncher);
}
catch (Exception ex)
{
@@ -203,6 +195,7 @@
}
setKeepInstaller(true);
+ return permanentLauncher;
}
public static boolean isInstallerKept()
diff --git a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/AbstractConfirmDialog.java b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/AbstractConfirmDialog.java
index d00ecfd..1b18320 100644
--- a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/AbstractConfirmDialog.java
+++ b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/AbstractConfirmDialog.java
@@ -26,7 +26,7 @@
{
private final String rememberButtonText;
- private boolean remember;
+ private boolean remember = getRememberButtonDefaultValue();
public AbstractConfirmDialog(Shell parentShell, String title, int width, int height, String rememberButtonText)
{
@@ -48,6 +48,7 @@
protected void createButtonsForButtonBar(Composite parent)
{
final Button rememberButton = createCheckbox(parent, rememberButtonText);
+ rememberButton.setSelection(remember);
rememberButton.addSelectionListener(new SelectionAdapter()
{
@Override
@@ -76,4 +77,9 @@
{
return null;
}
+
+ protected boolean getRememberButtonDefaultValue()
+ {
+ return false;
+ }
}
diff --git a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ProjectPage.java b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ProjectPage.java
index 8a2071a..01b6f14 100644
--- a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ProjectPage.java
+++ b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/ProjectPage.java
@@ -1163,26 +1163,6 @@
}
}
- public static void hookTransferControl(Shell shell, Control execludedControl, SetupTransferSupport transferSupport,
- ConfigurationListener configurationListener)
- {
- shell.addShellListener(configurationListener);
-
- // Listen for drops on the overall composite.
- for (Control control : shell.getChildren())
- {
- if (control instanceof Composite)
- {
- transferSupport.addControl(control);
- break;
- }
- }
-
- // But exclude the page itself.
- transferSupport.excludeControl(execludedControl);
- configurationListener.checkConfigurationAvailability();
- }
-
@Override
public void leavePage(boolean forward)
{
@@ -1206,13 +1186,6 @@
}
}
- public static void unhookTransferControl(Shell shell, Control execludedControl, SetupTransferSupport transferSupport,
- ConfigurationListener configurationListener)
- {
- shell.removeShellListener(configurationListener);
- transferSupport.removeControls();
- }
-
@Override
public void sendStats(boolean success)
{
@@ -1490,6 +1463,33 @@
adapterFactory.dispose();
}
+ public static void hookTransferControl(Shell shell, Control execludedControl, SetupTransferSupport transferSupport,
+ ConfigurationListener configurationListener)
+ {
+ shell.addShellListener(configurationListener);
+
+ // Listen for drops on the overall composite.
+ for (Control control : shell.getChildren())
+ {
+ if (control instanceof Composite)
+ {
+ transferSupport.addControl(control);
+ break;
+ }
+ }
+
+ // But exclude the page itself.
+ transferSupport.excludeControl(execludedControl);
+ configurationListener.checkConfigurationAvailability();
+ }
+
+ public static void unhookTransferControl(Shell shell, Control execludedControl, SetupTransferSupport transferSupport,
+ ConfigurationListener configurationListener)
+ {
+ shell.removeShellListener(configurationListener);
+ transferSupport.removeControls();
+ }
+
private static void createProjectLabel(Project project, StringBuilder builder)
{
Project parentProject = project.getParentProject();
diff --git a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/VariablePage.java b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/VariablePage.java
index 3b9e1bc..460a859 100644
--- a/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/VariablePage.java
+++ b/plugins/org.eclipse.oomph.setup.ui/src/org/eclipse/oomph/setup/ui/wizards/VariablePage.java
@@ -803,6 +803,7 @@
@SuppressWarnings("unchecked")
List<SetupTaskPerformer> performers = (List<SetupTaskPerformer>)contexts;
allPromptedPerfomers.addAll(performers);
+
for (SetupTaskPerformer performer : performers)
{
boolean resolvedAll = true;
diff --git a/releng/org.eclipse.oomph.releng/Build Linux 64bit.launch b/releng/org.eclipse.oomph.releng/Build Linux 64bit.launch
new file mode 100644
index 0000000..f4c21b4
--- /dev/null
+++ b/releng/org.eclipse.oomph.releng/Build Linux 64bit.launch
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.ui.externaltools.ProgramLaunchConfigurationType">
+<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
+<listEntry value="org.eclipse.ui.externaltools.launchGroup"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/mvn"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="-Dbuild.id=Local -Dgit.commit=Unknown -DskipTests=true -Denv=linux64 -DDtycho.debug.resolver=true -DX clean verify"/>
+<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${git.clone.oomph}"/>
+</launchConfiguration>