diff --git a/build.gradle b/build.gradle index 525624a4a..9889bfed6 100644 --- a/build.gradle +++ b/build.gradle @@ -129,6 +129,7 @@ dependencies { compile group: 'com.zestedesavoir.zmarkdown', name: 'java-zmarkdown', version: '2.6.0.17' compile group: 'com.fasterxml', name: 'jackson-module-json-org', version: '0.9.1' compile group: 'commons-io', name: 'commons-io', version: '2.5' + compile group: 'com.1stleg', name: 'jnativehook', version: '2.0.2' } test { diff --git a/src/main/java/com/zestedesavoir/zestwriter/MainApp.java b/src/main/java/com/zestedesavoir/zestwriter/MainApp.java index 252c32dfa..efd3ececc 100644 --- a/src/main/java/com/zestedesavoir/zestwriter/MainApp.java +++ b/src/main/java/com/zestedesavoir/zestwriter/MainApp.java @@ -7,6 +7,7 @@ import com.zestedesavoir.zestwriter.utils.Configuration; import com.zestedesavoir.zestwriter.utils.Markdown; import com.zestedesavoir.zestwriter.utils.ZdsHttp; +import com.zestedesavoir.zestwriter.view.KeyListener; import com.zestedesavoir.zestwriter.view.MdTextController; import com.zestedesavoir.zestwriter.view.MenuController; import com.zestedesavoir.zestwriter.view.com.CustomAlert; @@ -35,6 +36,8 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; +import org.jnativehook.GlobalScreen; +import org.jnativehook.NativeHookException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,6 +48,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; +import java.util.logging.Level; public class MainApp extends Application{ public static Configuration config; @@ -62,8 +66,10 @@ public class MainApp extends Application{ private PluginsManager pm; private static ContentsConfig contentsConfigPlugins; private static ContentsConfig contentsConfigThemes; - private static String[] args; - protected static File defaultHome; + public static String[] args; + public static File defaultHome; + public static KeyListener keyListener; + public MainApp() { super(); @@ -71,12 +77,26 @@ public MainApp() { initEnvVariable(); logger = LoggerFactory.getLogger(MainApp.class); + if(FunctionTreeFactory.isLinuxOs()){ + java.util.logging.Logger logger2 = java.util.logging.Logger.getLogger(GlobalScreen.class.getPackage().getName()); + logger2.setLevel(Level.OFF); + + try{ + GlobalScreen.registerNativeHook(); + keyListener = new KeyListener(); + GlobalScreen.addNativeKeyListener(keyListener); + }catch(NativeHookException e){ + logger.error("Error for initialize KeyListener", e); + } + } + logger.info("Version Java de l'utilisateur: " + System.getProperty("java.version")); logger.info("Architecture du système utilisateur: " + System.getProperty("os.arch")); logger.info("Nom du système utilisateur: " + System.getProperty("os.name")); logger.info("Version du système utilisateur: " + System.getProperty("os.version")); logger.info("Emplacement du fichier de log: " + System.getProperty("zw.logPath")); + if(args.length > 0) { config = new Configuration(args[0]); } else { @@ -105,13 +125,13 @@ private void initEnvVariable() { Path logDir; String appName = "zest-writer"; String os = System.getProperty("os.name").toLowerCase(); - if(os.indexOf("nix") >= 0 || os.indexOf("nux") >= 0 || os.indexOf("aix") >= 0) { + if(FunctionTreeFactory.isLinuxOs()) { logPath = Paths.get(System.getProperty("user.home"), ".config", appName, appName+".log"); logDir = logPath.getParent(); - } else if(os.indexOf("win") >= 0) { + } else if(FunctionTreeFactory.isWindowsOs()) { logPath = Paths.get(System.getProperty("user.home"), "AppData", "Local", appName, appName+".log"); logDir = logPath.getParent(); - } else if(os.indexOf("mac") >= 0) { + } else if(FunctionTreeFactory.isMacOs()) { logPath = Paths.get(System.getProperty("user.home"), "Library", "Application Support", appName, appName+".log"); logDir = logPath.getParent(); } else { diff --git a/src/main/java/com/zestedesavoir/zestwriter/view/KeyListener.java b/src/main/java/com/zestedesavoir/zestwriter/view/KeyListener.java new file mode 100644 index 000000000..c684d1399 --- /dev/null +++ b/src/main/java/com/zestedesavoir/zestwriter/view/KeyListener.java @@ -0,0 +1,109 @@ +package com.zestedesavoir.zestwriter.view; + +import com.zestedesavoir.zestwriter.view.com.CustomStyledClassedTextArea; +import javafx.application.Platform; +import org.apache.log4j.LogManager; +import org.apache.log4j.Logger; +import org.jnativehook.keyboard.NativeKeyEvent; +import org.jnativehook.keyboard.NativeKeyListener; + +/** + * Created by: WinXaito (Kevin Vuilleumier) + */ +public class KeyListener implements NativeKeyListener{ + private Logger logger = LogManager.getLogger(KeyListener.class); + private CustomStyledClassedTextArea sourceText; + + private boolean enable = false; + private boolean cirumflex = false; + private boolean trema; + + public KeyListener(){ + logger.debug("Initialize keyListener"); + } + + @Override + public void nativeKeyPressed(NativeKeyEvent e){ + if(sourceText != null && enable){ + logger.debug("Keypressed: " + e.getRawCode() + " -- " + e.getModifiers()); + + if(e.getRawCode() == 221){ + if(cirumflex){ + appendSpecialCharacter("^^"); + cirumflex = false; + }else{ + cirumflex = true; + trema = false; + } + }else if(e.getRawCode() == 192){ + if(trema){ + appendSpecialCharacter("¨¨"); + trema = false; + }else{ + trema = true; + cirumflex = false; + } + }else{ + switch(e.getRawCode()){ + case 69: //E + if(cirumflex) + appendSpecialCharacter("ê"); + else if(trema) + appendSpecialCharacter("ë"); + break; + case 65: //A + if(cirumflex) + appendSpecialCharacter("â"); + else if(trema) + appendSpecialCharacter("ä"); + break; + case 73: //I + if(cirumflex) + appendSpecialCharacter("î"); + else if(trema) + appendSpecialCharacter("ï"); + break; + case 79: //O + if(cirumflex) + appendSpecialCharacter("ô"); + else if(trema) + appendSpecialCharacter("ö"); + break; + case 85: //U + if(cirumflex) + appendSpecialCharacter("û"); + else if(trema) + appendSpecialCharacter("ü"); + break; + } + + cirumflex = false; + } + } + } + + @Override + public void nativeKeyReleased(NativeKeyEvent nativeKeyEvent){ + } + + @Override + public void nativeKeyTyped(NativeKeyEvent nativeKeyEvent){ + } + + public void setSourceText(CustomStyledClassedTextArea sourceText){ + this.sourceText = sourceText; + enable = true; + } + + public void setEnable(boolean enable){ + this.enable = enable; + } + + private void appendSpecialCharacter(String letter){ + logger.debug("Append special character (Linux Only): " + letter + " (Length: " + letter.length() + ")"); + Platform.runLater(() -> sourceText.deleteText(sourceText.getCaretPosition() - letter.length(), sourceText.getCaretPosition())); + Platform.runLater(() -> sourceText.appendText(letter)); + cirumflex = false; + trema = false; + } +} diff --git a/src/main/java/com/zestedesavoir/zestwriter/view/MdConvertController.java b/src/main/java/com/zestedesavoir/zestwriter/view/MdConvertController.java index 192ddc6b6..253e261ca 100644 --- a/src/main/java/com/zestedesavoir/zestwriter/view/MdConvertController.java +++ b/src/main/java/com/zestedesavoir/zestwriter/view/MdConvertController.java @@ -8,6 +8,7 @@ import com.zestedesavoir.zestwriter.utils.readability.Readability; import com.zestedesavoir.zestwriter.view.com.*; import com.zestedesavoir.zestwriter.view.dialogs.ImageInputDialog; +import com.ziclix.python.sql.pipe.Source; import javafx.application.Platform; import javafx.beans.property.BooleanPropertyBase; import javafx.beans.property.SimpleBooleanProperty; @@ -130,6 +131,14 @@ public void setMdBox(MdTextController mdBox, Textual extract, Tab tab) throws IO updateRender(); }); updateRender(); + + if(FunctionTreeFactory.isLinuxOs()){ + MainApp.keyListener.setSourceText(SourceText); + + SourceText.focusedProperty().addListener((observable, oldValue, newValue) -> { + MainApp.keyListener.setEnable(newValue); + }); + } }); EventHandlerHelper.install(SourceText.onKeyPressedProperty(), @@ -749,4 +758,8 @@ public int getHScrollValue(WebView view) { return 0; } } + + public void appendSourceText(String text){ + SourceText.appendText(text); + } } diff --git a/src/main/java/com/zestedesavoir/zestwriter/view/com/FunctionTreeFactory.java b/src/main/java/com/zestedesavoir/zestwriter/view/com/FunctionTreeFactory.java index 77c2c6565..c6c1040cb 100644 --- a/src/main/java/com/zestedesavoir/zestwriter/view/com/FunctionTreeFactory.java +++ b/src/main/java/com/zestedesavoir/zestwriter/view/com/FunctionTreeFactory.java @@ -37,9 +37,18 @@ import java.util.regex.Pattern; public class FunctionTreeFactory { - public static boolean isMacOs() { - return System.getProperty("os.name").toLowerCase().indexOf("mac") >= 0; + return System.getProperty("os.name").toLowerCase().contains("mac"); + } + + public static boolean isWindowsOs(){ + return System.getProperty("os.name").toLowerCase().contains("win"); + } + + public static boolean isLinuxOs(){ + return true; + /*String os = System.getProperty("os.name").toLowerCase(); + return os.contains("lin") || os.contains("nix") || os.contains("nux") || os.contains("aix") || os.contains("uni");*/ } public static Map initContentDialog(Content defaultContent) {