mirror of
https://github.com/hexedtech/codemp-intellij.git
synced 2024-11-21 22:54:48 +01:00
feat: bundle library, generate hash colors from name, misc cleanup
This commit is contained in:
parent
4e28c9a65a
commit
d85c4370f6
9 changed files with 131 additions and 75 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -47,5 +47,7 @@ Cargo.lock
|
||||||
.cargo
|
.cargo
|
||||||
target
|
target
|
||||||
|
|
||||||
# Do not inclue generated code
|
# Do not include generated code
|
||||||
src/main/java/com/codemp/intellij/jni
|
src/main/java/com/codemp/intellij/jni
|
||||||
|
src/main/resources/*.so
|
||||||
|
src/main/resources/*.dll
|
11
build.gradle
11
build.gradle
|
@ -1,6 +1,6 @@
|
||||||
plugins {
|
plugins {
|
||||||
id 'java'
|
id 'java'
|
||||||
id 'org.jetbrains.intellij' version '1.14.1'
|
id 'org.jetbrains.intellij' version '1.16.0'
|
||||||
}
|
}
|
||||||
|
|
||||||
group = "com.codemp"
|
group = "com.codemp"
|
||||||
|
@ -53,6 +53,15 @@ tasks.register('cargoBuild', Exec) {
|
||||||
|
|
||||||
compileJava.dependsOn cargoBuild
|
compileJava.dependsOn cargoBuild
|
||||||
|
|
||||||
|
tasks.register('copyBinary', Copy) {
|
||||||
|
from "target/debug"
|
||||||
|
into "src/main/resources"
|
||||||
|
include "*.so", "*.dll"
|
||||||
|
dependsOn cargoBuild
|
||||||
|
}
|
||||||
|
|
||||||
|
patchPluginXml.dependsOn copyBinary
|
||||||
|
|
||||||
tasks.register('deleteGeneratedNativeInterface', Delete) {
|
tasks.register('deleteGeneratedNativeInterface', Delete) {
|
||||||
delete 'src/main/java/com/codemp/intellij/jni'
|
delete 'src/main/java/com/codemp/intellij/jni'
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,27 @@
|
||||||
package com.codemp.intellij;
|
package com.codemp.intellij;
|
||||||
|
|
||||||
|
import com.intellij.openapi.util.SystemInfo;
|
||||||
|
import cz.adamh.utils.NativeUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
public class CodeMP {
|
public class CodeMP {
|
||||||
public static Logger LOGGER = LoggerFactory.getLogger(CodeMP.class);
|
public static Logger LOGGER = LoggerFactory.getLogger(CodeMP.class);
|
||||||
|
|
||||||
|
private static boolean loadedLibrary = false;
|
||||||
|
public static void loadLibrary() {
|
||||||
|
if(!loadedLibrary) {
|
||||||
|
try {
|
||||||
|
if(SystemInfo.isWindows) //TODO on win for some reason it bundles it twice
|
||||||
|
NativeUtils.loadLibraryFromJar("/codemp_intellij.dll");
|
||||||
|
else NativeUtils.loadLibraryFromJar("/libcodemp_intellij.so");
|
||||||
|
} catch(IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
} finally {
|
||||||
|
loadedLibrary = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -5,23 +5,11 @@ import com.codemp.intellij.jni.CodeMPHandler;
|
||||||
import com.intellij.openapi.actionSystem.AnAction;
|
import com.intellij.openapi.actionSystem.AnAction;
|
||||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||||
import com.intellij.openapi.ui.Messages;
|
import com.intellij.openapi.ui.Messages;
|
||||||
import cz.adamh.utils.NativeUtils;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
public class ConnectAction extends AnAction {
|
public class ConnectAction extends AnAction {
|
||||||
public ConnectAction() {
|
|
||||||
/*try {
|
|
||||||
NativeUtils.loadLibraryFromJar("/resources/libHelloJNI.so");
|
|
||||||
} catch(IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}*/
|
|
||||||
//System.load("/home/zaaarf/dev/irl/rust/codemp/client/intellij/target/debug/libcodemp_intellij.so");
|
|
||||||
System.load("O:/dev/IRL/Rust/codemp/client/intellij/target/debug/codemp_intellij.dll");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void connect(String url, boolean silent) throws Exception {
|
public static void connect(String url, boolean silent) throws Exception {
|
||||||
|
CodeMP.loadLibrary(); //will only load it the first time
|
||||||
CodeMPHandler.connect(url);
|
CodeMPHandler.connect(url);
|
||||||
if(!silent) Messages.showInfoMessage(String.format("Connected to %s!", url), "CodeMP");
|
if(!silent) Messages.showInfoMessage(String.format("Connected to %s!", url), "CodeMP");
|
||||||
CodeMP.LOGGER.debug("Connected to {}!", url);
|
CodeMP.LOGGER.debug("Connected to {}!", url);
|
||||||
|
|
|
@ -6,13 +6,13 @@ import com.codemp.intellij.jni.CursorEventWrapper;
|
||||||
import com.codemp.intellij.jni.CursorHandler;
|
import com.codemp.intellij.jni.CursorHandler;
|
||||||
import com.codemp.intellij.listeners.CursorEventListener;
|
import com.codemp.intellij.listeners.CursorEventListener;
|
||||||
import com.codemp.intellij.util.ActionUtil;
|
import com.codemp.intellij.util.ActionUtil;
|
||||||
|
import com.codemp.intellij.util.ColorUtil;
|
||||||
|
import com.intellij.openapi.Disposable;
|
||||||
import com.intellij.openapi.actionSystem.AnAction;
|
import com.intellij.openapi.actionSystem.AnAction;
|
||||||
import com.intellij.openapi.actionSystem.AnActionEvent;
|
import com.intellij.openapi.actionSystem.AnActionEvent;
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
import com.intellij.openapi.application.ApplicationManager;
|
||||||
import com.intellij.openapi.editor.Document;
|
|
||||||
import com.intellij.openapi.editor.Editor;
|
import com.intellij.openapi.editor.Editor;
|
||||||
import com.intellij.openapi.editor.EditorFactory;
|
import com.intellij.openapi.editor.EditorFactory;
|
||||||
import com.intellij.openapi.editor.colors.TextAttributesKey;
|
|
||||||
import com.intellij.openapi.editor.markup.HighlighterLayer;
|
import com.intellij.openapi.editor.markup.HighlighterLayer;
|
||||||
import com.intellij.openapi.editor.markup.HighlighterTargetArea;
|
import com.intellij.openapi.editor.markup.HighlighterTargetArea;
|
||||||
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
import com.intellij.openapi.editor.markup.RangeHighlighter;
|
||||||
|
@ -20,8 +20,8 @@ import com.intellij.openapi.editor.markup.TextAttributes;
|
||||||
import com.intellij.openapi.progress.ProgressIndicator;
|
import com.intellij.openapi.progress.ProgressIndicator;
|
||||||
import com.intellij.openapi.progress.ProgressManager;
|
import com.intellij.openapi.progress.ProgressManager;
|
||||||
import com.intellij.openapi.progress.Task;
|
import com.intellij.openapi.progress.Task;
|
||||||
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.ui.Messages;
|
import com.intellij.openapi.ui.Messages;
|
||||||
import com.intellij.ui.JBColor;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
|
@ -32,58 +32,26 @@ public class JoinAction extends AnAction {
|
||||||
|
|
||||||
private static final Map<String, RangeHighlighter> highlighterMap = new HashMap<>();
|
private static final Map<String, RangeHighlighter> highlighterMap = new HashMap<>();
|
||||||
|
|
||||||
private static final TextAttributes HIGHLIGHTED = new TextAttributes(
|
|
||||||
null, JBColor.BLUE, null, null, Font.PLAIN
|
|
||||||
);
|
|
||||||
|
|
||||||
public static void join(AnActionEvent e, String session, boolean silent) throws Exception {
|
public static void join(AnActionEvent e, String session, boolean silent) throws Exception {
|
||||||
CursorHandler cursorHandler = CodeMPHandler.join(session);
|
CursorHandler cursorHandler = CodeMPHandler.join(session);
|
||||||
EditorFactory.getInstance()
|
|
||||||
.getEventMulticaster()
|
|
||||||
.addCaretListener(new CursorEventListener());
|
|
||||||
|
|
||||||
if(!silent) Messages.showInfoMessage(String.format("Joined session %s!", session), "CodeMP");
|
if(!silent) Messages.showInfoMessage(String.format("Joined session %s!", session), "CodeMP");
|
||||||
else CodeMP.LOGGER.debug("Joined session {}!", session);
|
else CodeMP.LOGGER.debug("Joined session {}!", session);
|
||||||
|
|
||||||
Editor editor = ActionUtil.getCurrentEditor(e);
|
Editor editor = ActionUtil.getCurrentEditor(e);
|
||||||
Document document = editor.getDocument();
|
|
||||||
ProgressManager.getInstance().run(new Task.Backgroundable(e.getProject(), "Awaiting CodeMP cursor events") {
|
|
||||||
@Override
|
|
||||||
public void run(@NotNull ProgressIndicator indicator) {
|
|
||||||
while(true) {
|
|
||||||
try {
|
|
||||||
CursorEventWrapper event = cursorHandler.recv();
|
|
||||||
ApplicationManager.getApplication().invokeLater(() -> {
|
|
||||||
try {
|
|
||||||
RangeHighlighter h = highlighterMap.get(event.getUser());
|
|
||||||
if(h != null)
|
|
||||||
h.dispose();
|
|
||||||
|
|
||||||
CodeMP.LOGGER.debug(
|
CursorEventAwaiter task = new CursorEventAwaiter(
|
||||||
"Cursor moved by user {}! Start pos: {}x {}y; end pos: {}x {}y with buffer {}!",
|
e.getProject(),
|
||||||
event.getUser(),
|
"Awaiting CodeMP cursor events",
|
||||||
event.getStartCol(), event.getStartCol(),
|
cursorHandler,
|
||||||
event.getEndRow(), event.getEndCol(),
|
editor
|
||||||
event.getBuffer());
|
);
|
||||||
|
|
||||||
highlighterMap.put(event.getUser(), editor
|
EditorFactory.getInstance()
|
||||||
.getMarkupModel()
|
.getEventMulticaster()
|
||||||
.addRangeHighlighter(TextAttributesKey.createTextAttributesKey("codemp", HIGHLIGHTED),
|
.addCaretListener(new CursorEventListener(), task);
|
||||||
document.getLineStartOffset(event.getStartRow()) + event.getStartCol(),
|
|
||||||
document.getLineStartOffset(event.getEndRow()) + event.getEndCol(),
|
ProgressManager.getInstance().run(task);
|
||||||
HighlighterLayer.SELECTION,
|
|
||||||
HighlighterTargetArea.EXACT_RANGE
|
|
||||||
));
|
|
||||||
} catch(Exception ex) {
|
|
||||||
throw new RuntimeException();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
} catch(Exception ex) {
|
|
||||||
throw new RuntimeException(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -103,4 +71,64 @@ public class JoinAction extends AnAction {
|
||||||
"CodeMP Join");
|
"CodeMP Join");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO this is janky as it shows a progress bar it doesn't use tbh
|
||||||
|
//implements disposable so i can use it as lifetime ig
|
||||||
|
private static class CursorEventAwaiter extends Task.Backgroundable implements Disposable {
|
||||||
|
|
||||||
|
private final CursorHandler handler;
|
||||||
|
private final Editor editor;
|
||||||
|
|
||||||
|
public CursorEventAwaiter(Project project, String title, CursorHandler handler, Editor editor) {
|
||||||
|
super(project, title);
|
||||||
|
this.handler = handler;
|
||||||
|
this.editor = editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void dispose() {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@SuppressWarnings("InfiniteLoopStatement")
|
||||||
|
public void run(@NotNull ProgressIndicator indicator) {
|
||||||
|
while(true) {
|
||||||
|
try {
|
||||||
|
CursorEventWrapper event = handler.recv();
|
||||||
|
ApplicationManager.getApplication().invokeLater(() -> {
|
||||||
|
try {
|
||||||
|
RangeHighlighter highlighter = highlighterMap.get(event.getUser());
|
||||||
|
if(highlighter != null)
|
||||||
|
highlighter.dispose();
|
||||||
|
|
||||||
|
CodeMP.LOGGER.debug(
|
||||||
|
"Cursor moved by user {}! Start pos: {}x {}y; end pos: {}x {}y with buffer {}!",
|
||||||
|
event.getUser(),
|
||||||
|
event.getStartCol(), event.getStartCol(),
|
||||||
|
event.getEndRow(), event.getEndCol(),
|
||||||
|
event.getBuffer());
|
||||||
|
|
||||||
|
highlighterMap.put(event.getUser(), this.editor
|
||||||
|
.getMarkupModel()
|
||||||
|
.addRangeHighlighter(
|
||||||
|
this.editor.getDocument().getLineStartOffset(event.getStartRow()) + event.getStartCol(),
|
||||||
|
this.editor.getDocument().getLineStartOffset(event.getEndRow()) + event.getEndCol(),
|
||||||
|
HighlighterLayer.SELECTION,
|
||||||
|
new TextAttributes(
|
||||||
|
null,
|
||||||
|
ColorUtil.colorFromUsername(event.getUser()),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
Font.PLAIN
|
||||||
|
), HighlighterTargetArea.EXACT_RANGE
|
||||||
|
));
|
||||||
|
} catch(Exception ex) {
|
||||||
|
throw new RuntimeException();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch(Exception ex) {
|
||||||
|
throw new RuntimeException(ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ public class BufferAttachAction extends AnAction {
|
||||||
|
|
||||||
ProgressManager.getInstance().run(new Task.Backgroundable(e.getProject(), "Awaiting CodeMP buffer events") {
|
ProgressManager.getInstance().run(new Task.Backgroundable(e.getProject(), "Awaiting CodeMP buffer events") {
|
||||||
@Override
|
@Override
|
||||||
|
@SuppressWarnings({"InfiniteLoopStatement", "UnstableApiUsage"})
|
||||||
public void run(@NotNull ProgressIndicator indicator) {
|
public void run(@NotNull ProgressIndicator indicator) {
|
||||||
while(true) {
|
while(true) {
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -27,11 +27,3 @@ public class BufferEventListener implements DocumentListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
ABCD
|
|
||||||
ABAACD
|
|
||||||
|
|
||||||
getOffset() -> B + 1
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
19
src/main/java/com/codemp/intellij/util/ColorUtil.java
Normal file
19
src/main/java/com/codemp/intellij/util/ColorUtil.java
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package com.codemp.intellij.util;
|
||||||
|
|
||||||
|
import com.intellij.ui.JBColor;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
|
||||||
|
public class ColorUtil {
|
||||||
|
public static JBColor colorFromUsername(String username) {
|
||||||
|
int hash = username.hashCode();
|
||||||
|
|
||||||
|
Color hashColor = Color.decode( //Integer.toHexString(((hash >> 24) & 0xFF)) +
|
||||||
|
Integer.toHexString(((hash >> 16) & 0xFF)) +
|
||||||
|
Integer.toHexString(((hash >> 8) & 0xFF)) +
|
||||||
|
Integer.toHexString((hash & 0xFF))
|
||||||
|
);
|
||||||
|
|
||||||
|
return new JBColor(hashColor, hashColor.darker());
|
||||||
|
}
|
||||||
|
}
|
|
@ -40,10 +40,8 @@
|
||||||
</group>
|
</group>
|
||||||
</actions>
|
</actions>
|
||||||
|
|
||||||
<!-- Extension points defined by the plugin.
|
|
||||||
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -
|
|
||||||
<extensions defaultExtensionNs="com.intellij">
|
<extensions defaultExtensionNs="com.intellij">
|
||||||
|
<!-- Extension points defined by the plugin.
|
||||||
|
Read more: https://plugins.jetbrains.com/docs/intellij/plugin-extension-points.html -->
|
||||||
</extensions>
|
</extensions>
|
||||||
</idea-plugin>
|
</idea-plugin>
|
||||||
->
|
|
Loading…
Reference in a new issue