mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
[platform] inlining macOS protocol handler; making it work at launch time
GitOrigin-RevId: efaa671da3a866252a098d62b1cf2ecc8525a920
This commit is contained in:
committed by
intellij-monorepo-bot
parent
d780cd2b94
commit
4876d4057f
@@ -1,51 +0,0 @@
|
||||
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
|
||||
package com.intellij.ui;
|
||||
|
||||
import com.intellij.ide.CommandLineProcessor;
|
||||
import com.intellij.openapi.diagnostic.Logger;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import io.netty.handler.codec.http.QueryStringDecoder;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.net.URI;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Dennis.Ushakov
|
||||
*/
|
||||
public class CustomProtocolHandler {
|
||||
public static final String LINE_NUMBER_ARG_NAME = "--line";
|
||||
public static final String COLUMN_NUMBER_ARG_NAME = "--column";
|
||||
|
||||
private static final Logger LOG = Logger.getInstance(CustomProtocolHandler.class);
|
||||
|
||||
public boolean openLink(@NotNull URI uri) {
|
||||
LOG.info("CustomProtocolHandler.openLink");
|
||||
final List<String> args = getOpenArgs(uri);
|
||||
return !args.isEmpty() && CommandLineProcessor.processExternalCommandLine(args, null).getFirst() != null;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public List<String> getOpenArgs(@NotNull URI uri) {
|
||||
Map<String, List<String>> parameters = new QueryStringDecoder(uri).parameters();
|
||||
String file = ContainerUtil.getFirstItem(parameters.get("file"));
|
||||
String line = ContainerUtil.getFirstItem(parameters.get("line"));
|
||||
String column = ContainerUtil.getFirstItem(parameters.get("column"));
|
||||
|
||||
List<String> args = new SmartList<>();
|
||||
if (file != null) {
|
||||
if (line != null) {
|
||||
args.add(LINE_NUMBER_ARG_NAME);
|
||||
args.add(line);
|
||||
}
|
||||
if (column != null) {
|
||||
args.add(COLUMN_NUMBER_ARG_NAME);
|
||||
args.add(column);
|
||||
}
|
||||
args.add(file);
|
||||
}
|
||||
return args;
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import com.apple.eawt.AppEvent;
|
||||
import com.apple.eawt.Application;
|
||||
import com.apple.eawt.OpenURIHandler;
|
||||
import com.intellij.diagnostic.LoadingState;
|
||||
import com.intellij.ide.CommandLineProcessor;
|
||||
import com.intellij.ide.DataManager;
|
||||
import com.intellij.ide.actions.AboutAction;
|
||||
import com.intellij.ide.actions.ShowSettingsAction;
|
||||
@@ -23,16 +24,20 @@ import com.intellij.openapi.project.ProjectManager;
|
||||
import com.intellij.openapi.util.BuildNumber;
|
||||
import com.intellij.openapi.util.SystemInfo;
|
||||
import com.intellij.openapi.wm.IdeFocusManager;
|
||||
import com.intellij.ui.CustomProtocolHandler;
|
||||
import com.intellij.ui.mac.foundation.Foundation;
|
||||
import com.intellij.ui.mac.foundation.ID;
|
||||
import com.intellij.util.SmartList;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.sun.jna.Callback;
|
||||
import io.netty.handler.codec.http.QueryStringDecoder;
|
||||
|
||||
import javax.swing.*;
|
||||
import java.awt.*;
|
||||
import java.awt.event.MouseEvent;
|
||||
import java.io.File;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
public final class MacOSApplicationProvider {
|
||||
@@ -179,11 +184,33 @@ public final class MacOSApplicationProvider {
|
||||
ID mainBundle = Foundation.invoke("NSBundle", "mainBundle");
|
||||
ID urlTypes = Foundation.invoke(mainBundle, "objectForInfoDictionaryKey:", Foundation.nsString("CFBundleURLTypes"));
|
||||
if (!urlTypes.equals(ID.NIL)) {
|
||||
CustomProtocolHandler handler = new CustomProtocolHandler();
|
||||
Application.getApplication().setOpenURIHandler(new OpenURIHandler() {
|
||||
@Override
|
||||
public void openURI(AppEvent.OpenURIEvent event) {
|
||||
handler.openLink(event.getURI());
|
||||
Map<String, List<String>> parameters = new QueryStringDecoder(event.getURI()).parameters();
|
||||
String file = ContainerUtil.getFirstItem(parameters.get("file"));
|
||||
if (file != null) {
|
||||
if (LoadingState.COMPONENTS_LOADED.isOccurred()) {
|
||||
String line = ContainerUtil.getFirstItem(parameters.get("line"));
|
||||
String column = ContainerUtil.getFirstItem(parameters.get("column"));
|
||||
List<String> args = new SmartList<>();
|
||||
if (line != null) {
|
||||
args.add("--line");
|
||||
args.add(line);
|
||||
}
|
||||
if (column != null) {
|
||||
args.add("--column");
|
||||
args.add(column);
|
||||
}
|
||||
args.add(file);
|
||||
ApplicationManager.getApplication().invokeLater(
|
||||
() -> CommandLineProcessor.processExternalCommandLine(args, null),
|
||||
ModalityState.NON_MODAL);
|
||||
}
|
||||
else {
|
||||
ApplicationLoader.openFilesOnLoading(Collections.singletonList(new File(file)));
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
package com.intellij.ui;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import java.net.URI;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Dennis.Ushakov
|
||||
*/
|
||||
public class CustomProtocolHandlerTest extends TestCase {
|
||||
public void testOpenOurLink() throws URISyntaxException {
|
||||
final URI uri = new URI("x-mine://open?file=/Users/denofevil/RubymineProjects/JRubyRails/app/assets/javascripts/application.js.coffee&line=2");
|
||||
final List<String> args = new CustomProtocolHandler().getOpenArgs(uri);
|
||||
assertTrue(args.contains("--line"));
|
||||
assertTrue(args.contains("2"));
|
||||
assertTrue(args.contains("/Users/denofevil/RubymineProjects/JRubyRails/app/assets/javascripts/application.js.coffee"));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user