--- /dev/null
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.argeo.eclipse.ui.specific;
+
+import static org.argeo.eclipse.ui.utils.SingleSourcingConstants.FILE_SCHEME;
+import static org.argeo.eclipse.ui.utils.SingleSourcingConstants.SCHEME_HOST_SEPARATOR;
+
+import java.awt.Desktop;
+import java.io.File;
+import java.io.IOException;
+
+import org.argeo.eclipse.ui.utils.SingleSourcingConstants;
+import org.eclipse.core.commands.AbstractHandler;
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+
+/**
+ * RCP specific command handler to open a file.
+ *
+ * The parameter "URI" is used to determine the correct method to open it.
+ *
+ * Various instances of this handler with different command ID might coexist in
+ * order to provide context specific open file services.
+ *
+ */
+public class OpenFile extends AbstractHandler {
+ // private final static Log log = LogFactory.getLog(OpenFile.class);
+ public final static String ID = SingleSourcingConstants.OPEN_FILE_CMD_ID;
+ public final static String PARAM_FILE_NAME = SingleSourcingConstants.PARAM_FILE_NAME;
+ public final static String PARAM_FILE_URI = SingleSourcingConstants.PARAM_FILE_URI;
+
+ public Object execute(ExecutionEvent event) throws ExecutionException {
+ String fileUri = event.getParameter(PARAM_FILE_URI);
+
+ // sanity check
+ if (fileUri == null || "".equals(fileUri.trim()))
+ return null;
+
+ Desktop desktop = null;
+ if (Desktop.isDesktopSupported()) {
+ desktop = Desktop.getDesktop();
+ }
+
+ File file = getFileFromUri(fileUri);
+ if (file != null)
+ try {
+ desktop.open(file);
+ } catch (IOException e) {
+ throw new SingleSourcingException("Unable to open file with URI: " + fileUri, e);
+ }
+ return null;
+ }
+
+ protected File getFileFromUri(String uri) {
+ if (uri.startsWith(FILE_SCHEME)) {
+ String path = uri.substring((FILE_SCHEME + SCHEME_HOST_SEPARATOR).length());
+ return new File(path);
+ }
+ return null;
+ }
+}