diff --git a/src/main/java/data/StatisticsNew.java b/src/main/java/data/StatisticsNew.java index 4e93e7c..618f85d 100644 --- a/src/main/java/data/StatisticsNew.java +++ b/src/main/java/data/StatisticsNew.java @@ -352,11 +352,13 @@ public class StatisticsNew { // n.gram nivo if (ngramLevel > 1) { info.put("n-gram nivo:", String.valueOf(ngramLevel)); - } else if (ngramLevel == 1){ - info.put("n-gram nivo:", "nivo besed"); - } else { - info.put("n-gram nivo:", "nivo črk"); } + +// else if (ngramLevel == 1){ +// info.put("n-gram nivo:", "nivo besed"); +// } else { +// info.put("n-gram nivo:", "nivo črk"); +// } // skip if (ngramLevel > 1) info.put("Skip:", isNotEmpty(filter.getSkipValue()) ? filter.getSkipValue().toString() : "0"); @@ -382,15 +384,15 @@ public class StatisticsNew { } - if (isNotEmpty(filter.getTaxonomy()) && Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { - ArrayList tax = Tax.getTaxonomyForInfo(corpus.getCorpusType(), filter.getTaxonomy()); - - info.put("Taksonomija: ", ""); - String sep = ""; - for (String s : tax) { - info.put(sep = sep + " ", s); - } - } +// if (isNotEmpty(filter.getTaxonomy()) && Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { +// ArrayList tax = Tax.getTaxonomyForInfo(corpus.getCorpusType(), filter.getTaxonomy()); +// +// info.put("Taksonomija: ", ""); +// String sep = ""; +// for (String s : tax) { +// info.put(sep = sep + " ", s); +// } +// } if (corpus.getCorpusType() == CorpusType.SOLAR) { HashMap> filters = corpus.getSolarFilters(); diff --git a/src/main/java/gui/GUIController.java b/src/main/java/gui/GUIController.java index 4bd6a33..b3bee99 100644 --- a/src/main/java/gui/GUIController.java +++ b/src/main/java/gui/GUIController.java @@ -109,6 +109,8 @@ public class GUIController extends Application { ctController.setFfsController(ffsController); //ctController.setWordFormationTab(wordFormationTab); ctController.setWordLevelTab(wordLevelTab); + //System.out.println(com.sun.javafx.runtime.VersionInfo.getRuntimeVersion()); + ctController.setHostServices(getHostServices()); satNew2Controller.setCorpus(corpus); diff --git a/src/main/java/gui/Messages.java b/src/main/java/gui/Messages.java index f26d937..2df16ad 100644 --- a/src/main/java/gui/Messages.java +++ b/src/main/java/gui/Messages.java @@ -35,9 +35,11 @@ public class Messages { public static final String NOTIFICATION_ANALYSIS_COMPLETED = "Analiza je zaključena, rezultati so shranjeni."; public static final String NOTIFICATION_ANALYSIS_COMPLETED_NO_RESULTS = "Analiza je zaključena, vendar ni bilo moč izračunati statistike, ki bi ustrezala vsem navedenim pogojem."; public static final String RESULTS_PATH_SET_TO_DEFAULT = "Lokacija za shranjevanje rezultatov je nastavljena na lokacijo korpusa."; + public static final String NOTIFICATION_ANALYSIS_CANCLED = "Analiziranje je bilo prekinjeno."; // ongoing notifications - displayed while processing, dynamically changing public static final String ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y = "Analiziram datoteko %d od %d (%s)"; + public static final String CANCELING_NOTIFICATION = "Prekinjeno"; // Labels public static final String LABEL_CORPUS_LOCATION_NOT_SET = "Lokacija korpusa ni nastavljena"; diff --git a/src/main/java/gui/OneWordAnalysisTab.java b/src/main/java/gui/OneWordAnalysisTab.java index 44c3e79..2f7572d 100755 --- a/src/main/java/gui/OneWordAnalysisTab.java +++ b/src/main/java/gui/OneWordAnalysisTab.java @@ -37,6 +37,10 @@ public class OneWordAnalysisTab { private ArrayList msd; private ArrayList msdStrings; + @FXML + private CheckComboBox alsoVisualizeCCB; + private ArrayList alsoVisualize; + @FXML private CheckComboBox taxonomyCCB; private ArrayList taxonomy; @@ -49,6 +53,9 @@ public class OneWordAnalysisTab { @FXML private Button computeNgramsB; + @FXML + private Button cancel; + @FXML public ProgressBar ngramProgressBar; @FXML @@ -73,7 +80,8 @@ public class OneWordAnalysisTab { 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"); private static final ObservableList N_GRAM_COMPUTE_FOR_WORDS_ORTH = FXCollections.observableArrayList("različnica"); - + private static final ObservableList alsoVisualizeItemsLemma = FXCollections.observableArrayList("besedna vrsta", "oblikoskladenjska oznaka"); + private static final ObservableList alsoVisualizeItemsDifferential = FXCollections.observableArrayList("lema", "besedna vrsta", "oblikoskladenjska oznaka"); // TODO: pass observables for taxonomy based on header scan // after header scan @@ -126,6 +134,16 @@ public class OneWordAnalysisTab { msdTF.setText(""); msd = new ArrayList<>(); + alsoVisualizeCCB.getItems().removeAll(); + alsoVisualizeCCB.getItems().setAll(alsoVisualizeItemsLemma); + alsoVisualizeCCB.getCheckModel().getCheckedItems().addListener((ListChangeListener) c -> { + alsoVisualize = new ArrayList<>(); + ObservableList checkedItems = alsoVisualizeCCB.getCheckModel().getCheckedItems(); + alsoVisualize.addAll(checkedItems); + logger.info(String.format("Selected also visualize items: %s", StringUtils.join(checkedItems, ","))); + }); + alsoVisualizeCCB.getCheckModel().clearChecks(); + // taxonomy if (Tax.getCorpusTypesWithTaxonomy().contains(corpus.getCorpusType())) { taxonomyCCB.getItems().removeAll(); @@ -334,6 +352,10 @@ public class OneWordAnalysisTab { for (File f : corpusFiles) { readXML(f.toString(), statistic); i++; + if (isCancelled()) { + updateMessage(CANCELING_NOTIFICATION); + break; + } this.updateProgress(i, corpusFiles.size()); this.updateMessage(String.format(ONGOING_NOTIFICATION_ANALYZING_FILE_X_OF_Y, i, corpusFiles.size(), f.getName())); } @@ -374,6 +396,21 @@ public class OneWordAnalysisTab { progressLabel.setText(""); }); + task.setOnCancelled(e -> { + showAlert(Alert.AlertType.INFORMATION, Messages.NOTIFICATION_ANALYSIS_CANCLED); + ngramProgressBar.progressProperty().unbind(); + ngramProgressBar.setProgress(0.0); + ngramProgressBar.setStyle(Settings.FX_ACCENT_OK); + progressLabel.textProperty().unbind(); + progressLabel.setText(""); + }); + + // When cancel button is pressed cancel analysis + cancel.setOnAction(e -> { + task.cancel(); + logger.info("cancel button"); + }); + final Thread thread = new Thread(task, "task"); thread.setDaemon(true); thread.start(); diff --git a/src/main/java/gui/ValidationUtil.java b/src/main/java/gui/ValidationUtil.java index 9a2cdfc..44416fa 100644 --- a/src/main/java/gui/ValidationUtil.java +++ b/src/main/java/gui/ValidationUtil.java @@ -9,7 +9,8 @@ import org.apache.commons.lang3.math.NumberUtils; public class ValidationUtil { public static boolean isNumber(String value) { - return NumberUtils.isCreatable(value); + //return NumberUtils.isCreatable(value); + return NumberUtils.isNumber(value); } /** diff --git a/src/main/java/util/Export.java b/src/main/java/util/Export.java index f11c656..9b5e3be 100644 --- a/src/main/java/util/Export.java +++ b/src/main/java/util/Export.java @@ -55,9 +55,35 @@ public class Export { public static String SetToCSV(Set>> set, File resultsPath, LinkedHashMap headerInfoBlock) { //Delimiter used in CSV file String NEW_LINE_SEPARATOR = "\n"; + Object[] FILE_HEADER; + + //Count frequencies + int num_frequencies = 0; + for (Pair> p : set) { + Map map = p.getRight(); + for (Map.Entry e : map.entrySet()) { + num_frequencies += e.getValue(); + } + } + //CSV file header - Object[] FILE_HEADER = {"word", "frequency", "percent"}; + if (headerInfoBlock.containsKey("Analiza") && headerInfoBlock.get("Analiza").equals("Besede")) { + if (headerInfoBlock.containsKey("Izračunaj za:") && headerInfoBlock.get("Izračunaj za:").equals("različnica")) { + headerInfoBlock.put("Skupna vsota vseh različnic:", String.valueOf(num_frequencies)); + FILE_HEADER = new Object[]{"Različnica", "Skupna absolutna pogostost", "Delež glede na vse različnice"}; + } else if (headerInfoBlock.containsKey("Izračunaj za:") && headerInfoBlock.get("Izračunaj za:").equals("lema")) { + headerInfoBlock.put("Skupna vsota vseh lem:", String.valueOf(num_frequencies)); + FILE_HEADER = new Object[]{"Lema", "Skupna absolutna pogostost", "Delež glede na vse leme"}; + } else if (headerInfoBlock.containsKey("Izračunaj za:") && headerInfoBlock.get("Izračunaj za:").equals("oblikoskladenjska oznaka")) { + headerInfoBlock.put("Skupna vsota vseh oblikoskladenjskih oznak:", String.valueOf(num_frequencies)); + FILE_HEADER = new Object[]{"Oblikoskladenjska oznaka", "Skupna absolutna pogostost", "Delež glede na vse oblikoskladenjske oznake"}; + } else { + headerInfoBlock.put("Skupna vsota vseh različnic:", String.valueOf(num_frequencies)); + FILE_HEADER = new Object[]{"Lema", "Skupna pogostost", "Delež glede na leme"}; + } + } else + FILE_HEADER = new Object[]{"word", "frequency", "percent"}; String fileName = ""; diff --git a/src/main/resources/gui/CharacterAnalysisTab.fxml b/src/main/resources/gui/CharacterAnalysisTab.fxml index 7d4ad96..800bd23 100644 --- a/src/main/resources/gui/CharacterAnalysisTab.fxml +++ b/src/main/resources/gui/CharacterAnalysisTab.fxml @@ -48,6 +48,9 @@ +