diff --git a/src/main/java/alg/XML_processing.java b/src/main/java/alg/XML_processing.java index c393fad..c1ea422 100755 --- a/src/main/java/alg/XML_processing.java +++ b/src/main/java/alg/XML_processing.java @@ -15,6 +15,7 @@ import javax.xml.stream.XMLStreamException; import javax.xml.stream.events.*; import gui.I18N; +import javafx.beans.InvalidationListener; import javafx.beans.property.ReadOnlyDoubleProperty; import javafx.beans.property.ReadOnlyDoubleWrapper; import javafx.concurrent.Task; @@ -34,6 +35,7 @@ public class XML_processing { public static boolean isCancelled = false; public static Date startTime = new Date(); public static boolean isCollocability = false; + public static InvalidationListener progressBarListener; public double getProgress() { return progressProperty().get(); diff --git a/src/main/java/data/CorpusType.java b/src/main/java/data/CorpusType.java index e14c4df..811d024 100755 --- a/src/main/java/data/CorpusType.java +++ b/src/main/java/data/CorpusType.java @@ -1,5 +1,8 @@ package data; +import java.util.ArrayList; +import java.util.Arrays; + public enum CorpusType { GIGAFIDA("Gigafida", "gigafida"), GIGAFIDA2("Gigafida2.0", "gigafida2.0"), @@ -25,4 +28,8 @@ public enum CorpusType { public String getNameLowerCase() { return nameLowerCase; } + + public static ArrayList multipleFilesCorpuses() { + return new ArrayList<>(Arrays.asList(new CorpusType[]{GIGAFIDA, GIGAFIDA2, CCKRES})); + } } diff --git a/src/main/java/gui/CharacterAnalysisTab.java b/src/main/java/gui/CharacterAnalysisTab.java index c286bad..5453846 100755 --- a/src/main/java/gui/CharacterAnalysisTab.java +++ b/src/main/java/gui/CharacterAnalysisTab.java @@ -162,7 +162,6 @@ public class CharacterAnalysisTab { private boolean useDb; private HostServices hostService; private ListChangeListener taxonomyListener; - private InvalidationListener progressBarListener; private static final String [] N_GRAM_COMPUTE_FOR_LETTERS_ARRAY = {"calculateFor.WORD", "calculateFor.LEMMA"}; private static final ArrayList N_GRAM_COMPUTE_FOR_LETTERS = new ArrayList<>(Arrays.asList(N_GRAM_COMPUTE_FOR_LETTERS_ARRAY)); @@ -637,13 +636,13 @@ public class CharacterAnalysisTab { logger.info("Started execution: ", statistic.getFilter()); Collection corpusFiles = statistic.getCorpus().getDetectedCorpusFiles(); - boolean corpusIsSplit = corpusFiles.size() > 1; final Task task = new Task() { @SuppressWarnings("Duplicates") @Override protected Void call() throws Exception { - if(corpusFiles.size() > 1){ + final boolean multipleFiles = CorpusType.multipleFilesCorpuses().contains(statistic.getCorpus().getCorpusType()); + if(multipleFiles){ cancel.setVisible(true); } int i = 0; @@ -654,12 +653,16 @@ public class CharacterAnalysisTab { for (File f : corpusFiles) { final int iFinal = i; XML_processing xml_processing = new XML_processing(); + xml_processing.isCancelled = false; i++; if (isCancelled()) { updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } - if (corpusFiles.size() > 1) { + if(xml_processing.progressBarListener != null) { + xml_processing.progressProperty().removeListener(xml_processing.progressBarListener); + } + if (multipleFiles) { if ((new Date()).getTime() - previousTime.getTime() > 500 || remainingSeconds == -1){ remainingSeconds = (int) (((new Date()).getTime() - startTime.getTime()) * (1.0/i) * (corpusFiles.size() - i) / 1000); previousTime = new Date(); @@ -667,11 +670,8 @@ public class CharacterAnalysisTab { this.updateProgress(i, corpusFiles.size()); this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName(), remainingSeconds)); } else { - if(progressBarListener != null) { - xml_processing.progressProperty().removeListener(progressBarListener); - } - progressBarListener = new InvalidationListener() { + xml_processing.progressBarListener = new InvalidationListener() { int remainingSeconds = -1; Date previousTime = new Date(); @Override @@ -692,7 +692,7 @@ public class CharacterAnalysisTab { // this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName(), remainingSeconds)); - xml_processing.progressProperty().addListener(progressBarListener); + xml_processing.progressProperty().addListener(xml_processing.progressBarListener); // xml_processing.progressProperty().addListener((obs, oldProgress, newProgress) -> // updateProgress((iFinal * 100) + newProgress.doubleValue(), corpusFiles.size() * 100)); diff --git a/src/main/java/gui/CorpusTab.java b/src/main/java/gui/CorpusTab.java index 73e4ed7..62cc2cd 100755 --- a/src/main/java/gui/CorpusTab.java +++ b/src/main/java/gui/CorpusTab.java @@ -7,9 +7,12 @@ import static util.Util.*; import java.io.File; import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; import java.util.*; import javafx.scene.layout.AnchorPane; +import javafx.util.Duration; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOCase; import org.apache.commons.io.LineIterator; @@ -96,8 +99,44 @@ public class CorpusTab { private String corpusLocation; private String corpusFilesSize; + /** + * Hack allowing to modify the default behavior of the tooltips. + * @param openDelay The open delay, knowing that by default it is set to 1000. + * @param visibleDuration The visible duration, knowing that by default it is set to 5000. + * @param closeDelay The close delay, knowing that by default it is set to 200. + * @param hideOnExit Indicates whether the tooltip should be hide on exit, + * knowing that by default it is set to false. + */ + private static void updateTooltipBehavior(double openDelay, double visibleDuration, + double closeDelay, boolean hideOnExit) { + try { + // Get the non public field "BEHAVIOR" + Field fieldBehavior = Tooltip.class.getDeclaredField("BEHAVIOR"); + // Make the field accessible to be able to get and set its value + fieldBehavior.setAccessible(true); + // Get the value of the static field + Object objBehavior = fieldBehavior.get(null); + // Get the constructor of the private static inner class TooltipBehavior + Constructor constructor = objBehavior.getClass().getDeclaredConstructor( + Duration.class, Duration.class, Duration.class, boolean.class + ); + // Make the constructor accessible to be able to invoke it + constructor.setAccessible(true); + // Create a new instance of the private static inner class TooltipBehavior + Object tooltipBehavior = constructor.newInstance( + new Duration(openDelay), new Duration(visibleDuration), + new Duration(closeDelay), hideOnExit + ); + // Set the new instance of TooltipBehavior + fieldBehavior.set(null, tooltipBehavior); + } catch (Exception e) { + throw new IllegalStateException(e); + } + } public void initialize() { + updateTooltipBehavior(0.0, 30000.0,0.0, true); + // add CSS style corpusTabPane.getStylesheets().add("style.css"); corpusTabPane.getStyleClass().add("root"); diff --git a/src/main/java/gui/OneWordAnalysisTab.java b/src/main/java/gui/OneWordAnalysisTab.java index 1665177..f4a9b64 100755 --- a/src/main/java/gui/OneWordAnalysisTab.java +++ b/src/main/java/gui/OneWordAnalysisTab.java @@ -158,7 +158,6 @@ public class OneWordAnalysisTab { private ListChangeListener taxonomyListener; private ListChangeListener alsoVisualizeListener; private ChangeListener calculateForListener; - private InvalidationListener progressBarListener; // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka"); // private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); @@ -742,7 +741,8 @@ public class OneWordAnalysisTab { @SuppressWarnings("Duplicates") @Override protected Void call() throws Exception { - if(corpusFiles.size() > 1){ + final boolean multipleFiles = CorpusType.multipleFilesCorpuses().contains(statistic.getCorpus().getCorpusType()); + if(multipleFiles){ cancel.setVisible(true); } int i = 0; @@ -752,8 +752,12 @@ public class OneWordAnalysisTab { for (File f : corpusFiles) { final int iFinal = i; XML_processing xml_processing = new XML_processing(); + xml_processing.isCancelled = false; i++; - if (corpusFiles.size() > 1) { + if(xml_processing.progressBarListener != null) { + xml_processing.progressProperty().removeListener(xml_processing.progressBarListener); + } + if (multipleFiles) { if ((new Date()).getTime() - previousTime.getTime() > 500 || remainingSeconds == -1){ remainingSeconds = (int) (((new Date()).getTime() - startTime.getTime()) * (1.0/i) * (corpusFiles.size() - i) / 1000); previousTime = new Date(); @@ -765,11 +769,8 @@ public class OneWordAnalysisTab { // break; // } } else { - if(progressBarListener != null) { - xml_processing.progressProperty().removeListener(progressBarListener); - } - progressBarListener = new InvalidationListener() { + xml_processing.progressBarListener = new InvalidationListener() { int remainingSeconds = -1; Date previousTime = new Date(); @Override @@ -787,7 +788,7 @@ public class OneWordAnalysisTab { } }; - xml_processing.progressProperty().addListener(progressBarListener); + xml_processing.progressProperty().addListener(xml_processing.progressBarListener); } xml_processing.readXML(f.toString(), statistic); if (isCancelled()) { diff --git a/src/main/java/gui/StringAnalysisTabNew2.java b/src/main/java/gui/StringAnalysisTabNew2.java index 4e7ed97..47bab95 100755 --- a/src/main/java/gui/StringAnalysisTabNew2.java +++ b/src/main/java/gui/StringAnalysisTabNew2.java @@ -207,7 +207,6 @@ public class StringAnalysisTabNew2 { private ListChangeListener alsoVisualizeListener; private ListChangeListener collocabilityListener; private ChangeListener calculateForListener; - private InvalidationListener progressBarListener; // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica", "oblikoskladenjska oznaka"); // private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); @@ -917,7 +916,8 @@ public class StringAnalysisTabNew2 { @SuppressWarnings("Duplicates") @Override protected Void call() throws Exception { - if(corpusFiles.size() > 1){ + final boolean multipleFiles = CorpusType.multipleFilesCorpuses().contains(statistic.getCorpus().getCorpusType()); + if(multipleFiles){ cancel.setVisible(true); } int i = corpusFiles.size(); @@ -934,7 +934,10 @@ public class StringAnalysisTabNew2 { final int iFinal = i; XML_processing xml_processing = new XML_processing(); i++; - if (corpusFiles.size() > 1) { + if(xml_processing.progressBarListener != null) { + xml_processing.progressProperty().removeListener(xml_processing.progressBarListener); + } + if (multipleFiles) { if ((new Date()).getTime() - previousTime.getTime() > 500 || remainingSeconds == -1){ remainingSeconds = (int) (((new Date()).getTime() - startTime.getTime()) * (1.0/i) * (corpusSize - i) / 1000); previousTime = new Date(); @@ -946,11 +949,7 @@ public class StringAnalysisTabNew2 { // break; // } } else { - if(progressBarListener != null) { - xml_processing.progressProperty().removeListener(progressBarListener); - } - - progressBarListener = new InvalidationListener() { + xml_processing.progressBarListener = new InvalidationListener() { int remainingSeconds = -1; Date previousTime = new Date(); @Override @@ -972,7 +971,7 @@ public class StringAnalysisTabNew2 { } }; - xml_processing.progressProperty().addListener(progressBarListener); + xml_processing.progressProperty().addListener(xml_processing.progressBarListener); } xml_processing.isCollocability = true; xml_processing.readXML(f.toString(), statisticsOneGrams); @@ -1078,7 +1077,8 @@ public class StringAnalysisTabNew2 { @SuppressWarnings("Duplicates") @Override protected Void call() throws Exception { - if(corpusFiles.size() > 1){ + final boolean multipleFiles = CorpusType.multipleFilesCorpuses().contains(statistic.getCorpus().getCorpusType()); + if(multipleFiles){ cancel.setVisible(true); } int i = 0; @@ -1094,8 +1094,12 @@ public class StringAnalysisTabNew2 { for (File f : corpusFiles) { final int iFinal = i; XML_processing xml_processing = new XML_processing(); + xml_processing.isCancelled = false; i++; - if (corpusFiles.size() > 1) { + if(xml_processing.progressBarListener != null) { + xml_processing.progressProperty().removeListener(xml_processing.progressBarListener); + } + if (multipleFiles) { if ((new Date()).getTime() - previousTime.getTime() > 500 || remainingSeconds == -1){ remainingSeconds = (int) (((new Date()).getTime() - startTime.getTime()) * (1.0/i) * (corpusSize - i) / 1000); previousTime = new Date(); @@ -1107,11 +1111,7 @@ public class StringAnalysisTabNew2 { // break; // } } else { - if(progressBarListener != null) { - xml_processing.progressProperty().removeListener(progressBarListener); - } - - progressBarListener = new InvalidationListener() { + xml_processing.progressBarListener = new InvalidationListener() { int remainingSeconds = -1; Date previousTime = new Date(); @Override @@ -1133,14 +1133,14 @@ public class StringAnalysisTabNew2 { } }; - xml_processing.progressProperty().addListener(progressBarListener); + xml_processing.progressProperty().addListener(xml_processing.progressBarListener); } xml_processing.readXML(f.toString(), statistic); if (isCancelled()) { updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } - if(!(corpusFiles.size() > 1)){ + if(!(multipleFiles)){ cancel.setVisible(false); } // readXML(f.toString(), statistic); diff --git a/src/main/java/gui/WordLevelTab.java b/src/main/java/gui/WordLevelTab.java index d276e03..34b14cd 100755 --- a/src/main/java/gui/WordLevelTab.java +++ b/src/main/java/gui/WordLevelTab.java @@ -198,7 +198,6 @@ public class WordLevelTab { private ListChangeListener taxonomyListener; private ListChangeListener alsoVisualizeListener; private ChangeListener calculateForListener; - private InvalidationListener progressBarListener; // private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS = FXCollections.observableArrayList("lema", "različnica"); // private static final ObservableList N_GRAM_COMPUTE_FOR_LETTERS = FXCollections.observableArrayList("lema", "različnica"); @@ -890,7 +889,8 @@ public class WordLevelTab { @SuppressWarnings("Duplicates") @Override protected Void call() throws Exception { - if(corpusFiles.size() > 1){ + final boolean multipleFiles = CorpusType.multipleFilesCorpuses().contains(statistic.getCorpus().getCorpusType()); + if(multipleFiles){ cancel.setVisible(true); } int i = 0; @@ -900,24 +900,24 @@ public class WordLevelTab { for (File f : corpusFiles) { final int iFinal = i; XML_processing xml_processing = new XML_processing(); + xml_processing.isCancelled = false; i++; if (isCancelled()) { updateMessage(I18N.get("message.CANCELING_NOTIFICATION")); break; } - if (corpusFiles.size() > 1) { - if ((new Date()).getTime() - previousTime.getTime() > 500 || remainingSeconds == -1){ - remainingSeconds = (int) (((new Date()).getTime() - startTime.getTime()) * (1.0/i) * (corpusFiles.size() - i) / 1000); - previousTime = new Date(); - } - this.updateProgress(i, corpusFiles.size()); - this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName(), remainingSeconds)); - } else { - if(progressBarListener != null) { - xml_processing.progressProperty().removeListener(progressBarListener); - } - - progressBarListener = new InvalidationListener() { + if(xml_processing.progressBarListener != null) { + xml_processing.progressProperty().removeListener(xml_processing.progressBarListener); + } + if (multipleFiles) { + if ((new Date()).getTime() - previousTime.getTime() > 500 || remainingSeconds == -1){ + remainingSeconds = (int) (((new Date()).getTime() - startTime.getTime()) * (1.0/i) * (corpusFiles.size() - i) / 1000); + previousTime = new Date(); + } + this.updateProgress(i, corpusFiles.size()); + this.updateMessage(String.format(I18N.get("message.ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y"), i, corpusFiles.size(), f.getName(), remainingSeconds)); + } else { + xml_processing.progressBarListener = new InvalidationListener() { int remainingSeconds = -1; Date previousTime = new Date(); @Override @@ -935,7 +935,7 @@ public class WordLevelTab { } }; - xml_processing.progressProperty().addListener(progressBarListener); + xml_processing.progressProperty().addListener(xml_processing.progressBarListener); } xml_processing.readXML(f.toString(), statistic); if (isCancelled()) { diff --git a/src/main/resources/gui/CharacterAnalysisTab.fxml b/src/main/resources/gui/CharacterAnalysisTab.fxml index 8e7d155..ea7ef7e 100755 --- a/src/main/resources/gui/CharacterAnalysisTab.fxml +++ b/src/main/resources/gui/CharacterAnalysisTab.fxml @@ -16,11 +16,18 @@ + +