From 3fe4cc361801477a13166023b886737490bd51db Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 12:51:47 -0700 Subject: [PATCH 01/17] Basic working gradle project TestDynamicTable01 runs successfully! --- IntelliJ/Nx/.gitignore | 42 + IntelliJ/Nx/build.gradle.kts | 176 ++ IntelliJ/Nx/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 60756 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + IntelliJ/Nx/gradlew | 234 ++ IntelliJ/Nx/gradlew.bat | 89 + IntelliJ/Nx/settings.gradle.kts | 2 + .../enginewrapper/LicenseResolver.java | 19 + .../enginewrapper/NuixDiagnostics.java | 73 + .../innovation/enginewrapper/NuixEngine.java | 611 +++++ .../NuixLicenseFeaturesLogger.java | 86 + .../enginewrapper/NuixLicenseResolver.java | 444 ++++ .../innovation/enginewrapper/NuixVersion.java | 265 +++ .../enginewrapper/RubyScriptRunner.java | 155 ++ .../enginewrapper/ThrowCapableConsumer.java | 10 + .../java/com/nuix/nx/LookAndFeelHelper.java | 33 + .../main/java/com/nuix/nx/NuixConnection.java | 72 + .../main/java/com/nuix/nx/NuixVersion.java | 290 +++ .../nx/callbacks/SimpleProgressCallback.java | 16 + .../BatchExporterLoadFileSettings.java | 154 ++ .../controls/BatchExporterNativeSettings.java | 196 ++ .../nx/controls/BatchExporterPdfSettings.java | 142 ++ .../controls/BatchExporterTextSettings.java | 260 ++ .../BatchExporterTraversalSettings.java | 119 + .../java/com/nuix/nx/controls/ButtonRow.java | 38 + .../nuix/nx/controls/ChoiceTableControl.java | 350 +++ .../java/com/nuix/nx/controls/ComboItem.java | 46 + .../com/nuix/nx/controls/ComboItemBox.java | 80 + .../java/com/nuix/nx/controls/CsvTable.java | 237 ++ .../DataProcessingSettingsControl.java | 1023 ++++++++ .../controls/DisablingGlassPaneWrapper.java | 46 + .../nuix/nx/controls/DynamicTableControl.java | 460 ++++ .../nuix/nx/controls/LocalWorkerSettings.java | 139 ++ .../nx/controls/MultipleChoiceComboBox.java | 120 + .../com/nuix/nx/controls/OcrSettings.java | 537 +++++ .../java/com/nuix/nx/controls/PathList.java | 221 ++ .../nx/controls/PathSelectedCallback.java | 16 + .../nx/controls/PathSelectionControl.java | 144 ++ .../controls/ProcessingFinishedListener.java | 15 + .../nx/controls/ProcessingStatusControl.java | 523 ++++ .../nuix/nx/controls/ReportDisplayPanel.java | 310 +++ .../java/com/nuix/nx/controls/StringList.java | 221 ++ .../main/java/com/nuix/nx/controls/accept.png | Bin 0 -> 781 bytes .../main/java/com/nuix/nx/controls/add.png | Bin 0 -> 733 bytes .../java/com/nuix/nx/controls/arrow_down.png | Bin 0 -> 379 bytes .../java/com/nuix/nx/controls/arrow_up.png | Bin 0 -> 372 bytes .../com/nuix/nx/controls/bullet_arrow_top.png | Bin 0 -> 230 bytes .../main/java/com/nuix/nx/controls/cancel.png | Bin 0 -> 587 bytes .../com/nuix/nx/controls/control_pause.png | Bin 0 -> 598 bytes .../com/nuix/nx/controls/control_play.png | Bin 0 -> 592 bytes .../com/nuix/nx/controls/control_stop.png | Bin 0 -> 403 bytes .../main/java/com/nuix/nx/controls/cross.png | Bin 0 -> 655 bytes .../main/java/com/nuix/nx/controls/delete.png | Bin 0 -> 715 bytes .../main/java/com/nuix/nx/controls/eye.png | Bin 0 -> 750 bytes .../filters/DynamicTableAllRecordsFilter.java | 18 + .../DynamicTableCheckedRecordsFilter.java | 26 + .../filters/DynamicTableContainsFilter.java | 30 + .../filters/DynamicTableFilterProvider.java | 47 + .../filters/DynamicTableRegexFilter.java | 54 + .../DynamicTableUncheckedRecordsFilter.java | 26 + .../java/com/nuix/nx/controls/folder_page.png | Bin 0 -> 688 bytes .../com/nuix/nx/controls/folder_table.png | Bin 0 -> 675 bytes .../controls/models/ArrangeableListModel.java | 98 + .../com/nuix/nx/controls/models/Choice.java | 130 + .../nx/controls/models/ChoiceTableModel.java | 412 ++++ .../ChoiceTableModelChangeListener.java | 16 + .../models/ControlDeserializationHandler.java | 17 + .../models/ControlSerializationHandler.java | 17 + .../nx/controls/models/CsvTableModel.java | 98 + .../models/DoubleBoundedRangeModel.java | 59 + .../nx/controls/models/DynamicTableModel.java | 601 +++++ .../models/DynamicTableValueCallback.java | 15 + .../models/ItemStatisticsTableModel.java | 147 ++ .../nx/controls/models/ReportDataModel.java | 234 ++ .../controls/models/StringListTableModel.java | 81 + .../java/com/nuix/nx/controls/page_save.png | Bin 0 -> 774 bytes .../main/java/com/nuix/nx/controls/tick.png | Bin 0 -> 537 bytes .../java/com/nuix/nx/controls/unaccept.png | Bin 0 -> 822 bytes .../java/com/nuix/nx/controls/zoom_out.png | Bin 0 -> 708 bytes .../com/nuix/nx/dialogs/ChoiceDialog.java | 266 +++ .../com/nuix/nx/dialogs/CommonDialogs.java | 416 ++++ .../com/nuix/nx/dialogs/CustomTabPanel.java | 2106 +++++++++++++++++ .../nx/dialogs/ProcessingStatusDialog.java | 153 ++ .../com/nuix/nx/dialogs/ProgressDialog.java | 524 ++++ .../dialogs/ProgressDialogBlockInterface.java | 15 + .../ProgressDialogLoggingCallback.java | 15 + .../nx/dialogs/ScrollableCustomTabPanel.java | 44 + .../nuix/nx/dialogs/TabbedCustomDialog.java | 1153 +++++++++ .../main/java/com/nuix/nx/dialogs/Toast.java | 171 ++ .../nuix/nx/dialogs/ValidationCallback.java | 23 + .../main/java/com/nuix/nx/dialogs/help.png | Bin 0 -> 786 bytes .../java/com/nuix/nx/dialogs/nuix_icon.png | Bin 0 -> 14156 bytes .../com/nuix/nx/dialogs/page_white_get.png | Bin 0 -> 516 bytes .../com/nuix/nx/dialogs/page_white_put.png | Bin 0 -> 523 bytes .../com/nuix/nx/dialogs/page_white_text.png | Bin 0 -> 342 bytes .../java/com/nuix/nx/digest/DigestHelper.java | 295 +++ .../nuix/nx/export/CombinedPdfExporter.java | 138 ++ .../filters/DynamicTableAllRecordsFilter.java | 20 + .../DynamicTableCheckedRecordsFilter.java | 28 + .../filters/DynamicTableContainsFilter.java | 32 + .../filters/DynamicTableFilterProvider.java | 47 + .../nx/filters/DynamicTableRegexFilter.java | 56 + .../DynamicTableUncheckedRecordsFilter.java | 28 + .../com/nuix/nx/helpers/FormatHelpers.java | 57 + .../nx/helpers/MetadataProfileHelper.java | 25 + .../com/nuix/nx/helpers/package-info.java | 1 + .../com/nuix/nx/misc/PlaceholderResolver.java | 115 + .../java/com/nuix/nx/misc/package-info.java | 1 + .../nuix/nx/models/ArrangeableListModel.java | 98 + .../main/java/com/nuix/nx/models/Choice.java | 130 + .../com/nuix/nx/models/ChoiceTableModel.java | 414 ++++ .../ChoiceTableModelChangeListener.java | 16 + .../models/ControlDeserializationHandler.java | 17 + .../models/ControlSerializationHandler.java | 17 + .../com/nuix/nx/models/CsvTableModel.java | 98 + .../nx/models/DoubleBoundedRangeModel.java | 59 + .../com/nuix/nx/models/DynamicTableModel.java | 603 +++++ .../nx/models/DynamicTableValueCallback.java | 15 + .../nx/models/ItemStatisticsTableModel.java | 147 ++ .../com/nuix/nx/models/ReportDataModel.java | 234 ++ .../nuix/nx/models/StringListTableModel.java | 81 + .../sourceitem/SourceItemVisitCallback.java | 22 + .../nuix/nx/sourceitem/SourceItemVisitor.java | 83 + .../Nx/src/main/resources/icons/accept.png | Bin 0 -> 781 bytes IntelliJ/Nx/src/main/resources/icons/add.png | Bin 0 -> 733 bytes .../src/main/resources/icons/arrow_down.png | Bin 0 -> 379 bytes .../Nx/src/main/resources/icons/arrow_up.png | Bin 0 -> 372 bytes .../main/resources/icons/bullet_arrow_top.png | Bin 0 -> 230 bytes .../Nx/src/main/resources/icons/cancel.png | Bin 0 -> 587 bytes .../main/resources/icons/control_pause.png | Bin 0 -> 598 bytes .../src/main/resources/icons/control_play.png | Bin 0 -> 592 bytes .../src/main/resources/icons/control_stop.png | Bin 0 -> 403 bytes .../Nx/src/main/resources/icons/cross.png | Bin 0 -> 655 bytes .../Nx/src/main/resources/icons/delete.png | Bin 0 -> 715 bytes IntelliJ/Nx/src/main/resources/icons/eye.png | Bin 0 -> 750 bytes .../src/main/resources/icons/folder_page.png | Bin 0 -> 688 bytes .../src/main/resources/icons/folder_table.png | Bin 0 -> 675 bytes IntelliJ/Nx/src/main/resources/icons/help.png | Bin 0 -> 786 bytes .../Nx/src/main/resources/icons/nuix_icon.png | Bin 0 -> 14156 bytes .../Nx/src/main/resources/icons/page_save.png | Bin 0 -> 774 bytes .../main/resources/icons/page_white_get.png | Bin 0 -> 516 bytes .../main/resources/icons/page_white_put.png | Bin 0 -> 523 bytes .../main/resources/icons/page_white_text.png | Bin 0 -> 342 bytes IntelliJ/Nx/src/main/resources/icons/tick.png | Bin 0 -> 537 bytes .../Nx/src/main/resources/icons/unaccept.png | Bin 0 -> 822 bytes .../Nx/src/main/resources/icons/zoom_out.png | Bin 0 -> 708 bytes .../Nx/src/test/java/EngineWrapperTests.java | 106 + IntelliJ/Nx/src/test/java/RubyExamples.java | 109 + 148 files changed, 18124 insertions(+) create mode 100644 IntelliJ/Nx/.gitignore create mode 100644 IntelliJ/Nx/build.gradle.kts create mode 100644 IntelliJ/Nx/gradle/wrapper/gradle-wrapper.jar create mode 100644 IntelliJ/Nx/gradle/wrapper/gradle-wrapper.properties create mode 100644 IntelliJ/Nx/gradlew create mode 100644 IntelliJ/Nx/gradlew.bat create mode 100644 IntelliJ/Nx/settings.gradle.kts create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/LicenseResolver.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixDiagnostics.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixEngine.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseFeaturesLogger.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseResolver.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixVersion.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/RubyScriptRunner.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/ThrowCapableConsumer.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/LookAndFeelHelper.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/NuixConnection.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/NuixVersion.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/callbacks/SimpleProgressCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterLoadFileSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterNativeSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterPdfSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTextSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTraversalSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ButtonRow.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ChoiceTableControl.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItem.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItemBox.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/CsvTable.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DataProcessingSettingsControl.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DisablingGlassPaneWrapper.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DynamicTableControl.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/LocalWorkerSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/MultipleChoiceComboBox.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/OcrSettings.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathList.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectedCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectionControl.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingFinishedListener.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingStatusControl.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ReportDisplayPanel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/StringList.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/accept.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/add.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/arrow_down.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/arrow_up.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/bullet_arrow_top.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/cancel.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/control_pause.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/control_play.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/control_stop.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/cross.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/delete.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/eye.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableContainsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableFilterProvider.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableRegexFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/folder_page.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/folder_table.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ArrangeableListModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/Choice.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlDeserializationHandler.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlSerializationHandler.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/CsvTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DoubleBoundedRangeModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableValueCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ItemStatisticsTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ReportDataModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/StringListTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/page_save.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/tick.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/unaccept.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/controls/zoom_out.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ChoiceDialog.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CommonDialogs.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CustomTabPanel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProcessingStatusDialog.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialog.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogBlockInterface.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ScrollableCustomTabPanel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/TabbedCustomDialog.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/Toast.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ValidationCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/help.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/nuix_icon.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/page_white_get.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/page_white_put.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/page_white_text.png create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/digest/DigestHelper.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/export/CombinedPdfExporter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableAllRecordsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableContainsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableFilterProvider.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableRegexFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/FormatHelpers.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/MetadataProfileHelper.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/package-info.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/misc/PlaceholderResolver.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/misc/package-info.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ArrangeableListModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/Choice.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModelChangeListener.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlDeserializationHandler.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlSerializationHandler.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/CsvTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/DoubleBoundedRangeModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableValueCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ItemStatisticsTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/ReportDataModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/models/StringListTableModel.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitCallback.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitor.java create mode 100644 IntelliJ/Nx/src/main/resources/icons/accept.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/add.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/arrow_down.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/arrow_up.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/bullet_arrow_top.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/cancel.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/control_pause.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/control_play.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/control_stop.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/cross.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/delete.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/eye.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/folder_page.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/folder_table.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/help.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/nuix_icon.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/page_save.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/page_white_get.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/page_white_put.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/page_white_text.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/tick.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/unaccept.png create mode 100644 IntelliJ/Nx/src/main/resources/icons/zoom_out.png create mode 100644 IntelliJ/Nx/src/test/java/EngineWrapperTests.java create mode 100644 IntelliJ/Nx/src/test/java/RubyExamples.java diff --git a/IntelliJ/Nx/.gitignore b/IntelliJ/Nx/.gitignore new file mode 100644 index 0000000..b63da45 --- /dev/null +++ b/IntelliJ/Nx/.gitignore @@ -0,0 +1,42 @@ +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### IntelliJ IDEA ### +.idea/modules.xml +.idea/jarRepositories.xml +.idea/compiler.xml +.idea/libraries/ +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### Eclipse ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Mac OS ### +.DS_Store \ No newline at end of file diff --git a/IntelliJ/Nx/build.gradle.kts b/IntelliJ/Nx/build.gradle.kts new file mode 100644 index 0000000..78eac1c --- /dev/null +++ b/IntelliJ/Nx/build.gradle.kts @@ -0,0 +1,176 @@ +plugins { + id("java") +} + +group = "com.nuix.nx" +version = "1.19.0-SNAPSHOT" + +val sourceCompatibility = 11 +val targetCompatibility = 11 + +// Directory containing Nuix Engine release +val nuixEngineDirectory: String = System.getenv("NUIX_ENGINE_DIR") +println("NUIX_ENGINE_DIR: ${nuixEngineDirectory}") +if (nuixEngineDirectory.isEmpty()) { + throw InvalidUserDataException("Please populate the environment variable 'NUIX_ENGINE_DIR' with directory containing a Nuix Engine release") +} + +val engineLibDir = "${nuixEngineDirectory}\\lib" +println("engineLibDir: ${engineLibDir}") + +val nuixAppLibDir = "C:\\Program Files\\Nuix\\Nuix 100.2\\lib" +println("nuixAppLibDir: ${nuixAppLibDir}") + +repositories { + mavenCentral() +} + +// We can use this to define JAR files that we need copied to lib +val externalDependency: Configuration by configurations.creating { + isTransitive = true +} + +dependencies { + implementation("org.jetbrains:annotations:24.0.1") + + compileOnly("org.projectlombok:lombok:1.18.26") + annotationProcessor("org.projectlombok:lombok:1.18.26") + + testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.2") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.9.2") + + // ==================== + // Engine Dependencies + // ==================== + + implementation(fileTree(baseDir = engineLibDir) { + include( + "**/*log*.jar", + "**/*aspect*.jar", + "**/*joda*.jar", + "**/*commons*.jar", + "**/*guava*.jar", + "**/*gson*.jar", + "**/nuix-*.jar", + "**/*jruby*.jar", + "**/*swing*.jar", + "**/*jide*.jar", + "**/*csv*.jar", + "**/*beansbinding*.jar", + "**/*xml.bind*.jar", + "**/*itext*.jar", + ) + }) + + testRuntimeOnly(fileTree(baseDir = engineLibDir) { + include("*.jar") + }) +} + +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(11)) + } +} + +fun configureTestEnvironment(test: Test) { + println("Running 'configureTestEnvironment'...") + + // Engine runtime temp directory + val nuixTempDirectory = findProperty("tempDir") ?: "${System.getenv("LOCALAPPDATA")}\\Temp\\Nuix" + + // Args passed to JVM running tests + test.jvmArgs( + "--add-exports=java.base/jdk.internal.loader=ALL-UNNAMED", // Engine 9.6(?) and later require this + "-Xmx4G", + "-Djava.io.tmpdir=\"${nuixTempDirectory}\"", + // "-verbose:class" // Can help troubleshoot weird dependency issues + ) + + // Directory used to store data a test may rely on (like sample data) + val testDataDirectory = "${projectDir}\\..\\..\\TestData" + + // Directory used to store data a test may rely on (like sample data) + val rubyExamplesDirectory = "${projectDir}\\..\\..\\Examples" + + // Directory that tests may write data to, unique to each test invocation + val testOutputDirectory = "${projectDir}\\..\\..\\TestOutput\\${System.currentTimeMillis()}" + + // Configure ENV vars for JVM tests run in + test.setEnvironment( + // Add our engine release's bin and bin/x86 to PATH + Pair("PATH", "${System.getenv("PATH")};${nuixEngineDirectory}\\bin;${nuixEngineDirectory}\\bin\\x86"), + + // Define where tests can place re-usable test data + Pair("TEST_DATA_DIRECTORY", testDataDirectory), + + // Define where tests can write output produce for later review + Pair("TEST_OUTPUT_DIRECTORY", testOutputDirectory), + + // Defines where example ruby scripts live + Pair("RUBY_EXAMPLES_DIRECTORY", rubyExamplesDirectory), + + // Forward ENV username and password + Pair("NUIX_USERNAME", System.getenv("NUIX_USERNAME")), + Pair("NUIX_PASSWORD", System.getenv("NUIX_PASSWORD")), + + // Forward LOCALAPPDATA and APPDATA + Pair("LOCALAPPDATA", System.getenv("LOCALAPPDATA")), + Pair("APPDATA", System.getenv("APPDATA")), + + // We need to make sure we set these so workers will properly resolve temp dir + // (when using a worker based operation via EngineWrapper). + Pair("TEMP", nuixTempDirectory), + Pair("TMP", nuixTempDirectory), + + Pair("NUIX_ENGINE_DIR", nuixEngineDirectory) + ) +} + +// Builds JAR without any of the Engine wrapper stuff included +tasks.create("pluginOnlyJar") { + println("Producing plug-in only JAR file") + from(sourceSets.main.get().output) + exclude("com.nuix.innovation.enginewrapper.*") +} + +// Copies plug-in JAR to lib directory of engine release we're running against +tasks.register("copyJarsToEngine") { + val name = "@nx" + val jarName = "${name}.jar" + dependsOn(tasks.findByName("pluginOnlyJar")) + + duplicatesStrategy = org.gradle.api.file.DuplicatesStrategy.INCLUDE + + doFirst { + val toDelete = File(engineLibDir, jarName) + println("Deleting: " + toDelete.absolutePath) + delete(toDelete) + } + + println("Copying files engine to engine lib dir...") + copy { + into(File(engineLibDir)) + from(configurations.findByName("externalDependency")) + rename("(.*)\\.jar", "${name}-Dependency-$1.jar") + } + + copy { + from(tasks.findByName("pluginOnlyJar")) + into(File(engineLibDir)) + rename(".*\\.jar", jarName) + } +} + +// Ensure that tests are ran by JUnit and that test environment gets configured +tasks.test { + dependsOn(tasks.findByName("copyJarsToEngine")) + useJUnitPlatform() + configureTestEnvironment(this) +} + +// Customize where Javadoc output is written to +tasks.getByName("javadoc") { + setDestinationDir(File("${projectDir}/../../docs")) + exclude("com/nuix/innovation/enginewrapper/**") +} \ No newline at end of file diff --git a/IntelliJ/Nx/gradle/wrapper/gradle-wrapper.jar b/IntelliJ/Nx/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..249e5832f090a2944b7473328c07c9755baa3196 GIT binary patch literal 60756 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/IntelliJ/Nx/gradlew.bat b/IntelliJ/Nx/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/IntelliJ/Nx/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/IntelliJ/Nx/settings.gradle.kts b/IntelliJ/Nx/settings.gradle.kts new file mode 100644 index 0000000..54f80cd --- /dev/null +++ b/IntelliJ/Nx/settings.gradle.kts @@ -0,0 +1,2 @@ +rootProject.name = "Nx" + diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/LicenseResolver.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/LicenseResolver.java new file mode 100644 index 0000000..d6da4f4 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/LicenseResolver.java @@ -0,0 +1,19 @@ +package com.nuix.innovation.enginewrapper; + +import lombok.NonNull; +import nuix.engine.Engine; + +/*** + * An interface for providing {@link NuixEngine} license resolution. + * @author Jason Wells + */ +public interface LicenseResolver { + /*** + * Attempts to license the provided Engine instance using resolution and filtering configuration of this instance. + * @param engine The engine instance to attempt to license. + * @return True if a license was obtained, false if not. + * @throws Exception Exceptions thrown by any of the methods working to obtain a license will be uncaught and allowed + * to bubble up for caller to respond to. + */ + boolean resolveLicense(@NonNull Engine engine) throws Exception; +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixDiagnostics.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixDiagnostics.java new file mode 100644 index 0000000..b02a331 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixDiagnostics.java @@ -0,0 +1,73 @@ +package com.nuix.innovation.enginewrapper; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.joda.time.DateTime; + +import javax.management.MBeanServer; +import javax.management.MBeanServerFactory; +import javax.management.ObjectName; +import java.io.File; +import java.lang.management.ManagementFactory; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/*** + * Provides methods for generating Nuix diagnostics files. + * @author Jason Wells + */ +public class NuixDiagnostics { + private final static Logger logger = LogManager.getLogger(NuixDiagnostics.class); + + /*** + * Saves a Nuix diagnostics zip file at the specified path. + * @param zipFile The zip file to save Nuix diagnostics into + */ + public static void saveDiagnosticsToFile(File zipFile){ + List beanServers = new ArrayList(); + beanServers.add(ManagementFactory.getPlatformMBeanServer()); + beanServers.addAll(MBeanServerFactory.findMBeanServer(null)); + for (MBeanServer mBeanServer : beanServers) { + Set objectNames = mBeanServer.queryNames(null, null); + for (ObjectName beanName : objectNames) { + if(beanName.toString().contains("DiagnosticsControl")){ + zipFile.mkdirs(); + try { + mBeanServer.invoke(beanName,"generateDiagnostics",new Object[] {zipFile.getPath()},new String[] {"java.lang.String"}); + return; + } catch (Exception e) { + logger.error("Error saving diagnostics", e); + } + } + } + } + } + + /*** + * Saves a Nuix diagnostics zip file at the specified path. + * @param zipFile The zip file to save Nuix diagnostics into + */ + public static void saveDiagnosticsToFile(String zipFile) { saveDiagnosticsToFile(new File(zipFile)); } + + /*** + * Convenience method for saving a diagnostics file to a directory. Internally calls {@link #saveDiagnosticsToFile(File)} + * with a file path using the specified directory and a time stamped file name. + * @param directory The directory to save Nuix the diagnostics zip file to. + */ + public static void saveDiagnosticsToDirectory(File directory) { + DateTime timeStamp = DateTime.now(); + String timeStampString = timeStamp.toString("yyyyMMddHHmmss"); + File zipFile = new File(directory,"NuixEngineDiagnostics-"+timeStampString+".zip"); + saveDiagnosticsToFile(zipFile); + } + + /*** + * Convenience method for saving a diagnostics file to a directory. Internally calls {@link #saveDiagnosticsToFile(File)} + * with a file path using the specified directory and a time stamped file name. + * @param directory The directory to save Nuix the diagnostics zip file to. + */ + public static void saveDiagnosticsToDirectory(String directory) { + saveDiagnosticsToDirectory(new File(directory)); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixEngine.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixEngine.java new file mode 100644 index 0000000..63027c2 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixEngine.java @@ -0,0 +1,611 @@ +package com.nuix.innovation.enginewrapper; + +import com.google.common.base.Suppliers; +import nuix.ThirdPartyDependency; +import nuix.ThirdPartyDependencyStatus; +import nuix.Utilities; +import nuix.engine.Engine; +import nuix.engine.GlobalContainer; +import nuix.engine.GlobalContainerFactory; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.LifeCycle; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.LoggerConfig; +import org.joda.time.DateTime; + +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.management.RuntimeMXBean; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.function.Supplier; + +/*** + * This class represents a wrapper over the Nuix Engine API. It encapsulates the potentially error prone process of getting + * a Nuix Engine instance initialized and licensed with a simplified interface. Use this class as is or use it as a + * starting point for your own implementation.

+ * Basic usage example: + *

+ * {@code
+ * // Define a resolver which will resolve licenses from Cloud License Server (CLS),
+ * // authenticating using upon environment variable "NUIX_USERNAME" and "NUIX_PASSWORD",
+ * // that have at least 4 workers and the feature "CASE_CREATION".
+ * LicenseResolver cloud_4_workers = NuixLicenseResolver.fromCloud()
+ *     .withLicenseCredentialsResolvedFromEnvVars()
+ *     .withMinWorkerCount(4)
+ *     .withRequiredFeatures("CASE_CREATION");
+ *
+ * // Define a resolver which will attempt to resolve a license from a local physical dongle
+ * // that has the feature "CASE_CREATION".
+ * LicenseResolver anyDongle = NuixLicenseResolver.fromDongle()
+ *     .withRequiredFeatures("CASE_CREATION");
+ *
+ * // Create a new NuixEngine instance which will first attempt to resolve a cloud license and then
+ * // attempt to resolve a dongle license if one cannot be resolved from cloud, depending resolvers
+ * // defined above.  Calling run method to execute code with a licensed Engine instance (if a license can be obtained).
+ * NuixEngine.usingFirstAvailableLicense(cloud_4_workers, anyDongle)
+ *     .setEngineDistributionDirectoryFromEnvVars()
+ *     .run((utilities -> {
+ *         log.info("License was obtained!");
+ *         // Do something with Utilities and Engine here
+ *     }));
+ * }
+ * 
+ * @author Jason Wells + */ +public class NuixEngine implements AutoCloseable { + private static GlobalContainer globalContainer = null; + protected Supplier engineDistributionDirectorySupplier; + protected Supplier logDirectorySupplier; + protected Supplier userDataDirectorySupplier; + protected List nuixLicenseResolvers; + + protected Logger log = null; + protected Engine engine = null; + protected Utilities utilities = null; + protected Thread shutdownHook = null; + + protected NuixEngine() { + } + + public static void closeGlobalContainer() { + if (globalContainer != null) { + globalContainer.close(); + globalContainer = null; + } + } + + /*** + * Creates a new instance which will attempt to retrieve its license from one of the provided {@link LicenseResolver} + * instances in the order specified. + * @param nuixLicenseResolvers One or more resolvers which will be called upon in the order provided to obtain a license + * until one is able to successfully acquire an available license based on its configured source + * and filtering/selection logic. + * @return A new NuixEngine instance + */ + public static NuixEngine usingFirstAvailableLicense(LicenseResolver... nuixLicenseResolvers) { + return usingFirstAvailableLicense(Arrays.asList(nuixLicenseResolvers)); + } + + /*** + * Creates a new instance which will attempt to retrieve its license from one of the provided {@link LicenseResolver} + * instances in the order specified. + * @param nuixLicenseResolvers List of one or more resolvers which will be called upon in the order provided to obtain a license + * until one is able to successfully acquire an available license based on its configured source + * and filtering/selection logic. + * @return A new NuixEngine instance + */ + public static NuixEngine usingFirstAvailableLicense(List nuixLicenseResolvers) { + NuixEngine result = new NuixEngine(); + result.nuixLicenseResolvers = nuixLicenseResolvers; + return result; + } + + /*** + * Create a new instance which will attempt to retrieve its license from anywhere it can. + * @return A new NuixEngine instance + */ + public static NuixEngine usingAnyAvailableLicense() { + NuixEngine result = new NuixEngine(); + result.nuixLicenseResolvers = List.of(NuixLicenseResolver.fromAnySource()); + return result; + } + + /*** + * For various reasons, this class needs to be able to resolve the location of a Nuix Engine distribution. + * This method allows you to provide a Supplier which will resolve it as needed. Note that due to the importance + * of being able to resolve this, you must configure this value via one of the following methods before calling + * {@link #run(ThrowCapableConsumer)}, or you will get an error: + *
    + *
  • {@link #setEngineDistributionDirectory(File)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar(String)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar()}
  • + *
+ * @param engineDistributionDirectorySupplier A supplier which will yield directory containing a Nuix Engine distribution. + * @return This instance for method call chaining + */ + public NuixEngine setEngineDistributionDirectorySupplier(Supplier engineDistributionDirectorySupplier) { + this.engineDistributionDirectorySupplier = Suppliers.memoize(engineDistributionDirectorySupplier::get); + return this; + } + + /*** + * For various reasons, this class needs to be able to resolve the location of a Nuix Engine distribution. + * This method allows you to specify an explicit directory value. Note that due to the importance + * of being able to resolve this, you must configure this value via one of the following methods before calling + * {@link #run(ThrowCapableConsumer)}, or you will get an error: + *
    + *
  • {@link #setEngineDistributionDirectorySupplier(Supplier)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar(String)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar()}
  • + *
+ * @param directory The directory containing a Nuix Engine distribution + * @return This instance for method call chaining + */ + public NuixEngine setEngineDistributionDirectory(File directory) { + setEngineDistributionDirectorySupplier(() -> directory); + return this; + } + + /*** + * For various reasons, this class needs to be able to resolve the location of a Nuix Engine distribution. + * This method allows you to specify an environment variable which contains as its value the a directory + * containing a Nuix Engine distribution. Note that due to the importance + *of being able to resolve this, you must configure this value via one of the following methods before calling + *{@link #run(ThrowCapableConsumer)}, or you will get an error: + *
    + *
  • {@link #setEngineDistributionDirectorySupplier(Supplier)}
  • + *
  • {@link #setEngineDistributionDirectory(File)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar()}
  • + *
+ * @param environmentVariableName The name of the environment variable which has its value set to a directory containing + * a Nuix Engine distribution. + * @return This instance for method call chaining + */ + public NuixEngine setEngineDistributionDirectoryFromEnvVar(String environmentVariableName) { + setEngineDistributionDirectorySupplier(() -> { + String envValue = System.getenv(environmentVariableName); + System.out.printf("Obtained value '%s' from ENV var '%s'%n", + envValue, environmentVariableName); + return new File(envValue); + }); + return this; + } + + /*** + * For various reasons, this class needs to be able to resolve the location of a Nuix Engine distribution. + * This method allows you to specify that this directory should be obtained from the environment variable + * named "NUIX_ENGINE_DIR". Note that this is effectively just a convenience method to calling + * {@link #setEngineDistributionDirectoryFromEnvVar(String)} with the value "NUIX_ENGINE_DIR". Note that due to the importance + * of being able to resolve this, you must configure this value via one of the following methods before calling + * {@link #run(ThrowCapableConsumer)}, or you will get an error: + *
    + *
  • {@link #setEngineDistributionDirectorySupplier(Supplier)}
  • + *
  • {@link #setEngineDistributionDirectory(File)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar(String)}
  • + *
+ * @return This instance for method call chaining + */ + public NuixEngine setEngineDistributionDirectoryFromEnvVar() { + setEngineDistributionDirectoryFromEnvVar("NUIX_ENGINE_DIR"); + return this; + } + + /*** + * When logging is initialized a directory is specified in which log files are to be written. Calling this method + * allows you to provide a Supplier which will yield that directory when needed. Directory will be created if it + * does not exist. If neither this method nor the method {@link #setLogDirectory(File)} are called before logging + * initialization, then a default will be assumed in the form of "%LOCAL_APP_DATA%\Nuix\Logs\Engine-[DATE]-[TIME]". + * @param logDirectorySupplier A Supplier which will yield a log directory to use + * @return This instance for method call chaining + */ + public NuixEngine setLogDirectorySupplier(Supplier logDirectorySupplier) { + this.logDirectorySupplier = logDirectorySupplier::get; + return this; + } + + /*** + * When logging is initialized a directory is specified in which log files are to be written. Calling this method + * allows you to set an explicit directory to use. Directory will be created if it does not exist. If neither this + * method nor the method {@link #setLogDirectorySupplier(Supplier)} are called before logging initialization, + * then a default will be assumed in the form of "%LOCAL_APP_DATA%\Nuix\Logs\Engine-[DATE]-[TIME]". + * @param directory The log file directory to use + * @return This instance for method call chaining + */ + public NuixEngine setLogDirectory(File directory) { + setLogDirectorySupplier(() -> directory); + return this; + } + + /*** + * The Nuix Engine will need to be capable of resolving various artifacts such as metadata profiles, processing profiles, + * export profiles, word lists, etc. This method allows you to provide a Supplier which will yield a directory containing + * this information as needed. If neither this method nor the method {@link #setUserDataDirectory(File)} are called + * before calling {@link #run}, the "user-data" subdirectory of the Nuix Engine distribution will be used. + * @param userDataDirectorySupplier A Supplier which will yield directory containing engine user data + * @return This instance for method call chaining + */ + public NuixEngine setUserDataDirectorySupplier(Supplier userDataDirectorySupplier) { + this.userDataDirectorySupplier = Suppliers.memoize(userDataDirectorySupplier::get); + return this; + } + + /*** + * The Nuix Engine will need to be capable of resolving various artifacts such as metadata profiles, processing profiles, + * export profiles, word lists, etc. This method allows you to provide an explicit user data directory. + * If neither this method nor the method {@link #setUserDataDirectorySupplier(Supplier)} are called + * before calling {@link #run}, the "user-data" subdirectory of the Nuix Engine distribution will be used. + * @param directory The user data directory to use + * @return This instance for method call chaining + */ + public NuixEngine setUserDataDirectory(File directory) { + setLogDirectorySupplier(() -> directory); + return this; + } + + /*** + * Gets Utilities object to begin making use of the Nuix API. If instance has been previously obtained, then + * that instance will be returned. Otherwise, calling this method performs a series of steps to get setup: + *
    + *
  1. A set of preconditions are checked. Generally if a condition is not met an exception explaining the issue + * will be thrown. In a couple instances a default will be assumed if possible. + *
      + *
    • Can we resolve an engine distribution?
    • + *
    • Can we resolve a log directory?
    • + *
    • Can we resolve a user data directory?
    • + *
    • Does the system PATH have a reference to "[ENGINE_DIR]\bin"?
    • + *
    • Does the system PATH have a reference to "[ENGINE_DIR]\bin\x86"?
    • + *
    + *
  2. + *
  3. Logging is initialized
  4. + *
  5. The Nuix Engine GlobaContainer instance is created if needed
  6. + *
  7. An Engine instance is created
  8. + *
  9. Any provided {@link NuixLicenseResolver} instances are iteratively called upon to obtain a license until an + * instance has successfully acquired one. + *
  10. + *
  11. The callback provided when calling this method is invoked with a licenses Utilities object if license + * acquisition was successful.
  12. + *
  13. + * If an exception is thrown during this process, it is caught, written to System.out and then rethrown + * to be further handled by the caller. + *
  14. + *
+ * Note that before calling this method you must call one of the following methods to configure where a + * Nuix Engine distribution is located: + *
    + *
  • {@link #setEngineDistributionDirectorySupplier(Supplier)}
  • + *
  • {@link #setEngineDistributionDirectory(File)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar(String)}
  • + *
  • {@link #setEngineDistributionDirectoryFromEnvVar()}
  • + *
+ * + * @return If this instance already has an instance of Utilities, that is returned. Otherwise necessary steps + * will be taken to attempt to obtain and license underlying engine instance to ultimately provide a licensed + * Utilities instance. + * @throws Exception Allows exceptions to bubble up so caller can handle them. + */ + public Utilities getUtilities() throws Exception { + if (utilities == null) { + // Check to make sure some requirements are in place before proceeding + checkPreConditions(); + + // Make sure logging gets initialized + try { + initializeLogging(); + } catch (Exception exc) { + System.out.println("Error while initializing logging: " + exc.getMessage()); + throw new Exception("Error while initializing logging", exc); + } + + // Proceed with constructing engine instance, obtaining license and providing licensed Utilities + // to provided callback + log.info("Engine Distribution Directory: " + engineDistributionDirectorySupplier.get().getAbsolutePath()); + log.info("Log Directory: " + logDirectorySupplier.get().getAbsolutePath()); + log.info("User Data Directory: " + userDataDirectorySupplier.get().getAbsolutePath()); + + ensureGlobalContainer(); + buildEngine(); + if (obtainLicenseFromResolvers()) { + utilities = engine.getUtilities(); + logAllDependencyInfo(utilities); + } else { + log.error("No license was able to be resolved"); + } + } + + return utilities; + } + + /*** + * Convenience method for running an operation with a licensed engine instance and then automatically closing this instance. + * Supplied consumer will be provided a utilities instance by internally calling {@link #getUtilities()}. + * Upon return from consumer, either from normal return or exception, a 'finally' block will call the + * {@link #close()} method for you. Exceptions will be allowed to bubble up, so caller can handle them directly. + * @param throwCapableConsumer A callback which is to receive Utilities upon successful initialization and licensing. + * @throws Exception May be thrown by process or getting engine initialized or code in supplied consumer. + */ + public void run(ThrowCapableConsumer throwCapableConsumer) throws Exception { + try { + throwCapableConsumer.accept(getUtilities()); + } finally { + close(); + } + } + + /*** + * When creating a new instance via {@link NuixEngine#usingFirstAvailableLicense(LicenseResolver...)}, caller can + * specify a series of {@link NuixLicenseResolver} instances which will be called upon in sequence until one acquires + * a license. This method iterates through those resolvers to make that happen. + * @return True if a license was obtained, false if not. + * @throws Exception This method does not throw any methods itself, but instead allows any thrown methods to bubble up. + */ + private boolean obtainLicenseFromResolvers() throws Exception { + boolean licenseWasObtained = false; + // Iterate each provided license resolver in order until one signals to use it has licensed + // our engine instance. + for (LicenseResolver resolver : nuixLicenseResolvers) { + log.info(String.format("Attempting to resolve license using: %s", resolver)); + licenseWasObtained = resolver.resolveLicense(engine); + if (licenseWasObtained) { + log.info(String.format("Obtained license: %s", NuixLicenseFeaturesLogger.summarizeLicense(engine.getLicence()))); + break; + } else { + log.info("No license was obtained, will try next resolver if there is one"); + } + } + return licenseWasObtained; + } + + /*** + * This method checks to ensure various things are configured early on in the engine initialization process. We want + * to detect common misconfigurations here and when detected report the issue. + * @throws Exception This method may throw an exception if something is not configured correctly or at all and a default + * cannot be somehow assumed. This includes: + *
    + *
  • Unable to resolve a Nuix Engine distribution
  • + *
  • Unable to resolve 'bin' dir on PATH
  • + *
  • Unable to resolve 'bin\x86' dir on PATH
  • + *
+ */ + private void checkPreConditions() throws Exception { + // Due to changes in later versions of Java coupled with some added functionality + // added to Nuix at one point, we need to make sure the JVM we are running in + // was started with this arg: + // --add-exports=java.base/jdk.internal.loader=ALL-UNNAMED + // If it was not, then you will likely get error similar to this: + // java.lang.NoClassDefFoundError: org/bouncycastle/openpgp/PGPException + RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean(); + List jvmArgs = bean.getInputArguments(); + final String requiredJvmArg = "--add-exports=java.base/jdk.internal.loader=ALL-UNNAMED"; + if (jvmArgs.stream().noneMatch(arg -> arg.trim().equalsIgnoreCase(requiredJvmArg))) { + throw new IllegalStateException("Please ensure that JVM is started with argument: " + requiredJvmArg); + } + + // Caller must have set engine distribution directory, fail if they have not. + if (engineDistributionDirectorySupplier == null) { + throw new IllegalStateException("Unable to resolve engine distribution directory, please call one of the following methods " + + "before calling the run method: " + + "setEngineDistributionDirectorySupplier, setEngineDistributionDirectory, setEngineDistributionDirectoryFromENV"); + } + + // We need to set JVM system property 'nuix.libdir' so engine can resolve some things early on. + // Without this you may see an error about fips/non-fips module resolution + File libDir = new File(engineDistributionDirectorySupplier.get(), "lib"); + System.setProperty("nuix.libdir", libDir.getAbsolutePath()); + + // If caller has not configured a log directory, attempt to guess one in local app data, otherwise throw exception. + if (logDirectorySupplier == null) { + String localAppData = System.getenv("LOCALAPPDATA"); + if (localAppData != null && !localAppData.isEmpty()) { + File localAppDataDirectory = new File(localAppData); + File logDirectory = new File(localAppDataDirectory, "Engine-" + DateTime.now().toString("YYYYMMdd-HHmmss")); + System.out.println("No log directory specified, assuming local app data log directory: " + logDirectory.getAbsolutePath()); + setLogDirectory(logDirectory); + } else { + throw new IllegalStateException("Unable to resolve log directory, please call either " + + "setLogDirectorySupplier or setLogDirectory method before calling run method"); + } + } + + // If we reached here, we should have been able to resolve a log directory. Let's make sure that directory + // exists so later during logging initialization we don't receive an exception about non-existent directory. + logDirectorySupplier.get().getCanonicalFile().mkdirs(); + if (!logDirectorySupplier.get().getCanonicalFile().exists()) { + throw new IOException("Unable to create log directory: " + logDirectorySupplier.get().getCanonicalPath()); + } + + // If caller has not specified a user-data directory, assume the one that comes with the engine distribution + // that is being used. + if (userDataDirectorySupplier == null) { + System.out.println("No user data directory was specified, assuming directory relative to engine distribution: " + + new File(engineDistributionDirectorySupplier.get(), "user-data").getAbsolutePath()); + userDataDirectorySupplier = () -> new File(engineDistributionDirectorySupplier.get(), "user-data"); + } + + // Make sure PATH points to expected bin and bin/x86 subdirectories of our engine distribution + String[] pathDirs = System.getenv("PATH").split(";"); + File expectedBinDir = new File(engineDistributionDirectorySupplier.get(), "bin"); + File expectedBinX86Dir = new File(expectedBinDir, "x86"); + + // Make sure we can locate 'bin' subdirectory on PATH + if (Arrays.stream(pathDirs).noneMatch(pathDir -> pathDir.equalsIgnoreCase(expectedBinDir.getAbsolutePath()))) { + throw new IllegalStateException("PATH does not contain expected 'bin' directory: " + expectedBinDir.getAbsolutePath()); + } else { + System.out.println("'bin' Successfully found on PATH: " + expectedBinDir.getAbsolutePath()); + } + + // Make sure we can locate 'bin\x86' subdirectory on PATH + if (Arrays.stream(pathDirs).noneMatch(pathDir -> pathDir.equalsIgnoreCase(expectedBinX86Dir.getAbsolutePath()))) { + throw new IllegalStateException("PATH does not contain expected 'bin\\x86' directory: " + expectedBinX86Dir.getAbsolutePath()); + } else { + System.out.println("'bin\\x86' Successfully found on PATH: " + expectedBinX86Dir.getAbsolutePath()); + } + } + + /*** + * Initializes some logging details. + */ + protected void initializeLogging() { + if (log == null) { + System.setProperty("nuix.logdir", logDirectorySupplier.get().getAbsolutePath()); + // Use Log4j2 config YAML from engine base directory + File log4jConfigFile = new File(engineDistributionDirectorySupplier.get(), "config/log4j2.yml"); + System.setProperty("log4j.configurationFile", log4jConfigFile.getAbsolutePath()); + log = LogManager.getLogger(this.getClass()); + log.info("log4j.configurationFile => " + log4jConfigFile.getAbsolutePath()); + + // Set default level to INFO + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); + loggerConfig.setLevel(Level.INFO); + ctx.updateLoggers(); + } + } + + /*** + * If we do not yet have a global container instance, creates one. + */ + protected void ensureGlobalContainer() { + if (globalContainer == null) { + globalContainer = GlobalContainerFactory.newContainer(); + } + } + + /*** + * Builds an engine instance. Also registers a shutdown hook will attempt to release any license held by + * this instance in some situations which my not otherwise be handled cleanly. If this shutdown hook was not + * in place it is possible for a license to remain claimed after the claiming process has ended and until a timeout + * period has elapsed for the license. + */ + protected void buildEngine() { + Map engineConfiguration = Map.of( + "user", System.getProperty("user.name"), + "userDataDirs", userDataDirectorySupplier.get() + ); + + engine = globalContainer.newEngine(engineConfiguration); + log.info("Obtained Engine instance v" + engine.getVersion()); + + // Whenever we create an instance of the engine to hand over to the user, we will register + // our shutdown hook to close this instance. This helps to ensure that the license is released + // in some scenarios where our code to explicitly release it may be skipped, such as code calling + // System.exit before returning from user provided Consumer. + log.info("Adding shutdown hook for EngineWrapper::close"); + shutdownHook = new Thread(() -> { + try { + close(); + } catch (Exception e) { + log.error("Error in shutdown hook", e); + } + }); + Runtime.getRuntime().addShutdownHook(shutdownHook); + } + + /*** + * Returns the Nuix engine version by internally calling Engine.getVersion + *
Note that if Engine instance has not yet been initialized this returns "0.0.0.0" + * @return A String representing the Nuix Engine version or "0.0.0.0" if Engine has not yet been initialized. + */ + public String getNuixVersionString() { + if (engine != null) { + return engine.getVersion(); + } else { + return "0.0.0.0"; + } + } + + /*** + * Gets a {@link NuixVersion} object representing the Engine version as obtained by calling Engine.getVersion + *
Note that if Engine instance has not yet been initialized this returns "0.0.0.0" + * @return A NuixVersion object representing the Nuix Engine version or one representing "0.0.0.0" if + * Engine has not yet been initialized. + */ + public NuixVersion getNuixVersion() { + return NuixVersion.parse(getNuixVersionString()); + } + + /*** + * Logs information about all Nuix third party dependencies + * @param utilities Needs an instance of Utilities to get access to third party dependency information + */ + protected void logAllDependencyInfo(Utilities utilities) { + log.info("Reviewing third party dependency statuses:"); + try { + List dependencies = utilities.getThirdPartyDependencies(); + for (ThirdPartyDependency dependency : dependencies) { + try { + ThirdPartyDependencyStatus status = dependency.performCheck(); + log.info(String.format( + "[%s] '%s': %s", + status.isAttentionRequired() ? " " : "X", + dependency.getDescription(), + status.getMessage() + )); + } catch (Exception e) { + log.error(String.format( + "[!] '%s': Error Checking Status: %s", + dependency.getDescription(), + e.getMessage() + )); + } + } + } catch (Exception e) { + log.error("Error while fetching list of third party dependencies", e); + } + } + + /*** + * Cleans up resources associated with this instance: + *
    + *
  • Calls close on underlying Engine instance
  • + *
  • Drop reference to obtained Utilities object
  • + *
  • Unregisters shutdown hook
  • + *
  • Shuts down logging
  • + *
+ * @throws Exception If thrown, was a result of a method being called by this method and allowed to bubble up to caller. + */ + @Override + public void close() throws Exception { + // Close engine if we have an instance to close + if (engine != null) { + final String message = "Closing engine instance"; + if (log != null) { + log.info(message); + } else { + System.out.println(message); + } + engine.close(); + } + + // Drop reference to Utilities object + utilities = null; + + // Unregister shutdown hook since we are closing things up now + if (shutdownHook != null) { + final String message = "Removing shutdown hook to NuixEngine::close"; + if (log != null) { + log.info(message); + } else { + System.out.println(message); + } + Runtime.getRuntime().removeShutdownHook(shutdownHook); + shutdownHook = null; + } + + // Shutdown logging + if (log != null) { + ((LifeCycle) LogManager.getContext()).stop(); + log = null; + } + } + + public void showConfidentialValuesInLog(boolean enabled) { + System.setProperty("nuix.log.confidential.showValues", String.valueOf(enabled)); + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseFeaturesLogger.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseFeaturesLogger.java new file mode 100644 index 0000000..f45f07d --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseFeaturesLogger.java @@ -0,0 +1,86 @@ +package com.nuix.innovation.enginewrapper; + +import nuix.Licence; +import nuix.LicenceProperties; +import nuix.engine.AvailableLicence; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.StringJoiner; + +/*** + * Helper class for logging what features are present on a given license. + * @author Jason Wells + */ +public class NuixLicenseFeaturesLogger { + // Obtain a logger instance for this class + private final static Logger logger = LogManager.getLogger("LicenseFeatures"); + + // List of license features copied from 9.10 license profiles documentation + private static final String[] knownFeatures = new String[]{ + "ANALYSIS", "AOS_DATA", "AUTOMATIC_CLASSIFIER_EDITING", "AXS_ONE", "CASE_CREATION", "CUSTOM_NAMED_ENTITIES", + "CYBER_CONTEXT", "DESKTOP", "ELASTIC_SEARCH", "EXCHANGE_WS", "EXPORT_CASE_SUBSET", "EXPORT_DISCOVER", + "EXPORT_ITEMS", "EXPORT_LEGAL", "EXPORT_SINGLE_ITEM", "EXPORT_VIEW", "FAST_REVIEW", "FRONT_LOAD_METADATA", + "GENERAL_DATA", "GRAPH", "GWAVA", "IMAP_POP", "LIGHT_SPEED", "LOG_STASH", "LOTUS_NOTES", "MAIL_XTENDER", + "METADATA_IMPORT", "MICROSOFT_GRAPH", "MOBILE_DEVICE_IMAGING", "NETWORK_DATA", "OCR_PROCESSING", + "OTHER_EMAIL", "OUTLOOK", "OUTLOOK_EXPRESS", "PARTIAL_LOAD", "PRODUCTION_SET", "SCRIPTING", + "SYMANTEC_VAULT", "UNRESTRICTED_CASE_ACCESS", "WORKER", "WORKER_SCRIPTING", "ZANTAZ" + }; + + /*** + * Returns a String array containing a list of known license features + * @return Array of known license features + */ + public static String[] getKnownFeatures() { + return knownFeatures; + } + + /*** + * Generates a String summarizing the details of the provided AvailableLicence. + * @param availableLicense The AvailableLicense to summarize + * @return A String summarizing the AvailableLicense + */ + public static String summarizeLicense(AvailableLicence availableLicense) { + if(availableLicense == null) { return "NULL LICENSE"; } + String result = String.format("[Location=%s, Type=%s, ShortName=%s, Description=%s, Count=%s, Workers=%s, Features=%s]", + availableLicense.getSource().getLocation(), + availableLicense.getSource().getType(), + availableLicense.getShortName(), + availableLicense.getDescription(), + availableLicense.getCount(), + ((LicenceProperties) availableLicense).getWorkers(), + String.join("; ", availableLicense.getAllEnabledFeatures()) + ); + return result; + } + + /*** + * Generates a String summarizing the details of the provided License. + * @param license The Licence to summarize + * @return A String summarizing the Licence + */ + public static String summarizeLicense(Licence license) { + if(license == null) { return "NULL LICENSE"; } + String result = String.format("[ShortName=%s, Description=%s, Workers=%s, Features=%s]", + license.getShortName(), + license.getDescription(), + ((LicenceProperties) license).getWorkers(), + String.join("; ", license.getAllEnabledFeatures()) + ); + return result; + } + + /*** + * Logs a listing of whether each feature is present or not on the provided license. + * @param license The license to log feature presence information about + */ + public static void logFeaturesOfLicense(LicenceProperties license) { + StringJoiner message = new StringJoiner("\n"); + message.add("License Features:"); + for (String feature : knownFeatures) { + boolean hasFeature = license.hasFeature(feature); + message.add(String.format("[%s] %s", hasFeature ? "X" : " ", feature)); + } + logger.info(message.toString()); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseResolver.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseResolver.java new file mode 100644 index 0000000..e7f873a --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixLicenseResolver.java @@ -0,0 +1,444 @@ +package com.nuix.innovation.enginewrapper; + +import lombok.NonNull; +import nuix.LicenceProperties; +import nuix.engine.*; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Stream; + +/*** + * This class provides license resolution for a {@link NuixEngine} instance. Use it to specify: + *
    + *
  • What license sources should be queried:
      + *
    • {@link NuixLicenseResolver#fromServer(String, int)}
    • + *
    • {@link NuixLicenseResolver#fromCloud()}
    • + *
    • {@link NuixLicenseResolver#fromDongle()}
    • + *
    • {@link NuixLicenseResolver#fromAnySource()}
    • + *
  • + *
  • Criteria to disqualify some licenses from being acquired when there are multiple to select from:
      + *
    • {@link #withRequiredFeatures(String...)}
    • + *
    • {@link #withMinWorkerCount(int)}
    • + *
    • {@link #withMaxWorkerCount(int)}
    • + *
    • {@link #withFinalDecisionMadeBy(Function)}
    • + *
  • + *
  • Custom logic to ultimately pick the license acquired from candidates {@link #withFinalDecisionMadeBy(Function)}
  • + *
  • Configuration details that are part of obtaining a license:
      + *
    • {@link #withCertificateTrustCallback(CertificateTrustCallback)}
    • + *
    • {@link #withLicenseCredentials(String, String)}
    • + *
    • {@link #withLicenseCredentialsProvider(CredentialsCallback)}
    • + *
    • {@link #withLicenseCredentialsResolvedFromEnvVars(String, String)}
    • + *
    • {@link #withLicenseCredentialsResolvedFromEnvVars()}
    • + *
  • + *
+ *

+ * Example usages: + *
+ * {@code
+ * // Define a resolver which will resolve licenses from Cloud License Server (CLS),
+ * // authenticating using upon environment variable "NUIX_USERNAME" and "NUIX_PASSWORD",
+ * // that have at least 4 workers and the feature "CASE_CREATION".
+ * LicenseResolver cloud_4_workers = NuixLicenseResolver.fromCloud()
+ *     .withLicenseCredentialsResolvedFromEnvVars()
+ *     .withMinWorkerCount(4)
+ *     .withRequiredFeatures("CASE_CREATION");
+ *
+ * // Define a resolver which will attempt to resolve a license from a local physical dongle
+ * // that has the feature "CASE_CREATION".
+ * LicenseResolver anyDongle = NuixLicenseResolver.fromDongle()
+ *     .withRequiredFeatures("CASE_CREATION");
+ * }
+ * 
+ * @author Jason Wells + */ +public class NuixLicenseResolver implements LicenseResolver { + private static final Logger log = LogManager.getLogger(NuixLicenseResolver.class); + + /*** + * An enum with options about how this license resolver should locate its license. + */ + public enum LicenseResolutionSource { + /*** + * The license should be resolved from physical dongles attached to the machine. + */ + Dongle, + /*** + * The license should be resolved from a Nuix Management Server (NMS) instance. + */ + Server, + /*** + * The license should be resolved from the Nuix Cloud License Server (CLS). + */ + Cloud, + /*** + * The license resolution is not constrained to any particular source. + */ + Any, + /*** + * Similar to Any, but the user provides a custom list of sources. + */ + Custom + } + + protected LicenseResolutionSource licenseSource; + protected String customSource; + protected String serverHost; + protected int serverPort = 27443; + protected CredentialsCallback credentialsCallback; + protected CertificateTrustCallback certificateTrustCallback; + protected Set requiredFeatures = new HashSet<>(); + protected int minWorkerCount = 0; + protected int maxWorkerCount = 0; + protected String targetShortName = null; + protected Function, Optional> finalDecider; + + protected NuixLicenseResolver() { + // By default, we will just return the first one that matches our criteria, but user + // could provide custom logic that ultimately decides which license (if any) of those + // that have met other criteria is selected. + finalDecider = availableLicenceStream -> { + log.info("Picking first available license candidate..."); + return availableLicenceStream.findAny(); + }; + + // By default, we blindly trust any cert. User can provide more discerning method if they wish. + certificateTrustCallback = certificateTrustCallbackInfo -> { + log.info("Blindly trusting certificate..."); + certificateTrustCallbackInfo.setTrusted(true); + }; + } + + /*** + * Creates an instance specifically for resolving a license from a Nuix Management Server (NMS) instance. + * @param host The host/ip of the NMS server. + * @param port The port of the NMS server. + * @return An NMS specific license resolver + */ + public static NuixLicenseResolver fromServer(@NonNull String host, int port) { + NuixLicenseResolver result = new NuixLicenseResolver(); + result.licenseSource = LicenseResolutionSource.Server; + result.serverHost = host; + result.serverPort = port; + return result; + } + + /*** + * Creates an instance specifically for resolving a license from a Nuix Management Server (NMS) instance. + * Similar to calling {@link #fromServer(String, int)} with a port of 27443 (the default). + * @param host The host/ip of the NMS server. + * @return An NMS specific license resolver + */ + public static NuixLicenseResolver fromServer(@NonNull String host) { + return fromServer(host, 27443); + } + + /*** + * Creates an instance specifically for resolving a physical dongle based license. + * @return A dongle specific license resolver. + */ + public static NuixLicenseResolver fromDongle() { + NuixLicenseResolver result = new NuixLicenseResolver(); + result.licenseSource = LicenseResolutionSource.Dongle; + return result; + } + + /*** + * Creates an instance specifically for resolving a license from the Nuix Cloud License Server (CLS). + * @return A CLS specific license resolver. + */ + public static NuixLicenseResolver fromCloud() { + NuixLicenseResolver result = new NuixLicenseResolver(); + result.licenseSource = LicenseResolutionSource.Cloud; + return result; + } + + /*** + * Creates an instance which places no constraints on where the license is obtained from. When using this, + * no "sources" parameter is provided to the licensor, allowing for a license to be obtained from all sources + * that the engine is able to locate. + * @return A license resolver that is indifferent to where the license comes from. + */ + public static NuixLicenseResolver fromAnySource() { + NuixLicenseResolver result = new NuixLicenseResolver(); + result.licenseSource = LicenseResolutionSource.Any; + return result; + } + + /*** + * Creates an instance that will specify a custom source. + * @param customSource The custom source value to provide. + * @return A license resolver that uses a custom license source. + */ + public static NuixLicenseResolver fromCustomSource(@NonNull String customSource) { + NuixLicenseResolver result = new NuixLicenseResolver(); + result.licenseSource = LicenseResolutionSource.Custom; + result.customSource = customSource; + return result; + } + + /*** + * Specifies a list of one or more features that a license must have to be acceptable. + * @param features The required features. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withRequiredFeatures(String... features) { + if (features != null) { + requiredFeatures.addAll(Arrays.asList(features)); + } + return this; + } + + /*** + * Specifies a list of one or more features that a license must have to be acceptable. + * @param features The required features. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withRequiredFeatures(Collection features) { + if (features != null) { + requiredFeatures.addAll(features); + } + return this; + } + + /*** + * Specifies a minimum worker count a given license must have to be acceptable. + * @param minWorkerCount The minimum worker count. A value of 0 means no minimum. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withMinWorkerCount(int minWorkerCount) { + this.minWorkerCount = minWorkerCount; + return this; + } + + /*** + * Specifies a maximum worker count a license can have to be acceptable. This exists mostly + * to help in situations where you might have a license with a small amount of workers and another with a larger + * amount of workers to assist in preventing acquisition of the larger worker count license. + * @param maxWorkerCount The maximum worker count. A value of 0 means no maximum. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withMaxWorkerCount(int maxWorkerCount) { + this.maxWorkerCount = maxWorkerCount; + return this; + } + + /*** + * Allows you to provide a function which makes the final decision as to which available license to obtain. + * Supplied function will be provided Stream of AvailableLicenses after this license resolver has applied any + * filtering that it may have applied. + * @param finalDecider A function that can make the final choice of which (if any) license to acquire. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withFinalDecisionMadeBy( + @NonNull Function, Optional> finalDecider) { + this.finalDecider = finalDecider; + return this; + } + + /*** + * Allows you to provider a license credentials callback used for license authentication (CLS/NMS). + * @param credentialsCallback The custom credentials callback + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withLicenseCredentialsProvider(CredentialsCallback credentialsCallback) { + this.credentialsCallback = credentialsCallback; + return this; + } + + /*** + * Allows you to specify the specific username and password to use for license authentication (CLS/NMS) + * @param userName The username to use + * @param password The password to use + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withLicenseCredentials(String userName, String password) { + this.credentialsCallback = credentialsCallbackInfo -> { + credentialsCallbackInfo.setUsername(userName); + credentialsCallbackInfo.setPassword(password); + }; + return this; + } + + /*** + * Allows you to specify Environment variables to resolve the license authentication username and password from. + * @param usernameEnvVar The name of the environment variable + * @param passwordEnvVar The password of the environment variable + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withLicenseCredentialsResolvedFromEnvVars(String usernameEnvVar, String passwordEnvVar) { + this.credentialsCallback = credentialsCallbackInfo -> { + credentialsCallbackInfo.setUsername(System.getenv(usernameEnvVar)); + credentialsCallbackInfo.setPassword(System.getenv(passwordEnvVar)); + }; + return this; + } + + /*** + * Specifies that license authentication credentials will be obtained from environment variables. The value of + * username will be pulled from "NUIX_USERNAME" and the value of password will be pulled from "NUIX_PASSWORD". + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withLicenseCredentialsResolvedFromEnvVars() { + return withLicenseCredentialsResolvedFromEnvVars("NUIX_USERNAME", "NUIX_PASSWORD"); + } + + /*** + * Specifies a certificate trust callback. + * @param certificateTrustCallback The certificate trust callback. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withCertificateTrustCallback(CertificateTrustCallback certificateTrustCallback) { + this.certificateTrustCallback = certificateTrustCallback; + return this; + } + + /*** + * Specifies a certificate trust callback that blindly accepts all certificates. This is the default behavior + * of license resolver. + * @return This license resolver for chained method calls. + */ + public NuixLicenseResolver withTrustAllCertificates() { + return withCertificateTrustCallback((certificateTrustCallbackInfo) -> certificateTrustCallbackInfo.setTrusted(true)); + } + + /*** + * Attempts to license the provided Engine instance using resolution and filtering configuration of this instance. + * @param engine The engine instance to attempt to license. + * @return True if a license was obtained, false if not. + * @throws Exception Exceptions thrown by any of the methods working to obtain a license will be uncaught and allowed + * to bubble up for caller to respond to. + */ + @Override + public boolean resolveLicense(@NonNull Engine engine) throws Exception { + Map licenseOptions = Collections.emptyMap(); + + log.info("License Source: "+licenseSource); + + switch (licenseSource) { + case Cloud: + licenseOptions = Map.of("sources", "cloud-server"); + System.setProperty("nuix.registry.servers", "https://licence-api.nuix.com"); + break; + case Server: + licenseOptions = Map.of("sources", "server"); + System.setProperty("nuix.registry.servers", serverHost + ":" + serverPort); + break; + case Dongle: + licenseOptions = Map.of("sources", "dongle"); + break; + case Any: + // No further action needed + break; + case Custom: + licenseOptions = Map.of("sources", customSource); + break; + } + + // Credentials supplier for instances which require it (server/cls) + if (credentialsCallback != null) { + engine.whenAskedForCredentials(credentialsCallback); + } + + // Certificate trust callback + if (certificateTrustCallback != null) { + engine.whenAskedForCertificateTrust(certificateTrustCallback); + } + + log.info("Obtaining licensor...."); + Licensor licensor = engine.getLicensor(); + + log.info("Obtaining license stream..."); + Stream availableLicensesStream = licensor.findAvailableLicencesStream(licenseOptions); + + log.info("Applying filtering to available licenses..."); + Stream filteredLicensesStream = availableLicensesStream.filter((availableLicense -> { + log.info("Inspecting license: "+ NuixLicenseFeaturesLogger.summarizeLicense(availableLicense)); + + // It is possible to get a Licence specifically for running an NMS instance and not an Engine instance + // which we can ignore since it cannot license an Engine instance for us. + if (availableLicense.getShortName().equalsIgnoreCase("server")) { + log.info("Skipping license with shortname 'server' as we cannot make use of it"); + return false; + } + + // Get the number of workers this license has to offer + Integer availableWorkerCount = ((LicenceProperties) availableLicense).getWorkers(); + + // Verify the minimum worker count + if (availableWorkerCount != null && minWorkerCount > 0 && availableWorkerCount < minWorkerCount) { + log.info(String.format("License has %s workers, filter specifies a minimum of %s, ignoring this license", + availableWorkerCount, minWorkerCount)); + return false; + } + + // Verify the maximum worker count. This is intended for situations where perhaps multiple fixed worker + // count licenses may be available, and you don't want to acquire licenses with larger worker counts. + // When acquiring from a license server and the license shares a worker pool (canChooseWorkers below) then + // the maximum is ignored. + if (availableWorkerCount != null && availableLicense.canChooseWorkers() && maxWorkerCount > 0 && availableWorkerCount > maxWorkerCount) { + log.info(String.format("License has %s workers, filter specifies a maximum of %s, ignoring this license", + availableWorkerCount, minWorkerCount)); + return false; + } + + // Verify short name + String availableLicenseShortName = availableLicense.getShortName().toLowerCase(); + if (targetShortName != null && !availableLicenseShortName.equalsIgnoreCase(targetShortName)) { + log.info(String.format("License has shortname %s which does not match the target shortname %s", + availableLicenseShortName, targetShortName)); + return false; + } + + log.info("License meets all specified criteria..."); + return true; + })); + + // If we have a finalDecider function, allow it to pick from the remaining choices + Optional possiblySelectedLicense; + if (finalDecider != null) { + log.info("Asking provided final decider function to choose license from potential candidates..."); + possiblySelectedLicense = finalDecider.apply(filteredLicensesStream); + } else { + log.info("Choosing first license from potential candidates..."); + possiblySelectedLicense = filteredLicensesStream.findAny(); + } + + // If we have a license to obtain, obtain it and let caller know we have obtained it by + // returning true. Otherwise, return false so caller knows that no license has been resolved yet. + if (possiblySelectedLicense.isPresent()) { + AvailableLicence selectedLicense = possiblySelectedLicense.get(); + if (selectedLicense.canChooseWorkers()) { + int countToAcquire = Math.max(minWorkerCount, 2); + log.info(String.format("License supports choosing worker count, attempting to acquire with %s workers", + countToAcquire)); + // If we are able to select the number of workers to obtain with the license, + // we will either use the minimum user provided or 2, whichever is higher. + selectedLicense.acquire(Map.of("workerCount", countToAcquire)); + } else { + log.info(String.format("License does not support choosing worker count, attempting to acquire with all %s workers", + ((LicenceProperties) selectedLicense).getWorkers())); + selectedLicense.acquire(); + } + return true; + } else { + return false; + } + } + + @Override + public String toString() { + return "LicenseResolver{" + + "licenseSource=" + licenseSource + + ", customSource='" + customSource + '\'' + + ", serverHost='" + serverHost + '\'' + + ", serverPort=" + serverPort + + ", requiredFeatures=" + requiredFeatures + + ", minWorkerCount=" + minWorkerCount + + ", maxWorkerCount=" + maxWorkerCount + + ", targetShortName='" + targetShortName + '\'' + + '}'; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixVersion.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixVersion.java new file mode 100644 index 0000000..ae5cbda --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/NuixVersion.java @@ -0,0 +1,265 @@ +package com.nuix.innovation.enginewrapper; + +import java.util.regex.Pattern; + +/*** + * Provides a wrapper around Nuix version string that allows for comparison of versions. + * @author Jason Wells + */ +public class NuixVersion implements Comparable { + private static Pattern previewVersionInfoRemovalPattern = Pattern.compile("[^0-9\\.].*$"); + + private int major = 0; + private int minor = 0; + private int bugfix = 0; + private int build = 0; + + /*** + * Creates a new instance defaulting to version 0.0.0 + */ + public NuixVersion() { + this(0, 0, 0, 0); + } + + /*** + * Creates a new instance using the provided major version: major.0.0.0 + * @param majorVersion The major version number + */ + public NuixVersion(int majorVersion) { + this(majorVersion, 0, 0, 0); + } + + /*** + * Creates a new instance using the provided major and minor versions: major.minor.0.0 + * @param majorVersion The major version number + * @param minorVersion The minor version number + */ + public NuixVersion(int majorVersion, int minorVersion) { + this(majorVersion, minorVersion, 0, 0); + } + + /*** + * Creates a new instance using the provided major, minor and bugfix versions: major.minor.bugfix.0 + * @param majorVersion The major version number + * @param minorVersion The minor version number + * @param bugfixVersion The bugfix version number + */ + public NuixVersion(int majorVersion, int minorVersion, int bugfixVersion) { + this(majorVersion, minorVersion, bugfixVersion, 0); + } + + /*** + * Creates a new instance using the provided major, minor, bugfix and build versions: major.minor.bugfix.build + * @param majorVersion The major version number + * @param minorVersion The minor version number + * @param bugfixVersion The bugfix version number + * @param buildVersion The build version number + */ + public NuixVersion(int majorVersion, int minorVersion, int bugfixVersion, int buildVersion) { + major = majorVersion; + minor = minorVersion; + bugfix = bugfixVersion; + build = buildVersion; + } + + /*** + * Parses a version string into a NuixVersion instance. Supports values such as: 6, 6.2, 6.2.0, 6.2.1-preview6, 7.8.0.10
+ * When providing a version string such as "6.2.1-preview6", "-preview6" will be trimmed off before parsing. + * @param versionString The version string to parse. + * @return A NuixVersion instance representing the supplied version string, if there is an error parsing the provided value will return + * an instance representing 100.0.0 + */ + public static NuixVersion parse(String versionString) { + try { + String[] versionParts = NuixVersion.previewVersionInfoRemovalPattern.matcher(versionString.trim()).replaceAll("").split("\\."); + int[] versionPartInts = new int[versionParts.length]; + for (int i = 0; i < versionParts.length; i++) { + versionPartInts[i] = Integer.parseInt(versionParts[i]); + } + switch (versionParts.length) { + case 1: + return new NuixVersion(versionPartInts[0]); + case 2: + return new NuixVersion(versionPartInts[0], versionPartInts[1]); + case 3: + return new NuixVersion(versionPartInts[0], versionPartInts[1], versionPartInts[2]); + case 4: + return new NuixVersion(versionPartInts[0], versionPartInts[1], versionPartInts[2], versionPartInts[3]); + default: + return new NuixVersion(); + } + } catch (Exception exc) { + System.out.println("Error while parsing version: " + versionString); + System.out.println("Pretending version is 100.0.0.0"); + return new NuixVersion(100, 0, 0, 0); + } + } + + /*** + * Gets the determined major portion of this version instance (X.0.0.0) + * @return The determined major portion of version + */ + public int getMajor() { + return major; + } + + /*** + * Sets the major portion of this version instance (X.0.0.0) + * @param major The major version value + */ + public void setMajor(int major) { + this.major = major; + } + + /*** + * Gets the determined minor portion of this version instance (0.X.0.0) + * @return The determined minor portion of version + */ + public int getMinor() { + return minor; + } + + /*** + * Sets the minor portion of this version instance (0.X.0.0) + * @param minor The minor version value + */ + public void setMinor(int minor) { + this.minor = minor; + } + + /*** + * Gets the determined bugfix portion of this version instance (0.0.x.0) + * @return The determined bugfix portion of version + */ + public int getBugfix() { + return bugfix; + } + + /*** + * Sets the determined bugfix portion of this version instance (0.0.x.0) + * @param bugfix The determined bugfix portion of version + */ + public void setBugfix(int bugfix) { + this.bugfix = bugfix; + } + + /*** + * Gets the determined build portion of this version instance (0.0.0.x) + * @return The determined build portion of version + */ + public int getBuild() { + return build; + } + + /*** + * Sets the build portion of this version instance (0.0.0.x) + * @param build The build version value + */ + public void setBuild(int build) { + this.build = build; + } + + /*** + * Determines whether another instance's version is less than this instance + * @param other The other instance to compare against + * @return True if the other instance is a lower version, false otherwise + */ + public boolean isLessThan(NuixVersion other) { + return this.compareTo(other) < 0; + } + + /*** + * Determines whether another instance's version is greater than or equal to this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than or equal to this instance, false otherwise + */ + public boolean isAtLeast(NuixVersion other) { + return this.compareTo(other) >= 0; + } + + /*** + * Determines whether another instance's version is greater than this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than this instance, false otherwise + */ + public boolean isGreaterThan(NuixVersion other) { + return this.compareTo(other) > 0; + } + + /*** + * Determines whether another instance's version is greater than this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than this instance, false otherwise + */ + public boolean isGreaterThan(String other) { + return this.compareTo(NuixVersion.parse(other)) > 0; + } + + /*** + * Determines whether another instance's version is equal to this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than this instance, false otherwise + */ + public boolean isEqualTo(NuixVersion other) { + return this.compareTo(other) == 0; + } + + /*** + * Determines whether another instance's version is equal to this instance + * @param other The other instance to compare against + * @return True if the other instance is equal to this instance (major, minor and release are the same), false otherwise + */ + public boolean isEqualTo(String other) { + return this.compareTo(NuixVersion.parse(other)) == 0; + } + + /*** + * Determines whether another instance's version is less than this instance + * @param other A version string to compare against + * @return True if the other instance is a lower version, false otherwise + */ + public boolean isLessThan(String other) { + return isLessThan(parse(other)); + } + + /*** + * Determines whether another instance's version is greater than or equal to this instance + * @param other A version string to compare against + * @return True if the other instance is greater than or equal to this instance, false otherwise + */ + public boolean isAtLeast(String other) { + return isAtLeast(parse(other)); + } + + /*** + * Provides comparison logic when comparing two instances. + */ + @Override + public int compareTo(NuixVersion other) { + if (this.major == other.major) { + if (this.minor == other.minor) { + if (this.bugfix == other.bugfix) { + return Integer.compare(this.build, other.build); + } else { + return Integer.compare(this.bugfix, other.bugfix); + } + } else { + return Integer.compare(this.minor, other.minor); + } + } else { + return Integer.compare(this.major, other.major); + } + + } + + /*** + * Converts this instance back to a version string from its components, such as: "7.8.0.10" + */ + @Override + public String toString() { + return Integer.toString(this.major) + "." + + Integer.toString(this.minor) + "." + + Integer.toString(this.bugfix) + "." + + Integer.toString(this.build); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/RubyScriptRunner.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/RubyScriptRunner.java new file mode 100644 index 0000000..40afd1a --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/RubyScriptRunner.java @@ -0,0 +1,155 @@ +package com.nuix.innovation.enginewrapper; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.exception.ExceptionUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.jruby.embed.LocalVariableBehavior; +import org.jruby.embed.ScriptingContainer; + +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Writer; +import java.util.Map; +import java.util.function.Consumer; + +public class RubyScriptRunner { + private static final Logger log = LogManager.getLogger(RubyScriptRunner.class); + + static class EventedWriter extends Writer { + private Consumer consumer; + + public EventedWriter(Consumer consumer) { + this.consumer = consumer; + } + + @Override + public void write(@NotNull char[] cbuf, int off, int len) throws IOException { + synchronized (lock) { + if (consumer != null) { + char[] subchars = new char[len]; + System.arraycopy(cbuf, off, subchars, 0, len); + String value = new String(subchars); + SwingUtilities.invokeLater(() -> { + consumer.accept(value); + }); + } + } + } + + @Override + public void flush() throws IOException { + } + + @Override + public void close() throws IOException { + consumer = null; + } + } + + protected ScriptingContainer scriptingContainer; + protected Thread scriptThread; + protected Consumer standardOutput; + protected Consumer errorOutput; + + public RubyScriptRunner() { + } + + public void interrupt() { + if (scriptThread != null) { + scriptThread.interrupt(); + } + } + + public boolean isAlive() { + if (scriptThread != null) { + return scriptThread.isAlive(); + } else { + return false; + } + } + + public void join(long timeoutMillis) throws InterruptedException { + if (scriptThread != null) { + scriptThread.join(timeoutMillis); + } + } + + public void join() throws InterruptedException { + join(0); + } + + public Consumer getStandardOutput() { + return standardOutput; + } + + public void setStandardOutput(Consumer standardOutput) { + this.standardOutput = standardOutput; + } + + public Consumer getErrorOutput() { + return errorOutput; + } + + public void setErrorOutput(Consumer errorOutput) { + this.errorOutput = errorOutput; + } + + public void runScriptAsync(String script, String nuixVersion, Map variables) { + initialize(nuixVersion, variables); + + scriptThread = new Thread(() -> { + scriptingContainer.runScriptlet(script); + }); + + scriptThread.start(); + } + + public void runFileAsync(File scriptFile, String nuixVersion, Map variables) { + initialize(nuixVersion, variables); + + scriptThread = new Thread(() -> { + try (InputStream scriptFileInputStream = FileUtils.openInputStream(scriptFile)) { + scriptingContainer.runScriptlet(scriptFileInputStream, scriptFile.getAbsolutePath()); + } catch (Exception exc) { + errorOutput.accept(ExceptionUtils.getMessage(exc) + "\n" + ExceptionUtils.getStackTrace(exc)); + } + }); + + scriptThread.start(); + } + + private void initialize(String nuixVersion, Map variablesToSet) { + // Wait on any already running scripts + try { + join(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + + if (standardOutput == null) { + standardOutput = log::info; + } + + if (errorOutput == null) { + errorOutput = log::error; + } + + scriptingContainer = new ScriptingContainer(LocalVariableBehavior.TRANSIENT); + + scriptingContainer.setWriter(new EventedWriter(this.standardOutput)); + scriptingContainer.setErrorWriter(new EventedWriter(this.standardOutput)); + + scriptingContainer.runScriptlet("NUIX_VERSION = \"" + nuixVersion + "\""); + + scriptingContainer.clear(); + for (Map.Entry variableToSet : variablesToSet.entrySet()) { + log.info("Setting variable: '{}' to '{}'", variableToSet.getKey(), variableToSet.getValue()); + scriptingContainer.put(variableToSet.getKey(), variableToSet.getValue()); + } + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/ThrowCapableConsumer.java b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/ThrowCapableConsumer.java new file mode 100644 index 0000000..390ca3f --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/innovation/enginewrapper/ThrowCapableConsumer.java @@ -0,0 +1,10 @@ +package com.nuix.innovation.enginewrapper; + +/*** + * An interface similar to {@link java.util.function.Consumer}, but allows for throwing checked exceptions. + * @param The type of the argument accepted. + */ +@FunctionalInterface +public interface ThrowCapableConsumer { + void accept(T value) throws Exception; +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/LookAndFeelHelper.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/LookAndFeelHelper.java new file mode 100644 index 0000000..df349fc --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/LookAndFeelHelper.java @@ -0,0 +1,33 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx; + +import javax.swing.UIManager; +import javax.swing.UIManager.LookAndFeelInfo; +/** + * Helper utility to change the Java look and feel. + * @author Jason Wells + */ +public class LookAndFeelHelper { + /** + * Changes the current Java look and feel to "Windows" if it is currently "Metal". You will usually want to call + * this early on to keep your script from having the default Java look. + */ + public static void setWindowsIfMetal(){ + if(UIManager.getLookAndFeel().getName().equals("Metal")){ + try { + for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) { + if ("Windows".equals(info.getName())) { + UIManager.setLookAndFeel(info.getClassName()); + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/NuixConnection.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/NuixConnection.java new file mode 100644 index 0000000..955749d --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/NuixConnection.java @@ -0,0 +1,72 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx; + +import nuix.Case; +import nuix.Utilities; + +/*** + * This class provides a way to hand required Nuix objects over to the library + * for the methods that need them. In the least you will probably want to call + * {@link #setUtilities(Utilities)} before using any of the classes in the + * com.nuix.nx.* package. + * @author Jason Wells + * + */ +public class NuixConnection { + private static Utilities utilities; + private static Case currentCase; + private static NuixVersion currentVersion; + + /*** + * Gets the instance of Utilities provided by previous call to {@link #setUtilities(Utilities)} + * @return Utilities instance provided by code using library, or null if {@link #setUtilities(Utilities)} was not yet called + */ + public static Utilities getUtilities() { + return utilities; + } + /*** + * Sets the instance of Utilities for the current session. It is important to note that without making this + * call aspects of this library may fail with exceptions as they need to have an instance of Utilities to function. + * It is recommended that any code using this library call this shortly after loading the JAR file. + * @param utilities The Nuix Utilities object associated with the current session. + */ + public static void setUtilities(Utilities utilities) { + NuixConnection.utilities = utilities; + } + + /*** + * Get the Nuix case provided via {@link #setCurrentCase(Case)} + * @return The case previously provided or null if no case has been provided + */ + public static Case getCurrentCase() { + return currentCase; + } + /*** + * Set the Nuix case to be considered the "current" case + * @param currentCase The case to set as being the "current" case + */ + public static void setCurrentCase(Case currentCase) { + NuixConnection.currentCase = currentCase; + } + + /*** + * Sets the current Nuix version. This may be used by library to detect features which are not available + * in a given version of Nuix. + * @param version A String containing the current Nuix version. + */ + public static void setCurrentNuixVersion(String version){ + currentVersion = NuixVersion.parse(version); + } + /*** + * Gets a {@link NuixVersion} object representing the current version of Nuix, assuming code using the library has + * previously made a call to {@link #setCurrentNuixVersion(String)} previously. + * @return A {@link NuixVersion} if previously set by call to {@link #setCurrentNuixVersion(String)}, else null. + */ + public static NuixVersion getCurrentNuixVersion(){ + return currentVersion; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/NuixVersion.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/NuixVersion.java new file mode 100644 index 0000000..2c0bc49 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/NuixVersion.java @@ -0,0 +1,290 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx; + +import java.lang.Package; +import java.util.regex.Pattern; + +/*** + * Assists in representing a Nuix version in object form to assist with comparing two versions. This allows for things such as + * only executing chunks of code if the version meets a requirement.
+ * Ruby example: + *
+ * {@code
+ * current_version = NuixVersion.new(NUIX_VERSION)
+ * if current_version.isLessThan("7.8.0.10")
+ *     puts "Sorry your version of Nuix is below the minimum required version of 7.8.0.10"
+ *     exit 1
+ * end
+ * }
+ * 
+ * @author Jason Wells + * + */ +public class NuixVersion implements Comparable { + private static final Pattern previewVersionInfoRemovalPattern = Pattern.compile("[^0-9\\.].*$"); + + private int major = 0; + private int minor = 0; + private int bugfix = 0; + private int build = 0; + + /*** + * Creates a new instance defaulting to version 0.0.0 + */ + public NuixVersion(){ + this(0,0,0,0); + } + + /*** + * Creates a new instance using the provided major version: major.0.0.0 + * @param majorVersion The major version number + */ + public NuixVersion(int majorVersion){ + this(majorVersion,0,0,0); + } + /*** + * Creates a new instance using the provided major and minor versions: major.minor.0.0 + * @param majorVersion The major version number + * @param minorVersion The minor version number + */ + public NuixVersion(int majorVersion, int minorVersion){ + this(majorVersion,minorVersion,0,0); + } + /*** + * Creates a new instance using the provided major, minor and bugfix versions: major.minor.bugfix.0 + * @param majorVersion The major version number + * @param minorVersion The minor version number + * @param bugfixVersion The bugfix version number + */ + public NuixVersion(int majorVersion, int minorVersion, int bugfixVersion){ + this(majorVersion,minorVersion,bugfixVersion,0); + } + + /*** + * Creates a new instance using the provided major, minor, bugfix and build versions: major.minor.bugfix.build + * @param majorVersion The major version number + * @param minorVersion The minor version number + * @param bugfixVersion The bugfix version number + * @param buildVersion The build version number + */ + public NuixVersion(int majorVersion, int minorVersion, int bugfixVersion, int buildVersion){ + major = majorVersion; + minor = minorVersion; + bugfix = bugfixVersion; + build = buildVersion; + } + + /*** + * Parses a version string into a NuixVersion instance. Supports values such as: 6, 6.2, 6.2.0, 6.2.1-preview6, 7.8.0.10
+ * When providing a version string such as "6.2.1-preview6", "-preview6" will be trimmed off before parsing. + * @param versionString The version string to parse. + * @return A NuixVersion instance representing the supplied version string, if there is an error parsing the provided value will return + * an instance representing 100.0.0 + */ + public static NuixVersion parse(String versionString){ + try { + String[] versionParts = NuixVersion.previewVersionInfoRemovalPattern.matcher(versionString.trim()).replaceAll("").split("\\."); + int[] versionPartInts = new int[versionParts.length]; + for(int i=0;i= 0; + } + /*** + * Determines whether another instance's version is greater than this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than this instance, false otherwise + */ + public boolean isGreaterThan(NuixVersion other){ + return this.compareTo(other) > 0; + } + /*** + * Determines whether another instance's version is greater than this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than this instance, false otherwise + */ + public boolean isGreaterThan(String other){ + return this.compareTo(NuixVersion.parse(other)) > 0; + } + /*** + * Determines whether another instance's version is equal to this instance + * @param other The other instance to compare against + * @return True if the other instance is greater than this instance, false otherwise + */ + public boolean isEqualTo(NuixVersion other){ + return this.compareTo(other) == 0; + } + /*** + * Determines whether another instance's version is equal to this instance + * @param other The other instance to compare against + * @return True if the other instance is equal to this instance (major, minor and release are the same), false otherwise + */ + public boolean isEqualTo(String other){ + return this.compareTo(NuixVersion.parse(other)) == 0; + } + /*** + * Determines whether another instance's version is less than this instance + * @param other A version string to compare against + * @return True if the other instance is a lower version, false otherwise + */ + public boolean isLessThan(String other){ + return isLessThan(parse(other)); + } + /*** + * Determines whether another instance's version is greater than or equal to this instance + * @param other A version string to compare against + * @return True if the other instance is greater than or equal to this instance, false otherwise + */ + public boolean isAtLeast(String other){ + return isAtLeast(parse(other)); + } + + /*** + * Provides comparison logic when comparing two instances. + */ + @Override + public int compareTo(NuixVersion other) { + if(this.major == other.major){ + if(this.minor == other.minor){ + if(this.bugfix == other.bugfix) { + return Integer.compare(this.build, other.build); + } else { + return Integer.compare(this.bugfix, other.bugfix); + } + } else{ + return Integer.compare(this.minor, other.minor); + } + } else{ + return Integer.compare(this.major, other.major); + } + + } + + /*** + * Converts this instance back to a version string from its components, such as: "7.8.0.10" + */ + @Override + public String toString(){ + return Integer.toString(this.major) + "." + + Integer.toString(this.minor) + "." + + Integer.toString(this.bugfix) + "." + + Integer.toString(this.build); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/callbacks/SimpleProgressCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/callbacks/SimpleProgressCallback.java new file mode 100644 index 0000000..43c4c5e --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/callbacks/SimpleProgressCallback.java @@ -0,0 +1,16 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.callbacks; + +/*** + * Used as a way to provide simple feedback regarding progress which can be quantified + * as amount completed over total amount. + * @author Jason Wells + * + */ +public interface SimpleProgressCallback { + public void progressUpdated(long current, long total); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterLoadFileSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterLoadFileSettings.java new file mode 100644 index 0000000..3d67bd7 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterLoadFileSettings.java @@ -0,0 +1,154 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import javax.swing.JPanel; +import java.awt.GridBagLayout; +import javax.swing.border.TitledBorder; + +import com.nuix.nx.NuixConnection; + +import nuix.MetadataProfile; + +import javax.swing.JLabel; +import java.awt.GridBagConstraints; +import java.awt.Insets; +import java.util.List; + +/*** + * A control which encapsulates some of the common load file export settings. + * @author Jason Wells + */ +@SuppressWarnings("serial") +public class BatchExporterLoadFileSettings extends JPanel { + private ComboItemBox comboLoadFileType; + private ComboItemBox comboProfile; + private ComboItemBox comboEncoding; + private ComboItemBox comboLineSeparator; + public BatchExporterLoadFileSettings() { + setBorder(new TitledBorder(null, "Load File Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 200, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JLabel lblType = new JLabel("Type"); + GridBagConstraints gbc_lblType = new GridBagConstraints(); + gbc_lblType.insets = new Insets(0, 0, 5, 5); + gbc_lblType.anchor = GridBagConstraints.EAST; + gbc_lblType.gridx = 0; + gbc_lblType.gridy = 0; + add(lblType, gbc_lblType); + + comboLoadFileType = new ComboItemBox(); + GridBagConstraints gbc_comboLoadFileType = new GridBagConstraints(); + gbc_comboLoadFileType.insets = new Insets(0, 0, 5, 5); + gbc_comboLoadFileType.fill = GridBagConstraints.HORIZONTAL; + gbc_comboLoadFileType.gridx = 1; + gbc_comboLoadFileType.gridy = 0; + add(comboLoadFileType, gbc_comboLoadFileType); + + JLabel lblMetadataProfile = new JLabel("Metadata Profile"); + GridBagConstraints gbc_lblMetadataProfile = new GridBagConstraints(); + gbc_lblMetadataProfile.anchor = GridBagConstraints.EAST; + gbc_lblMetadataProfile.insets = new Insets(0, 0, 5, 5); + gbc_lblMetadataProfile.gridx = 0; + gbc_lblMetadataProfile.gridy = 1; + add(lblMetadataProfile, gbc_lblMetadataProfile); + + comboProfile = new ComboItemBox(); + GridBagConstraints gbc_comboProfile = new GridBagConstraints(); + gbc_comboProfile.insets = new Insets(0, 0, 5, 5); + gbc_comboProfile.fill = GridBagConstraints.HORIZONTAL; + gbc_comboProfile.gridx = 1; + gbc_comboProfile.gridy = 1; + add(comboProfile, gbc_comboProfile); + + { + JLabel lblEncoding = new JLabel("Encoding"); + GridBagConstraints gbc_lblEncoding = new GridBagConstraints(); + gbc_lblEncoding.anchor = GridBagConstraints.EAST; + gbc_lblEncoding.insets = new Insets(0, 0, 5, 5); + gbc_lblEncoding.gridx = 0; + gbc_lblEncoding.gridy = 2; + add(lblEncoding, gbc_lblEncoding); + + comboEncoding = new ComboItemBox(); + GridBagConstraints gbc_comboEncoding = new GridBagConstraints(); + gbc_comboEncoding.insets = new Insets(0, 0, 5, 5); + gbc_comboEncoding.fill = GridBagConstraints.HORIZONTAL; + gbc_comboEncoding.gridx = 1; + gbc_comboEncoding.gridy = 2; + add(comboEncoding, gbc_comboEncoding); + + JLabel lblLineSeparator = new JLabel("Line Separator"); + GridBagConstraints gbc_lblLineSeparator = new GridBagConstraints(); + gbc_lblLineSeparator.anchor = GridBagConstraints.EAST; + gbc_lblLineSeparator.insets = new Insets(0, 0, 5, 5); + gbc_lblLineSeparator.gridx = 0; + gbc_lblLineSeparator.gridy = 3; + add(lblLineSeparator, gbc_lblLineSeparator); + + comboLineSeparator = new ComboItemBox(); + GridBagConstraints gbc_comboLineSeparator = new GridBagConstraints(); + gbc_comboLineSeparator.insets = new Insets(0, 0, 5, 5); + gbc_comboLineSeparator.fill = GridBagConstraints.HORIZONTAL; + gbc_comboLineSeparator.gridx = 1; + gbc_comboLineSeparator.gridy = 3; + add(comboLineSeparator, gbc_comboLineSeparator); + + comboLoadFileType.addValue("Concordance","concordance"); + comboLoadFileType.addValue("Summation","summation"); + comboLoadFileType.addValue("Discovery Radar","discovery_radar"); + comboLoadFileType.addValue("Documatrix","documatrix"); + comboLoadFileType.addValue("EDRM XML","edrm_xml"); + comboLoadFileType.addValue("EDRM XML ZIP","edrm_xml_zip"); + comboLoadFileType.addValue("IPRO","ipro"); + comboLoadFileType.addValue("Ring Tail","ringtail"); + comboLoadFileType.addValue("XHTML Summary Report","xhtml_summary_report"); + comboLoadFileType.addValue("CSV Summary Report","csv_summary_report "); + comboLoadFileType.setSelectedIndex(0); + + List profiles = NuixConnection.getUtilities().getMetadataProfileStore().getMetadataProfiles(); + for(MetadataProfile profile : profiles){ + String label = profile.getName() + " - " + profile.getMetadata().size() + " fields"; + comboProfile.addValue(label,profile.getName()); + } + comboProfile.setSelectedIndex(0); + + comboLineSeparator.addValue("\\n","\n"); + comboLineSeparator.addValue("\\r\\n","\r\n"); + comboLineSeparator.setSelectedValue(System.lineSeparator()); + + comboEncoding.addValue("UTF-8","UTF-8"); + comboEncoding.addValue("UTF-16","UTF-16"); + comboEncoding.addValue("CP-1252 / WINDOWS-1252","CP-1252"); + comboEncoding.addValue("ASCII","ASCII"); + comboEncoding.addValue("ISO-8859-1","ISO-8859-1"); + comboEncoding.addValue("UTF-16LE","UTF-16LE"); + comboEncoding.addValue("UTF-16BE","UTF-16BE"); + comboEncoding.setSelectedIndex(0); + } + } + + public ComboItemBox getComboLoadFileType() { + return comboLoadFileType; + } + + public ComboItemBox getComboProfile() { + return comboProfile; + } + + public ComboItemBox getComboEncoding() { + return comboEncoding; + } + + public ComboItemBox getComboLineSeparator() { + return comboLineSeparator; + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterNativeSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterNativeSettings.java new file mode 100644 index 0000000..e6e6409 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterNativeSettings.java @@ -0,0 +1,196 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; + +/*** + * A control which encapsulates some of the common native export settings. + * @author Jason Wells + */ +@SuppressWarnings("serial") +public class BatchExporterNativeSettings extends JPanel { + private JTextField txtPath; + private JTextField txtsuffix; + private ComboItemBox comboNaming; + private JLabel lblMailFormat; + private ComboItemBox comboMailFormat; + private JLabel lblIncludeAttachments; + private JCheckBox chckbxIncludeAttachments; + private JLabel lblRegenerateStored; + private JCheckBox chckbxRegenerateStored; + public BatchExporterNativeSettings() { + setBorder(new TitledBorder(null, "Native Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 200, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 10, 0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JLabel lblNaming = new JLabel("Naming"); + GridBagConstraints gbc_lblNaming = new GridBagConstraints(); + gbc_lblNaming.insets = new Insets(0, 0, 5, 5); + gbc_lblNaming.anchor = GridBagConstraints.EAST; + gbc_lblNaming.gridx = 0; + gbc_lblNaming.gridy = 0; + add(lblNaming, gbc_lblNaming); + + comboNaming = new ComboItemBox(); + GridBagConstraints gbc_comboNaming = new GridBagConstraints(); + gbc_comboNaming.insets = new Insets(0, 0, 5, 5); + gbc_comboNaming.fill = GridBagConstraints.HORIZONTAL; + gbc_comboNaming.gridx = 1; + gbc_comboNaming.gridy = 0; + add(comboNaming, gbc_comboNaming); + + JLabel lblSubDirectoryName = new JLabel("Sub Directory Name"); + GridBagConstraints gbc_lblSubDirectoryName = new GridBagConstraints(); + gbc_lblSubDirectoryName.anchor = GridBagConstraints.EAST; + gbc_lblSubDirectoryName.insets = new Insets(0, 0, 5, 5); + gbc_lblSubDirectoryName.gridx = 0; + gbc_lblSubDirectoryName.gridy = 1; + add(lblSubDirectoryName, gbc_lblSubDirectoryName); + + txtPath = new JTextField(); + txtPath.setText("NATIVE"); + GridBagConstraints gbc_txtPath = new GridBagConstraints(); + gbc_txtPath.insets = new Insets(0, 0, 5, 5); + gbc_txtPath.fill = GridBagConstraints.HORIZONTAL; + gbc_txtPath.gridx = 1; + gbc_txtPath.gridy = 1; + add(txtPath, gbc_txtPath); + txtPath.setColumns(10); + + JLabel lblSuffix = new JLabel("Suffix"); + GridBagConstraints gbc_lblSuffix = new GridBagConstraints(); + gbc_lblSuffix.anchor = GridBagConstraints.EAST; + gbc_lblSuffix.insets = new Insets(0, 0, 5, 5); + gbc_lblSuffix.gridx = 0; + gbc_lblSuffix.gridy = 2; + add(lblSuffix, gbc_lblSuffix); + + txtsuffix = new JTextField(); + GridBagConstraints gbc_txtsuffix = new GridBagConstraints(); + gbc_txtsuffix.insets = new Insets(0, 0, 5, 5); + gbc_txtsuffix.fill = GridBagConstraints.HORIZONTAL; + gbc_txtsuffix.gridx = 1; + gbc_txtsuffix.gridy = 2; + add(txtsuffix, gbc_txtsuffix); + txtsuffix.setColumns(10); + + lblMailFormat = new JLabel("Mail Format"); + GridBagConstraints gbc_lblMailFormat = new GridBagConstraints(); + gbc_lblMailFormat.anchor = GridBagConstraints.EAST; + gbc_lblMailFormat.insets = new Insets(0, 0, 5, 5); + gbc_lblMailFormat.gridx = 0; + gbc_lblMailFormat.gridy = 4; + add(lblMailFormat, gbc_lblMailFormat); + + comboMailFormat = new ComboItemBox(); + GridBagConstraints gbc_comboMailFormat = new GridBagConstraints(); + gbc_comboMailFormat.insets = new Insets(0, 0, 5, 5); + gbc_comboMailFormat.fill = GridBagConstraints.HORIZONTAL; + gbc_comboMailFormat.gridx = 1; + gbc_comboMailFormat.gridy = 4; + add(comboMailFormat, gbc_comboMailFormat); + + lblIncludeAttachments = new JLabel("Include Attachments"); + GridBagConstraints gbc_lblIncludeAttachments = new GridBagConstraints(); + gbc_lblIncludeAttachments.anchor = GridBagConstraints.EAST; + gbc_lblIncludeAttachments.insets = new Insets(0, 0, 5, 5); + gbc_lblIncludeAttachments.gridx = 0; + gbc_lblIncludeAttachments.gridy = 5; + add(lblIncludeAttachments, gbc_lblIncludeAttachments); + + chckbxIncludeAttachments = new JCheckBox(""); + chckbxIncludeAttachments.setSelected(true); + GridBagConstraints gbc_chckbxIncludeAttachments = new GridBagConstraints(); + gbc_chckbxIncludeAttachments.insets = new Insets(0, 0, 5, 5); + gbc_chckbxIncludeAttachments.anchor = GridBagConstraints.WEST; + gbc_chckbxIncludeAttachments.gridx = 1; + gbc_chckbxIncludeAttachments.gridy = 5; + add(chckbxIncludeAttachments, gbc_chckbxIncludeAttachments); + + lblRegenerateStored = new JLabel("Regenerate Stored"); + GridBagConstraints gbc_lblRegenerateStored = new GridBagConstraints(); + gbc_lblRegenerateStored.anchor = GridBagConstraints.EAST; + gbc_lblRegenerateStored.insets = new Insets(0, 0, 5, 5); + gbc_lblRegenerateStored.gridx = 0; + gbc_lblRegenerateStored.gridy = 6; + add(lblRegenerateStored, gbc_lblRegenerateStored); + + chckbxRegenerateStored = new JCheckBox(""); + GridBagConstraints gbc_chckbxRegenerateStored = new GridBagConstraints(); + gbc_chckbxRegenerateStored.insets = new Insets(0, 0, 5, 5); + gbc_chckbxRegenerateStored.anchor = GridBagConstraints.WEST; + gbc_chckbxRegenerateStored.gridx = 1; + gbc_chckbxRegenerateStored.gridy = 6; + add(chckbxRegenerateStored, gbc_chckbxRegenerateStored); + + comboNaming.addValue("Document ID","document_id"); + comboNaming.addValue("Document ID with Page","document_id_with_page"); + comboNaming.addValue("Page Only","page_only"); + comboNaming.addValue("Full","full"); + comboNaming.addValue("Full with Periods","full_with_periods"); + comboNaming.addValue("Item Name","item_name"); + comboNaming.addValue("Item Name with Path","item_name_with_path"); + comboNaming.addValue("GUID","guid"); + comboNaming.addValue("MD5","md5"); + comboNaming.setSelectedIndex(0); + + comboMailFormat.addValue("Native","native"); + comboMailFormat.addValue("EML","eml"); + comboMailFormat.addValue("HTML","html"); + comboMailFormat.addValue("Mime HTML","mime_html"); + comboMailFormat.addValue("MSG","msg"); + comboMailFormat.addValue("DXL","dxl"); + comboMailFormat.addValue("MBOX","mbox"); + comboMailFormat.addValue("PST","pst"); + comboMailFormat.addValue("NSF","nsf"); + comboMailFormat.setSelectedIndex(0); + } + + @Override + public void setEnabled(boolean value){ + for(Component c : getComponents()){ + c.setEnabled(value); + } + } + + public ComboItemBox getComboNaming() { + return comboNaming; + } + + public JTextField getTxtPath() { + return txtPath; + } + + public JTextField getTxtSuffix() { + return txtsuffix; + } + + public ComboItemBox getComboMailFormat() { + return comboMailFormat; + } + + public JCheckBox getChckbxIncludeAttachments() { + return chckbxIncludeAttachments; + } + + public JCheckBox getChckbxRegenerateStored() { + return chckbxRegenerateStored; + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterPdfSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterPdfSettings.java new file mode 100644 index 0000000..8548c45 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterPdfSettings.java @@ -0,0 +1,142 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.border.TitledBorder; + +/*** + * A control which encapsulates some of the common PDF export settings + * @author Jason Wells + */ +@SuppressWarnings("serial") +public class BatchExporterPdfSettings extends JPanel { + private JTextField txtPath; + private JTextField txtSuffix; + private ComboItemBox comboNaming; + private JLabel lblRegenerateStored; + private JCheckBox chckbxRegenerateStored; + + public BatchExporterPdfSettings() { + setBorder(new TitledBorder(null, "Text Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 200, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JLabel lblNaming = new JLabel("Naming"); + GridBagConstraints gbc_lblNaming = new GridBagConstraints(); + gbc_lblNaming.insets = new Insets(0, 0, 5, 5); + gbc_lblNaming.anchor = GridBagConstraints.EAST; + gbc_lblNaming.gridx = 0; + gbc_lblNaming.gridy = 0; + add(lblNaming, gbc_lblNaming); + + comboNaming = new ComboItemBox(); + GridBagConstraints gbc_comboNaming = new GridBagConstraints(); + gbc_comboNaming.insets = new Insets(0, 0, 5, 5); + gbc_comboNaming.fill = GridBagConstraints.HORIZONTAL; + gbc_comboNaming.gridx = 1; + gbc_comboNaming.gridy = 0; + add(comboNaming, gbc_comboNaming); + + JLabel lblSubDirectoryName = new JLabel("Sub Directory Name"); + GridBagConstraints gbc_lblSubDirectoryName = new GridBagConstraints(); + gbc_lblSubDirectoryName.anchor = GridBagConstraints.EAST; + gbc_lblSubDirectoryName.insets = new Insets(0, 0, 5, 5); + gbc_lblSubDirectoryName.gridx = 0; + gbc_lblSubDirectoryName.gridy = 1; + add(lblSubDirectoryName, gbc_lblSubDirectoryName); + + txtPath = new JTextField(); + txtPath.setText("TEXT"); + GridBagConstraints gbc_txtPath = new GridBagConstraints(); + gbc_txtPath.insets = new Insets(0, 0, 5, 5); + gbc_txtPath.fill = GridBagConstraints.HORIZONTAL; + gbc_txtPath.gridx = 1; + gbc_txtPath.gridy = 1; + add(txtPath, gbc_txtPath); + txtPath.setColumns(10); + + JLabel lblSuffix = new JLabel("Suffix"); + GridBagConstraints gbc_lblSuffix = new GridBagConstraints(); + gbc_lblSuffix.anchor = GridBagConstraints.EAST; + gbc_lblSuffix.insets = new Insets(0, 0, 5, 5); + gbc_lblSuffix.gridx = 0; + gbc_lblSuffix.gridy = 2; + add(lblSuffix, gbc_lblSuffix); + + txtSuffix = new JTextField(); + GridBagConstraints gbc_txtSuffix = new GridBagConstraints(); + gbc_txtSuffix.insets = new Insets(0, 0, 5, 5); + gbc_txtSuffix.fill = GridBagConstraints.HORIZONTAL; + gbc_txtSuffix.gridx = 1; + gbc_txtSuffix.gridy = 2; + add(txtSuffix, gbc_txtSuffix); + txtSuffix.setColumns(10); + + { + comboNaming.addValue("Document ID","document_id"); + comboNaming.addValue("Document ID with Page","document_id_with_page"); + comboNaming.addValue("Page Only","page_only"); + comboNaming.addValue("Full","full"); + comboNaming.addValue("Full with Periods","full_with_periods"); + comboNaming.addValue("Item Name","item_name"); + comboNaming.addValue("Item Name with Path","item_name_with_path"); + comboNaming.addValue("GUID","guid"); + comboNaming.addValue("MD5","md5"); + comboNaming.setSelectedIndex(0); + } + + lblRegenerateStored = new JLabel("Regenerate Stored"); + GridBagConstraints gbc_lblRegenerateStored = new GridBagConstraints(); + gbc_lblRegenerateStored.insets = new Insets(0, 0, 5, 5); + gbc_lblRegenerateStored.gridx = 0; + gbc_lblRegenerateStored.gridy = 4; + add(lblRegenerateStored, gbc_lblRegenerateStored); + + chckbxRegenerateStored = new JCheckBox(""); + GridBagConstraints gbc_chckbxRegnerateStored = new GridBagConstraints(); + gbc_chckbxRegnerateStored.anchor = GridBagConstraints.WEST; + gbc_chckbxRegnerateStored.insets = new Insets(0, 0, 5, 5); + gbc_chckbxRegnerateStored.gridx = 1; + gbc_chckbxRegnerateStored.gridy = 4; + add(chckbxRegenerateStored, gbc_chckbxRegnerateStored); + } + + @Override + public void setEnabled(boolean value){ + for(Component c : getComponents()){ + c.setEnabled(value); + } + } + + public ComboItemBox getComboNaming() { + return comboNaming; + } + + public JTextField getTxtPath() { + return txtPath; + } + + public JTextField getTxtSuffix() { + return txtSuffix; + } + + public JCheckBox getChckbxRegenerateStored() { + return chckbxRegenerateStored; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTextSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTextSettings.java new file mode 100644 index 0000000..33138f7 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTextSettings.java @@ -0,0 +1,260 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JSpinner; +import javax.swing.JTextField; +import javax.swing.SpinnerNumberModel; +import javax.swing.border.TitledBorder; + +/*** + * A control which encapsulates some of the common text export settings + * @author Jason Wells + */ +@SuppressWarnings("serial") +public class BatchExporterTextSettings extends JPanel { + private JTextField txtPath; + private JTextField txtSuffix; + private ComboItemBox comboNaming; + private JLabel lblWrapLines; + private JCheckBox chckbxWrapLines; + private JLabel lblWrapLength; + private JSpinner spinnerWrapLength; + private JLabel lblPerPage; + private JCheckBox chckbxPerPage; + private JLabel lblLineSeparator; + private JPanel panel; + private ComboItemBox comboLineSeparator; + private JLabel lblEncoding; + private ComboItemBox comboEncoding; + public BatchExporterTextSettings() { + setBorder(new TitledBorder(null, "Text Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 200, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JLabel lblNaming = new JLabel("Naming"); + GridBagConstraints gbc_lblNaming = new GridBagConstraints(); + gbc_lblNaming.insets = new Insets(0, 0, 5, 5); + gbc_lblNaming.anchor = GridBagConstraints.EAST; + gbc_lblNaming.gridx = 0; + gbc_lblNaming.gridy = 0; + add(lblNaming, gbc_lblNaming); + + comboNaming = new ComboItemBox(); + GridBagConstraints gbc_comboNaming = new GridBagConstraints(); + gbc_comboNaming.insets = new Insets(0, 0, 5, 5); + gbc_comboNaming.fill = GridBagConstraints.HORIZONTAL; + gbc_comboNaming.gridx = 1; + gbc_comboNaming.gridy = 0; + add(comboNaming, gbc_comboNaming); + + JLabel lblSubDirectoryName = new JLabel("Sub Directory Name"); + GridBagConstraints gbc_lblSubDirectoryName = new GridBagConstraints(); + gbc_lblSubDirectoryName.anchor = GridBagConstraints.EAST; + gbc_lblSubDirectoryName.insets = new Insets(0, 0, 5, 5); + gbc_lblSubDirectoryName.gridx = 0; + gbc_lblSubDirectoryName.gridy = 1; + add(lblSubDirectoryName, gbc_lblSubDirectoryName); + + txtPath = new JTextField(); + txtPath.setText("TEXT"); + GridBagConstraints gbc_txtPath = new GridBagConstraints(); + gbc_txtPath.insets = new Insets(0, 0, 5, 5); + gbc_txtPath.fill = GridBagConstraints.HORIZONTAL; + gbc_txtPath.gridx = 1; + gbc_txtPath.gridy = 1; + add(txtPath, gbc_txtPath); + txtPath.setColumns(10); + + JLabel lblSuffix = new JLabel("Suffix"); + GridBagConstraints gbc_lblSuffix = new GridBagConstraints(); + gbc_lblSuffix.anchor = GridBagConstraints.EAST; + gbc_lblSuffix.insets = new Insets(0, 0, 5, 5); + gbc_lblSuffix.gridx = 0; + gbc_lblSuffix.gridy = 2; + add(lblSuffix, gbc_lblSuffix); + + txtSuffix = new JTextField(); + GridBagConstraints gbc_txtSuffix = new GridBagConstraints(); + gbc_txtSuffix.insets = new Insets(0, 0, 5, 5); + gbc_txtSuffix.fill = GridBagConstraints.HORIZONTAL; + gbc_txtSuffix.gridx = 1; + gbc_txtSuffix.gridy = 2; + add(txtSuffix, gbc_txtSuffix); + txtSuffix.setColumns(10); + + panel = new JPanel(); + GridBagConstraints gbc_panel = new GridBagConstraints(); + gbc_panel.gridwidth = 2; + gbc_panel.insets = new Insets(0, 0, 5, 5); + gbc_panel.fill = GridBagConstraints.BOTH; + gbc_panel.gridx = 0; + gbc_panel.gridy = 4; + add(panel, gbc_panel); + GridBagLayout gbl_panel = new GridBagLayout(); + gbl_panel.columnWidths = new int[]{0, 0, 0, 0, 0, 0}; + gbl_panel.rowHeights = new int[]{0, 0}; + gbl_panel.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + panel.setLayout(gbl_panel); + + lblWrapLines = new JLabel("Wrap Lines"); + GridBagConstraints gbc_lblWrapLines = new GridBagConstraints(); + gbc_lblWrapLines.insets = new Insets(0, 0, 0, 5); + gbc_lblWrapLines.gridx = 0; + gbc_lblWrapLines.gridy = 0; + panel.add(lblWrapLines, gbc_lblWrapLines); + + chckbxWrapLines = new JCheckBox(""); + GridBagConstraints gbc_chckbxWrapLines = new GridBagConstraints(); + gbc_chckbxWrapLines.insets = new Insets(0, 0, 0, 5); + gbc_chckbxWrapLines.gridx = 1; + gbc_chckbxWrapLines.gridy = 0; + panel.add(chckbxWrapLines, gbc_chckbxWrapLines); + + lblWrapLength = new JLabel("Wrap Length"); + GridBagConstraints gbc_lblWrapLength = new GridBagConstraints(); + gbc_lblWrapLength.insets = new Insets(0, 0, 0, 5); + gbc_lblWrapLength.gridx = 3; + gbc_lblWrapLength.gridy = 0; + panel.add(lblWrapLength, gbc_lblWrapLength); + + spinnerWrapLength = new JSpinner(); + GridBagConstraints gbc_spinnerWrapLength = new GridBagConstraints(); + gbc_spinnerWrapLength.fill = GridBagConstraints.HORIZONTAL; + gbc_spinnerWrapLength.gridx = 4; + gbc_spinnerWrapLength.gridy = 0; + panel.add(spinnerWrapLength, gbc_spinnerWrapLength); + spinnerWrapLength.setMinimumSize(new Dimension(100, 22)); + spinnerWrapLength.setModel(new SpinnerNumberModel(Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1))); + + lblPerPage = new JLabel("Per Page"); + GridBagConstraints gbc_lblPerPage = new GridBagConstraints(); + gbc_lblPerPage.anchor = GridBagConstraints.EAST; + gbc_lblPerPage.insets = new Insets(0, 0, 5, 5); + gbc_lblPerPage.gridx = 0; + gbc_lblPerPage.gridy = 5; + add(lblPerPage, gbc_lblPerPage); + + chckbxPerPage = new JCheckBox(""); + GridBagConstraints gbc_chckbxPerPage = new GridBagConstraints(); + gbc_chckbxPerPage.anchor = GridBagConstraints.WEST; + gbc_chckbxPerPage.insets = new Insets(0, 0, 5, 5); + gbc_chckbxPerPage.gridx = 1; + gbc_chckbxPerPage.gridy = 5; + add(chckbxPerPage, gbc_chckbxPerPage); + + lblLineSeparator = new JLabel("Line Separator"); + GridBagConstraints gbc_lblLineSeparator = new GridBagConstraints(); + gbc_lblLineSeparator.anchor = GridBagConstraints.EAST; + gbc_lblLineSeparator.insets = new Insets(0, 0, 5, 5); + gbc_lblLineSeparator.gridx = 0; + gbc_lblLineSeparator.gridy = 6; + add(lblLineSeparator, gbc_lblLineSeparator); + + comboLineSeparator = new ComboItemBox(); + GridBagConstraints gbc_comboLineSeparator = new GridBagConstraints(); + gbc_comboLineSeparator.insets = new Insets(0, 0, 5, 5); + gbc_comboLineSeparator.fill = GridBagConstraints.HORIZONTAL; + gbc_comboLineSeparator.gridx = 1; + gbc_comboLineSeparator.gridy = 6; + add(comboLineSeparator, gbc_comboLineSeparator); + + lblEncoding = new JLabel("Encoding"); + GridBagConstraints gbc_lblEncoding = new GridBagConstraints(); + gbc_lblEncoding.anchor = GridBagConstraints.EAST; + gbc_lblEncoding.insets = new Insets(0, 0, 5, 5); + gbc_lblEncoding.gridx = 0; + gbc_lblEncoding.gridy = 7; + add(lblEncoding, gbc_lblEncoding); + + comboEncoding = new ComboItemBox(); + GridBagConstraints gbc_comboEncoding = new GridBagConstraints(); + gbc_comboEncoding.insets = new Insets(0, 0, 5, 5); + gbc_comboEncoding.fill = GridBagConstraints.HORIZONTAL; + gbc_comboEncoding.gridx = 1; + gbc_comboEncoding.gridy = 7; + add(comboEncoding, gbc_comboEncoding); + + { + comboNaming.addValue("Document ID","document_id"); + comboNaming.addValue("Document ID with Page","document_id_with_page"); + comboNaming.addValue("Page Only","page_only"); + comboNaming.addValue("Full","full"); + comboNaming.addValue("Full with Periods","full_with_periods"); + comboNaming.addValue("Item Name","item_name"); + comboNaming.addValue("Item Name with Path","item_name_with_path"); + comboNaming.addValue("GUID","guid"); + comboNaming.addValue("MD5","md5"); + comboNaming.setSelectedIndex(0); + + comboLineSeparator.addValue("\\n","\n"); + comboLineSeparator.addValue("\\r\\n","\r\n"); + comboLineSeparator.setSelectedValue(System.lineSeparator()); + + comboEncoding.addValue("UTF-8","UTF-8"); + comboEncoding.addValue("UTF-16","UTF-16"); + comboEncoding.addValue("CP-1252 / WINDOWS-1252","CP-1252"); + comboEncoding.addValue("ASCII","ASCII"); + comboEncoding.addValue("ISO-8859-1","ISO-8859-1"); + comboEncoding.addValue("UTF-16LE","UTF-16LE"); + comboEncoding.addValue("UTF-16BE","UTF-16BE"); + comboEncoding.setSelectedIndex(0); + } + } + + @Override + public void setEnabled(boolean value){ + for(Component c : getComponents()){ + c.setEnabled(value); + } + } + + public JCheckBox getChckbxWrapLines() { + return chckbxWrapLines; + } + + public JSpinner getSpinnerWrapLength() { + return spinnerWrapLength; + } + + public JCheckBox getChckbxPerPage() { + return chckbxPerPage; + } + + public ComboItemBox getComboLineSeparator() { + return comboLineSeparator; + } + + public ComboItemBox getComboEncoding() { + return comboEncoding; + } + + public ComboItemBox getComboNaming() { + return comboNaming; + } + + public JTextField getTxtPath() { + return txtPath; + } + + public JTextField getTxtSuffix() { + return txtSuffix; + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTraversalSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTraversalSettings.java new file mode 100644 index 0000000..a75c469 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/BatchExporterTraversalSettings.java @@ -0,0 +1,119 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Component; + +import javax.swing.JPanel; +import java.awt.GridBagLayout; +import javax.swing.border.TitledBorder; +import javax.swing.JLabel; +import java.awt.GridBagConstraints; +import java.awt.Insets; + +/*** + * A control which encapsulates some of the common traversal settings + * @author Jason Wells + */ +@SuppressWarnings("serial") +public class BatchExporterTraversalSettings extends JPanel { + private ComboItemBox comboTraversal; + private ComboItemBox comboDedupe; + private ComboItemBox comboSortOrder; + public BatchExporterTraversalSettings() { + setBorder(new TitledBorder(null, "Traversal Options", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JLabel lblTraversalStategy = new JLabel("Traversal Stategy"); + GridBagConstraints gbc_lblTraversalStategy = new GridBagConstraints(); + gbc_lblTraversalStategy.insets = new Insets(0, 0, 5, 5); + gbc_lblTraversalStategy.anchor = GridBagConstraints.EAST; + gbc_lblTraversalStategy.gridx = 0; + gbc_lblTraversalStategy.gridy = 0; + add(lblTraversalStategy, gbc_lblTraversalStategy); + + comboTraversal = new ComboItemBox(); + GridBagConstraints gbc_comboTraversal = new GridBagConstraints(); + gbc_comboTraversal.insets = new Insets(0, 0, 5, 0); + gbc_comboTraversal.fill = GridBagConstraints.HORIZONTAL; + gbc_comboTraversal.gridx = 1; + gbc_comboTraversal.gridy = 0; + add(comboTraversal, gbc_comboTraversal); + + JLabel lblDeduplication = new JLabel("Deduplication"); + GridBagConstraints gbc_lblDeduplication = new GridBagConstraints(); + gbc_lblDeduplication.anchor = GridBagConstraints.EAST; + gbc_lblDeduplication.insets = new Insets(0, 0, 5, 5); + gbc_lblDeduplication.gridx = 0; + gbc_lblDeduplication.gridy = 1; + add(lblDeduplication, gbc_lblDeduplication); + + comboDedupe = new ComboItemBox(); + GridBagConstraints gbc_comboDedupe = new GridBagConstraints(); + gbc_comboDedupe.insets = new Insets(0, 0, 5, 0); + gbc_comboDedupe.fill = GridBagConstraints.HORIZONTAL; + gbc_comboDedupe.gridx = 1; + gbc_comboDedupe.gridy = 1; + add(comboDedupe, gbc_comboDedupe); + + JLabel lblSortOrder = new JLabel("Sort Order"); + GridBagConstraints gbc_lblSortOrder = new GridBagConstraints(); + gbc_lblSortOrder.anchor = GridBagConstraints.EAST; + gbc_lblSortOrder.insets = new Insets(0, 0, 5, 5); + gbc_lblSortOrder.gridx = 0; + gbc_lblSortOrder.gridy = 2; + add(lblSortOrder, gbc_lblSortOrder); + + comboSortOrder = new ComboItemBox(); + GridBagConstraints gbc_comboSortOrder = new GridBagConstraints(); + gbc_comboSortOrder.insets = new Insets(0, 0, 5, 0); + gbc_comboSortOrder.fill = GridBagConstraints.HORIZONTAL; + gbc_comboSortOrder.gridx = 1; + gbc_comboSortOrder.gridy = 2; + add(comboSortOrder, gbc_comboSortOrder); + + comboTraversal.addValue("Items", "items"); + comboTraversal.addValue("Items and Descendants", "items_and_descendants"); + comboTraversal.addValue("Top Level Items", "top_level_items"); + comboTraversal.setSelectedIndex(0); + + comboDedupe.addValue("None","none"); + comboDedupe.addValue("MD5","md5"); + comboDedupe.addValue("MD5 per Custodian","md5_per_custodian"); + comboDedupe.setSelectedIndex(0); + + comboSortOrder.addValue("Result Set Order","none"); + comboSortOrder.addValue("Item Position","position"); + comboSortOrder.addValue("Top Level Item Date Ascending","top_level_item_date"); + comboSortOrder.addValue("Top Level Item Date Descending","top_level_item_date_descending"); + comboSortOrder.addValue("Document ID","document_id"); + comboSortOrder.setSelectedIndex(0); + } + + @Override + public void setEnabled(boolean value){ + for(Component c : getComponents()){ + c.setEnabled(value); + } + } + + public ComboItemBox getComboTraversal() { + return comboTraversal; + } + + public ComboItemBox getComboDedupe() { + return comboDedupe; + } + + public ComboItemBox getComboSortOrder() { + return comboSortOrder; + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ButtonRow.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ButtonRow.java new file mode 100644 index 0000000..7df61e1 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ButtonRow.java @@ -0,0 +1,38 @@ +package com.nuix.nx.controls; + +import java.awt.Dimension; +import java.awt.event.ActionListener; + +import javax.swing.JButton; +import javax.swing.JPanel; + +import com.nuix.nx.dialogs.CustomTabPanel; + +@SuppressWarnings("serial") +public class ButtonRow extends JPanel { + private CustomTabPanel owningTab; + + public ButtonRow() {} + public ButtonRow(CustomTabPanel owningTab) { + this.owningTab = owningTab; + } + + /*** + * Appends a JButton control with the specified label and attaches the provided action listener to the + * button. From Ruby pass a block to add a handler to the button. + * @param identifier The unique identifier for this control. + * @param controlLabel The label text of the button + * @param actionListener The action listener to attach to the button. + * @return Returns this ButtonRow instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public ButtonRow appendButton(String identifier, String controlLabel, ActionListener actionListener) throws Exception{ + JButton component = new JButton(controlLabel); + component.addActionListener(actionListener); + Double preferredHeight = component.getPreferredSize().getHeight(); + component.setPreferredSize(new Dimension(150,preferredHeight.intValue())); + add(component); + owningTab.trackComponent(identifier, component); + return this; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ChoiceTableControl.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ChoiceTableControl.java new file mode 100644 index 0000000..399adf4 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ChoiceTableControl.java @@ -0,0 +1,350 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.JToolBar; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.table.TableColumn; + +import com.nuix.nx.controls.models.Choice; +import com.nuix.nx.controls.models.ChoiceTableModel; +import com.nuix.nx.controls.models.ChoiceTableModelChangeListener; + +import javax.swing.JLabel; +import javax.swing.ListSelectionModel; +import javax.swing.JSeparator; +import javax.swing.SwingConstants; + +/*** + * A table control for allowing the user to check one or more choices which are defined + * using {@link Choice} objects. + * @author Jason Wells + * + * @param The data type of the of the {@link Choice} instances which will be displayed by this table. + */ +@SuppressWarnings("serial") +public class ChoiceTableControl extends JPanel { + + private JTable choiceTable; + private ChoiceTableModel tableModel; + private JTextField txtFilter; + private JButton btnClearFilter; + private JToolBar toolBar; + private JButton btnCheckDisplayed; + private JButton btnUncheckDisplayed; + private JScrollPane scrollPane; + private JLabel lblLblcounts; + private JButton btnSortup; + private JButton btnSortdown; + private JButton btnSortcheckedtotop; + private JButton btnShowChecked; + private JButton btnShowunchecked; + private JSeparator separator; + private JSeparator separator_1; + private JLabel lblFilter; + + public ChoiceTableControl(){ + this(""); + } + + public ChoiceTableControl(String choiceTypeName) { + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 450, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + { + { + tableModel = new ChoiceTableModel(); + tableModel.setChoiceTypeName(choiceTypeName); + tableModel.setChangeListener(new ChoiceTableModelChangeListener() { + @Override + public void dataChanged() { + lblLblcounts.setText("Checked: " + tableModel.getCheckedValueCount() + + " Visible: " + tableModel.getVisibleValueCount() + + " Total: " + tableModel.getTotalValueCount()); + } + + @Override + public void structureChanged() { + TableColumn checkColumn = choiceTable.getColumnModel().getColumn(0); + checkColumn.setMinWidth(25); + checkColumn.setMaxWidth(25); + } + }); + + lblFilter = new JLabel("Filter:"); + GridBagConstraints gbc_lblFilter = new GridBagConstraints(); + gbc_lblFilter.insets = new Insets(0, 0, 5, 5); + gbc_lblFilter.anchor = GridBagConstraints.EAST; + gbc_lblFilter.gridx = 0; + gbc_lblFilter.gridy = 0; + add(lblFilter, gbc_lblFilter); + + txtFilter = new JTextField(); + GridBagConstraints gbc_txtFilter = new GridBagConstraints(); + gbc_txtFilter.insets = new Insets(0, 0, 5, 5); + gbc_txtFilter.fill = GridBagConstraints.HORIZONTAL; + gbc_txtFilter.gridx = 1; + gbc_txtFilter.gridy = 0; + add(txtFilter, gbc_txtFilter); + txtFilter.setColumns(10); + + toolBar = new JToolBar(); + toolBar.setFloatable(false); + GridBagConstraints gbc_toolBar = new GridBagConstraints(); + gbc_toolBar.insets = new Insets(0, 0, 5, 0); + gbc_toolBar.gridx = 2; + gbc_toolBar.gridy = 0; + add(toolBar, gbc_toolBar); + + btnShowChecked = new JButton(""); + btnShowChecked.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + txtFilter.setText(":checked:"); + } + }); + + btnClearFilter = new JButton(""); + btnClearFilter.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + txtFilter.setText(""); + } + }); + toolBar.add(btnClearFilter); + btnClearFilter.setToolTipText("Clear current filter"); + btnClearFilter.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/zoom_out.png"))); + btnShowChecked.setToolTipText("Show all currently checked choices"); + btnShowChecked.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/tick.png"))); + toolBar.add(btnShowChecked); + + btnShowunchecked = new JButton(""); + btnShowunchecked.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + txtFilter.setText(":unchecked:"); + } + }); + btnShowunchecked.setToolTipText("Show all currently un-checked choices"); + btnShowunchecked.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/cross.png"))); + toolBar.add(btnShowunchecked); + + btnCheckDisplayed = new JButton(); + btnCheckDisplayed.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tableModel.checkDisplayedChoices(); + } + }); + + separator = new JSeparator(); + separator.setOrientation(SwingConstants.VERTICAL); + toolBar.add(separator); + btnCheckDisplayed.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/accept.png"))); + btnCheckDisplayed.setToolTipText("Check all visible"); + toolBar.add(btnCheckDisplayed); + + btnUncheckDisplayed = new JButton(""); + btnUncheckDisplayed.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tableModel.uncheckDisplayedChoices(); + } + }); + btnUncheckDisplayed.setToolTipText("Uncheck all visible"); + btnUncheckDisplayed.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/unaccept.png"))); + toolBar.add(btnUncheckDisplayed); + + btnSortup = new JButton(""); + btnSortup.setToolTipText("Move selected row up. Only available when no filtering is currently applied to the table."); + btnSortup.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/arrow_up.png"))); + btnSortup.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + int[] rows = new int[]{choiceTable.getSelectedRow()}; + rows = tableModel.shiftRowsUp(rows); + choiceTable.setRowSelectionInterval(rows[0], rows[rows.length-1]); + } + }); + + separator_1 = new JSeparator(); + separator_1.setOrientation(SwingConstants.VERTICAL); + toolBar.add(separator_1); + toolBar.add(btnSortup); + + btnSortdown = new JButton(""); + btnSortdown.setToolTipText("Move selected row down. Only available when no filtering is currently applied to the table."); + btnSortdown.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/arrow_down.png"))); + btnSortdown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + int[] rows = new int[]{choiceTable.getSelectedRow()}; + rows = tableModel.shiftRowsDown(rows); + choiceTable.setRowSelectionInterval(rows[0], rows[rows.length-1]); + } + }); + toolBar.add(btnSortdown); + + btnSortcheckedtotop = new JButton(""); + btnSortcheckedtotop.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tableModel.sortCheckedToTop(); + } + }); + btnSortcheckedtotop.setIcon(new ImageIcon(ChoiceTableControl.class.getResource("/icons/bullet_arrow_top.png"))); + btnSortcheckedtotop.setToolTipText("Sort checked items to top. Only available when no filtering is currently applied to the table."); + toolBar.add(btnSortcheckedtotop); + + + scrollPane = new JScrollPane(); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.insets = new Insets(0, 0, 5, 0); + gbc_scrollPane.gridwidth = 3; + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 1; + add(scrollPane, gbc_scrollPane); + choiceTable = new JTable(tableModel){ + + //Implement table cell tool tips. + public String getToolTipText(MouseEvent e) { + String tip = null; + java.awt.Point p = e.getPoint(); + int rowIndex = rowAtPoint(p); + //int colIndex = columnAtPoint(p); + try { + //comment row, exclude heading + if(rowIndex != 0){ + tip = tableModel.getDisplayedChoice(rowIndex).getToolTip(); + } + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + + return tip; + } + }; + choiceTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + choiceTable.setFillsViewportHeight(true); + scrollPane.setViewportView(choiceTable); + + lblLblcounts = new JLabel("Checked: 0 Visible: 0 Total: 0"); + GridBagConstraints gbc_lblLblcounts = new GridBagConstraints(); + gbc_lblLblcounts.gridwidth = 2; + gbc_lblLblcounts.anchor = GridBagConstraints.WEST; + gbc_lblLblcounts.insets = new Insets(0, 0, 0, 5); + gbc_lblLblcounts.gridx = 0; + gbc_lblLblcounts.gridy = 2; + add(lblLblcounts, gbc_lblLblcounts); + constrainFirstColumn(); + choiceTable.getModel().addTableModelListener(new TableModelListener() { + @Override + public void tableChanged(TableModelEvent e) { + constrainFirstColumn(); + } + }); + } + } + + txtFilter.getDocument().addDocumentListener(new DocumentListener() { + public void changedUpdate(DocumentEvent e) { + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled); + btnSortdown.setEnabled(sortEnabled); + btnSortcheckedtotop.setEnabled(sortEnabled); + tableModel.setFilter(filterText); + } + + public void removeUpdate(DocumentEvent e) { + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled); + btnSortdown.setEnabled(sortEnabled); + btnSortcheckedtotop.setEnabled(sortEnabled); + tableModel.setFilter(filterText); + } + + public void insertUpdate(DocumentEvent e) { + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled); + btnSortdown.setEnabled(sortEnabled); + btnSortcheckedtotop.setEnabled(sortEnabled); + tableModel.setFilter(filterText); + } + }); + } + + public void constrainFirstColumn(){ + TableColumn checkColumn = choiceTable.getColumnModel().getColumn(0); + checkColumn.setMinWidth(25); + checkColumn.setWidth(25); + checkColumn.setPreferredWidth(25); + checkColumn.setMaxWidth(25); + } + + public ChoiceTableModel getTableModel() { + return tableModel; + } + + public void setTableModel(ChoiceTableModel model) { + tableModel = model; + } + + public void setChoices(List> choices){ + tableModel.setChoices(choices); + } + + public void setValues(List values){ + List> choices = new ArrayList>(); + for(T value : values){ + choices.add(new Choice(value)); + } + setChoices(choices); + } + + public void setEnabled(boolean value){ + choiceTable.setEnabled(value); + choiceTable.setVisible(value); + if(value) + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + else + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + txtFilter.setEnabled(value); + btnClearFilter.setEnabled(value); + toolBar.setEnabled(value); + btnCheckDisplayed.setEnabled(value); + btnUncheckDisplayed.setEnabled(value); + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled && value); + btnSortdown.setEnabled(sortEnabled && value); + btnSortcheckedtotop.setEnabled(sortEnabled && value); + } + + public void setFilter(String filterString){ + tableModel.setFilter(filterString); + } + + public void fitColumns(){ + this.choiceTable.sizeColumnsToFit(1); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItem.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItem.java new file mode 100644 index 0000000..84b9d33 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItem.java @@ -0,0 +1,46 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +/*** + * Data class for representing combo box entries + * @author Jason Wells + */ +public class ComboItem { + private String value; + private String label; + + /*** + * Create instance with the provided label and value + * @param label The label to associated + * @param value The value to associate + */ + public ComboItem(String label, String value) { + this.value = value; + this.label = label; + } + + /*** + * Gets the value associated to this instance + * @return The associated value + */ + public String getValue() { + return this.value; + } + + /*** + * Gets the label associate to this instance + * @return The associated label + */ + public String getLabel() { + return this.label; + } + + @Override + public String toString() { + return label; + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItemBox.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItemBox.java new file mode 100644 index 0000000..4b142e6 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ComboItemBox.java @@ -0,0 +1,80 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.util.List; + +import javax.swing.JComboBox; + +/*** + * Slightly customized combo box control for displaying {@link ComboItem} objects + * @author Jason Wells + */ +@SuppressWarnings("serial") +public class ComboItemBox extends JComboBox { + /*** + * Sets the values displayed in the combo box, then selects the first value + * @param values List of {@link ComboItem} representing choices in the combo box + */ + public void setValues(List values){ + removeAllItems(); + for(ComboItem value : values){ + addItem(value); + } + setSelectedIndex(0); + } + + /*** + * Adds a single {@link ComboItem} item as a value to the combo box + * @param value A single {@link ComboItem} value to add to the combo box + */ + public void addValue(ComboItem value){ + addItem(value); + } + + /*** + * Convenience method for adding an entry to the combo box. + * @param label The label (value seen by user) + * @param value The value that is returned when selected + */ + public void addValue(String label, String value){ + addValue(new ComboItem(label,value)); + } + + public ComboItem getSelectedComboItem(){ + return (ComboItem)getSelectedItem(); + } + + public String getSelectedLabel(){ + return getSelectedComboItem().getLabel(); + } + + public String getSelectedValue(){ + return getSelectedComboItem().getValue(); + } + + public void setSelectedComboItem(ComboItem value){ + setSelectedItem(value); + } + + public void setSelectedLabel(String label){ + for (int i = 0; i < this.getModel().getSize(); i++) { + if(this.getModel().getElementAt(i).getLabel().equalsIgnoreCase(label)){ + this.setSelectedIndex(i); + break; + } + } + } + + public void setSelectedValue(String value){ + for (int i = 0; i < this.getModel().getSize(); i++) { + if(this.getModel().getElementAt(i).getValue().equalsIgnoreCase(value)){ + this.setSelectedIndex(i); + break; + } + } + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/CsvTable.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/CsvTable.java new file mode 100644 index 0000000..b1b5996 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/CsvTable.java @@ -0,0 +1,237 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JToolBar; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; + +import com.generationjava.io.CsvReader; +import com.nuix.nx.controls.models.CsvTableModel; +import com.nuix.nx.dialogs.CommonDialogs; +import java.awt.Font; + +/*** + * A table control designed with the idea of accepting data imported from a CSV. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class CsvTable extends JPanel { + private JTable recordsTable; + private CsvTableModel recordsTableModel = null; + private JButton btnRemovedSelectedRows; + private JButton btnAddRow; + private JButton btnImportCsv; + private String defaultImportDirectory = "C:\\"; + + public CsvTable(List headers) { + recordsTableModel = new CsvTableModel(headers); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + btnImportCsv = new JButton("Import CSV"); + btnImportCsv.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + File csvFile = CommonDialogs.openFileDialog(defaultImportDirectory, "Comma Separated Values", "csv", "Import CSV"); + if(csvFile != null){ + importCsv(csvFile); + } + } + + + }); + GridBagConstraints gbc_btnImportCsv = new GridBagConstraints(); + gbc_btnImportCsv.insets = new Insets(0, 0, 5, 5); + gbc_btnImportCsv.gridx = 0; + gbc_btnImportCsv.gridy = 0; + add(btnImportCsv, gbc_btnImportCsv); + + JToolBar toolBar = new JToolBar(); + toolBar.setFloatable(false); + GridBagConstraints gbc_toolBar = new GridBagConstraints(); + gbc_toolBar.insets = new Insets(0, 0, 5, 0); + gbc_toolBar.fill = GridBagConstraints.BOTH; + gbc_toolBar.gridx = 1; + gbc_toolBar.gridy = 0; + add(toolBar, gbc_toolBar); + + btnAddRow = new JButton(""); + btnAddRow.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + Map record = new HashMap(); + for (int i = 0; i < headers.size(); i++) { + record.put(headers.get(i), ""); + } + recordsTableModel.addRecord(record); + } + }); + btnAddRow.setToolTipText("Add Row"); + btnAddRow.setIcon(new ImageIcon(CsvTable.class.getResource("/icons/add.png"))); + toolBar.add(btnAddRow); + + btnRemovedSelectedRows = new JButton(""); + btnRemovedSelectedRows.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + int[] selectedIndices = recordsTable.getSelectedRows(); + Arrays.sort(selectedIndices); + for (int i = selectedIndices.length-1; i >= 0 ; i--) { + recordsTableModel.removeRecordAt(selectedIndices[i]); + } + } + }); + btnRemovedSelectedRows.setToolTipText("Removed Selected Rows"); + btnRemovedSelectedRows.setIcon(new ImageIcon(CsvTable.class.getResource("/icons/delete.png"))); + toolBar.add(btnRemovedSelectedRows); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.gridwidth = 2; + gbc_scrollPane.insets = new Insets(0, 0, 0, 5); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 1; + add(scrollPane, gbc_scrollPane); + + recordsTable = new JTable(recordsTableModel); + recordsTable.setFont(new Font("Consolas", Font.PLAIN, 14)); + recordsTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); + recordsTable.setFillsViewportHeight(true); + scrollPane.setViewportView(recordsTable); + + recordsTable.getColumnModel().getColumn(0).setPreferredWidth(40); + recordsTable.getColumnModel().getColumn(0).setMinWidth(40); + recordsTable.getColumnModel().getColumn(0).setMaxWidth(40); + recordsTable.getColumnModel().getColumn(0).setWidth(40); + } + + private void importCsv(File csvFile) { + try(BufferedReader br = new BufferedReader(new FileReader(csvFile))) { + CsvReader r = new CsvReader(br); + String[] headers = r.readLine(); + + Set csvHeadersLookup = new HashSet(); + System.out.println("Headers:"); + for (int i = 0; i < headers.length; i++) { + //CSV reader leaks in newlines for some reason, gotta chop em off + headers[i] = headers[i].trim(); + System.out.println(i+": "+headers[i]); + csvHeadersLookup.add(headers[i]); + } + + Set expectedHeaders = new HashSet(recordsTableModel.getHeaders()); + List missingHeaders = new ArrayList(); + for (String expectedHeader : expectedHeaders) { + if(!csvHeadersLookup.contains(expectedHeader)){ + missingHeaders.add(expectedHeader); + } + } + + while(true){ + String[] values = r.readLine(); + if(values == null){ + break; + } else { + Map record = new HashMap(); + // Populate expected fields with defaults + for (String expectedHeader : expectedHeaders) { + record.put(expectedHeader, ""); + } + + for (int i = 0; i < headers.length; i++) { + String header = headers[i]; + if(expectedHeaders.contains(header)){ + if(i > values.length-1){ + // Handle empty column value which will be surfaced + // as a shorter value array if the empty value is at + // the end + record.put(header, ""); + } else { + record.put(header, values[i].trim()); + } + } + } + recordsTableModel.addRecord(record); + } + } + + if(missingHeaders.size() > 0){ + StringBuilder message = new StringBuilder(); + message.append("The following expected headers were not found in CSV:\n\n"); + message.append(String.join("\n", missingHeaders)); + message.append("\n\nImported data from columns which were present (if any)."); + CommonDialogs.showInformation(message.toString(), "Some Columns Missing"); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + CommonDialogs.showError("Error importing CSV: "+e.getMessage()); + } catch (IOException e) { + e.printStackTrace(); + CommonDialogs.showError("Error importing CSV: "+e.getMessage()); + } + } + + public List getHeaders() { + return recordsTableModel.getHeaders(); + } + + public List> getRecords() { + return recordsTableModel.getRecords(); + } + + public void addRecord(Map record){ + recordsTableModel.addRecord(record); + } + + public JTable getTable(){ + return recordsTable; + } + + @Override + public void setEnabled(boolean value) { + recordsTable.setEnabled(value); + btnImportCsv.setEnabled(value); + btnAddRow.setEnabled(value); + btnRemovedSelectedRows.setEnabled(value); + super.setEnabled(value); + } + + public String getDefaultImportDirectory() { + return defaultImportDirectory; + } + + public void setDefaultImportDirectory(String defaultImportDirectory) { + this.defaultImportDirectory = defaultImportDirectory; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DataProcessingSettingsControl.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DataProcessingSettingsControl.java new file mode 100644 index 0000000..ee858c1 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DataProcessingSettingsControl.java @@ -0,0 +1,1023 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import com.google.common.base.Joiner; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.nuix.nx.dialogs.CommonDialogs; +import org.apache.log4j.Logger; +import org.jdesktop.beansbinding.AutoBinding; +import org.jdesktop.beansbinding.AutoBinding.UpdateStrategy; +import org.jdesktop.beansbinding.BeanProperty; +import org.jdesktop.beansbinding.Bindings; + +import javax.swing.*; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/*** + * A control which allows the user to specify settings found in the GUI under "Data Processing Settings" during ingestion + * setup. + * @author JWells01 + * + */ +@SuppressWarnings("serial") +public class DataProcessingSettingsControl extends JPanel { + + private static Logger logger = Logger.getLogger(DataProcessingSettingsControl.class); + + class ComboChoice { + public String displayName; + public String settingName; + + public ComboChoice(String displayName, String settingName){ + this.displayName = displayName; + this.settingName = settingName; + } + + @Override + public String toString() { + return displayName; + } + } + + private JTextField txtCarvingBlockSize; + private JCheckBox chckbxPerformItemIdentification; + private JCheckBox chckbxCalculateProcessingSize; + private JSpinner spinnerMaxDigestSize; + private JCheckBox chckbxDigestIncludeBcc; + private JCheckBox chckbxDigestIncludeItemDate; + private JComboBox comboTraversal; + private JCheckBox chckbxReuseEvidenceStores; + private JCheckBox chckbxCalculateAuditedSize; + private JCheckBox chckbxStoreBinary; + private JSpinner spinnerMaxBinarySize; + private JCheckBox chckbxRecoverDeletedFiles; + private JCheckBox chckbxExtractEndOfFileSlackSpace; + private JCheckBox chckbxSmartProcessRegistry; + private JCheckBox chckbxExtractFromSlackSpace; + private JCheckBox chckbxIndexUnallocatedSpace; + private JCheckBox chckbxCarveFileSystem; + private JCheckBox chckbxCreateFamilySearchFields; + private JCheckBox chckbxHideImmaterialItems; + private JComboBox comboAnalysisLanguage; + private JCheckBox chckbxUseStopWords; + private JCheckBox chckbxUseStemming; + private JCheckBox chckbxEnableExactQueries; + private JCheckBox chckbxProcessText; + private JCheckBox chckbxEnableNearDuplicates; + private JCheckBox chckbxEnableTextSummarisation; + private JCheckBox chckbxExtractNamedEntities; + private JCheckBox chckbxExtractNamedEntitiesFromTextStripped; + private JCheckBox chckbxExtractNamedEntitiesFromProperties; + private JCheckBox chckbxGenerateThumbnails; + private JCheckBox chckbxPerformSkinToneAnalysis; + private JCheckBox chckbxDetectFaces; + private JCheckBox chckbxMd5; + private JCheckBox chckbxSha1; + private JCheckBox chckbxSha256; + private JCheckBox chckbxSsdeep; + private JToolBar toolBar; + private JButton btnSaveSettings; + private JButton btnLoadSettings; + private JButton btnResetSettings; + + private BiMap booleanSettingsMap = HashBiMap.create(); + private BiMap intSettingsMap = HashBiMap.create(); + private List traversalChoices = new ArrayList(); + private List languageChoices = new ArrayList(); + private Map defaultSettings = null; + + public DataProcessingSettingsControl() { + setBorder(new EmptyBorder(5, 5, 5, 5)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + toolBar = new JToolBar(); + toolBar.setFloatable(false); + GridBagConstraints gbc_toolBar = new GridBagConstraints(); + gbc_toolBar.anchor = GridBagConstraints.WEST; + gbc_toolBar.insets = new Insets(0, 0, 5, 0); + gbc_toolBar.gridx = 0; + gbc_toolBar.gridy = 0; + add(toolBar, gbc_toolBar); + + btnSaveSettings = new JButton("Save Processing Settings"); + btnSaveSettings.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + File outputFile = CommonDialogs.saveFileDialog("C:\\", "Processing Settings JSON", "json", "Save Processing Settings"); + if(outputFile != null){ + try { + saveJSONFile(outputFile); + } catch (Exception e1) { + String message = "There was an error while saving the file:\n\n"+e1.getMessage(); + CommonDialogs.showError(message); + logger.error(message,e1); + } + } + } + }); + btnSaveSettings.setIcon(new ImageIcon(DataProcessingSettingsControl.class.getResource("/icons/page_save.png"))); + toolBar.add(btnSaveSettings); + + btnLoadSettings = new JButton("Load Processing Settings"); + btnLoadSettings.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + File inputFile = CommonDialogs.openFileDialog("C:\\", "Processing Settings JSON", "json", "Load Processing Settings"); + if(inputFile != null){ + try { + loadSettingsJSONFile(inputFile); + } catch (Exception e1) { + String message = "There was an error while loading the file:\n\n"+e1.getMessage(); + CommonDialogs.showError(message); + logger.error(message,e1); + } + } + } + }); + btnLoadSettings.setIcon(new ImageIcon(DataProcessingSettingsControl.class.getResource("/icons/folder_page.png"))); + toolBar.add(btnLoadSettings); + + btnResetSettings = new JButton("Reset Processing Settings"); + btnResetSettings.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + if(CommonDialogs.getConfirmation("Are you sure you want to reset all settings?", "Reset Settings")){ + loadDefaultSettings(); + } + } + }); + btnResetSettings.setIcon(new ImageIcon(DataProcessingSettingsControl.class.getResource("/icons/cancel.png"))); + toolBar.add(btnResetSettings); + + JPanel topMostPanel = new JPanel(); + GridBagConstraints gbc_topMostPanel = new GridBagConstraints(); + gbc_topMostPanel.anchor = GridBagConstraints.WEST; + gbc_topMostPanel.insets = new Insets(0, 0, 5, 0); + gbc_topMostPanel.fill = GridBagConstraints.VERTICAL; + gbc_topMostPanel.gridx = 0; + gbc_topMostPanel.gridy = 1; + add(topMostPanel, gbc_topMostPanel); + + chckbxPerformItemIdentification = new JCheckBox("Perform item identification"); + topMostPanel.add(chckbxPerformItemIdentification); + + chckbxCalculateProcessingSize = new JCheckBox("Calculate processing size up-front"); + topMostPanel.add(chckbxCalculateProcessingSize); + + JPanel traversalPanel = new JPanel(); + GridBagConstraints gbc_traversalPanel = new GridBagConstraints(); + gbc_traversalPanel.insets = new Insets(0, 0, 5, 0); + gbc_traversalPanel.fill = GridBagConstraints.BOTH; + gbc_traversalPanel.gridx = 0; + gbc_traversalPanel.gridy = 2; + add(traversalPanel, gbc_traversalPanel); + GridBagLayout gbl_traversalPanel = new GridBagLayout(); + gbl_traversalPanel.columnWidths = new int[]{0, 400, 0, 0}; + gbl_traversalPanel.rowHeights = new int[]{0, 0}; + gbl_traversalPanel.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gbl_traversalPanel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + traversalPanel.setLayout(gbl_traversalPanel); + + JLabel lblTraversal = new JLabel("Traversal:"); + GridBagConstraints gbc_lblTraversal = new GridBagConstraints(); + gbc_lblTraversal.insets = new Insets(0, 0, 0, 5); + gbc_lblTraversal.anchor = GridBagConstraints.EAST; + gbc_lblTraversal.gridx = 0; + gbc_lblTraversal.gridy = 0; + traversalPanel.add(lblTraversal, gbc_lblTraversal); + + comboTraversal = new JComboBox(); + GridBagConstraints gbc_comboTraversal = new GridBagConstraints(); + gbc_comboTraversal.insets = new Insets(0, 0, 0, 5); + gbc_comboTraversal.fill = GridBagConstraints.HORIZONTAL; + gbc_comboTraversal.gridx = 1; + gbc_comboTraversal.gridy = 0; + traversalPanel.add(comboTraversal, gbc_comboTraversal); + + JPanel mainSettingsPanel = new JPanel(); + GridBagConstraints gbc_mainSettingsPanel = new GridBagConstraints(); + gbc_mainSettingsPanel.fill = GridBagConstraints.BOTH; + gbc_mainSettingsPanel.gridx = 0; + gbc_mainSettingsPanel.gridy = 3; + add(mainSettingsPanel, gbc_mainSettingsPanel); + GridBagLayout gbl_mainSettingsPanel = new GridBagLayout(); + gbl_mainSettingsPanel.columnWidths = new int[]{0, 0, 0}; + gbl_mainSettingsPanel.rowHeights = new int[]{0, 0}; + gbl_mainSettingsPanel.columnWeights = new double[]{1.0, 1.0, Double.MIN_VALUE}; + gbl_mainSettingsPanel.rowWeights = new double[]{1.0, Double.MIN_VALUE}; + mainSettingsPanel.setLayout(gbl_mainSettingsPanel); + + JPanel leftPanel = new JPanel(); + GridBagConstraints gbc_leftPanel = new GridBagConstraints(); + gbc_leftPanel.insets = new Insets(0, 0, 0, 5); + gbc_leftPanel.fill = GridBagConstraints.BOTH; + gbc_leftPanel.gridx = 0; + gbc_leftPanel.gridy = 0; + mainSettingsPanel.add(leftPanel, gbc_leftPanel); + GridBagLayout gbl_leftPanel = new GridBagLayout(); + gbl_leftPanel.columnWidths = new int[]{0, 0}; + gbl_leftPanel.rowHeights = new int[]{0, 0, 0, 0, 0, 0}; + gbl_leftPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_leftPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + leftPanel.setLayout(gbl_leftPanel); + + JPanel evidenceSettings = new JPanel(); + evidenceSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Evidence Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_evidenceSettings = new GridBagConstraints(); + gbc_evidenceSettings.insets = new Insets(0, 0, 5, 0); + gbc_evidenceSettings.fill = GridBagConstraints.BOTH; + gbc_evidenceSettings.gridx = 0; + gbc_evidenceSettings.gridy = 0; + leftPanel.add(evidenceSettings, gbc_evidenceSettings); + GridBagLayout gbl_evidenceSettings = new GridBagLayout(); + gbl_evidenceSettings.columnWidths = new int[]{0, 0, 0}; + gbl_evidenceSettings.rowHeights = new int[]{0, 0, 0, 0, 0}; + gbl_evidenceSettings.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gbl_evidenceSettings.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + evidenceSettings.setLayout(gbl_evidenceSettings); + + chckbxReuseEvidenceStores = new JCheckBox("Reuse evidence stores"); + GridBagConstraints gbc_chckbxReuseEvidenceStores = new GridBagConstraints(); + gbc_chckbxReuseEvidenceStores.gridwidth = 2; + gbc_chckbxReuseEvidenceStores.anchor = GridBagConstraints.WEST; + gbc_chckbxReuseEvidenceStores.insets = new Insets(0, 0, 5, 5); + gbc_chckbxReuseEvidenceStores.gridx = 0; + gbc_chckbxReuseEvidenceStores.gridy = 0; + evidenceSettings.add(chckbxReuseEvidenceStores, gbc_chckbxReuseEvidenceStores); + + chckbxCalculateAuditedSize = new JCheckBox("Calculate audited size"); + GridBagConstraints gbc_chckbxCalculateAuditedSize = new GridBagConstraints(); + gbc_chckbxCalculateAuditedSize.gridwidth = 2; + gbc_chckbxCalculateAuditedSize.anchor = GridBagConstraints.WEST; + gbc_chckbxCalculateAuditedSize.insets = new Insets(0, 0, 5, 5); + gbc_chckbxCalculateAuditedSize.gridx = 0; + gbc_chckbxCalculateAuditedSize.gridy = 1; + evidenceSettings.add(chckbxCalculateAuditedSize, gbc_chckbxCalculateAuditedSize); + + chckbxStoreBinary = new JCheckBox("Store binary of data items"); + GridBagConstraints gbc_chckbxStoreBinary = new GridBagConstraints(); + gbc_chckbxStoreBinary.gridwidth = 2; + gbc_chckbxStoreBinary.insets = new Insets(0, 0, 5, 5); + gbc_chckbxStoreBinary.anchor = GridBagConstraints.WEST; + gbc_chckbxStoreBinary.gridx = 0; + gbc_chckbxStoreBinary.gridy = 2; + evidenceSettings.add(chckbxStoreBinary, gbc_chckbxStoreBinary); + + JLabel lblMaximumBinarySize = new JLabel("Maximum binary size (MB):"); + GridBagConstraints gbc_lblMaximumBinarySize = new GridBagConstraints(); + gbc_lblMaximumBinarySize.insets = new Insets(0, 0, 0, 5); + gbc_lblMaximumBinarySize.gridx = 0; + gbc_lblMaximumBinarySize.gridy = 3; + evidenceSettings.add(lblMaximumBinarySize, gbc_lblMaximumBinarySize); + + spinnerMaxBinarySize = new JSpinner(); + spinnerMaxBinarySize.setModel(new SpinnerNumberModel(1000, 0, 1000, 1)); + GridBagConstraints gbc_spinnerMaxBinarySize = new GridBagConstraints(); + gbc_spinnerMaxBinarySize.fill = GridBagConstraints.HORIZONTAL; + gbc_spinnerMaxBinarySize.gridx = 1; + gbc_spinnerMaxBinarySize.gridy = 3; + evidenceSettings.add(spinnerMaxBinarySize, gbc_spinnerMaxBinarySize); + + JPanel deletedRecoverySettings = new JPanel(); + deletedRecoverySettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Deleted File Recovery & Forensic Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_deletedRecoverySettings = new GridBagConstraints(); + gbc_deletedRecoverySettings.insets = new Insets(0, 0, 5, 0); + gbc_deletedRecoverySettings.fill = GridBagConstraints.BOTH; + gbc_deletedRecoverySettings.gridx = 0; + gbc_deletedRecoverySettings.gridy = 1; + leftPanel.add(deletedRecoverySettings, gbc_deletedRecoverySettings); + GridBagLayout gbl_deletedRecoverySettings = new GridBagLayout(); + gbl_deletedRecoverySettings.columnWidths = new int[]{0, 0, 0}; + gbl_deletedRecoverySettings.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0}; + gbl_deletedRecoverySettings.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gbl_deletedRecoverySettings.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + deletedRecoverySettings.setLayout(gbl_deletedRecoverySettings); + + chckbxRecoverDeletedFiles = new JCheckBox("Recover deleted files from disk images"); + GridBagConstraints gbc_chckbxRecoverDeletedFiles = new GridBagConstraints(); + gbc_chckbxRecoverDeletedFiles.gridwidth = 2; + gbc_chckbxRecoverDeletedFiles.anchor = GridBagConstraints.WEST; + gbc_chckbxRecoverDeletedFiles.insets = new Insets(0, 0, 5, 5); + gbc_chckbxRecoverDeletedFiles.gridx = 0; + gbc_chckbxRecoverDeletedFiles.gridy = 0; + deletedRecoverySettings.add(chckbxRecoverDeletedFiles, gbc_chckbxRecoverDeletedFiles); + + chckbxExtractEndOfFileSlackSpace = new JCheckBox("Extract end-of-slack space from disk images"); + GridBagConstraints gbc_chckbxExtractEndOfFileSlackSpace = new GridBagConstraints(); + gbc_chckbxExtractEndOfFileSlackSpace.gridwidth = 2; + gbc_chckbxExtractEndOfFileSlackSpace.insets = new Insets(0, 0, 5, 5); + gbc_chckbxExtractEndOfFileSlackSpace.anchor = GridBagConstraints.WEST; + gbc_chckbxExtractEndOfFileSlackSpace.gridx = 0; + gbc_chckbxExtractEndOfFileSlackSpace.gridy = 1; + deletedRecoverySettings.add(chckbxExtractEndOfFileSlackSpace, gbc_chckbxExtractEndOfFileSlackSpace); + + chckbxSmartProcessRegistry = new JCheckBox("Smart process Microsoft Registry files"); + GridBagConstraints gbc_chckbxSmartProcessRegistry = new GridBagConstraints(); + gbc_chckbxSmartProcessRegistry.gridwidth = 2; + gbc_chckbxSmartProcessRegistry.insets = new Insets(0, 0, 5, 5); + gbc_chckbxSmartProcessRegistry.anchor = GridBagConstraints.WEST; + gbc_chckbxSmartProcessRegistry.gridx = 0; + gbc_chckbxSmartProcessRegistry.gridy = 2; + deletedRecoverySettings.add(chckbxSmartProcessRegistry, gbc_chckbxSmartProcessRegistry); + + chckbxExtractFromSlackSpace = new JCheckBox("Extract from mailbox slack space"); + GridBagConstraints gbc_chckbxExtractFromSlackSpace = new GridBagConstraints(); + gbc_chckbxExtractFromSlackSpace.gridwidth = 2; + gbc_chckbxExtractFromSlackSpace.insets = new Insets(0, 0, 5, 5); + gbc_chckbxExtractFromSlackSpace.anchor = GridBagConstraints.WEST; + gbc_chckbxExtractFromSlackSpace.gridx = 0; + gbc_chckbxExtractFromSlackSpace.gridy = 3; + deletedRecoverySettings.add(chckbxExtractFromSlackSpace, gbc_chckbxExtractFromSlackSpace); + + chckbxIndexUnallocatedSpace = new JCheckBox("Index unallocated space"); + GridBagConstraints gbc_chckbxIndexUnallocatedSpace = new GridBagConstraints(); + gbc_chckbxIndexUnallocatedSpace.gridwidth = 2; + gbc_chckbxIndexUnallocatedSpace.insets = new Insets(0, 0, 5, 5); + gbc_chckbxIndexUnallocatedSpace.anchor = GridBagConstraints.WEST; + gbc_chckbxIndexUnallocatedSpace.gridx = 0; + gbc_chckbxIndexUnallocatedSpace.gridy = 4; + deletedRecoverySettings.add(chckbxIndexUnallocatedSpace, gbc_chckbxIndexUnallocatedSpace); + + chckbxCarveFileSystem = new JCheckBox("Carve file system unallocated space"); + GridBagConstraints gbc_chckbxCarveFileSystem = new GridBagConstraints(); + gbc_chckbxCarveFileSystem.gridwidth = 2; + gbc_chckbxCarveFileSystem.insets = new Insets(0, 0, 5, 5); + gbc_chckbxCarveFileSystem.anchor = GridBagConstraints.WEST; + gbc_chckbxCarveFileSystem.gridx = 0; + gbc_chckbxCarveFileSystem.gridy = 5; + deletedRecoverySettings.add(chckbxCarveFileSystem, gbc_chckbxCarveFileSystem); + + JLabel lblCarvingBlockSize = new JLabel("Carving block size (in bytes):"); + GridBagConstraints gbc_lblCarvingBlockSize = new GridBagConstraints(); + gbc_lblCarvingBlockSize.insets = new Insets(0, 0, 0, 5); + gbc_lblCarvingBlockSize.anchor = GridBagConstraints.EAST; + gbc_lblCarvingBlockSize.gridx = 0; + gbc_lblCarvingBlockSize.gridy = 6; + deletedRecoverySettings.add(lblCarvingBlockSize, gbc_lblCarvingBlockSize); + + txtCarvingBlockSize = new JTextField(); + GridBagConstraints gbc_txtCarvingBlockSize = new GridBagConstraints(); + gbc_txtCarvingBlockSize.fill = GridBagConstraints.HORIZONTAL; + gbc_txtCarvingBlockSize.gridx = 1; + gbc_txtCarvingBlockSize.gridy = 6; + deletedRecoverySettings.add(txtCarvingBlockSize, gbc_txtCarvingBlockSize); + txtCarvingBlockSize.setColumns(10); + + JPanel familyTextSettings = new JPanel(); + familyTextSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Family Text Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_familyTextSettings = new GridBagConstraints(); + gbc_familyTextSettings.insets = new Insets(0, 0, 5, 0); + gbc_familyTextSettings.fill = GridBagConstraints.BOTH; + gbc_familyTextSettings.gridx = 0; + gbc_familyTextSettings.gridy = 2; + leftPanel.add(familyTextSettings, gbc_familyTextSettings); + GridBagLayout gbl_familyTextSettings = new GridBagLayout(); + gbl_familyTextSettings.columnWidths = new int[]{0, 0}; + gbl_familyTextSettings.rowHeights = new int[]{0, 0, 0}; + gbl_familyTextSettings.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_familyTextSettings.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE}; + familyTextSettings.setLayout(gbl_familyTextSettings); + + chckbxCreateFamilySearchFields = new JCheckBox("Create family search fields for top level items"); + GridBagConstraints gbc_chckbxCreateFamilySearchFields = new GridBagConstraints(); + gbc_chckbxCreateFamilySearchFields.insets = new Insets(0, 0, 5, 0); + gbc_chckbxCreateFamilySearchFields.anchor = GridBagConstraints.WEST; + gbc_chckbxCreateFamilySearchFields.gridx = 0; + gbc_chckbxCreateFamilySearchFields.gridy = 0; + familyTextSettings.add(chckbxCreateFamilySearchFields, gbc_chckbxCreateFamilySearchFields); + + chckbxHideImmaterialItems = new JCheckBox("Hide immaterial items (text rolled up to parent)"); + GridBagConstraints gbc_chckbxHideImmaterialItems = new GridBagConstraints(); + gbc_chckbxHideImmaterialItems.anchor = GridBagConstraints.WEST; + gbc_chckbxHideImmaterialItems.gridx = 0; + gbc_chckbxHideImmaterialItems.gridy = 1; + familyTextSettings.add(chckbxHideImmaterialItems, gbc_chckbxHideImmaterialItems); + + JPanel textIndexingSettings = new JPanel(); + textIndexingSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Text Indexing Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_textIndexingSettings = new GridBagConstraints(); + gbc_textIndexingSettings.insets = new Insets(0, 0, 5, 0); + gbc_textIndexingSettings.fill = GridBagConstraints.BOTH; + gbc_textIndexingSettings.gridx = 0; + gbc_textIndexingSettings.gridy = 3; + leftPanel.add(textIndexingSettings, gbc_textIndexingSettings); + GridBagLayout gbl_textIndexingSettings = new GridBagLayout(); + gbl_textIndexingSettings.columnWidths = new int[]{0, 0, 0}; + gbl_textIndexingSettings.rowHeights = new int[]{0, 0, 0, 0, 0}; + gbl_textIndexingSettings.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gbl_textIndexingSettings.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + textIndexingSettings.setLayout(gbl_textIndexingSettings); + + JLabel lblAnalysisLanguage = new JLabel("Analysis Language:"); + GridBagConstraints gbc_lblAnalysisLanguage = new GridBagConstraints(); + gbc_lblAnalysisLanguage.insets = new Insets(0, 0, 5, 5); + gbc_lblAnalysisLanguage.anchor = GridBagConstraints.EAST; + gbc_lblAnalysisLanguage.gridx = 0; + gbc_lblAnalysisLanguage.gridy = 0; + textIndexingSettings.add(lblAnalysisLanguage, gbc_lblAnalysisLanguage); + + comboAnalysisLanguage = new JComboBox(); + GridBagConstraints gbc_comboAnalysisLanguage = new GridBagConstraints(); + gbc_comboAnalysisLanguage.insets = new Insets(0, 0, 5, 0); + gbc_comboAnalysisLanguage.fill = GridBagConstraints.HORIZONTAL; + gbc_comboAnalysisLanguage.gridx = 1; + gbc_comboAnalysisLanguage.gridy = 0; + textIndexingSettings.add(comboAnalysisLanguage, gbc_comboAnalysisLanguage); + + chckbxUseStopWords = new JCheckBox("Use stop words"); + GridBagConstraints gbc_chckbxUseStopWords = new GridBagConstraints(); + gbc_chckbxUseStopWords.insets = new Insets(0, 0, 5, 0); + gbc_chckbxUseStopWords.anchor = GridBagConstraints.WEST; + gbc_chckbxUseStopWords.gridwidth = 2; + gbc_chckbxUseStopWords.gridx = 0; + gbc_chckbxUseStopWords.gridy = 1; + textIndexingSettings.add(chckbxUseStopWords, gbc_chckbxUseStopWords); + + chckbxUseStemming = new JCheckBox("Use stemming"); + GridBagConstraints gbc_chckbxUseStemming = new GridBagConstraints(); + gbc_chckbxUseStemming.insets = new Insets(0, 0, 5, 0); + gbc_chckbxUseStemming.anchor = GridBagConstraints.WEST; + gbc_chckbxUseStemming.gridwidth = 2; + gbc_chckbxUseStemming.gridx = 0; + gbc_chckbxUseStemming.gridy = 2; + textIndexingSettings.add(chckbxUseStemming, gbc_chckbxUseStemming); + + chckbxEnableExactQueries = new JCheckBox("Enable exact queries"); + GridBagConstraints gbc_chckbxEnableExactQueries = new GridBagConstraints(); + gbc_chckbxEnableExactQueries.anchor = GridBagConstraints.WEST; + gbc_chckbxEnableExactQueries.gridwidth = 2; + gbc_chckbxEnableExactQueries.insets = new Insets(0, 0, 0, 5); + gbc_chckbxEnableExactQueries.gridx = 0; + gbc_chckbxEnableExactQueries.gridy = 3; + textIndexingSettings.add(chckbxEnableExactQueries, gbc_chckbxEnableExactQueries); + + JPanel rightPanel = new JPanel(); + GridBagConstraints gbc_rightPanel = new GridBagConstraints(); + gbc_rightPanel.fill = GridBagConstraints.BOTH; + gbc_rightPanel.gridx = 1; + gbc_rightPanel.gridy = 0; + mainSettingsPanel.add(rightPanel, gbc_rightPanel); + GridBagLayout gbl_rightPanel = new GridBagLayout(); + gbl_rightPanel.columnWidths = new int[]{0, 0}; + gbl_rightPanel.rowHeights = new int[]{0, 0, 0, 0, 0}; + gbl_rightPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_rightPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + rightPanel.setLayout(gbl_rightPanel); + + JPanel itemContentSettings = new JPanel(); + itemContentSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Item Content Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_itemContentSettings = new GridBagConstraints(); + gbc_itemContentSettings.insets = new Insets(0, 0, 5, 0); + gbc_itemContentSettings.fill = GridBagConstraints.BOTH; + gbc_itemContentSettings.gridx = 0; + gbc_itemContentSettings.gridy = 0; + rightPanel.add(itemContentSettings, gbc_itemContentSettings); + GridBagLayout gbl_itemContentSettings = new GridBagLayout(); + gbl_itemContentSettings.columnWidths = new int[]{30, 0, 0}; + gbl_itemContentSettings.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0}; + gbl_itemContentSettings.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gbl_itemContentSettings.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + itemContentSettings.setLayout(gbl_itemContentSettings); + + chckbxProcessText = new JCheckBox("Process text"); + GridBagConstraints gbc_chckbxProcessText = new GridBagConstraints(); + gbc_chckbxProcessText.gridwidth = 2; + gbc_chckbxProcessText.anchor = GridBagConstraints.WEST; + gbc_chckbxProcessText.insets = new Insets(0, 0, 5, 0); + gbc_chckbxProcessText.gridx = 0; + gbc_chckbxProcessText.gridy = 0; + itemContentSettings.add(chckbxProcessText, gbc_chckbxProcessText); + + chckbxEnableNearDuplicates = new JCheckBox("Enable near-duplicates"); + GridBagConstraints gbc_chckbxEnableNearDuplicates = new GridBagConstraints(); + gbc_chckbxEnableNearDuplicates.gridwidth = 2; + gbc_chckbxEnableNearDuplicates.insets = new Insets(0, 0, 5, 0); + gbc_chckbxEnableNearDuplicates.anchor = GridBagConstraints.WEST; + gbc_chckbxEnableNearDuplicates.gridx = 0; + gbc_chckbxEnableNearDuplicates.gridy = 1; + itemContentSettings.add(chckbxEnableNearDuplicates, gbc_chckbxEnableNearDuplicates); + + chckbxEnableTextSummarisation = new JCheckBox("Enable text summarisation"); + GridBagConstraints gbc_chckbxEnableTextSummarisation = new GridBagConstraints(); + gbc_chckbxEnableTextSummarisation.gridwidth = 2; + gbc_chckbxEnableTextSummarisation.anchor = GridBagConstraints.WEST; + gbc_chckbxEnableTextSummarisation.insets = new Insets(0, 0, 5, 0); + gbc_chckbxEnableTextSummarisation.gridx = 0; + gbc_chckbxEnableTextSummarisation.gridy = 2; + itemContentSettings.add(chckbxEnableTextSummarisation, gbc_chckbxEnableTextSummarisation); + + chckbxExtractNamedEntities = new JCheckBox("Extract named entities from text"); + GridBagConstraints gbc_chckbxExtractNamedEntities = new GridBagConstraints(); + gbc_chckbxExtractNamedEntities.gridwidth = 2; + gbc_chckbxExtractNamedEntities.anchor = GridBagConstraints.WEST; + gbc_chckbxExtractNamedEntities.insets = new Insets(0, 0, 5, 0); + gbc_chckbxExtractNamedEntities.gridx = 0; + gbc_chckbxExtractNamedEntities.gridy = 3; + itemContentSettings.add(chckbxExtractNamedEntities, gbc_chckbxExtractNamedEntities); + + chckbxExtractNamedEntitiesFromTextStripped = new JCheckBox("Include text stripped items"); + chckbxExtractNamedEntitiesFromTextStripped.setEnabled(false); + GridBagConstraints gbc_chckbxExtractNamedEntitiesFromTextStripped = new GridBagConstraints(); + gbc_chckbxExtractNamedEntitiesFromTextStripped.insets = new Insets(0, 0, 5, 0); + gbc_chckbxExtractNamedEntitiesFromTextStripped.anchor = GridBagConstraints.WEST; + gbc_chckbxExtractNamedEntitiesFromTextStripped.gridx = 1; + gbc_chckbxExtractNamedEntitiesFromTextStripped.gridy = 4; + itemContentSettings.add(chckbxExtractNamedEntitiesFromTextStripped, gbc_chckbxExtractNamedEntitiesFromTextStripped); + + chckbxExtractNamedEntitiesFromProperties = new JCheckBox("Extract named entities from properties"); + GridBagConstraints gbc_chckbxExtractNamedEntitiesFromProperties = new GridBagConstraints(); + gbc_chckbxExtractNamedEntitiesFromProperties.gridwidth = 2; + gbc_chckbxExtractNamedEntitiesFromProperties.anchor = GridBagConstraints.WEST; + gbc_chckbxExtractNamedEntitiesFromProperties.gridx = 0; + gbc_chckbxExtractNamedEntitiesFromProperties.gridy = 5; + itemContentSettings.add(chckbxExtractNamedEntitiesFromProperties, gbc_chckbxExtractNamedEntitiesFromProperties); + + JPanel imageSettings = new JPanel(); + imageSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Image Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_imageSettings = new GridBagConstraints(); + gbc_imageSettings.insets = new Insets(0, 0, 5, 0); + gbc_imageSettings.fill = GridBagConstraints.BOTH; + gbc_imageSettings.gridx = 0; + gbc_imageSettings.gridy = 1; + rightPanel.add(imageSettings, gbc_imageSettings); + GridBagLayout gbl_imageSettings = new GridBagLayout(); + gbl_imageSettings.columnWidths = new int[]{0, 0}; + gbl_imageSettings.rowHeights = new int[]{0, 0, 0, 0}; + gbl_imageSettings.columnWeights = new double[]{0.0, Double.MIN_VALUE}; + gbl_imageSettings.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; + imageSettings.setLayout(gbl_imageSettings); + + chckbxGenerateThumbnails = new JCheckBox("Generate thumbnails for image data"); + GridBagConstraints gbc_chckbxGenerateThumbnails = new GridBagConstraints(); + gbc_chckbxGenerateThumbnails.anchor = GridBagConstraints.WEST; + gbc_chckbxGenerateThumbnails.insets = new Insets(0, 0, 5, 0); + gbc_chckbxGenerateThumbnails.gridx = 0; + gbc_chckbxGenerateThumbnails.gridy = 0; + imageSettings.add(chckbxGenerateThumbnails, gbc_chckbxGenerateThumbnails); + + chckbxPerformSkinToneAnalysis = new JCheckBox("Perform image colour and skin-tone analysis"); + GridBagConstraints gbc_chckbxPerformSkinToneAnalysis = new GridBagConstraints(); + gbc_chckbxPerformSkinToneAnalysis.insets = new Insets(0, 0, 5, 0); + gbc_chckbxPerformSkinToneAnalysis.anchor = GridBagConstraints.WEST; + gbc_chckbxPerformSkinToneAnalysis.gridx = 0; + gbc_chckbxPerformSkinToneAnalysis.gridy = 1; + imageSettings.add(chckbxPerformSkinToneAnalysis, gbc_chckbxPerformSkinToneAnalysis); + + chckbxDetectFaces = new JCheckBox("Detect faces"); + GridBagConstraints gbc_chckbxDetectFaces = new GridBagConstraints(); + gbc_chckbxDetectFaces.anchor = GridBagConstraints.WEST; + gbc_chckbxDetectFaces.gridx = 0; + gbc_chckbxDetectFaces.gridy = 2; + imageSettings.add(chckbxDetectFaces, gbc_chckbxDetectFaces); + + JPanel digestSettings = new JPanel(); + digestSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Digest Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_digestSettings = new GridBagConstraints(); + gbc_digestSettings.insets = new Insets(0, 0, 5, 0); + gbc_digestSettings.fill = GridBagConstraints.BOTH; + gbc_digestSettings.gridx = 0; + gbc_digestSettings.gridy = 2; + rightPanel.add(digestSettings, gbc_digestSettings); + GridBagLayout gbl_digestSettings = new GridBagLayout(); + gbl_digestSettings.columnWidths = new int[]{20, 0, 0, 0}; + gbl_digestSettings.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0, 0}; + gbl_digestSettings.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gbl_digestSettings.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + digestSettings.setLayout(gbl_digestSettings); + + JLabel lblDigestsToCompute = new JLabel("Digests to compute:"); + GridBagConstraints gbc_lblDigestsToCompute = new GridBagConstraints(); + gbc_lblDigestsToCompute.insets = new Insets(0, 0, 5, 5); + gbc_lblDigestsToCompute.anchor = GridBagConstraints.WEST; + gbc_lblDigestsToCompute.gridwidth = 2; + gbc_lblDigestsToCompute.gridx = 0; + gbc_lblDigestsToCompute.gridy = 0; + digestSettings.add(lblDigestsToCompute, gbc_lblDigestsToCompute); + + chckbxMd5 = new JCheckBox("MD5"); + chckbxMd5.setSelected(true); + chckbxMd5.setEnabled(false); + GridBagConstraints gbc_chckbxMd5 = new GridBagConstraints(); + gbc_chckbxMd5.insets = new Insets(0, 0, 5, 5); + gbc_chckbxMd5.anchor = GridBagConstraints.WEST; + gbc_chckbxMd5.gridx = 1; + gbc_chckbxMd5.gridy = 1; + digestSettings.add(chckbxMd5, gbc_chckbxMd5); + + chckbxSha1 = new JCheckBox("SHA-1"); + GridBagConstraints gbc_chckbxSha1 = new GridBagConstraints(); + gbc_chckbxSha1.anchor = GridBagConstraints.WEST; + gbc_chckbxSha1.insets = new Insets(0, 0, 5, 5); + gbc_chckbxSha1.gridx = 1; + gbc_chckbxSha1.gridy = 2; + digestSettings.add(chckbxSha1, gbc_chckbxSha1); + + chckbxSha256 = new JCheckBox("SHA-256"); + GridBagConstraints gbc_chckbxSha256 = new GridBagConstraints(); + gbc_chckbxSha256.anchor = GridBagConstraints.WEST; + gbc_chckbxSha256.insets = new Insets(0, 0, 5, 5); + gbc_chckbxSha256.gridx = 1; + gbc_chckbxSha256.gridy = 3; + digestSettings.add(chckbxSha256, gbc_chckbxSha256); + + chckbxSsdeep = new JCheckBox("SSDeep"); + GridBagConstraints gbc_chckbxSsdeep = new GridBagConstraints(); + gbc_chckbxSsdeep.insets = new Insets(0, 0, 5, 5); + gbc_chckbxSsdeep.anchor = GridBagConstraints.WEST; + gbc_chckbxSsdeep.gridx = 1; + gbc_chckbxSsdeep.gridy = 4; + digestSettings.add(chckbxSsdeep, gbc_chckbxSsdeep); + + JLabel lblMaximumDigestSize = new JLabel("Maximum digest size (MB):"); + GridBagConstraints gbc_lblMaximumDigestSize = new GridBagConstraints(); + gbc_lblMaximumDigestSize.anchor = GridBagConstraints.WEST; + gbc_lblMaximumDigestSize.gridwidth = 2; + gbc_lblMaximumDigestSize.insets = new Insets(0, 0, 5, 5); + gbc_lblMaximumDigestSize.gridx = 0; + gbc_lblMaximumDigestSize.gridy = 5; + digestSettings.add(lblMaximumDigestSize, gbc_lblMaximumDigestSize); + + spinnerMaxDigestSize = new JSpinner(); + spinnerMaxDigestSize.setModel(new SpinnerNumberModel(Integer.valueOf(250), Integer.valueOf(0), null, Integer.valueOf(1))); + GridBagConstraints gbc_spinnerMaxDigestSize = new GridBagConstraints(); + gbc_spinnerMaxDigestSize.insets = new Insets(0, 0, 5, 0); + gbc_spinnerMaxDigestSize.fill = GridBagConstraints.HORIZONTAL; + gbc_spinnerMaxDigestSize.gridx = 2; + gbc_spinnerMaxDigestSize.gridy = 5; + digestSettings.add(spinnerMaxDigestSize, gbc_spinnerMaxDigestSize); + + JPanel emailDigestSettings = new JPanel(); + emailDigestSettings.setBorder(new CompoundBorder(new EmptyBorder(5, 5, 5, 5), new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Email Digest Settings", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5)))); + GridBagConstraints gbc_emailDigestSettings = new GridBagConstraints(); + gbc_emailDigestSettings.gridwidth = 3; + gbc_emailDigestSettings.fill = GridBagConstraints.BOTH; + gbc_emailDigestSettings.gridx = 0; + gbc_emailDigestSettings.gridy = 6; + digestSettings.add(emailDigestSettings, gbc_emailDigestSettings); + GridBagLayout gbl_emailDigestSettings = new GridBagLayout(); + gbl_emailDigestSettings.columnWidths = new int[]{0, 0}; + gbl_emailDigestSettings.rowHeights = new int[]{0, 0, 0}; + gbl_emailDigestSettings.columnWeights = new double[]{0.0, Double.MIN_VALUE}; + gbl_emailDigestSettings.rowWeights = new double[]{0.0, 0.0, Double.MIN_VALUE}; + emailDigestSettings.setLayout(gbl_emailDigestSettings); + + chckbxDigestIncludeBcc = new JCheckBox("Include Bcc"); + GridBagConstraints gbc_chckbxDigestIncludeBcc = new GridBagConstraints(); + gbc_chckbxDigestIncludeBcc.anchor = GridBagConstraints.WEST; + gbc_chckbxDigestIncludeBcc.insets = new Insets(0, 0, 5, 0); + gbc_chckbxDigestIncludeBcc.gridx = 0; + gbc_chckbxDigestIncludeBcc.gridy = 0; + emailDigestSettings.add(chckbxDigestIncludeBcc, gbc_chckbxDigestIncludeBcc); + + chckbxDigestIncludeItemDate = new JCheckBox("Include Item Date"); + GridBagConstraints gbc_chckbxDigestIncludeItemDate = new GridBagConstraints(); + gbc_chckbxDigestIncludeItemDate.anchor = GridBagConstraints.WEST; + gbc_chckbxDigestIncludeItemDate.gridx = 0; + gbc_chckbxDigestIncludeItemDate.gridy = 1; + emailDigestSettings.add(chckbxDigestIncludeItemDate, gbc_chckbxDigestIncludeItemDate); + + initialize(); + initDataBindings(); + } + + private void initialize(){ + defineTraversalChoices(); + buildSettingControlMaps(); + } + + private void defineTraversalChoices(){ + traversalChoices.add(new ComboChoice("Full traversal","full_traversal")); + traversalChoices.add(new ComboChoice("Process loose files and forensic images but not their contents","loose_files_and_forensic_images")); + traversalChoices.add(new ComboChoice("Process loose files but not their contents","loose_files")); + + for(ComboChoice choice : traversalChoices){ + comboTraversal.addItem(choice); + } + + languageChoices.add(new ComboChoice("English","en")); + languageChoices.add(new ComboChoice("Japanese","ja")); + + for(ComboChoice choice : languageChoices){ + comboAnalysisLanguage.addItem(choice); + } + } + + private void buildSettingControlMaps(){ + //Map check boxes + booleanSettingsMap.put("addBccToEmailDigests",chckbxDigestIncludeBcc); + booleanSettingsMap.put("addCommunicationDateToEmailDigests",chckbxDigestIncludeItemDate); + booleanSettingsMap.put("calculateAuditedSize",chckbxCalculateAuditedSize); + booleanSettingsMap.put("calculateSSDeepFuzzyHash",chckbxSsdeep); + booleanSettingsMap.put("carveFileSystemUnallocatedSpace",chckbxCarveFileSystem); + booleanSettingsMap.put("createThumbnails",chckbxGenerateThumbnails); + booleanSettingsMap.put("detectFaces",chckbxDetectFaces); + booleanSettingsMap.put("enableExactQueries",chckbxEnableExactQueries); + booleanSettingsMap.put("extractEndOfFileSlackSpace",chckbxExtractEndOfFileSlackSpace); + booleanSettingsMap.put("extractFromSlackSpace",chckbxExtractFromSlackSpace); + booleanSettingsMap.put("extractNamedEntitiesFromProperties",chckbxExtractNamedEntitiesFromProperties); + booleanSettingsMap.put("extractNamedEntitiesFromText",chckbxExtractNamedEntities); + booleanSettingsMap.put("extractNamedEntitiesFromTextStripped",chckbxExtractNamedEntitiesFromTextStripped); + booleanSettingsMap.put("extractShingles",chckbxEnableNearDuplicates); + booleanSettingsMap.put("hideEmbeddedImmaterialData",chckbxHideImmaterialItems); + booleanSettingsMap.put("identifyPhysicalFiles",chckbxPerformItemIdentification); + booleanSettingsMap.put("processFamilyFields",chckbxCreateFamilySearchFields); + booleanSettingsMap.put("processText",chckbxProcessText); + booleanSettingsMap.put("processTextSummaries",chckbxEnableTextSummarisation); + booleanSettingsMap.put("recoverDeletedFiles",chckbxRecoverDeletedFiles); + booleanSettingsMap.put("reuseEvidenceStores",chckbxReuseEvidenceStores); + booleanSettingsMap.put("skinToneAnalysis",chckbxPerformSkinToneAnalysis); + booleanSettingsMap.put("smartProcessRegistry",chckbxSmartProcessRegistry); + booleanSettingsMap.put("stemming",chckbxUseStemming); + booleanSettingsMap.put("stopWords",chckbxUseStopWords); + booleanSettingsMap.put("storeBinary",chckbxStoreBinary); + booleanSettingsMap.put("carveUnidentifiedData",chckbxIndexUnallocatedSpace); + + // Map spinners + intSettingsMap.put("maxStoredBinarySize",spinnerMaxBinarySize); + intSettingsMap.put("maxDigestSize",spinnerMaxDigestSize); + } + + /*** + * Gets the settings represented by this control as a Map which could be passed directly to Nuix + * via Processing.setProcessingSettings + * @return A Map of processing settings compatible with Processing.setProcessingSettings + */ + public Map getSettings(){ + Map result = new TreeMap(); + + // Bulk add bools + for(Map.Entry boolEntry : booleanSettingsMap.entrySet()){ + result.put(boolEntry.getKey(),boolEntry.getValue().isSelected()); + } + + //reportProcessingStatus is special + result.put("reportPrcessingStatus",chckbxCalculateProcessingSize.isSelected() ? "physical_files" : "none"); + + //Bulk add ints + for(Map.Entry intEntry : intSettingsMap.entrySet()){ + result.put(intEntry.getKey(),(Integer)intEntry.getValue().getValue() * (1000 * 1000)); + } + + //Digests + List digestSettings = new ArrayList(); + boolean md5 = chckbxMd5.isSelected(); + boolean sha1 = chckbxSha1.isSelected(); + boolean sha256 = chckbxSha256.isSelected(); + + if (md5){digestSettings.add("MD5");} + if (sha1){digestSettings.add("SHA-1");} + if (sha256){digestSettings.add("SHA-256");} + + result.put("digests",digestSettings); + + //Traversal + String traversalSetting = ((ComboChoice)comboTraversal.getSelectedItem()).settingName; + result.put("traversalScope",traversalSetting); + + //Language + String languageSetting = ((ComboChoice)comboAnalysisLanguage.getSelectedItem()).settingName; + result.put("analysisLanguage",languageSetting); + + //Block size + if(txtCarvingBlockSize.getText().length() > 0){ + int carvingBlockSize = Integer.parseInt(txtCarvingBlockSize.getText()); + result.put("carvingBlockSize",carvingBlockSize); + } + + return result; + } + + /*** + * Loads settings Map into the control. Map format should be compatible with Processor.setProcessingSettings + * @param settings A Map of processing settings compatible with Processor.setProcessingSettings + */ + @SuppressWarnings("unchecked") + public void loadSettings(Map settings){ + clearSettings(); + for(Map.Entry entry : settings.entrySet()){ + if(booleanSettingsMap.containsKey(entry.getKey())){ + booleanSettingsMap.get(entry.getKey()).setSelected((Boolean)entry.getValue()); + } else if(entry.getKey().equals("reportProcessingStatus")){ + chckbxCalculateProcessingSize.setSelected(((String)entry.getValue()).equalsIgnoreCase("physical_files")); + } else if(intSettingsMap.containsKey(entry.getKey())){ + Object mapValue = entry.getValue(); + Double value = null; + if(mapValue instanceof Double){ + value = (Double)entry.getValue(); + } else if (mapValue instanceof Integer){ + Integer intValue = (Integer)entry.getValue(); + value = Double.valueOf(intValue); + } else if (mapValue instanceof Long){ + Long longValue = (Long)entry.getValue(); + value = Double.valueOf(longValue); + } + intSettingsMap.get(entry.getKey()).setValue(value.intValue() / (1000 * 1000)); + } else if (entry.getKey().equals("digests")){ + List digests = (List)entry.getValue(); + for(String digest : digests){ + if(digest.equals("MD5")){ chckbxMd5.setSelected(true); } + else if (digest.equals("SHA-1")){ chckbxSha1.setSelected(true); } + else if (digest.equals("SHA-256")){ chckbxSha256.setSelected(true); } + } + } else if (entry.getKey().equals("traversalScope")){ + String traversalSetting = (String)entry.getValue(); + for(ComboChoice possibleChoice : traversalChoices){ + if(traversalSetting.equals(possibleChoice.settingName)){ + comboTraversal.setSelectedItem(possibleChoice); + break; + } + } + } else if (entry.getKey().equals("analysisLanguage")){ + String languageSetting = (String)entry.getValue(); + for(ComboChoice possibleChoice : languageChoices){ + if(languageSetting.equals(possibleChoice.settingName)){ + comboAnalysisLanguage.setSelectedItem(possibleChoice); + break; + } + } + } else if (entry.getKey().equals("carvingBlockSize")){ + Double blockSize = (Double)entry.getValue(); + if(blockSize != null) { + txtCarvingBlockSize.setText(blockSize.intValue()+""); + } + } + } + } + + /*** + * Gets the settings represented by this control as a JSON string + * @return The settings as a JSON string + */ + public String getSettingsJSON(){ + GsonBuilder builder = new GsonBuilder(); + builder.setPrettyPrinting(); + Gson gson = builder.create(); + return gson.toJson(getSettings()); + } + + /*** + * Saves the settings represented by this control as a JSON file + * @param filePath The location to save the file to + * @throws Exception Thrown if something goes wrong + */ + public void saveJSONFile(File filePath) throws Exception { + FileWriter fw = null; + PrintWriter pw = null; + try{ + fw = new FileWriter(filePath); + pw = new PrintWriter(fw); + pw.print(getSettingsJSON()); + }catch(Exception exc){ + throw exc; + } + finally{ + try { + fw.close(); + } catch (IOException e) {} + pw.close(); + } + } + + /*** + * Saves the settings represented by this control as a JSON file + * @param filePath The location to save the file to + * @throws Exception Thrown if something goes wrong + */ + public void saveJSONFile(String filePath) throws Exception { + saveJSONFile(new File(filePath)); + } + + /*** + * Loads settings into the control from a JSON string + * @param json The JSON string of settings to load + */ + public void loadSettingsJSON(String json){ + Gson gson = new Gson(); + Map settings = gson.fromJson(json,new TypeToken>(){}.getType()); + loadSettings(settings); + } + + /*** + * Loads settings into the control from a JSON file + * @param filePath The location of the file to load + * @throws Exception Thrown if something goes wrong + */ + public void loadSettingsJSONFile(String filePath) throws Exception{ + List lines = Files.readAllLines(Paths.get(filePath)); + String json = Joiner.on("\n").join(lines); + loadSettingsJSON(json); + } + + /*** + * Loads settings into the control from a JSON file + * @param filePath The location of the file to load + * @throws Exception Thrown if something goes wrong + */ + public void loadSettingsJSONFile(File filePath) throws Exception{ + loadSettingsJSONFile(filePath.getPath()); + } + + /*** + * Clears the settings of this control. All check boxes are unchecked, max binary size + * is set to 1000MB, max digest size is set to 250MB, + */ + public void clearSettings(){ + // Bulk add bools + for(Map.Entry boolEntry : booleanSettingsMap.entrySet()){ + boolEntry.getValue().setSelected(false); + } + + chckbxCalculateProcessingSize.setSelected(false); + + //Reset Ints + spinnerMaxBinarySize.setValue(1000); + spinnerMaxDigestSize.setValue(250); +// for(Map.Entry intEntry : intSettingsMap.entrySet()){ +// intEntry.getValue().setValue(0); +// } + + //Digests + chckbxMd5.setSelected(true); + chckbxSha1.setSelected(false); + chckbxSha256.setSelected(false); + + //Traversal + comboTraversal.setSelectedIndex(0); + + //Language + comboAnalysisLanguage.setSelectedIndex(0); + + //Block size + txtCarvingBlockSize.setText(""); + } + + public void loadDefaultSettings(){ + clearSettings(); + if(defaultSettings != null){ + loadSettings(defaultSettings); + } + } + + public Map getDefaultSettings() { + return defaultSettings; + } + + public void setDefaultSettings(Map defaultSettings) { + this.defaultSettings = defaultSettings; + loadDefaultSettings(); + } + + public void setDefaultSettingsFromJSON(String json) { + Gson gson = new Gson(); + Map settings = gson.fromJson(json,new TypeToken>(){}.getType()); + setDefaultSettings(settings); + } + + public void setDefaultSettingsFromJSONFile(String filePath) throws Exception { + List lines = Files.readAllLines(Paths.get(filePath)); + String json = Joiner.on("\n").join(lines); + setDefaultSettingsFromJSON(json); + } + + public void setDefaultSettingsFromJSONFile(File filePath) throws Exception { + setDefaultSettingsFromJSONFile(filePath.getPath()); + } + + protected void initDataBindings() { + BeanProperty jCheckBoxBeanProperty = BeanProperty.create("selected"); + BeanProperty jCheckBoxBeanProperty_1 = BeanProperty.create("enabled"); + AutoBinding autoBinding = Bindings.createAutoBinding(UpdateStrategy.READ, chckbxExtractNamedEntities, jCheckBoxBeanProperty, chckbxExtractNamedEntitiesFromTextStripped, jCheckBoxBeanProperty_1); + autoBinding.bind(); + } + + public void hideSaveLoadResetButtons(){ + btnSaveSettings.setVisible(false); + btnLoadSettings.setVisible(false); + btnResetSettings.setVisible(false); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DisablingGlassPaneWrapper.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DisablingGlassPaneWrapper.java new file mode 100644 index 0000000..cf5471e --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DisablingGlassPaneWrapper.java @@ -0,0 +1,46 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.event.MouseAdapter; + +import javax.swing.JComponent; +import javax.swing.JLayeredPane; +import javax.swing.JPanel; + +/*** + * Overlay clear pane which disables input to the underlying controls. Used as a way to disable entire + * panel at once. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class DisablingGlassPaneWrapper extends JLayeredPane{ + private JPanel glassPanel = new JPanel(); + + public DisablingGlassPaneWrapper(JComponent myPanel) { + glassPanel.setOpaque(false); + glassPanel.setVisible(false); + glassPanel.addMouseListener(new MouseAdapter() {}); + glassPanel.setFocusable(true); + + myPanel.setSize(myPanel.getPreferredSize()); + add(myPanel, JLayeredPane.DEFAULT_LAYER); + add(glassPanel, JLayeredPane.PALETTE_LAYER); + + glassPanel.setPreferredSize(myPanel.getPreferredSize()); + glassPanel.setSize(myPanel.getPreferredSize()); + setPreferredSize(myPanel.getPreferredSize()); + } + + public void activateGlassPane(boolean activate) { + glassPanel.setVisible(activate); + if (activate) { + glassPanel.requestFocusInWindow(); + glassPanel.setFocusTraversalKeysEnabled(false); + } + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DynamicTableControl.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DynamicTableControl.java new file mode 100644 index 0000000..332bc2b --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/DynamicTableControl.java @@ -0,0 +1,460 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; +import java.util.Arrays; +import java.util.List; +import java.util.function.Supplier; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JSeparator; +import javax.swing.JTextField; +import javax.swing.JToolBar; +import javax.swing.ListSelectionModel; +import javax.swing.SwingConstants; +import javax.swing.Timer; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; + +import org.apache.commons.lang.ArrayUtils; +import org.jdesktop.swingx.JXTable; + +import com.nuix.nx.controls.models.ChoiceTableModelChangeListener; +import com.nuix.nx.controls.models.DynamicTableModel; +import com.nuix.nx.controls.models.DynamicTableValueCallback; +import org.jetbrains.annotations.NotNull; + +/*** + * Control for displaying a dynamically defined table of data. Meant to mostly make this a little easier + * from a Ruby script. + * @author JWells01 + * + */ +@SuppressWarnings("serial") +public class DynamicTableControl extends JPanel { + + private JXTable dataTable; + private DynamicTableModel tableModel; + private JTextField txtFilter; + private JButton btnClearFilter; + private JToolBar toolBar; + private JButton btnCheckDisplayed; + private JButton btnUncheckDisplayed; + private JScrollPane scrollPane; + private JLabel lblLblcounts; + private JButton btnSortup; + private JButton btnSortdown; + //private JButton btnSortcheckedtotop; + private JButton btnShowChecked; + private JButton btnShowunchecked; + private JSeparator separator; + private JSeparator separator_1; + private JLabel lblFilter; + private Timer filterUpdateTimer; + private JSeparator separator_2; + private JButton btnAddRecord; + private Supplier addRecordCallback = null; + private JButton btnRemoveSelected; + + public DynamicTableControl(List headers, List records, DynamicTableValueCallback valueCallback) { + filterUpdateTimer = new Timer(250, new ActionListener(){ + @Override + public void actionPerformed(ActionEvent arg0) { + try { + // Possible for this to fire before were properly ready so we check for nulls + if(tableModel != null && txtFilter != null) { + tableModel.setFilter(txtFilter.getText()); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + }); + filterUpdateTimer.setRepeats(false); + filterUpdateTimer.start(); + + lblLblcounts = new JLabel("Checked: 0 Visible: 0 Total: 0"); + + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 450, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 1.0, 0.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + { + { + tableModel = new DynamicTableModel(headers,records,valueCallback,false); + tableModel.setChangeListener(new ChoiceTableModelChangeListener() { + @Override + public void dataChanged() { + lblLblcounts.setText("Checked: " + tableModel.getCheckedValueCount() + + " Visible: " + tableModel.getVisibleValueCount() + + " Total: " + tableModel.getTotalValueCount()); + + } + + @Override + public void structureChanged() { + TableColumn checkColumn = dataTable.getColumnModel().getColumn(0); + checkColumn.setMinWidth(25); + checkColumn.setMaxWidth(25); + } + }); + + lblFilter = new JLabel("Filter:"); + GridBagConstraints gbc_lblFilter = new GridBagConstraints(); + gbc_lblFilter.insets = new Insets(0, 0, 5, 5); + gbc_lblFilter.anchor = GridBagConstraints.EAST; + gbc_lblFilter.gridx = 0; + gbc_lblFilter.gridy = 0; + add(lblFilter, gbc_lblFilter); + + txtFilter = new JTextField(); + GridBagConstraints gbc_txtFilter = new GridBagConstraints(); + gbc_txtFilter.insets = new Insets(0, 0, 5, 5); + gbc_txtFilter.fill = GridBagConstraints.HORIZONTAL; + gbc_txtFilter.gridx = 1; + gbc_txtFilter.gridy = 0; + add(txtFilter, gbc_txtFilter); + txtFilter.setColumns(10); + + toolBar = new JToolBar(); + toolBar.setFloatable(false); + GridBagConstraints gbc_toolBar = new GridBagConstraints(); + gbc_toolBar.insets = new Insets(0, 0, 5, 0); + gbc_toolBar.gridx = 2; + gbc_toolBar.gridy = 0; + add(toolBar, gbc_toolBar); + + btnShowChecked = new JButton(""); + btnShowChecked.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + txtFilter.setText(":checked:"); + } + }); + + btnClearFilter = new JButton(""); + btnClearFilter.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + txtFilter.setText(""); + } + }); + toolBar.add(btnClearFilter); + btnClearFilter.setToolTipText("Clear current filter"); + btnClearFilter.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/zoom_out.png"))); + btnShowChecked.setToolTipText("Show all currently checked choices"); + btnShowChecked.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/tick.png"))); + toolBar.add(btnShowChecked); + + btnShowunchecked = new JButton(""); + btnShowunchecked.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + txtFilter.setText(":unchecked:"); + } + }); + btnShowunchecked.setToolTipText("Show all currently un-checked choices"); + btnShowunchecked.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/cross.png"))); + toolBar.add(btnShowunchecked); + + btnCheckDisplayed = new JButton(); + btnCheckDisplayed.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tableModel.checkDisplayedRecords(); + } + }); + + separator = new JSeparator(); + separator.setOrientation(SwingConstants.VERTICAL); + toolBar.add(separator); + btnCheckDisplayed.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/accept.png"))); + btnCheckDisplayed.setToolTipText("Check all visible"); + toolBar.add(btnCheckDisplayed); + + btnUncheckDisplayed = new JButton(""); + btnUncheckDisplayed.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + tableModel.uncheckDisplayedRecords(); + } + }); + btnUncheckDisplayed.setToolTipText("Uncheck all visible"); + btnUncheckDisplayed.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/unaccept.png"))); + toolBar.add(btnUncheckDisplayed); + + btnSortup = new JButton(""); + btnSortup.setToolTipText("Move selected row up. Only available when no filtering is currently applied to the table."); + btnSortup.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/arrow_up.png"))); + btnSortup.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + int[] rows = dataTable.getSelectedRows(); + rows = tableModel.shiftRowsUp(rows); + dataTable.setRowSelectionInterval(rows[0], rows[rows.length-1]); + } + }); + + separator_1 = new JSeparator(); + separator_1.setOrientation(SwingConstants.VERTICAL); + toolBar.add(separator_1); + toolBar.add(btnSortup); + + btnSortdown = new JButton(""); + btnSortdown.setToolTipText("Move selected row down. Only available when no filtering is currently applied to the table."); + btnSortdown.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/arrow_down.png"))); + btnSortdown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + int[] rows = dataTable.getSelectedRows(); + rows = tableModel.shiftRowsDown(rows); + dataTable.setRowSelectionInterval(rows[0], rows[rows.length-1]); + } + }); + toolBar.add(btnSortdown); + + separator_2 = new JSeparator(); + separator_2.setOrientation(SwingConstants.VERTICAL); + toolBar.add(separator_2); + + btnAddRecord = new JButton(""); + btnAddRecord.setEnabled(false); + btnAddRecord.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(addRecordCallback != null){ + Object newRecord = addRecordCallback.get(); + if(newRecord != null) { + getModel().addRecord(newRecord); + } + } + } + }); + btnAddRecord.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/add.png"))); + toolBar.add(btnAddRecord); + + btnRemoveSelected = new JButton(""); + btnRemoveSelected.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] selectedIndices = dataTable.getSelectedRows(); + Arrays.sort(selectedIndices); + ArrayUtils.reverse(selectedIndices); + for(int index : selectedIndices){ + getModel().remove(index); + } + } + }); + btnRemoveSelected.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/delete.png"))); + toolBar.add(btnRemoveSelected); + +// btnSortcheckedtotop = new JButton(""); +// btnSortcheckedtotop.addActionListener(new ActionListener() { +// public void actionPerformed(ActionEvent e) { +// tableModel.sortCheckedToTop(); +// } +// }); +// btnSortcheckedtotop.setIcon(new ImageIcon(DynamicTableControl.class.getResource("/icons/bullet_arrow_top.png"))); +// btnSortcheckedtotop.setToolTipText("Sort checked items to top. Only available when no filtering is currently applied to the table."); +// toolBar.add(btnSortcheckedtotop); + + + scrollPane = new JScrollPane(); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.insets = new Insets(0, 0, 5, 0); + gbc_scrollPane.gridwidth = 3; + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 1; + add(scrollPane, gbc_scrollPane); + dataTable = new JXTable(tableModel){ + + //Implement table cell tool tips. + public String getToolTipText(MouseEvent e) { + String tip = null; + java.awt.Point p = e.getPoint(); + int rowIndex = rowAtPoint(p); + //int colIndex = columnAtPoint(p); + try { + //comment row, exclude heading + if(rowIndex != 0){ + tip = "";//tableModel.getChoice(rowIndex).getToolTip(); + } + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + + return tip; + } + }; + dataTable.setSortsOnUpdates(false); + dataTable.setSortable(false); + dataTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + dataTable.setFillsViewportHeight(true); + scrollPane.setViewportView(dataTable); + + GridBagConstraints gbc_lblLblcounts = new GridBagConstraints(); + gbc_lblLblcounts.gridwidth = 2; + gbc_lblLblcounts.anchor = GridBagConstraints.WEST; + gbc_lblLblcounts.insets = new Insets(0, 0, 0, 5); + gbc_lblLblcounts.gridx = 0; + gbc_lblLblcounts.gridy = 2; + add(lblLblcounts, gbc_lblLblcounts); + TableColumn checkColumn = dataTable.getColumnModel().getColumn(0); + checkColumn.setMinWidth(25); + checkColumn.setMaxWidth(25); + } + } + + txtFilter.getDocument().addDocumentListener(new DocumentListener() { + public void changedUpdate(DocumentEvent e) { + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled); + btnSortdown.setEnabled(sortEnabled); + //btnSortcheckedtotop.setEnabled(sortEnabled); + filterUpdateTimer.stop(); + filterUpdateTimer.start(); + } + + public void removeUpdate(DocumentEvent e) { + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled); + btnSortdown.setEnabled(sortEnabled); + //btnSortcheckedtotop.setEnabled(sortEnabled); + filterUpdateTimer.stop(); + filterUpdateTimer.start(); + } + + public void insertUpdate(DocumentEvent e) { + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled); + btnSortdown.setEnabled(sortEnabled); + //btnSortcheckedtotop.setEnabled(sortEnabled); + filterUpdateTimer.stop(); + filterUpdateTimer.start(); + } + }); + } + + public DynamicTableModel getTableModel() { + return tableModel; + } + + /** + * Apply the new table model to the table view. + *

+ * This method will apply the new data model, while also transferring exising listeners from the old model + * to the new one (removing them from the old model in the process). Finally, it will fire a table data changed + * event on the table model to force an update of the UI. + *

+ * @param model The new model. It will have existing {@link ChoiceTableModelChangeListener} and TableModelListeners + * added to it as a result of this method. + */ + public void setTableModel(DynamicTableModel model) { + DynamicTableModel oldModel = tableModel; + + ChoiceTableModelChangeListener changeListener = oldModel.getChangeListener(); + + tableModel = model; + tableModel.setChangeListener(changeListener); + dataTable.setModel(tableModel); + + oldModel.removeChangeListener(changeListener); + + TableColumn checkColumn = dataTable.getColumnModel().getColumn(0); + checkColumn.setMinWidth(25); + checkColumn.setMaxWidth(25); + + //tableModel.fireTableDataChanged(); + } + + /** + * Set the {@link TableCellRenderer} to be used to render data of the provided type. + * @param type The {@link Class} of the type the provided renderer. If the TableModel returns an instance of this + * class from {@link javax.swing.table.TableModel#getColumnClass(int)} then the provided + * TableCellRenderer will be used to render the returned contents into the JTable. + * @param renderer The {@link TableCellRenderer} used to calculate the displayed content for any JTable cells that + * are of the type specified. + */ + public void setTableCellRenderer(@NotNull Class type, @NotNull TableCellRenderer renderer) { + getTable().setDefaultRenderer(type, renderer); + } + + + public void setEnabled(boolean value){ + dataTable.setEnabled(value); + dataTable.setVisible(value); + if(value) + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + else + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER); + txtFilter.setEnabled(value); + btnClearFilter.setEnabled(value); + toolBar.setEnabled(value); + btnCheckDisplayed.setEnabled(value); + btnUncheckDisplayed.setEnabled(value); + String filterText = txtFilter.getText(); + boolean sortEnabled = filterText.length() == 0; + btnSortup.setEnabled(sortEnabled && value); + btnSortdown.setEnabled(sortEnabled && value); + //btnSortcheckedtotop.setEnabled(sortEnabled && value); + } + + public void setFilter(String filterString){ + txtFilter.setText(filterString); + tableModel.setFilter(filterString); + } + + public void setCheckedAtIndex(int index, boolean value){ + tableModel.setCheckedAtIndex(index, value); + } + + public List getCheckedRecords(){ + return tableModel.getCheckedRecords(); + } + + public List getRecords(){ + return tableModel.getRecords(); + } + + public void setRecords(List records){ + tableModel.setRecords(records); + } + + public DynamicTableModel getModel(){ + return tableModel; + } + + public JXTable getTable(){ + return dataTable; + } + + public void setUserCanAddRecords(boolean value,Supplier callback){ + if(value == true){ + addRecordCallback = callback; + } else { + addRecordCallback = null; + } + btnAddRecord.setEnabled(value); + btnRemoveSelected.setEnabled(value); + } + + public void setDefaultCheckState(boolean defaultCheckState) { + tableModel.setDefaultCheckState(defaultCheckState); + } + + public JButton getBtnAddRecord() { + return btnAddRecord; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/LocalWorkerSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/LocalWorkerSettings.java new file mode 100644 index 0000000..b533cba --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/LocalWorkerSettings.java @@ -0,0 +1,139 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Component; + +import javax.swing.JPanel; +import java.awt.GridBagLayout; +import javax.swing.border.TitledBorder; +import javax.swing.JLabel; +import java.awt.GridBagConstraints; +import java.awt.Insets; +import java.io.File; + +import com.nuix.nx.NuixConnection; +import com.nuix.nx.controls.PathSelectionControl.ChooserType; + +import nuix.Utilities; + +import javax.swing.JSpinner; +import javax.swing.SpinnerNumberModel; + +/*** + * A control for providing settings relevant to local Nuix workers + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class LocalWorkerSettings extends JPanel { + private JSpinner workerCount; + private JSpinner memoryPerWorker; + private PathSelectionControl workerTempDirectory; + + public LocalWorkerSettings() { + setBorder(new TitledBorder(null, "Worker Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 100, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JLabel lblNumberOfWorkers = new JLabel("Number of Workers"); + GridBagConstraints gbc_lblNumberOfWorkers = new GridBagConstraints(); + gbc_lblNumberOfWorkers.anchor = GridBagConstraints.EAST; + gbc_lblNumberOfWorkers.insets = new Insets(0, 0, 5, 5); + gbc_lblNumberOfWorkers.gridx = 0; + gbc_lblNumberOfWorkers.gridy = 0; + add(lblNumberOfWorkers, gbc_lblNumberOfWorkers); + + workerCount = new JSpinner(); + int initialWorkers = 2; + int minWorkers = 1; + int maxWorkers = 9999; + Utilities util = NuixConnection.getUtilities(); + if(util != null && NuixConnection.getCurrentNuixVersion().isAtLeast("6.2.0")){ + initialWorkers = maxWorkers = util.getLicence().getWorkers(); + } + workerCount.setModel(new SpinnerNumberModel(initialWorkers, minWorkers, maxWorkers, 1)); + GridBagConstraints gbc_workerCount = new GridBagConstraints(); + gbc_workerCount.fill = GridBagConstraints.HORIZONTAL; + gbc_workerCount.insets = new Insets(0, 0, 5, 5); + gbc_workerCount.gridx = 1; + gbc_workerCount.gridy = 0; + add(workerCount, gbc_workerCount); + + JLabel lblMemoryPerworkermb = new JLabel("Memory per-worker (MB)"); + GridBagConstraints gbc_lblMemoryPerworkermb = new GridBagConstraints(); + gbc_lblMemoryPerworkermb.anchor = GridBagConstraints.EAST; + gbc_lblMemoryPerworkermb.insets = new Insets(0, 0, 5, 5); + gbc_lblMemoryPerworkermb.gridx = 0; + gbc_lblMemoryPerworkermb.gridy = 1; + add(lblMemoryPerworkermb, gbc_lblMemoryPerworkermb); + + memoryPerWorker = new JSpinner(); + memoryPerWorker.setModel(new SpinnerNumberModel(Integer.valueOf(2048), Integer.valueOf(768), null, Integer.valueOf(1))); + GridBagConstraints gbc_memoryPerWorker = new GridBagConstraints(); + gbc_memoryPerWorker.fill = GridBagConstraints.HORIZONTAL; + gbc_memoryPerWorker.insets = new Insets(0, 0, 5, 5); + gbc_memoryPerWorker.gridx = 1; + gbc_memoryPerWorker.gridy = 1; + add(memoryPerWorker, gbc_memoryPerWorker); + + JLabel lblWorkerTempDirectory = new JLabel("Worker temp directory"); + GridBagConstraints gbc_lblWorkerTempDirectory = new GridBagConstraints(); + gbc_lblWorkerTempDirectory.anchor = GridBagConstraints.EAST; + gbc_lblWorkerTempDirectory.insets = new Insets(0, 0, 0, 5); + gbc_lblWorkerTempDirectory.gridx = 0; + gbc_lblWorkerTempDirectory.gridy = 2; + add(lblWorkerTempDirectory, gbc_lblWorkerTempDirectory); + + workerTempDirectory = new PathSelectionControl(ChooserType.DIRECTORY, (String) null, (String) null, "Choose worker temp directory"); + GridBagConstraints gbc_workerTempDirectory = new GridBagConstraints(); + gbc_workerTempDirectory.gridwidth = 2; + gbc_workerTempDirectory.fill = GridBagConstraints.BOTH; + gbc_workerTempDirectory.gridx = 1; + gbc_workerTempDirectory.gridy = 2; + add(workerTempDirectory, gbc_workerTempDirectory); + workerTempDirectory.setPath("C:\\WorkerTemp"); + } + + @Override + public void setEnabled(boolean value){ + for(Component c : getComponents()){ + c.setEnabled(value); + } + } + + public int getWorkerCount() { + return (Integer) workerCount.getValue(); + } + + public void setWorkerCount(int value) { + workerCount.setValue(value); + } + + public int getMemoryPerWorker() { + return (Integer) memoryPerWorker.getValue(); + } + + public void setMemoryPerWorker(int value) { + memoryPerWorker.setValue(value); + } + + public void setWorkerTempDirectory(String value){ + workerTempDirectory.setPath(value); + } + + public String getWorkerTempDirectory() { + return workerTempDirectory.getPath(); + } + + public File getWorkerTempDirectoryFile() { + return workerTempDirectory.getPathFile(); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/MultipleChoiceComboBox.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/MultipleChoiceComboBox.java new file mode 100644 index 0000000..e0d301e --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/MultipleChoiceComboBox.java @@ -0,0 +1,120 @@ +package com.nuix.nx.controls; + +import javax.swing.JPanel; +import java.awt.GridBagLayout; +import java.util.ArrayList; +import java.util.List; + +import com.jidesoft.combobox.CheckBoxListExComboBox; +import java.awt.GridBagConstraints; +import javax.swing.DefaultComboBoxModel; +import java.awt.Insets; +import javax.swing.JToolBar; +import javax.swing.JButton; +import javax.swing.ImageIcon; +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; + +/*** + * A combo box (based on CheckBoxListExComboBox) which offers a drop down which allows the user to pick + * multiple choices by checking them, rather than just the single choice of a traditional combo box. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class MultipleChoiceComboBox extends JPanel { + + private CheckBoxListExComboBox comboBox; + private String[] possibleChoices = new String[] {}; + + public MultipleChoiceComboBox() { + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0}; + gridBagLayout.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + comboBox = new CheckBoxListExComboBox(); + GridBagConstraints gbc_comboBox = new GridBagConstraints(); + gbc_comboBox.insets = new Insets(0, 0, 0, 5); + gbc_comboBox.fill = GridBagConstraints.HORIZONTAL; + gbc_comboBox.gridx = 0; + gbc_comboBox.gridy = 0; + add(comboBox, gbc_comboBox); + + JToolBar toolBar = new JToolBar(); + toolBar.setFloatable(false); + GridBagConstraints gbc_toolBar = new GridBagConstraints(); + gbc_toolBar.fill = GridBagConstraints.HORIZONTAL; + gbc_toolBar.gridx = 1; + gbc_toolBar.gridy = 0; + add(toolBar, gbc_toolBar); + + JButton btnCheckAll = new JButton(""); + btnCheckAll.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + checkAll(); + } + }); + btnCheckAll.setIcon(new ImageIcon(MultipleChoiceComboBox.class.getResource("/icons/accept.png"))); + btnCheckAll.setToolTipText("Check all choices"); + toolBar.add(btnCheckAll); + + JButton btnUncheckAll = new JButton(""); + btnUncheckAll.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + uncheckAll(); + } + }); + btnUncheckAll.setIcon(new ImageIcon(MultipleChoiceComboBox.class.getResource("/icons/unaccept.png"))); + btnUncheckAll.setToolTipText("Uncheck all choices"); + toolBar.add(btnUncheckAll); + + } + + /*** + * Sets the list of choices offered to the user. + * @param choices List of string choices. + */ + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void setChoices(List choices) { + possibleChoices = choices.toArray(new String[] {}); + comboBox.setModel(new DefaultComboBoxModel(possibleChoices)); + } + + /*** + * Sets which of the possible choices are currently checked. + * @param checkedChoices List of string choices to be checked, choices not in this list will be unchecked. + */ + public void setCheckedChoices(List checkedChoices) { + comboBox.setSelectedItem(checkedChoices.toArray(new String[] {})); + } + + /*** + * Gets a list of which choices are currently checked. + * @return List of choices currently checked. + */ + public List getCheckedChoices() { + List result = new ArrayList(); + Object[] selectedFields = comboBox.getSelectedObjects(); + for (int i = 0; i < selectedFields.length; i++) { + result.add((String)selectedFields[i]); + } + return result; + } + + /*** + * Checks all available choices. + */ + public void checkAll() { + comboBox.setSelectedItem(possibleChoices); + } + + /*** + * Unchecks all available choices. + */ + public void uncheckAll() { + comboBox.setSelectedItem(new String[] {}); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/OcrSettings.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/OcrSettings.java new file mode 100644 index 0000000..6a56ae0 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/OcrSettings.java @@ -0,0 +1,537 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.border.TitledBorder; + +import com.nuix.nx.NuixConnection; +import com.nuix.nx.controls.models.Choice; +import javax.swing.JSpinner; +import javax.swing.SpinnerNumberModel; + +/*** + * A control for providing some of the common OCR settings + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class OcrSettings extends JPanel { + private JCheckBox chckbxRegeneratePdfs; + private JCheckBox chckbxUpdatePdfText; + private JCheckBox chckbxUpdateItemText; + private ComboItemBox comboTextModification; + private ComboItemBox comboQuality; + private ComboItemBox comboRotation; + private JCheckBox chckbxDeskew; + private ChoiceTableControl languageChoices; + private JLabel lblOutputDirectory; + private PathSelectionControl outputDirectory; + private JPanel panel; + private JPanel panel_1; + private JLabel lblUpdateDuplicates; + private JCheckBox chckbxUpdateDuplicates; + private JLabel lblTimeoutminutes; + private JSpinner timeoutMinutes; + public OcrSettings() { + setBorder(new TitledBorder(null, "OCR Settings", TitledBorder.LEADING, TitledBorder.TOP, null, null)); + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 100, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0, 0, 0, 0, 0}; + gridBagLayout.columnWeights = new double[]{0.0, 0.0, 1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + lblOutputDirectory = new JLabel("Output Directory"); + GridBagConstraints gbc_lblOutputDirectory = new GridBagConstraints(); + gbc_lblOutputDirectory.anchor = GridBagConstraints.EAST; + gbc_lblOutputDirectory.insets = new Insets(0, 0, 5, 5); + gbc_lblOutputDirectory.gridx = 0; + gbc_lblOutputDirectory.gridy = 0; + add(lblOutputDirectory, gbc_lblOutputDirectory); + + outputDirectory = new PathSelectionControl(PathSelectionControl.ChooserType.DIRECTORY, (String) null, (String) null, "Output Directory"); + GridBagConstraints gbc_outputDirectory = new GridBagConstraints(); + gbc_outputDirectory.gridwidth = 2; + gbc_outputDirectory.insets = new Insets(0, 0, 5, 0); + gbc_outputDirectory.fill = GridBagConstraints.BOTH; + gbc_outputDirectory.gridx = 1; + gbc_outputDirectory.gridy = 0; + add(outputDirectory, gbc_outputDirectory); + + panel_1 = new JPanel(); + GridBagConstraints gbc_panel_1 = new GridBagConstraints(); + gbc_panel_1.gridwidth = 3; + gbc_panel_1.insets = new Insets(0, 0, 5, 0); + gbc_panel_1.fill = GridBagConstraints.BOTH; + gbc_panel_1.gridx = 0; + gbc_panel_1.gridy = 1; + add(panel_1, gbc_panel_1); + GridBagLayout gbl_panel_1 = new GridBagLayout(); + gbl_panel_1.columnWidths = new int[]{0, 0, 25, 0, 0, 25, 0, 0, 25, 0, 0, 25, 0, 0, 0}; + gbl_panel_1.rowHeights = new int[]{0, 0}; + gbl_panel_1.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, Double.MIN_VALUE}; + gbl_panel_1.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + panel_1.setLayout(gbl_panel_1); + + JLabel lblUpdatePdfText = new JLabel("Update PDF Text"); + GridBagConstraints gbc_lblUpdatePdfText = new GridBagConstraints(); + gbc_lblUpdatePdfText.anchor = GridBagConstraints.EAST; + gbc_lblUpdatePdfText.insets = new Insets(0, 0, 0, 5); + gbc_lblUpdatePdfText.gridx = 0; + gbc_lblUpdatePdfText.gridy = 0; + panel_1.add(lblUpdatePdfText, gbc_lblUpdatePdfText); + + chckbxUpdatePdfText = new JCheckBox(""); + GridBagConstraints gbc_chckbxUpdatePdfText = new GridBagConstraints(); + gbc_chckbxUpdatePdfText.anchor = GridBagConstraints.WEST; + gbc_chckbxUpdatePdfText.insets = new Insets(0, 0, 0, 5); + gbc_chckbxUpdatePdfText.gridx = 1; + gbc_chckbxUpdatePdfText.gridy = 0; + panel_1.add(chckbxUpdatePdfText, gbc_chckbxUpdatePdfText); + chckbxUpdatePdfText.setSelected(true); + + JLabel lblUpdateItemText = new JLabel("Update Item Text"); + GridBagConstraints gbc_lblUpdateItemText = new GridBagConstraints(); + gbc_lblUpdateItemText.insets = new Insets(0, 0, 0, 5); + gbc_lblUpdateItemText.anchor = GridBagConstraints.EAST; + gbc_lblUpdateItemText.gridx = 3; + gbc_lblUpdateItemText.gridy = 0; + panel_1.add(lblUpdateItemText, gbc_lblUpdateItemText); + + chckbxUpdateItemText = new JCheckBox(""); + GridBagConstraints gbc_chckbxUpdateItemText = new GridBagConstraints(); + gbc_chckbxUpdateItemText.anchor = GridBagConstraints.WEST; + gbc_chckbxUpdateItemText.insets = new Insets(0, 0, 0, 5); + gbc_chckbxUpdateItemText.gridx = 4; + gbc_chckbxUpdateItemText.gridy = 0; + panel_1.add(chckbxUpdateItemText, gbc_chckbxUpdateItemText); + chckbxUpdateItemText.setSelected(true); + + JLabel lblRegeneratePdfs = new JLabel("Regenerate PDFs"); + GridBagConstraints gbc_lblRegeneratePdfs = new GridBagConstraints(); + gbc_lblRegeneratePdfs.anchor = GridBagConstraints.EAST; + gbc_lblRegeneratePdfs.insets = new Insets(0, 0, 0, 5); + gbc_lblRegeneratePdfs.gridx = 6; + gbc_lblRegeneratePdfs.gridy = 0; + panel_1.add(lblRegeneratePdfs, gbc_lblRegeneratePdfs); + + chckbxRegeneratePdfs = new JCheckBox(""); + GridBagConstraints gbc_chckbxRegeneratePdfs = new GridBagConstraints(); + gbc_chckbxRegeneratePdfs.anchor = GridBagConstraints.WEST; + gbc_chckbxRegeneratePdfs.insets = new Insets(0, 0, 0, 5); + gbc_chckbxRegeneratePdfs.gridx = 7; + gbc_chckbxRegeneratePdfs.gridy = 0; + panel_1.add(chckbxRegeneratePdfs, gbc_chckbxRegeneratePdfs); + + JLabel lblDeskew = new JLabel("Deskew"); + GridBagConstraints gbc_lblDeskew = new GridBagConstraints(); + gbc_lblDeskew.insets = new Insets(0, 0, 0, 5); + gbc_lblDeskew.anchor = GridBagConstraints.EAST; + gbc_lblDeskew.gridx = 9; + gbc_lblDeskew.gridy = 0; + panel_1.add(lblDeskew, gbc_lblDeskew); + + chckbxDeskew = new JCheckBox(""); + GridBagConstraints gbc_chckbxDeskew = new GridBagConstraints(); + gbc_chckbxDeskew.insets = new Insets(0, 0, 0, 5); + gbc_chckbxDeskew.anchor = GridBagConstraints.WEST; + gbc_chckbxDeskew.gridx = 10; + gbc_chckbxDeskew.gridy = 0; + panel_1.add(chckbxDeskew, gbc_chckbxDeskew); + chckbxDeskew.setSelected(true); + + lblUpdateDuplicates = new JLabel("Update Duplicates"); + GridBagConstraints gbc_lblUpdateDuplicates = new GridBagConstraints(); + gbc_lblUpdateDuplicates.insets = new Insets(0, 0, 0, 5); + gbc_lblUpdateDuplicates.anchor = GridBagConstraints.EAST; + gbc_lblUpdateDuplicates.gridx = 12; + gbc_lblUpdateDuplicates.gridy = 0; + panel_1.add(lblUpdateDuplicates, gbc_lblUpdateDuplicates); + + chckbxUpdateDuplicates = new JCheckBox(""); + chckbxUpdateDuplicates.setSelected(true); + GridBagConstraints gbc_chckbxUpdateDuplicates = new GridBagConstraints(); + gbc_chckbxUpdateDuplicates.gridx = 13; + gbc_chckbxUpdateDuplicates.gridy = 0; + panel_1.add(chckbxUpdateDuplicates, gbc_chckbxUpdateDuplicates); + + panel = new JPanel(); + GridBagConstraints gbc_panel = new GridBagConstraints(); + gbc_panel.gridwidth = 3; + gbc_panel.insets = new Insets(0, 0, 5, 0); + gbc_panel.fill = GridBagConstraints.BOTH; + gbc_panel.gridx = 0; + gbc_panel.gridy = 2; + add(panel, gbc_panel); + GridBagLayout gbl_panel = new GridBagLayout(); + gbl_panel.columnWidths = new int[]{0, 0, 25, 0, 0, 25, 0, 0, 0}; + gbl_panel.rowHeights = new int[]{0, 0}; + gbl_panel.columnWeights = new double[]{0.0, 1.0, 0.0, 0.0, 2.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + panel.setLayout(gbl_panel); + + JLabel lblTextUpdateMethod = new JLabel("Text Update Method"); + GridBagConstraints gbc_lblTextUpdateMethod = new GridBagConstraints(); + gbc_lblTextUpdateMethod.anchor = GridBagConstraints.EAST; + gbc_lblTextUpdateMethod.insets = new Insets(0, 0, 0, 5); + gbc_lblTextUpdateMethod.gridx = 0; + gbc_lblTextUpdateMethod.gridy = 0; + panel.add(lblTextUpdateMethod, gbc_lblTextUpdateMethod); + + comboTextModification = new ComboItemBox(); + GridBagConstraints gbc_comboTextModification = new GridBagConstraints(); + gbc_comboTextModification.fill = GridBagConstraints.HORIZONTAL; + gbc_comboTextModification.insets = new Insets(0, 0, 0, 5); + gbc_comboTextModification.gridx = 1; + gbc_comboTextModification.gridy = 0; + panel.add(comboTextModification, gbc_comboTextModification); + + comboTextModification.addValue("Append", "append"); + comboTextModification.addValue("Overwrite", "overwrite"); + comboTextModification.setSelectedIndex(0); + + JLabel lblQuality = new JLabel("Quality"); + GridBagConstraints gbc_lblQuality = new GridBagConstraints(); + gbc_lblQuality.insets = new Insets(0, 0, 0, 5); + gbc_lblQuality.anchor = GridBagConstraints.EAST; + gbc_lblQuality.gridx = 3; + gbc_lblQuality.gridy = 0; + panel.add(lblQuality, gbc_lblQuality); + + comboQuality = new ComboItemBox(); + GridBagConstraints gbc_comboQuality = new GridBagConstraints(); + gbc_comboQuality.fill = GridBagConstraints.HORIZONTAL; + gbc_comboQuality.insets = new Insets(0, 0, 0, 5); + gbc_comboQuality.gridx = 4; + gbc_comboQuality.gridy = 0; + panel.add(comboQuality, gbc_comboQuality); + + if(NuixConnection.getCurrentNuixVersion().isLessThan("7.4")){ + comboQuality.addValue("High Quality","high_quality"); + comboQuality.addValue("Medium Quality","mid_range"); + comboQuality.addValue("Fast","fast"); + } else { + // Nuix 7.4 OCR quality settings are quite a bit different + comboQuality.addValue("Default","default"); + comboQuality.addValue("Document Archiving (accuracy)","document_archiving_accuracy"); + comboQuality.addValue("Document Archiving (speed)","document_archiving_speed"); + comboQuality.addValue("Book Archiving (accuracy)","book_archiving_accuracy"); + comboQuality.addValue("Book Archiving (speed)","book_archiving_speed"); + comboQuality.addValue("Document Conversion (accuracy)","document_conversion_accuracy"); + comboQuality.addValue("Document Conversion (speed)","document_conversion_speed"); + comboQuality.addValue("Text Extraction (accuracy)","text_extraction_accuracy"); + comboQuality.addValue("Text Extraction (speed)","text_extraction_speed"); + comboQuality.addValue("Field Level Recognition","field_level_recognition"); + } + + comboQuality.setSelectedIndex(0); + + JLabel lblRotation = new JLabel("Rotation"); + GridBagConstraints gbc_lblRotation = new GridBagConstraints(); + gbc_lblRotation.insets = new Insets(0, 0, 0, 5); + gbc_lblRotation.anchor = GridBagConstraints.EAST; + gbc_lblRotation.gridx = 6; + gbc_lblRotation.gridy = 0; + panel.add(lblRotation, gbc_lblRotation); + + comboRotation = new ComboItemBox(); + GridBagConstraints gbc_comboRotation = new GridBagConstraints(); + gbc_comboRotation.fill = GridBagConstraints.HORIZONTAL; + gbc_comboRotation.gridx = 7; + gbc_comboRotation.gridy = 0; + panel.add(comboRotation, gbc_comboRotation); + + comboRotation.addValue("Auto","auto"); + comboRotation.addValue("No Rotation","no_rotation"); + comboRotation.addValue("Left","left"); + comboRotation.addValue("Right","right"); + comboRotation.addValue("Upside Down","upside_down"); + comboRotation.setSelectedIndex(0); + + lblTimeoutminutes = new JLabel("Item Timeout (minutes):"); + GridBagConstraints gbc_lblTimeoutminutes = new GridBagConstraints(); + gbc_lblTimeoutminutes.insets = new Insets(0, 0, 5, 5); + gbc_lblTimeoutminutes.gridx = 0; + gbc_lblTimeoutminutes.gridy = 3; + add(lblTimeoutminutes, gbc_lblTimeoutminutes); + + timeoutMinutes = new JSpinner(); + timeoutMinutes.setModel(new SpinnerNumberModel(90, 1, 1440, 1)); + GridBagConstraints gbc_timeoutMinutes = new GridBagConstraints(); + gbc_timeoutMinutes.fill = GridBagConstraints.HORIZONTAL; + gbc_timeoutMinutes.insets = new Insets(0, 0, 5, 5); + gbc_timeoutMinutes.gridx = 1; + gbc_timeoutMinutes.gridy = 3; + add(timeoutMinutes, gbc_timeoutMinutes); + + JLabel lblLanguages = new JLabel("Languages"); + lblLanguages.setFont(new Font("Tahoma", Font.BOLD, 13)); + GridBagConstraints gbc_lblLanguages = new GridBagConstraints(); + gbc_lblLanguages.insets = new Insets(0, 0, 5, 5); + gbc_lblLanguages.gridx = 0; + gbc_lblLanguages.gridy = 4; + add(lblLanguages, gbc_lblLanguages); + + languageChoices = new ChoiceTableControl(); + GridBagConstraints gbc_languageChoices = new GridBagConstraints(); + gbc_languageChoices.gridwidth = 3; + gbc_languageChoices.fill = GridBagConstraints.BOTH; + gbc_languageChoices.gridx = 0; + gbc_languageChoices.gridy = 5; + + languageChoices.getTableModel().setChoiceTypeName("Language"); + List> languages = new ArrayList>(); + languages.add(new Choice("English","English","",true)); + languages.add(new Choice("Abkhaz")); + languages.add(new Choice("Adyghe")); + languages.add(new Choice("Afrikaans")); + languages.add(new Choice("Agul")); + languages.add(new Choice("Albanian")); + languages.add(new Choice("Altaic")); + languages.add(new Choice("Arabic")); + languages.add(new Choice("ArmenianEastern")); + languages.add(new Choice("ArmenianGrabar")); + languages.add(new Choice("ArmenianWestern")); + languages.add(new Choice("Awar")); + languages.add(new Choice("Aymara")); + languages.add(new Choice("AzeriCyrillic")); + languages.add(new Choice("AzeriLatin")); + languages.add(new Choice("Bashkir")); + languages.add(new Choice("Basque")); + languages.add(new Choice("Belarusian")); + languages.add(new Choice("Bemba")); + languages.add(new Choice("Blackfoot")); + languages.add(new Choice("Breton")); + languages.add(new Choice("Bugotu")); + languages.add(new Choice("Bulgarian")); + languages.add(new Choice("Buryat")); + languages.add(new Choice("Catalan")); + languages.add(new Choice("Chamorro")); + languages.add(new Choice("Chechen")); + languages.add(new Choice("ChinesePRC")); + languages.add(new Choice("ChineseTaiwan")); + languages.add(new Choice("Chukcha")); + languages.add(new Choice("Chuvash")); + languages.add(new Choice("Corsican")); + languages.add(new Choice("CrimeanTatar")); + languages.add(new Choice("Croatian")); + languages.add(new Choice("Crow")); + languages.add(new Choice("Czech")); + languages.add(new Choice("Danish")); + languages.add(new Choice("Dargwa")); + languages.add(new Choice("Dungan")); + languages.add(new Choice("Dutch")); + languages.add(new Choice("DutchBelgian")); + languages.add(new Choice("EskimoCyrillic")); + languages.add(new Choice("EskimoLatin")); + languages.add(new Choice("Esperanto")); + languages.add(new Choice("Estonian")); + languages.add(new Choice("Even")); + languages.add(new Choice("Evenki")); + languages.add(new Choice("Faeroese")); + languages.add(new Choice("Fijian")); + languages.add(new Choice("Finnish")); + languages.add(new Choice("French")); + languages.add(new Choice("Frisian")); + languages.add(new Choice("Friulian")); + languages.add(new Choice("GaelicScottish")); + languages.add(new Choice("Gagauz")); + languages.add(new Choice("Galician")); + languages.add(new Choice("Ganda")); + languages.add(new Choice("German")); + languages.add(new Choice("GermanLuxembourg")); + languages.add(new Choice("GermanNewSpelling")); + languages.add(new Choice("Greek")); + languages.add(new Choice("Guarani")); + languages.add(new Choice("Hani")); + languages.add(new Choice("Hausa")); + languages.add(new Choice("Hawaiian")); + languages.add(new Choice("Hebrew")); + languages.add(new Choice("Hungarian")); + languages.add(new Choice("Icelandic")); + languages.add(new Choice("Ido")); + languages.add(new Choice("Indonesian")); + languages.add(new Choice("Ingush")); + languages.add(new Choice("Interlingua")); + languages.add(new Choice("Irish")); + languages.add(new Choice("Italian")); + languages.add(new Choice("Japanese")); + languages.add(new Choice("Kabardian")); + languages.add(new Choice("Kalmyk")); + languages.add(new Choice("KarachayBalkar")); + languages.add(new Choice("Karakalpak")); + languages.add(new Choice("Kasub")); + languages.add(new Choice("Kawa")); + languages.add(new Choice("Kazakh")); + languages.add(new Choice("Khakas")); + languages.add(new Choice("Khanty")); + languages.add(new Choice("Kikuyu")); + languages.add(new Choice("Kirgiz")); + languages.add(new Choice("Kongo")); + languages.add(new Choice("Korean")); + languages.add(new Choice("Koryak")); + languages.add(new Choice("Kpelle")); + languages.add(new Choice("Kumyk")); + languages.add(new Choice("Kurdish")); + languages.add(new Choice("Lak")); + languages.add(new Choice("Lappish")); + languages.add(new Choice("Latin")); + languages.add(new Choice("Latvian")); + languages.add(new Choice("LatvianGothic")); + languages.add(new Choice("Lezgin")); + languages.add(new Choice("Lithuanian")); + languages.add(new Choice("Luba")); + languages.add(new Choice("Macedonian")); + languages.add(new Choice("Malagasy")); + languages.add(new Choice("Malay")); + languages.add(new Choice("Malinke")); + languages.add(new Choice("Maltese")); + languages.add(new Choice("Mansi")); + languages.add(new Choice("Maori")); + languages.add(new Choice("Mari")); + languages.add(new Choice("Maya")); + languages.add(new Choice("Miao")); + languages.add(new Choice("Minankabaw")); + languages.add(new Choice("Mohawk")); + languages.add(new Choice("Mongol")); + languages.add(new Choice("Mordvin")); + languages.add(new Choice("Nahuatl")); + languages.add(new Choice("Nenets")); + languages.add(new Choice("Nivkh")); + languages.add(new Choice("Nogay")); + languages.add(new Choice("Norwegian")); + languages.add(new Choice("NorwegianBokmal")); + languages.add(new Choice("NorwegianNynorsk")); + languages.add(new Choice("Nyanja")); + languages.add(new Choice("Occidental")); + languages.add(new Choice("Ojibway")); + languages.add(new Choice("Ossetic")); + languages.add(new Choice("Papiamento")); + languages.add(new Choice("PidginEnglish")); + languages.add(new Choice("Polish")); + languages.add(new Choice("PortugueseBrazilian")); + languages.add(new Choice("PortugueseStandard")); + languages.add(new Choice("Provencal")); + languages.add(new Choice("Quechua")); + languages.add(new Choice("RhaetoRomanic")); + languages.add(new Choice("Romanian")); + languages.add(new Choice("RomanianMoldavia")); + languages.add(new Choice("Romany")); + languages.add(new Choice("Ruanda")); + languages.add(new Choice("Rundi")); + languages.add(new Choice("Russian")); + languages.add(new Choice("RussianOldSpelling")); + languages.add(new Choice("RussianWithAccent")); + languages.add(new Choice("Samoan")); + languages.add(new Choice("Selkup")); + languages.add(new Choice("SerbianCyrillic")); + languages.add(new Choice("SerbianLatin")); + languages.add(new Choice("Shona")); + languages.add(new Choice("Sioux")); + languages.add(new Choice("Slovak")); + languages.add(new Choice("Slovenian")); + languages.add(new Choice("Somali")); + languages.add(new Choice("Sorbian")); + languages.add(new Choice("Sotho")); + languages.add(new Choice("Spanish")); + languages.add(new Choice("Sunda")); + languages.add(new Choice("Swahili")); + languages.add(new Choice("Swazi")); + languages.add(new Choice("Swedish")); + languages.add(new Choice("Tabassaran")); + languages.add(new Choice("Tagalog")); + languages.add(new Choice("Tahitian")); + languages.add(new Choice("Tajik")); + languages.add(new Choice("Tatar")); + languages.add(new Choice("Thai")); + languages.add(new Choice("Tinpo")); + languages.add(new Choice("Tongan")); + languages.add(new Choice("Tswana")); + languages.add(new Choice("Tun")); + languages.add(new Choice("Turkish")); + languages.add(new Choice("Turkmen")); + languages.add(new Choice("TurkmenLatin")); + languages.add(new Choice("Tuvin")); + languages.add(new Choice("Udmurt")); + languages.add(new Choice("UighurCyrillic")); + languages.add(new Choice("UighurLatin")); + languages.add(new Choice("Ukrainian")); + languages.add(new Choice("UzbekCyrillic")); + languages.add(new Choice("UzbekLatin")); + languages.add(new Choice("Vietnamese")); + languages.add(new Choice("Visayan")); + languages.add(new Choice("Welsh")); + languages.add(new Choice("Wolof")); + languages.add(new Choice("Xhosa")); + languages.add(new Choice("Yakut")); + languages.add(new Choice("Yiddish")); + languages.add(new Choice("Zapotec")); + languages.add(new Choice("Zulu")); + languageChoices.setChoices(languages); + + add(languageChoices, gbc_languageChoices); + + // Update duplicates was added in Nuix 7.2.0 + if(NuixConnection.getCurrentNuixVersion().isLessThan("7.2.0")){ + lblUpdateDuplicates.setVisible(false); + chckbxUpdateDuplicates.setVisible(false); + lblTimeoutminutes.setVisible(false); + timeoutMinutes.setVisible(false); + } + + languageChoices.constrainFirstColumn(); + } + + public JCheckBox getChckbxRegeneratePdfs() { + return chckbxRegeneratePdfs; + } + public JCheckBox getChckbxUpdatePdfText() { + return chckbxUpdatePdfText; + } + public JCheckBox getChckbxUpdateItemText() { + return chckbxUpdateItemText; + } + public ComboItemBox getComboTextModification() { + return comboTextModification; + } + public ComboItemBox getComboQuality() { + return comboQuality; + } + public ComboItemBox getComboRotation() { + return comboRotation; + } + public JCheckBox getChckbxDeskew() { + return chckbxDeskew; + } + public boolean getUpdateDuplicates(){ + return chckbxUpdateDuplicates.isSelected(); + } + public void setUpdateDuplicates(boolean value){ + chckbxUpdateDuplicates.setSelected(value); + } + public ChoiceTableControl getLanguageChoices() { + return languageChoices; + } + public PathSelectionControl getOutputDirectory() { + return outputDirectory; + } + public int getTimeoutMinutes(){ + return (int)timeoutMinutes.getValue(); + } + public void setTimeoutMinutes(int value){ + timeoutMinutes.setValue(value); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathList.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathList.java new file mode 100644 index 0000000..4fe6951 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathList.java @@ -0,0 +1,221 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JList; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.ListSelectionModel; +import javax.swing.ScrollPaneConstants; + +import org.apache.commons.lang.ArrayUtils; + +import com.nuix.nx.controls.models.ArrangeableListModel; +import com.nuix.nx.dialogs.CommonDialogs; + +/*** + * A control which allows the user to supply a list of file and directory paths + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class PathList extends JPanel { + private JButton btnAddFiles; + private JButton btnAddDirectories; + private JButton btnRemoveSelected; + private JList pathList; + private ArrangeableListModel listModel = new ArrangeableListModel(); + private JButton btnImportTextFile; + private JButton btnMoveUp; + private JButton btnMoveDown; + + public PathList() { + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0}; + gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + JPanel panel = new JPanel(); + GridBagConstraints gbc_panel = new GridBagConstraints(); + gbc_panel.anchor = GridBagConstraints.EAST; + gbc_panel.insets = new Insets(0, 0, 5, 0); + gbc_panel.fill = GridBagConstraints.VERTICAL; + gbc_panel.gridx = 0; + gbc_panel.gridy = 0; + add(panel, gbc_panel); + + btnAddFiles = new JButton("Add Files"); + btnAddFiles.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + File[] selectedFiles = CommonDialogs.selectFilesDialog("C:\\","Add File Path"); + if(selectedFiles != null){ + for(File file : selectedFiles){ + listModel.addElement(file.getPath()); + } + } + } + }); + btnAddFiles.setIcon(new ImageIcon(PathList.class.getResource("/icons/add.png"))); + panel.add(btnAddFiles); + + btnAddDirectories = new JButton("Add Directories"); + btnAddDirectories.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + File[] selectedDirectories = CommonDialogs.selectDirectories("C:\\", "Add Directory Path"); + if(selectedDirectories != null){ + for(File directory : selectedDirectories){ + listModel.addElement(directory.getPath()); + } + } + } + }); + btnAddDirectories.setIcon(new ImageIcon(PathList.class.getResource("/icons/add.png"))); + panel.add(btnAddDirectories); + + btnRemoveSelected = new JButton("Remove Selected"); + btnRemoveSelected.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] selectedIndices = pathList.getSelectedIndices(); + Arrays.sort(selectedIndices); + ArrayUtils.reverse(selectedIndices); + for(int index : selectedIndices){ + listModel.remove(index); + } + } + }); + + btnImportTextFile = new JButton("Import"); + btnImportTextFile.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + File textFile = CommonDialogs.openFileDialog("C:\\", "Text File", "txt", "Choose Text File to Import"); + if(textFile != null){ + try(BufferedReader br = new BufferedReader(new FileReader(textFile))) { + for(String line; (line = br.readLine()) != null; ) { + addPath(line.trim()); + } + } catch(Exception exc){ + CommonDialogs.showError("Error while importing text file: \n"+exc.getMessage()); + } + } + } + }); + btnImportTextFile.setIcon(new ImageIcon(PathList.class.getResource("/icons/page_white_get.png"))); + panel.add(btnImportTextFile); + btnRemoveSelected.setIcon(new ImageIcon(PathList.class.getResource("/icons/delete.png"))); + panel.add(btnRemoveSelected); + + btnMoveUp = new JButton("Move Up"); + btnMoveUp.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + int[] selectedIndices = pathList.getSelectedIndices(); + if(selectedIndices != null && selectedIndices.length > 0){ + if(listModel.shiftRowsUp(selectedIndices[0], selectedIndices[selectedIndices.length-1])){ + pathList.clearSelection(); + for (int i = 0; i < selectedIndices.length; i++) { + selectedIndices[i] = selectedIndices[i] - 1; + } + pathList.setSelectedIndices(selectedIndices); + } + } + } + }); + btnMoveUp.setIcon(new ImageIcon(PathList.class.getResource("/icons/arrow_up.png"))); + panel.add(btnMoveUp); + + btnMoveDown = new JButton("Move Down"); + btnMoveDown.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] selectedIndices = pathList.getSelectedIndices(); + if(selectedIndices != null && selectedIndices.length > 0){ + if(listModel.shiftRowsDown(selectedIndices[0], selectedIndices[selectedIndices.length-1])){ + pathList.clearSelection(); + for (int i = 0; i < selectedIndices.length; i++) { + selectedIndices[i] = selectedIndices[i] + 1; + } + pathList.setSelectedIndices(selectedIndices); + } + } + } + }); + btnMoveDown.setIcon(new ImageIcon(PathList.class.getResource("/icons/arrow_down.png"))); + panel.add(btnMoveDown); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 1; + add(scrollPane, gbc_scrollPane); + + pathList = new JList(); + pathList.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION); + pathList.setModel(listModel); + scrollPane.setViewportView(pathList); + } + + public List getPaths(){ + List result = new ArrayList(); + for (int i = 0; i < listModel.size(); i++) { + result.add(listModel.getElementAt(i)); + } + return result; + } + + public List getPathFiles(){ + return getPaths().stream().map(p -> new File(p)).collect(Collectors.toList()); + } + + public void setPaths(List paths){ + pathList.clearSelection(); + listModel.clear(); + for(String path : paths){ + listModel.addElement(path); + } + } + + public void addPath(String path){ + listModel.addElement(path); + } + + public void setFilesButtonVisible(boolean value){ + btnAddFiles.setVisible(value); + } + + public void setDirectoriesButtonVisible(boolean value){ + btnAddDirectories.setVisible(value); + } + public JButton getBtnImportTextFile() { + return btnImportTextFile; + } + + @Override + public void setEnabled(boolean value) { + btnAddDirectories.setEnabled(value); + btnAddFiles.setEnabled(value); + btnImportTextFile.setEnabled(value); + btnRemoveSelected.setEnabled(value); + super.setEnabled(value); + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectedCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectedCallback.java new file mode 100644 index 0000000..40a0819 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectedCallback.java @@ -0,0 +1,16 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +/*** + * Callback used for some of the path selection controls on {@link com.nuix.nx.dialogs.CustomTabPanel} + * allowing a script to react to a user selects a path. + * @author Jason Wells + * + */ +public interface PathSelectedCallback { + public void pathSelected(String selectedPath); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectionControl.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectionControl.java new file mode 100644 index 0000000..bd7e806 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/PathSelectionControl.java @@ -0,0 +1,144 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import javax.swing.JPanel; + +import java.awt.GridBagLayout; + +import javax.swing.JTextField; + +import java.awt.GridBagConstraints; +import java.awt.Insets; + +import javax.swing.JButton; + +import com.nuix.nx.dialogs.CommonDialogs; + +import java.awt.event.ActionListener; +import java.awt.event.ActionEvent; +import java.io.File; + +/*** + * A control which provides a user a way to select paths + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class PathSelectionControl extends JPanel { + public enum ChooserType { + DIRECTORY, + OPEN_FILE, + SAVE_FILE + } + private JTextField txtFilePath; + private String dialogTitle = "Choose"; + private JButton btnChoose; + private PathSelectedCallback pathSelectedCallback; + private String initialDirectory = null; + + public PathSelectionControl(ChooserType type, String fileTypeName, String fileExtension, String openFileDialogTitle) { + if(openFileDialogTitle != null) + dialogTitle = openFileDialogTitle; + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0}; + gridBagLayout.columnWeights = new double[]{1.0, 0.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + txtFilePath = new JTextField(); + GridBagConstraints gbc_txtFilePath = new GridBagConstraints(); + gbc_txtFilePath.insets = new Insets(0, 0, 0, 5); + gbc_txtFilePath.fill = GridBagConstraints.HORIZONTAL; + gbc_txtFilePath.gridx = 0; + gbc_txtFilePath.gridy = 0; + add(txtFilePath, gbc_txtFilePath); + txtFilePath.setColumns(10); + + btnChoose = new JButton("Choose"); + btnChoose.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + File selectedFile = null; + String existingValue = txtFilePath.getText(); + boolean existingValueIsEmpty = existingValue.trim().isEmpty(); + switch(type){ + case DIRECTORY: + if(existingValueIsEmpty && initialDirectory != null){ + selectedFile = CommonDialogs.getDirectory(initialDirectory, dialogTitle); + } else { + selectedFile = CommonDialogs.getDirectory(existingValue, dialogTitle); + } + break; + case OPEN_FILE: + if(existingValueIsEmpty && initialDirectory != null){ + selectedFile = CommonDialogs.openFileDialog(initialDirectory, fileTypeName, fileExtension, dialogTitle); + } else { + selectedFile = CommonDialogs.openFileDialog(existingValue, fileTypeName, fileExtension, dialogTitle); + } + break; + case SAVE_FILE: + if(existingValueIsEmpty && initialDirectory != null){ + selectedFile = CommonDialogs.saveFileDialog(initialDirectory, fileTypeName, fileExtension, dialogTitle); + } else { + selectedFile = CommonDialogs.saveFileDialog(existingValue, fileTypeName, fileExtension, dialogTitle); + } + break; + default: + break; + } + + if(selectedFile != null) + txtFilePath.setText(selectedFile.toString()); + firePathSelected(); + } + }); + GridBagConstraints gbc_btnChoose = new GridBagConstraints(); + gbc_btnChoose.gridx = 1; + gbc_btnChoose.gridy = 0; + add(btnChoose, gbc_btnChoose); + + } + + protected void firePathSelected(){ + if(pathSelectedCallback != null){ + pathSelectedCallback.pathSelected(getPath()); + } + } + + public void whenPathSelected(PathSelectedCallback callback){ + pathSelectedCallback = callback; + } + + public void setPath(String path){ + txtFilePath.setText(path); + } + + public String getPath(){ + return txtFilePath.getText(); + } + + public File getPathFile(){ + return new File(getPath()); + } + + public void setEnabled(boolean value){ + txtFilePath.setEnabled(value); + btnChoose.setEnabled(value); + } + + public void setPathFieldEditable(boolean value){ + txtFilePath.setEditable(value); + } + + public String getInitialDirectory() { + return initialDirectory; + } + + public void setInitialDirectory(String initialDirectory) { + this.initialDirectory = initialDirectory; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingFinishedListener.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingFinishedListener.java new file mode 100644 index 0000000..9cd303f --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingFinishedListener.java @@ -0,0 +1,15 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +/*** + * Simple callback fired {@link ProcessingStatusControl} when processing has completed. + * @author Jason Wells + * + */ +public interface ProcessingFinishedListener { + public void processingFinished(); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingStatusControl.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingStatusControl.java new file mode 100644 index 0000000..7b1fccc --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ProcessingStatusControl.java @@ -0,0 +1,523 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Desktop; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.ScrollPaneConstants; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.UIManager; +import javax.swing.border.CompoundBorder; +import javax.swing.border.EmptyBorder; +import javax.swing.border.TitledBorder; +import javax.swing.table.TableColumn; + +import org.apache.log4j.Logger; +import org.joda.time.DateTime; + +import com.nuix.nx.controls.models.ItemStatisticsTableModel; +import com.nuix.nx.dialogs.CommonDialogs; +import com.nuix.nx.helpers.FormatHelpers; + +import nuix.LoadProcessingJob; +import nuix.Processor; +import nuix.ProcessorCleaningUpCallback; + +/*** + * Control for displaying processing status. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class ProcessingStatusControl extends JPanel { + private static Logger logger = Logger.getLogger(ProcessingStatusControl.class); + + private JTable itemStatsTable; + private ItemStatisticsTableModel itemStatsTableModel = new ItemStatisticsTableModel(); + private JTextArea txtrProcessingLog; + + private int totalProcessed = 0; + private int totalCorrupted = 0; + private int totalEncrypted = 0; + private int totalDeleted = 0; + private LoadProcessingJob job = null; + + private JLabel lblTotalProcessedCount; + private JLabel lblTotalCorruptedCount; + private JLabel lblTotalEncryptedCount; + private JLabel lblTotalDeletedCount; + private JLabel lblElapsedTimeValue; + private JButton btnPauseProcessing; + private JButton btnResumeProcessing; + private JButton btnStopProcessing; + private JButton btnAbortProcessing; + + private List processingFinishedListeners = new ArrayList(); + private JTabbedPane tabbedPane; + private JPanel processingStatusTab; + private JPanel processingSettingsTab; + private DataProcessingSettingsControl dataProcessingSettingsControl; + private JButton btnOpenLogDirectory; + + public ProcessingStatusControl() { + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0}; + gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{1.0, 0.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + tabbedPane = new JTabbedPane(JTabbedPane.TOP); + GridBagConstraints gbc_tabbedPane = new GridBagConstraints(); + gbc_tabbedPane.insets = new Insets(0, 0, 5, 0); + gbc_tabbedPane.fill = GridBagConstraints.BOTH; + gbc_tabbedPane.gridx = 0; + gbc_tabbedPane.gridy = 0; + add(tabbedPane, gbc_tabbedPane); + + processingStatusTab = new JPanel(); + tabbedPane.addTab("Processing Status", null, processingStatusTab, null); + GridBagLayout gbl_processingStatusTab = new GridBagLayout(); + gbl_processingStatusTab.columnWidths = new int[]{0, 0}; + gbl_processingStatusTab.rowHeights = new int[]{150, 0, 0}; + gbl_processingStatusTab.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gbl_processingStatusTab.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + processingStatusTab.setLayout(gbl_processingStatusTab); + + JPanel processingLogPanel = new JPanel(); + GridBagConstraints gbc_processingLogPanel = new GridBagConstraints(); + gbc_processingLogPanel.insets = new Insets(0, 0, 5, 0); + gbc_processingLogPanel.fill = GridBagConstraints.BOTH; + gbc_processingLogPanel.gridx = 0; + gbc_processingLogPanel.gridy = 0; + processingStatusTab.add(processingLogPanel, gbc_processingLogPanel); + processingLogPanel.setBorder(new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Processing Log", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5))); + processingLogPanel.setLayout(new BorderLayout(0, 0)); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + processingLogPanel.add(scrollPane, BorderLayout.CENTER); + + txtrProcessingLog = new JTextArea(); + txtrProcessingLog.setFont(new Font("Consolas", Font.PLAIN, 11)); + txtrProcessingLog.setEditable(false); + scrollPane.setViewportView(txtrProcessingLog); + + JPanel itemStatsPanel = new JPanel(); + GridBagConstraints gbc_itemStatsPanel = new GridBagConstraints(); + gbc_itemStatsPanel.fill = GridBagConstraints.BOTH; + gbc_itemStatsPanel.gridx = 0; + gbc_itemStatsPanel.gridy = 1; + processingStatusTab.add(itemStatsPanel, gbc_itemStatsPanel); + itemStatsPanel.setBorder(new CompoundBorder(new TitledBorder(UIManager.getBorder("TitledBorder.border"), "Item Statistics", TitledBorder.LEADING, TitledBorder.TOP, null, new Color(0, 0, 0)), new EmptyBorder(5, 5, 5, 5))); + GridBagLayout gbl_itemStatsPanel = new GridBagLayout(); + gbl_itemStatsPanel.columnWidths = new int[]{0, 0, 75, 0, 75, 0, 75, 0, 75, 0, 75, 0, 0}; + gbl_itemStatsPanel.rowHeights = new int[]{0, 0, 0}; + gbl_itemStatsPanel.columnWeights = new double[]{1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE}; + gbl_itemStatsPanel.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + itemStatsPanel.setLayout(gbl_itemStatsPanel); + + JLabel lblElapsed = new JLabel("Elapsed:"); + lblElapsed.setFont(new Font("Tahoma", Font.BOLD, 11)); + GridBagConstraints gbc_lblElapsed = new GridBagConstraints(); + gbc_lblElapsed.insets = new Insets(0, 0, 5, 5); + gbc_lblElapsed.gridx = 1; + gbc_lblElapsed.gridy = 0; + itemStatsPanel.add(lblElapsed, gbc_lblElapsed); + + lblElapsedTimeValue = new JLabel("00:00:00"); + GridBagConstraints gbc_lblElapsedTimeValue = new GridBagConstraints(); + gbc_lblElapsedTimeValue.anchor = GridBagConstraints.WEST; + gbc_lblElapsedTimeValue.insets = new Insets(0, 0, 5, 5); + gbc_lblElapsedTimeValue.gridx = 2; + gbc_lblElapsedTimeValue.gridy = 0; + itemStatsPanel.add(lblElapsedTimeValue, gbc_lblElapsedTimeValue); + + JLabel lblTotalProcessed = new JLabel("Total Processed:"); + lblTotalProcessed.setFont(new Font("Tahoma", Font.BOLD, 11)); + GridBagConstraints gbc_lblTotalProcessed = new GridBagConstraints(); + gbc_lblTotalProcessed.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalProcessed.gridx = 3; + gbc_lblTotalProcessed.gridy = 0; + itemStatsPanel.add(lblTotalProcessed, gbc_lblTotalProcessed); + + lblTotalProcessedCount = new JLabel("0"); + GridBagConstraints gbc_lblTotalProcessedCount = new GridBagConstraints(); + gbc_lblTotalProcessedCount.anchor = GridBagConstraints.WEST; + gbc_lblTotalProcessedCount.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalProcessedCount.gridx = 4; + gbc_lblTotalProcessedCount.gridy = 0; + itemStatsPanel.add(lblTotalProcessedCount, gbc_lblTotalProcessedCount); + + JLabel lblTotalCorrupted = new JLabel("Total Corrupted:"); + lblTotalCorrupted.setFont(new Font("Tahoma", Font.BOLD, 11)); + GridBagConstraints gbc_lblTotalCorrupted = new GridBagConstraints(); + gbc_lblTotalCorrupted.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalCorrupted.gridx = 5; + gbc_lblTotalCorrupted.gridy = 0; + itemStatsPanel.add(lblTotalCorrupted, gbc_lblTotalCorrupted); + + lblTotalCorruptedCount = new JLabel("0"); + GridBagConstraints gbc_lblTotalCorruptedCount = new GridBagConstraints(); + gbc_lblTotalCorruptedCount.anchor = GridBagConstraints.WEST; + gbc_lblTotalCorruptedCount.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalCorruptedCount.gridx = 6; + gbc_lblTotalCorruptedCount.gridy = 0; + itemStatsPanel.add(lblTotalCorruptedCount, gbc_lblTotalCorruptedCount); + + JLabel lblTotalEncrypted = new JLabel("Total Encrypted:"); + lblTotalEncrypted.setFont(new Font("Tahoma", Font.BOLD, 11)); + GridBagConstraints gbc_lblTotalEncrypted = new GridBagConstraints(); + gbc_lblTotalEncrypted.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalEncrypted.gridx = 7; + gbc_lblTotalEncrypted.gridy = 0; + itemStatsPanel.add(lblTotalEncrypted, gbc_lblTotalEncrypted); + + lblTotalEncryptedCount = new JLabel("0"); + GridBagConstraints gbc_lblTotalEncryptedCount = new GridBagConstraints(); + gbc_lblTotalEncryptedCount.anchor = GridBagConstraints.WEST; + gbc_lblTotalEncryptedCount.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalEncryptedCount.gridx = 8; + gbc_lblTotalEncryptedCount.gridy = 0; + itemStatsPanel.add(lblTotalEncryptedCount, gbc_lblTotalEncryptedCount); + + JLabel lblTotalDeleted = new JLabel("Total Deleted:"); + lblTotalDeleted.setFont(new Font("Tahoma", Font.BOLD, 11)); + GridBagConstraints gbc_lblTotalDeleted = new GridBagConstraints(); + gbc_lblTotalDeleted.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalDeleted.gridx = 9; + gbc_lblTotalDeleted.gridy = 0; + itemStatsPanel.add(lblTotalDeleted, gbc_lblTotalDeleted); + + lblTotalDeletedCount = new JLabel("0"); + GridBagConstraints gbc_lblTotalDeletedCount = new GridBagConstraints(); + gbc_lblTotalDeletedCount.anchor = GridBagConstraints.WEST; + gbc_lblTotalDeletedCount.insets = new Insets(0, 0, 5, 5); + gbc_lblTotalDeletedCount.gridx = 10; + gbc_lblTotalDeletedCount.gridy = 0; + itemStatsPanel.add(lblTotalDeletedCount, gbc_lblTotalDeletedCount); + + JScrollPane scrollPane_1 = new JScrollPane(); + scrollPane_1.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + GridBagConstraints gbc_scrollPane_1 = new GridBagConstraints(); + gbc_scrollPane_1.insets = new Insets(0, 0, 0, 5); + gbc_scrollPane_1.gridwidth = 12; + gbc_scrollPane_1.fill = GridBagConstraints.BOTH; + gbc_scrollPane_1.gridx = 0; + gbc_scrollPane_1.gridy = 1; + itemStatsPanel.add(scrollPane_1, gbc_scrollPane_1); + + itemStatsTable = new JTable(itemStatsTableModel); + itemStatsTable.setFillsViewportHeight(true); + scrollPane_1.setViewportView(itemStatsTable); + + processingSettingsTab = new JPanel(); + tabbedPane.addTab("Processing Settings Used", null, processingSettingsTab, null); + GridBagLayout gbl_processingSettingsTab = new GridBagLayout(); + gbl_processingSettingsTab.columnWidths = new int[]{0, 0, 0}; + gbl_processingSettingsTab.rowHeights = new int[]{0, 0}; + gbl_processingSettingsTab.columnWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + gbl_processingSettingsTab.rowWeights = new double[]{1.0, Double.MIN_VALUE}; + processingSettingsTab.setLayout(gbl_processingSettingsTab); + + dataProcessingSettingsControl = new DataProcessingSettingsControl(); + dataProcessingSettingsControl.hideSaveLoadResetButtons(); + DisablingGlassPaneWrapper processingSettingsDisabler = new DisablingGlassPaneWrapper(dataProcessingSettingsControl); + processingSettingsDisabler.activateGlassPane(true); + GridBagConstraints gbc_dataProcessingSettingsControl = new GridBagConstraints(); + gbc_dataProcessingSettingsControl.insets = new Insets(0, 0, 0, 5); + gbc_dataProcessingSettingsControl.fill = GridBagConstraints.BOTH; + gbc_dataProcessingSettingsControl.gridx = 0; + gbc_dataProcessingSettingsControl.gridy = 0; + processingSettingsTab.add(processingSettingsDisabler, gbc_dataProcessingSettingsControl); + + TableColumn kindCol = itemStatsTable.getColumnModel().getColumn(0); + + TableColumn typeCol = itemStatsTable.getColumnModel().getColumn(1); + + TableColumn mimetypeCol = itemStatsTable.getColumnModel().getColumn(2); + + JPanel panel = new JPanel(); + GridBagConstraints gbc_panel = new GridBagConstraints(); + gbc_panel.fill = GridBagConstraints.BOTH; + gbc_panel.gridx = 0; + gbc_panel.gridy = 1; + add(panel, gbc_panel); + GridBagLayout gbl_panel = new GridBagLayout(); + gbl_panel.columnWidths = new int[]{0, 0, 50, 0, 10, 0, 0, 0, 0}; + gbl_panel.rowHeights = new int[]{0, 0}; + gbl_panel.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; + gbl_panel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + panel.setLayout(gbl_panel); + + btnPauseProcessing = new JButton("Pause Processing"); + btnPauseProcessing.setEnabled(false); + btnPauseProcessing.setIcon(new ImageIcon(ProcessingStatusControl.class.getResource("/icons/control_pause.png"))); + btnPauseProcessing.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + pauseProcessing(); + } + }); + GridBagConstraints gbc_btnPauseProcessing = new GridBagConstraints(); + gbc_btnPauseProcessing.insets = new Insets(0, 0, 0, 5); + gbc_btnPauseProcessing.gridx = 0; + gbc_btnPauseProcessing.gridy = 0; + panel.add(btnPauseProcessing, gbc_btnPauseProcessing); + + btnResumeProcessing = new JButton("Resume Processing"); + btnResumeProcessing.setEnabled(false); + btnResumeProcessing.setIcon(new ImageIcon(ProcessingStatusControl.class.getResource("/icons/control_play.png"))); + btnResumeProcessing.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + resumeProcessing(); + } + }); + GridBagConstraints gbc_btnResumeProcessing = new GridBagConstraints(); + gbc_btnResumeProcessing.insets = new Insets(0, 0, 0, 5); + gbc_btnResumeProcessing.gridx = 1; + gbc_btnResumeProcessing.gridy = 0; + panel.add(btnResumeProcessing, gbc_btnResumeProcessing); + + btnStopProcessing = new JButton("Stop Processing"); + btnStopProcessing.setEnabled(false); + btnStopProcessing.setIcon(new ImageIcon(ProcessingStatusControl.class.getResource("/icons/control_stop.png"))); + btnStopProcessing.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + stopProcessing(); + } + }); + GridBagConstraints gbc_btnStopProcessing = new GridBagConstraints(); + gbc_btnStopProcessing.insets = new Insets(0, 0, 0, 5); + gbc_btnStopProcessing.gridx = 3; + gbc_btnStopProcessing.gridy = 0; + panel.add(btnStopProcessing, gbc_btnStopProcessing); + + btnAbortProcessing = new JButton("Abort Processing"); + btnAbortProcessing.setEnabled(false); + btnAbortProcessing.setIcon(new ImageIcon(ProcessingStatusControl.class.getResource("/icons/cancel.png"))); + btnAbortProcessing.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + abortProcessing(); + } + }); + GridBagConstraints gbc_btnAbortProcessing = new GridBagConstraints(); + gbc_btnAbortProcessing.insets = new Insets(0, 0, 0, 5); + gbc_btnAbortProcessing.gridx = 5; + gbc_btnAbortProcessing.gridy = 0; + panel.add(btnAbortProcessing, gbc_btnAbortProcessing); + + btnOpenLogDirectory = new JButton("Open Log Directory"); + btnOpenLogDirectory.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + try { + Desktop.getDesktop().open(new File(System.getProperty("nuix.logdir"))); + } catch (Exception e) { + logger.error(e); + } + } + }); + btnOpenLogDirectory.setIcon(new ImageIcon(ProcessingStatusControl.class.getResource("/icons/folder_table.png"))); + GridBagConstraints gbc_btnOpenLogDirectory = new GridBagConstraints(); + gbc_btnOpenLogDirectory.gridx = 7; + gbc_btnOpenLogDirectory.gridy = 0; + panel.add(btnOpenLogDirectory, gbc_btnOpenLogDirectory); + kindCol.setPreferredWidth(100); + kindCol.setWidth(100); + kindCol.setMinWidth(100); + kindCol.setMaxWidth(100); + typeCol.setPreferredWidth(250); + typeCol.setWidth(250); + typeCol.setMinWidth(250); + typeCol.setMaxWidth(250); + mimetypeCol.setPreferredWidth(250); + mimetypeCol.setWidth(250); + mimetypeCol.setMinWidth(250); + mimetypeCol.setMaxWidth(250); + } + + private void pauseProcessing(){ + String message = "Pausing places the processing job in an idle state from which it can be resumed from later. "+ + "Are you sure you want to pause processing?"; + + if(job != null && !job.hasFinished()){ + if(CommonDialogs.getConfirmation(this,message, "Pause processing?")){ + log("Requesting processor pause, please wait..."); + job.pause(); + btnResumeProcessing.setEnabled(true); + btnPauseProcessing.setEnabled(false); + } + } + } + + private void resumeProcessing(){ + if(job != null && job.hasPaused()){ + log("Requesting processor resume..."); + job.resume(); + btnResumeProcessing.setEnabled(false); + btnPauseProcessing.setEnabled(true); + } + } + + private void stopProcessing(){ + String message = "Stopping processing requests that the processor gracefully stop processing as soon as possible. "+ + "Are you sure you want to stop processing?"; + if(job != null && !job.hasFinished()){ + if(CommonDialogs.getConfirmation(this,message, "Stop processing?")){ + log("Requesting processor stop, please wait..."); + btnPauseProcessing.setEnabled(false); + btnResumeProcessing.setEnabled(false); + btnStopProcessing.setEnabled(false); + btnAbortProcessing.setEnabled(false); + job.stop(); + } + } + } + + private void abortProcessing(){ + String message = "Aborting processing requests that the processor forcefully stop processing as soon as possible. "+ + "Are you sure you want to abort processing?"; + if(job != null && !job.hasFinished()){ + if(CommonDialogs.getConfirmation(this,message, "Abort processing?")){ + log("Requesting processor abort, please wait..."); + btnPauseProcessing.setEnabled(false); + btnResumeProcessing.setEnabled(false); + btnStopProcessing.setEnabled(false); + btnAbortProcessing.setEnabled(false); + job.abort(); + } + } + } + + public void log(String message){ + txtrProcessingLog.append(DateTime.now().toString("YYYY-MM-dd hh:mm:ss") + ": " + message+"\n"); + txtrProcessingLog.setCaretPosition(txtrProcessingLog.getDocument().getLength()); + } + + public void beginProcessing(Processor processor){ +// BroadcastingLogAppender loggingListener = new BroadcastingLogAppender(); +// loggingListener.setLayout(new PatternLayout("%-5p [%t]: %m")); +// loggingListener.setLevel(Level.ALL); +// Queue logFifo = new CircularFifoQueue(1000); +// loggingListener.addListener(new LogEventListener() { +// +// @Override +// public void eventLogged(Appender source, LoggingEvent event) { +// logFifo.add(source.getLayout().format(event)); +// SwingUtilities.invokeLater(() -> { +// txtrLogEvents.setText(String.join("\n", logFifo)); +// txtrLogEvents.setCaretPosition(txtrLogEvents.getDocument().getLength()); +// }); +// } +// }); +// loggingListener.hookLogging(); + + dataProcessingSettingsControl.loadSettings(processor.getProcessingSettings()); + + long startTime = System.currentTimeMillis(); + Timer elapsedTimer = new Timer(500, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + long elapsedSeconds = (System.currentTimeMillis() - startTime)/1000; + lblElapsedTimeValue.setText(FormatHelpers.secondsToElapsedString(elapsedSeconds)); + } + }); + elapsedTimer.start(); + + Object syncObject = new Object(); + processor.whenItemProcessed((i)->{ + synchronized(syncObject){ + totalProcessed++; + if (i.isCorrupted()){ totalCorrupted++; } + if (i.isDeleted()){ totalDeleted++; } + if (i.isEncrypted()){ totalEncrypted++; } + } + + SwingUtilities.invokeLater(()->{ + lblTotalProcessedCount.setText(FormatHelpers.formatNumber(totalProcessed)); + lblTotalCorruptedCount.setText(FormatHelpers.formatNumber(totalCorrupted)); + lblTotalDeletedCount.setText(FormatHelpers.formatNumber(totalDeleted)); + lblTotalEncryptedCount.setText(FormatHelpers.formatNumber(totalEncrypted)); + itemStatsTableModel.record(i); + }); + }); + + processor.whenCleaningUp(new ProcessorCleaningUpCallback() { + @Override + public void cleaningUp() { + SwingUtilities.invokeLater(()->{ + log("Processor cleaning up..."); + }); + } + }); + + try { + log("Worker Count: "+processor.getParallelProcessingSettings().get("workerCount")); + if (System.getProperties().containsKey("nuix.processing.worker.timeout")){ + log("Worker Timeout (seconds): "+System.getProperty("nuix.processing.worker.timeout")); + } + log("Beginning processing..."); + + job = processor.processAsync(); + + //Enabled buttons + btnPauseProcessing.setEnabled(true); + btnStopProcessing.setEnabled(true); + btnAbortProcessing.setEnabled(true); + + job.waitUntilFinished(); + log("Processing Finished"); + } catch (Exception e) { + String message = "Error while processing: "+e.getMessage(); + log(message); + logger.error(message,e); + } + + //Disable buttons + btnPauseProcessing.setEnabled(false); + btnResumeProcessing.setEnabled(false); + btnStopProcessing.setEnabled(false); + btnAbortProcessing.setEnabled(false); + + elapsedTimer.stop(); + itemStatsTableModel.refresh(); + + notifyProcessingFinishedListeners(); + } + + public void addProcessingFinishedListener(ProcessingFinishedListener listener){ + processingFinishedListeners.add(listener); + } + + public void removeProcessingFinishedListener(ProcessingFinishedListener listener){ + processingFinishedListeners.remove(listener); + } + + private void notifyProcessingFinishedListeners(){ + for(ProcessingFinishedListener listener : processingFinishedListeners){ + listener.processingFinished(); + } + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ReportDisplayPanel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ReportDisplayPanel.java new file mode 100644 index 0000000..c4121b4 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/ReportDisplayPanel.java @@ -0,0 +1,310 @@ +/****************************************** + Copyright 2022 Nuix + http://www.apache.org/licenses/LICENSE-2.0 + *******************************************/ +package com.nuix.nx.controls; + +import com.nuix.nx.controls.models.ReportDataModel; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * This class is designed to display the contents of a ReportDataModel at the bottom of a + * {@link com.nuix.nx.dialogs.ProgressDialog} + */ +@SuppressWarnings("serial") +public class ReportDisplayPanel extends JPanel { + private static final int LABEL_COLUMN_WIDTH = 50; + private static final int CONTROL_COLUMN_WIDTH = 50; + private int activeRow = 0; + private static final Insets sectionInsets = new Insets(5, 2, 2, 2); + private static final Insets separatorInsets = new Insets(0, 0, 0, 0); + private static final Insets dataRowInsets = new Insets(2,2,2,2); + private GridBagLayout rootLayout; + + @SuppressWarnings("unused") + private JPanel filler; + + /** + * The names of each section presented as JLabels, and mapped to the section name. + */ + Map sectionLabels = new LinkedHashMap<>(); + + /** + * JSeparators used to separate the section label from the section contents. + */ + Map separators = new HashMap<>(); + + /** + * This stores the displays for the data in the report. There is a map of JLabels for each data value in the + * report. These maps are stored in an outer map keyed to the section name the values belong in. + */ + Map> dataValues = new LinkedHashMap<>(); + + /** + * Create a new ReportDisplayPanel with no {@link ReportDataModel}. No UI will be built until a data model is + * added via the {@link #setReportDataModel(ReportDataModel)} method. + */ + public ReportDisplayPanel() { + super(); + } + + /** + * Create a new ReportDisplayPanel based on the data stored in the provided {@link ReportDataModel}. + * + * @param dataModel The {@link ReportDataModel} containing the data for display. This will be used to build a UI + * from. This class will also begin to listen to the model for changes and update the UI + * accordingly. + */ + public ReportDisplayPanel(ReportDataModel dataModel) { + super(); + + setReportDataModel(dataModel); + } + + /** + * Set or replace the data used for this report with the supplied {@link ReportDataModel}. + *

+ * This will trigger a re-build of the user interface based on the contents of the data model and will also + * add a property change listener to the the model so the UI can be kept up to data with changes in the data. + *

+ * @param dataModel The {@link ReportDataModel} to add to or replace the existing data model for display on this + * control. + */ + public void setReportDataModel(ReportDataModel dataModel) { + ReportDataChangeListener listener = new ReportDataChangeListener(); + dataModel.addPropertyChangeListener(listener); + + buildDisplay(dataModel); + } + + private void buildDisplay(ReportDataModel dataModel) { + setBorder(new EmptyBorder(5,5,5,5)); + rootLayout = new GridBagLayout(); + rootLayout.columnWidths = new int[]{LABEL_COLUMN_WIDTH,CONTROL_COLUMN_WIDTH}; + setLayout(rootLayout); + + for (String sectionName : dataModel.getSections()) { + buildSection(sectionName, dataModel); + } + + //filler = addVerticalFiller(); + } + + private void buildSection(String sectionName, ReportDataModel data) { + Map section = makeSection(sectionName); + + + for (String dataField : data.getDataFieldsInSection(sectionName)) { + String dataValue = data.getDataFieldValue(sectionName, dataField); + JLabel[] dataValueDisplay = buildDataRow(dataField, dataValue); + section.put(dataField, dataValueDisplay); + } + } + + private Map makeSection(String sectionName) { + JLabel label = addSectionHeader(sectionName); + JSeparator separator = addHorizontalSeparator(); + + sectionLabels.put(sectionName, label); + separators.put(sectionName, separator); + + Map section = new LinkedHashMap<>(); + dataValues.put(sectionName, section); + + return section; + } + + private JLabel[] buildDataRow(String label, String value) { + return addDataFieldDisplay(label, value); + } + + /** + * This inner class of {@link ReportDisplayPanel} implements a PropertyChangeListener. + *

+ * It is non-static, so it has access to the ReportDisplayPanel's content, and uses that access to apply the + * changes made in the data model to the display of the content. + *

+ */ + public class ReportDataChangeListener implements PropertyChangeListener { + + /** + * Update the surrounding {@link ReportDisplayPanel} instance based on changes to the underlying + * {@link ReportDataModel}. + *

+ * It is expected properties will come in with a name formatted to include both the Section that is being + * changed and the name of the particular data field being changed. The two names should be delimited + * with {@link ReportDataModel#SECTION_FIELD_DELIM}. The results of the events in this class may result + * in the structure of the report changing: such as new sections or fields being added, as well as + * updates to fields that already exist. + *

+ * @param event A PropertyChangeEvent object describing the event source + * and the property that has changed. + */ + public void propertyChange(PropertyChangeEvent event) { + String changedProperty = event.getPropertyName(); + + String[] fieldNames = changedProperty.split(ReportDataModel.SECTION_FIELD_DELIM); + String sectionName = fieldNames[0]; + String newValue = event.getNewValue().toString(); + + if (fieldNames.length > 1) { + // Section and Data Field present + String dataField = fieldNames[1]; + + if (!dataValues.containsKey(sectionName)) { + //The section does not exist, make it + makeSection(sectionName); + } + + Map section = dataValues.get(sectionName); + + if (section.containsKey(dataField)) { + // field exists, update it + JLabel valueField = section.get(dataField)[1]; + valueField.setText(newValue); + } else { + // field does not exist, make a new one + JLabel[] dataFieldDisplays = addDataFieldDisplay(dataField, newValue); + section.put(dataField, dataFieldDisplays); + } + } else { + // Section only + if (dataValues.containsKey(sectionName)) { + // Section already exists, remove it first + + Map section = dataValues.get(sectionName); + for (JLabel[] fields : section.values()) { + for (JLabel field : fields) { + ReportDisplayPanel.this.remove(field); + } + } + + dataValues.remove(sectionName); + sectionLabels.remove(sectionName); + separators.remove(sectionName); + } + + buildSection(sectionName, (ReportDataModel)event.getSource()); + } + + } + } + + private void addComponent(Component component, GridBagConstraints c){ + rootLayout.setConstraints(component,c); + add(component); + } + + private JLabel[] addDataFieldDisplay(String label, String initialValue){ + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = activeRow; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 0; + c.weighty = 0; + c.fill = GridBagConstraints.NONE; + c.insets = dataRowInsets; + c.anchor = GridBagConstraints.WEST; + JLabel labelComponent = new JLabel(label); + labelComponent.setHorizontalAlignment(SwingConstants.LEFT); + labelComponent.setHorizontalTextPosition(SwingConstants.LEFT); + labelComponent.setVerticalAlignment(SwingConstants.CENTER); + addComponent(labelComponent,c); + + c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = activeRow; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 1; + c.weighty = 0; + c.fill = GridBagConstraints.HORIZONTAL; + c.insets = dataRowInsets; + c.anchor = GridBagConstraints.EAST; + JLabel valueComponent = new JLabel(initialValue); + valueComponent.setHorizontalAlignment(SwingConstants.RIGHT); + valueComponent.setHorizontalTextPosition(SwingConstants.RIGHT); + valueComponent.setVerticalAlignment(SwingConstants.CENTER); + addComponent(valueComponent,c); + + activeRow++; + + + return new JLabel[] { labelComponent, valueComponent}; + } + + private JLabel addSectionHeader(String label) { + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = activeRow; + c.gridwidth = 2; + c.gridheight = 1; + c.weightx = 0; + c.weighty = 0; + c.fill = GridBagConstraints.HORIZONTAL; + c.insets = sectionInsets; + c.anchor = GridBagConstraints.EAST; + JLabel labelComponent = new JLabel(label); + labelComponent.setHorizontalAlignment(SwingConstants.LEFT); + labelComponent.setHorizontalTextPosition(SwingConstants.LEFT); + labelComponent.setVerticalAlignment(SwingConstants.CENTER); + Font font = labelComponent.getFont(); + Font boldFont = new Font(font.getFontName(), Font.BOLD, font.getSize()); + labelComponent.setFont(boldFont); + addComponent(labelComponent,c); + + activeRow++; + + return labelComponent; + } + + private JSeparator addHorizontalSeparator() { + GridBagConstraints c = new GridBagConstraints(); + c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = activeRow; + c.gridwidth = 2; + c.gridheight = 1; + c.weightx = 0; + c.weighty = 0; + c.fill = GridBagConstraints.HORIZONTAL; + c.insets = separatorInsets; + c.anchor = GridBagConstraints.EAST; + JSeparator separator = new JSeparator(); + addComponent(separator, c); + + activeRow++; + + return separator; + } + + @SuppressWarnings("unused") + private JPanel addVerticalFiller(){ + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = activeRow; + c.gridwidth = 2; + c.gridheight = 1; + c.weightx = 1.0; + c.weighty = 1.0; + c.fill = GridBagConstraints.BOTH; + c.insets = dataRowInsets; + c.anchor = GridBagConstraints.NORTHWEST; + JPanel filler = new JPanel(); + addComponent(filler,c); + + activeRow++; + + return filler; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/StringList.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/StringList.java new file mode 100644 index 0000000..62a453c --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/StringList.java @@ -0,0 +1,221 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls; + +import java.awt.Component; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.ScrollPaneConstants; + +import org.apache.commons.lang.ArrayUtils; + +import com.nuix.nx.controls.models.StringListTableModel; +import com.nuix.nx.dialogs.CommonDialogs; + +/*** + * A control which allows a user to provide a list of string values (custodian names, tag names, etc) + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class StringList extends JPanel { + private JButton btnAdd; + private JButton btnRemoveSelected; + private JTextField txtUservalue; + private JButton btnImportFile; + private JPanel buttonLayoutPanel; + private JTable table; + private StringListTableModel model = new StringListTableModel(); + + public StringList() { + GridBagLayout gridBagLayout = new GridBagLayout(); + gridBagLayout.columnWidths = new int[]{0, 0}; + gridBagLayout.rowHeights = new int[]{0, 0, 0}; + gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE}; + gridBagLayout.rowWeights = new double[]{0.0, 1.0, Double.MIN_VALUE}; + setLayout(gridBagLayout); + + buttonLayoutPanel = new JPanel(){ + @Override + public void setEnabled(boolean enabled) { + for(Component c : getComponents()){ + c.setEnabled(enabled); + } + super.setEnabled(enabled); + } + }; + GridBagConstraints gbc_buttonLayoutPanel = new GridBagConstraints(); + gbc_buttonLayoutPanel.insets = new Insets(0, 0, 5, 0); + gbc_buttonLayoutPanel.fill = GridBagConstraints.BOTH; + gbc_buttonLayoutPanel.gridx = 0; + gbc_buttonLayoutPanel.gridy = 0; + add(buttonLayoutPanel, gbc_buttonLayoutPanel); + GridBagLayout gbl_buttonLayoutPanel = new GridBagLayout(); + gbl_buttonLayoutPanel.columnWidths = new int[]{75, 116, 0, 151, 0}; + gbl_buttonLayoutPanel.rowHeights = new int[]{25, 0}; + gbl_buttonLayoutPanel.columnWeights = new double[]{0.0, 1.0, 0.0, 0.0, Double.MIN_VALUE}; + gbl_buttonLayoutPanel.rowWeights = new double[]{0.0, Double.MIN_VALUE}; + buttonLayoutPanel.setLayout(gbl_buttonLayoutPanel); + + btnAdd = new JButton("Add"); + btnAdd.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + String userValue = txtUservalue.getText(); + if(userValue != null && !userValue.trim().isEmpty()){ + addValue(userValue); + txtUservalue.setText(""); + } + } + }); + btnAdd.setIcon(new ImageIcon(StringList.class.getResource("/icons/add.png"))); + GridBagConstraints gbc_btnAdd = new GridBagConstraints(); + gbc_btnAdd.anchor = GridBagConstraints.NORTHWEST; + gbc_btnAdd.insets = new Insets(0, 0, 0, 5); + gbc_btnAdd.gridx = 0; + gbc_btnAdd.gridy = 0; + buttonLayoutPanel.add(btnAdd, gbc_btnAdd); + + txtUservalue = new JTextField(); + GridBagConstraints gbc_txtUservalue = new GridBagConstraints(); + gbc_txtUservalue.fill = GridBagConstraints.HORIZONTAL; + gbc_txtUservalue.insets = new Insets(0, 0, 0, 5); + gbc_txtUservalue.gridx = 1; + gbc_txtUservalue.gridy = 0; + buttonLayoutPanel.add(txtUservalue, gbc_txtUservalue); + txtUservalue.setColumns(10); + txtUservalue.addKeyListener(new KeyAdapter() { + @Override + public void keyReleased(KeyEvent arg0) { + if(arg0.getKeyCode() == KeyEvent.VK_ENTER){ + String userValue = txtUservalue.getText(); + if(userValue != null && !userValue.trim().isEmpty()){ + addValue(userValue); + txtUservalue.setText(""); + } + arg0.consume(); + } + } + }); + + btnRemoveSelected = new JButton("Remove Selected"); + btnRemoveSelected.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + int[] selectedIndices = table.getSelectedRows(); + Arrays.sort(selectedIndices); + ArrayUtils.reverse(selectedIndices); + for(int index : selectedIndices){ + model.removeValueAt(index); + } + } + }); + + btnImportFile = new JButton("Import File"); + btnImportFile.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + File textFile = CommonDialogs.openFileDialog("C:\\", "Text File", "txt", "Choose Text File to Import"); + if(textFile != null){ + try(BufferedReader br = new BufferedReader(new FileReader(textFile))) { + for(String line; (line = br.readLine()) != null; ) { + addValue(line.trim()); + } + } catch(Exception exc){ + CommonDialogs.showError("Error while importing text file: \n"+exc.getMessage()); + } + } + } + }); + btnImportFile.setIcon(new ImageIcon(StringList.class.getResource("/icons/page_white_get.png"))); + GridBagConstraints gbc_btnImportFile = new GridBagConstraints(); + gbc_btnImportFile.insets = new Insets(0, 0, 0, 5); + gbc_btnImportFile.gridx = 2; + gbc_btnImportFile.gridy = 0; + buttonLayoutPanel.add(btnImportFile, gbc_btnImportFile); + btnRemoveSelected.setIcon(new ImageIcon(StringList.class.getResource("/icons/delete.png"))); + GridBagConstraints gbc_btnRemoveSelected = new GridBagConstraints(); + gbc_btnRemoveSelected.anchor = GridBagConstraints.NORTHWEST; + gbc_btnRemoveSelected.gridx = 3; + gbc_btnRemoveSelected.gridy = 0; + buttonLayoutPanel.add(btnRemoveSelected, gbc_btnRemoveSelected); + + JScrollPane scrollPane = new JScrollPane(); + scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 0; + gbc_scrollPane.gridy = 1; + add(scrollPane, gbc_scrollPane); + + table = new JTable(model); + table.setFillsViewportHeight(true); + scrollPane.setViewportView(table); + } + + /*** + * Gets the current values of the list. + * @return The current values of the list. + */ + public List getValues(){ + List result = new ArrayList(); + for (int i = 0; i < model.getValueCount(); i++) { + result.add(model.getValueAt(i)); + } + return result; + } + + /*** + * Sets the values of the list. + * @param values The new values of the list. + */ + public void setValues(List values){ + model.setValues(values); + } + + /*** + * Adds a value to the list. + * @param value The value to add. + */ + public void addValue(String value){ + model.addValue(value); + } + + public JButton getBtnImportFile() { + return btnImportFile; + } + + @Override + public void setEnabled(boolean enabled) { + for(Component c : getComponents()){ + c.setEnabled(enabled); + } + super.setEnabled(enabled); + } + + /*** + * Sets whether the user is allowed to edit entries. + * @param editable True if the user should be allowed to edit entries, False if not. + */ + public void setEditable(boolean editable) { + model.setEditable(editable); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/accept.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8129a490b329f3165f32fa0781701aab417ea GIT binary patch literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/arrow_down.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4e279377bf348f9cf53894e76bb673ccf067bd GIT binary patch literal 379 zcmV->0fhdEP)RB*?~^j!LKVQ>(O&A{Xr%)RXLn#U zs4LtZ6rCMFY5|B2$)yG$6aaIF6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000C#5QQ<|d}62BjvZR2H60wE-%s@N{tu(Kvs0!a}YF0}=J!QSUY7M7z;-RJ$7n8*6-IkwdUVS%nn(+HZ=IM>KhySVgJojLZytKsQlJks9 zg>q@PUpbdv;&|+P!{NQ{65)mBh3B(*yP58!PISKz-O48F^~6K0e}RJHfr*NaZ|Z(M akrr=d7xdAvd!`9=1B0ilpUXO@geCyB6I2-h literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/cancel.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..c149c2bc017d5ce5a8ae9330dd7dbd012482e0f4 GIT binary patch literal 587 zcmV-R0<`^!P)FS^-G}e*;M)Q6>s#cP zI`Y#S($G6W`W@NI5g|L-MKl0Zmu$m^(0~^Lwo5OO~d#(vPfzU3VE{tZoOXQ3gborPd)C!*bfsFfgUA%b`K z{k54{z0H}ACRrHvW^d-rdyicUV+{VYtX~gCqfs0|(-=vN2o1PiuPW{>+#Atov}dlj zm>FQRf_YAoB-!b7g57TC=llI0*6TIQX0twmlwz@1Su_y<#c()O27`fy#f%p1x~?-# z)7Wme<7b=AhIKj}t=(=bMjvNzr~MuZg=Ct#TCD`Id5F*FgY9+;-ENndyrfd8-V+sI zk|x?lbD>axN~J2Ai^W%{R^I>_0Z9u6gEF#73lqsO`axO|3~qzj{hRS`0}LC%>-AD? zlFkeU5t@ED93Che0EA(j5rE6(g7f(t5ddbb)O7oPG}&BpJRae6I)RyiO6J&XwmSe5 z5k7R5;6} zlgp~&KoEw{L*wq6jM9+RMU)_iNO6K~b@$|K=nj zb2!5=4Mjq_zrU*f>U2#vSVnMZ9ja4cY`AdOM*t}k^goWqfa3Iq(>2kSH;P81hAqIyBm_{t1>+!KRdtb~{1AK7>C~ zD-Nov`UX!X6ET_La7f{B_|*cRuZGR%^C`gjd@jmW6h*+;8;{2{8ja|Fzf-YTq+l@k zGLg?!DijI~9$+CG0P)O;^z5vZ zY!uIB*x&E}vNJj4{?GTJBigE^o7UKdzE#&EBXnfjM2N9qUNJ=7T*(!I*v$dVF@wV! zPcbfCO)dpCHwm6#49koVc}1IZ;f0opGWdxBx;Rl@XzG}46S&UgQ6wI6lQE987w+r= zQ{sp)?}bM^PuEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/eye.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..564a1a9714ff37aee1c8758109113e434eff7862 GIT binary patch literal 750 zcmVWW=I5Rl}zuENrQ28Pt;CX(qKOcDU|M8F&Z%jVGSZA7t& zSX&s1bi|{*v*DgAz3ST9+K6Us3~0Q9*~BWe6PID=&0x|wWdf!IWgI(}6lv9v-FpSS zw1U9OL{Ex%ACuJL>=wxTZg0 zEf8`!jsrze5UvA~SqG-HeEY!{P)iC{?3#nq?S616TB~hnMW{0-6j9tLvf?&u+XiC{ z?O_E0jiYQZlqIojGL$5a1qk9N)mlxpmZq1W6gHT`ec`8K>j$jl3}`WfukS z{=!u2#P1a^U!H8Xl5T`7??NT1t zUc_pqB=&-xQ}oxwg~5^6HaUDuDLGXE;y3!@QP_pOFSc-kKKIu gX8xa5{%_a#2W_ovs9z>%07*qoM6N<$f|edvg8%>k literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.java new file mode 100644 index 0000000..83f7ad2 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.java @@ -0,0 +1,18 @@ +package com.nuix.nx.controls.filters; + +import java.util.Map; + +public class DynamicTableAllRecordsFilter extends DynamicTableFilterProvider { + + @Override + public boolean handlesExpression(String filterExpression) { + return true; + } + + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + return true; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.java new file mode 100644 index 0000000..be7047d --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.java @@ -0,0 +1,26 @@ +package com.nuix.nx.controls.filters; + +import java.util.Map; + +public class DynamicTableCheckedRecordsFilter extends DynamicTableFilterProvider { + + /*** + * {@inheritDoc}
+ * This implementation returns true if provided expression is ":checked:" (case-insensitive). + */ + @Override + public boolean handlesExpression(String filterExpression) { + return filterExpression.equalsIgnoreCase(":checked:"); + } + + /*** + * {@inheritDoc}
+ * This implementation returns true if isChecked is true. + */ + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + return isChecked == true; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableContainsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableContainsFilter.java new file mode 100644 index 0000000..da8e8ee --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableContainsFilter.java @@ -0,0 +1,30 @@ +package com.nuix.nx.controls.filters; + +import java.util.Map; + +public class DynamicTableContainsFilter extends DynamicTableFilterProvider { + + @Override + public boolean handlesExpression(String filterExpression) { + return true; + } + + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, Object record, + Map rowValues) { + boolean result = false; + for(Map.Entry entry : rowValues.entrySet()) { + // Easy way to get string value of most common types + String stringValue = String.format("%s", entry.getValue()); + // Does string value contain the filter expression? + if(stringValue.contains(filterExpression)) { + // Any match will be considered a success and keeps the record so we + // do not need to keep looking + result = true; + break; + } + } + return result; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableFilterProvider.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableFilterProvider.java new file mode 100644 index 0000000..3abe297 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableFilterProvider.java @@ -0,0 +1,47 @@ +package com.nuix.nx.controls.filters; + +import java.util.List; +import java.util.Map; + +import com.nuix.nx.controls.models.DynamicTableModel; +import com.nuix.nx.controls.models.DynamicTableValueCallback; + +public abstract class DynamicTableFilterProvider { + /*** + * Whether this filter provider handles the given filter expression. If true is returned, {@link #keepRecord(int, boolean, String, Object, Map)} + * will be called for each record to determine whether the given record is filtered out or not. If false is returned then + * the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + * string since {@link DynamicTableModel} has built in logic to handle that before asking filters. + * @param filterExpression The expression the user has provided. + * @return True if this filter should handle this expression. False otherwise. + */ + public abstract boolean handlesExpression(String filterExpression); + + /*** + * If {@link #handlesExpression(String)} returns true, this method will be invoked for each record. It should return + * true for records that should make it into the final collection and false for records that should be filtered out. + * @param sourceIndex The index of the record in the full un-filtered source collection. + * @param isChecked Whether the given record is currently checked + * @param filterExpression The filter expression provided by the user. This value should never be null, only whitespace or empty. + * @param record The record to inspect and make a decision about. + * @param rowValues A map of the values actual represented as columns in the table. Relies on table model's {@link DynamicTableValueCallback}. + * @return True to keep the record, false to filter it out. + */ + public abstract boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues); + + /*** + * Invoked once before filtering begins, allowing for up front work to be performed that might + * then be leveraged in subsequent calls to {@link #keepRecord(int, boolean, String, Object, Map)}. + * Override in derived implementation, default implementation does nothing. + * @param filterExpression The filter expression that was provided + * @param allRecords All the of records pre-filtering + */ + public void beforeFiltering(String filterExpression, List allRecords) {} + + /*** + * Called once after filtering. Can be used to clean up any resources that may have been created by calls to {@link #beforeFiltering(String, List)} + * and/or {@link #keepRecord(int, boolean, String, Object, Map)}. + */ + public void afterFiltering() {} +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableRegexFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableRegexFilter.java new file mode 100644 index 0000000..176af6d --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableRegexFilter.java @@ -0,0 +1,54 @@ +package com.nuix.nx.controls.filters; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class DynamicTableRegexFilter extends DynamicTableFilterProvider { + private Pattern filterPattern; + + /*** + * {@inheritDoc}
+ * This is meant to be a fallback filter so it will happily accept any filter expression except when + * given value does not correctly compile to a regular expression. + */ + @Override + public boolean handlesExpression(String filterExpression) { + try { + Pattern.compile(filterExpression, Pattern.CASE_INSENSITIVE); + } catch (Exception e) { + return false; + } + return true; + } + + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + boolean result = false; + for(Map.Entry entry : rowValues.entrySet()) { + // Easy way to get string value of most common types + String stringValue = String.format("%s", entry.getValue()); + // Does string value match against our regex? + if(filterPattern.matcher(stringValue).find()) { + // Any match will be considered a success and keeps the record so we + // do not need to keep looking + result = true; + break; + } + } + return result; + } + + @Override + public void beforeFiltering(String filterExpression, List allRecords) { + this.filterPattern = Pattern.compile(Pattern.quote(filterExpression), Pattern.CASE_INSENSITIVE); + } + + @Override + public void afterFiltering() { + filterPattern = null; + } + + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.java new file mode 100644 index 0000000..73bae2d --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.java @@ -0,0 +1,26 @@ +package com.nuix.nx.controls.filters; + +import java.util.Map; + +public class DynamicTableUncheckedRecordsFilter extends DynamicTableFilterProvider { + + /*** + * {@inheritDoc}
+ * This implementation returns true if provided expression is ":unchecked:" (case-insensitive). + */ + @Override + public boolean handlesExpression(String filterExpression) { + return filterExpression.equalsIgnoreCase(":unchecked:"); + } + + /*** + * {@inheritDoc}
+ * This implementation returns true if isChecked is false. + */ + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + return isChecked == false; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/folder_page.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/folder_page.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef6e11438f3226f88bdc457f55d677d1f2f8409 GIT binary patch literal 688 zcmV;h0#E&kP)CVGc zN?Hxg{(SJp>2>GN9JetoZ(aZH;Ije%0FdZ{S!LRVX%}YG;=d8L^N!mJkCd*SBx($jgG)S}+Le)f;q=GIn30YFNh3ZW|nh}2rL)`=3ju9K*d z<&~Gte>sT=5|RjR+}A(|O&3gS5t&*G5h0Um$c5IgEgxJl_8nzY#B+YU^|Fhvzo-^U z6fNn3(lBMcl9{Silx)4RpURdFw}1BZ?>}8S&h8fk5`hjKW@sP$LJL*otPOMf+jp$? zcC^*PiL>vkTOZln=wuc^%A^$j`TU&aa3ETVYE{(r=bgN835`stIePGw{uwD`7K9Y) z=4)VDHnkl3YL%JeLce6>Uubzae&kQ4(}3^VYXIcMfLGh@F-->=;^b;9pE+9-AgXNuFXu)G8rVomlzjy+fuMmPft%;< z;=ME+0H|K;O6Ro$t8XO%AB5TfQ2?HetsDp#=xQMgLj3i0_vd_bXQy+~PBO^79shD) z2gUJahI$Y00sPoVsvS6sP95ueoO8~B0T}+x5^6?V2gMI7;Gj6ZOdL5dBNxNzBTZyp zhzXXUSwp(?5XtHwYDT0V1L8WzU{8C^4rUfN2tkSQE;7xKtR7QCD+?S-W+_d);LOx0 z(-UwOnEteH)B|rZlo)4u4HdS&uaGX!qFI>>xp`W@>zl#El)a_YMOJW=wutX7S5AyiXBT(kw$H#nh8)y~qh*_{kJ&rQ}tNH#14l@+2nf zn3Oo#I1hQnGy$z(x{1jqCS@9rUt;zn6mRu8fS43B4X9tm!g>{=DOdnYF)d@Vg@zI) zC2(%fTf}5$4#C1NEUZ;c)^}l{gvkabTbL$jx&V;u04&qrq5QMSZ`K#kLS&W$Er7LQ zk^&hPRZkZQk|buCrn`V7y+8M8um__bN8z8}&j2@;q4sn;^arVubHUWsrz-#e002ov JPDHLkV1l^%9 Generic data type this list will contain. + */ +@SuppressWarnings("serial") +public class ArrangeableListModel extends AbstractListModel { + private List elements = new ArrayList(); + + @Override + public E getElementAt(int index) { + return elements.get(index); + } + + @Override + public int getSize() { + if(elements == null){ + return 0; + } else { + return elements.size(); + } + } + + public int size(){ + if(elements == null){ + return 0; + } else { + return elements.size(); + } + } + + public boolean shiftRowsUp(int firstRowIndex, int lastRowIndex){ + if(firstRowIndex <= 0) + return false; + + for (int i = firstRowIndex; i <= lastRowIndex; i++) { + Collections.swap(elements, i, i-1); + } + + fireContentsChanged(this, firstRowIndex, lastRowIndex); + + return true; + } + + public boolean shiftRowsDown(int firstRowIndex, int lastRowIndex){ + if(lastRowIndex >= elements.size() - 1) + return false; + + for (int i = firstRowIndex; i <= lastRowIndex; i++) { + Collections.swap(elements, i, i+1); + } + + fireContentsChanged(this, firstRowIndex, lastRowIndex); + + return true; + } + + public void addElement(E element){ + SwingUtilities.invokeLater(()->{ + elements.add(element); + fireIntervalAdded(this, elements.size()-1, elements.size()-1); + }); + } + + public void remove(int index){ + SwingUtilities.invokeLater(()->{ + elements.remove(index); + fireIntervalRemoved(this, index, index); + }); + } + + public void clear(){ + SwingUtilities.invokeLater(()->{ + try { + int lastIndex = elements.size()-1; + elements.clear(); + fireIntervalRemoved(this, 0, lastIndex); + } catch (Exception e) { + } + }); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/Choice.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/Choice.java new file mode 100644 index 0000000..469714a --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/Choice.java @@ -0,0 +1,130 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +/*** + * This class represents a choice in some controls and has an associated label, tool tip, value and whether the choice is checked. + * @author Jason Wells + * + * @param The data type of the value help by this instance + */ +public class Choice { + private String label = ""; + private String toolTip; + private boolean isSelected = false; + private T value; + + public Choice(){} + + /*** + * Creates a choice object. Label and tool tip will be based on calling toString on the value provided. + * @param value The value this choice object represents. + */ + public Choice(T value){ + this.value = value; + this.toolTip = this.label = value.toString(); + } + + /*** + * Creates a choice object. Tool tip will be based on the provided label string. + * @param value The value this choice object represents. + * @param label The displayed string for this choice. + */ + public Choice(T value,String label){ + this.value = value; + this.toolTip = this.label = label; + } + + /*** + * Creates a choice object. + * @param value The value this choice object represents. + * @param label The displayed string for this choice. + * @param toolTip The tool tip associated to this choice. + */ + public Choice(T value,String label,String toolTip){ + this.value = value; + this.label = label; + this.toolTip = toolTip; + } + + /*** + * Creates a choice object. + * @param value The value this choice object represents. + * @param label The displayed string for this choice. + * @param toolTip The tool tip associated to this choice. + * @param isSelected Whether this choice is checked by default. + */ + public Choice(T value,String label,String toolTip, boolean isSelected){ + this.value = value; + this.label = label; + this.toolTip = toolTip; + this.isSelected = isSelected; + } + + /*** + * Whether this choice is currently selected + * @return True if this choice is selected. + */ + public boolean isSelected() { + return isSelected; + } + + /*** + * Sets whether this choice is currently selected. + * @param isSelected Provide true to select this choice. + */ + public void setSelected(boolean isSelected) { + this.isSelected = isSelected; + } + + /*** + * The tool tip which will be associated to this choice. + * @return The tool tip. + */ + public String getToolTip() { + return toolTip; + } + + /*** + * Sets the tool tip associated to this choice. + * @param toolTip The tool tip. + */ + public void setToolTip(String toolTip) { + this.toolTip = toolTip; + } + + /*** + * Gets the label used to display this choice. + * @return The label string. + */ + public String getLabel() { + return label; + } + + /*** + * Sets the label used to display this choice. + * @param label The label string to use. + */ + public void setLabel(String label) { + this.label = label; + } + + /*** + * Gets the value associated to this choice. + * @return The value associated. + */ + public T getValue() { + return value; + } + + /*** + * Sets the value associated to this choice. + * @param value The value to be associated. + */ + public void setValue(T value) { + this.value = value; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModel.java new file mode 100644 index 0000000..b9d3883 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModel.java @@ -0,0 +1,412 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import javax.swing.table.AbstractTableModel; + +import org.apache.log4j.Logger; + +/*** + * Table model used by the {@link com.nuix.nx.controls.ChoiceTableControl} + * @author Jason Wells + * + * @param The data type of the of the {@link Choice} instances which will be held by this model. + */ +@SuppressWarnings("serial") +public class ChoiceTableModel extends AbstractTableModel { + private static Logger logger = Logger.getLogger(ChoiceTableModel.class); + + private List> choices; + private List> displayedChoices; + private String filter = ""; + private ChoiceTableModelChangeListener changeListener; + private Pattern whitespaceSplitter = Pattern.compile("\\s+"); + private boolean singleSelectMode = false; + + /*** + * Create a new instance + */ + public ChoiceTableModel(){ + choices = new ArrayList>(); + setFilter(""); + } + + /*** + * Set a listener callback which will be notified of changes + * @param listener The listener to be notified of changes + */ + public void setChangeListener(ChoiceTableModelChangeListener listener){ + changeListener = listener; + } + + /*** + * Notify listeners that a change occurred + */ + private void notifyChanged(){ + if(changeListener != null){ + changeListener.dataChanged(); + } + + if(filter.equalsIgnoreCase(":checked:") || filter.equalsIgnoreCase(":unchecked:")){ + applyFiltering(); + } + } + + public List> setCheckedByLabels(Collection labels, boolean setChecked) { + Set labelLookup = new HashSet(); + labelLookup.addAll(labels); + List> updatedChoices = new ArrayList>(); + for (int i = 0; i < choices.size(); i++) { + if((i+1) % 1000 == 0 || (i+1) == choices.size()) { + logger.info(String.format("Restored check state to %s choices...", i+1)); + } + Choice c = choices.get(i); + if(labelLookup.contains(c.getLabel())) { + c.setSelected(setChecked); + updatedChoices.add(c); + } + } + fireTableDataChanged(); + notifyChanged(); + return updatedChoices; + } + + /*** + * Attempt to find a choice in the model with a matching label + * @param label The label to look for + * @return A corresponding {@link Choice} object if a match was found + */ + public Choice getFirstChoiceByLabel(String label){ + Choice result = null; + for(Choice choice : choices){ + if(choice.getLabel().equals(label)){ + result = choice; + break; + } + } + return result; + } + + /*** + * Attempt to find a choice in the model with a matching value + * @param value The value to look for + * @return A corresponding {@link Choice} object if a match was found + */ + public Choice getFirstChoiceByValue(T value){ + Choice result = null; + for(Choice choice : choices){ + if(choice.getValue().equals(value)){ + result = choice; + break; + } + } + return result; + } + + /*** + * Gets the list of choices associated + * @return The choices + */ + public List> getChoices() { + return choices; + } + + /*** + * Sets the list of choices associated + * @param choices The choices to associate + */ + public void setChoices(List> choices) { + this.choices = choices; + applyFiltering(); + notifyChanged(); + } + + private String[] columns = new String[]{ + "", + "" + }; + + @Override + public int getColumnCount() { + return columns.length; + } + + @Override + public int getRowCount() { + return displayedChoices.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + switch(columnIndex){ + case 0: + return displayedChoices.get(rowIndex).isSelected(); + case 1: + return displayedChoices.get(rowIndex).getLabel(); + default: + return ""; + } + } + + @Override + public Class getColumnClass(int columnIndex) { + switch(columnIndex){ + case 0: + return Boolean.class; + case 1: + return String.class; + default: + return null; + } + } + + @Override + public String getColumnName(int column) { + return columns[column]; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + if(columnIndex == 0) return true; + else return false; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if(columnIndex == 0){ + boolean value = (boolean)aValue; + if(singleSelectMode) { + if(value == true) { + uncheckAllChoices(); + } else { + // In single select mode we don't allow user to deselect + // the only selected choice + return; + } + } + displayedChoices.get(rowIndex).setSelected(value); + notifyChanged(); + } + } + + private void applyFiltering(){ + if(filter.isEmpty()){ + displayedChoices = choices; + } else if (filter.equalsIgnoreCase(":checked:")) { + displayedChoices = choices.stream().filter(c -> c.isSelected()).collect(Collectors.toList()); + }else if (filter.equalsIgnoreCase(":unchecked:")) { + displayedChoices = choices.stream().filter(c -> !c.isSelected()).collect(Collectors.toList()); + } else { + try { + // we will treat spaces as a delimiter allowing for multiple things AND'ed + String[] criteria = whitespaceSplitter.split(filter); + displayedChoices = choices; + for(String criterion : criteria) { + Pattern p = Pattern.compile(criterion,Pattern.CASE_INSENSITIVE); + displayedChoices = displayedChoices.stream().filter(c -> p.matcher(c.getLabel().toLowerCase()).find()).collect(Collectors.toList()); + } + } + catch(Exception exc) { + displayedChoices = new ArrayList>(); + } + } + this.fireTableDataChanged(); + } + + public void refreshTable() { + this.fireTableDataChanged(); + } + + public void setFilter(String filter){ + this.filter = filter; + applyFiltering(); + notifyChanged(); + } + + public Choice getChoice(int rowIndex){ + return choices.get(rowIndex); + } + + public Choice getDisplayedChoice(int rowIndex){ + return displayedChoices.get(rowIndex); + } + + public void addChoice(Choice choice){ + choices.add(choice); + int lastIndex = choices.size()-1; + this.fireTableRowsInserted(lastIndex, lastIndex); + notifyChanged(); + } + + public void setChoiceSelection(Choice choice, boolean value){ + int index = choices.indexOf(choice); + choices.get(index).setSelected(value); + this.fireTableCellUpdated(index, 0); + notifyChanged(); + } + + public void checkDisplayedChoices(){ + for(Choice choice : displayedChoices){ + choice.setSelected(true); + } + refreshTable(); + notifyChanged(); + } + + public void uncheckDisplayedChoices(){ + for(Choice choice : displayedChoices){ + choice.setSelected(false); + } + refreshTable(); + notifyChanged(); + } + + public void uncheckAllChoices(){ + for(Choice choice : choices){ + if(choice.isSelected()) { + choice.setSelected(false); + } + } + fireTableDataChanged(); + notifyChanged(); + } + + public List> getCheckedChoices(){ + return choices.stream().filter(c -> c.isSelected()).collect(Collectors.toList()); + } + + public List> getUncheckedChoices(){ + return choices.stream().filter(c -> !c.isSelected()).collect(Collectors.toList()); + } + + public List getCheckedValues(){ + List result = new ArrayList(); + for(Choice choice : getCheckedChoices()){ + result.add(choice.getValue()); + } + notifyChanged(); + return result; + } + + public List getCheckedLabels(){ + List result = new ArrayList(); + for(Choice choice : getCheckedChoices()){ + result.add(choice.getLabel()); + } + return result; + } + + public int getCheckedValueCount(){ + return getCheckedChoices().size(); + } + + public int getVisibleValueCount(){ + return displayedChoices.size(); + } + + public int getTotalValueCount(){ + return choices.size(); + } + + public void setChoiceTypeName(String name){ + columns[1] = name; + this.fireTableStructureChanged(); + } + + public int[] shiftRowsUp(int[] positions){ + return shiftRows(positions,-1); + } + + public int[] shiftRowsDown(int[] positions){ + return shiftRows(positions,1); + } + + public int[] shiftRows(int[] positions, int offset){ + List selection = new ArrayList(); + for (int i = 0; i < positions.length; i++) { + if(positions[i] + offset < 0 || positions[i] + offset > choices.size() - 1) + return positions; + else + selection.add(positions[i]); + } + Collections.sort(selection); + int minPos = selection.get(0); + Collections.reverse(selection); + List> selectedObjects = new ArrayList>(); + for(int i : selection){ + selectedObjects.add(choices.remove(i)); + } + Collections.reverse(selectedObjects); + choices.addAll(minPos+offset, selectedObjects); + this.fireTableDataChanged(); + return new int[]{minPos+offset,minPos+offset+positions.length-1}; + } + + public int[] shiftRows(List> list, int offset){ + if(offset > 0){ + Collections.reverse(list); + } + for(Choice entry : list){ + int previousIndex = choices.indexOf(entry); + int newIndex = previousIndex + offset; + if(newIndex < 0){ + newIndex = choices.size() - 1; + } else if (newIndex > choices.size() - 1){ + newIndex = 0; + } + choices.remove(entry); + choices.add(newIndex,entry); + } + fireTableDataChanged(); + int[] newIndices = new int[list.size()]; + for(int i=0;i> checked = new ArrayList>(choices.size()/2); + List> unchecked = new ArrayList>(choices.size()/2); + for (int i = 0; i < choices.size(); i++) { + Choice c = choices.get(i); + if(c.isSelected()) { checked.add(c); } + else { unchecked.add(c); } + } + choices.clear(); + choices.addAll(checked); + choices.addAll(unchecked); + fireTableDataChanged(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void sortChoicesToTop(List choicesToSort){ + List reversed = new ArrayList(); + reversed.addAll(choicesToSort); + Collections.reverse(reversed); + for(Choice choice : reversed){ + choices.remove(choice); + choices.add(0, choice); + } + } + + public boolean isSingleSelectMode() { + return singleSelectMode; + } + + public void setSingleSelectMode(boolean singleSelectMode) { + this.singleSelectMode = singleSelectMode; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.java new file mode 100644 index 0000000..7725c03 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.java @@ -0,0 +1,16 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +/*** + * Used to notify listeners that a {@link com.nuix.nx.controls.ChoiceTableControl} has changed in some way. + * @author Jason Wells + * + */ +public interface ChoiceTableModelChangeListener { + public void dataChanged(); + public void structureChanged(); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlDeserializationHandler.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlDeserializationHandler.java new file mode 100644 index 0000000..5b4d5e7 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlDeserializationHandler.java @@ -0,0 +1,17 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +import java.awt.Component; + +/*** + * Callback used to allow code to define a custom de-serialization for a particular control from JSON. + * @author Jason Wells + * + */ +public interface ControlDeserializationHandler { + public void deserializeControlData(Object data, Component destinationControl); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlSerializationHandler.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlSerializationHandler.java new file mode 100644 index 0000000..34c2eca --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ControlSerializationHandler.java @@ -0,0 +1,17 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +import java.awt.Component; + +/*** + * Callback used to allow code to define a custom serialization for a particular control to JSON. + * @author Jason Wells + * + */ +public interface ControlSerializationHandler { + public Object serializeControlData(Component sourceControl); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/CsvTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/CsvTableModel.java new file mode 100644 index 0000000..5e2d600 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/CsvTableModel.java @@ -0,0 +1,98 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.swing.table.AbstractTableModel; + +/*** + * Table model for {@link com.nuix.nx.controls.CsvTable}. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class CsvTableModel extends AbstractTableModel { + + private List headers = null; + private List> records = new ArrayList>(); + + public CsvTableModel(List headers){ + this.headers = headers; + } + + @Override + public int getColumnCount() { + return headers.size()+1; + } + + @Override + public int getRowCount() { + return records.size(); + } + + @Override + public Object getValueAt(int row, int col) { + if(col == 0){ + return row + 1; + } else { + Map record = records.get(row); + String header = headers.get(col-1); + if (record.containsKey(header)){ + return record.get(header); + } + else { + return ""; + } + } + } + + @Override + public void setValueAt(Object aValue, int row, int col) { + if(col > 0){ + Map record = records.get(row); + record.put(headers.get(col-1),(String)aValue); + } + } + + @Override + public String getColumnName(int col) { + if(col == 0){ + return "#"; + } else { + return headers.get(col-1); + } + } + + @Override + public boolean isCellEditable(int row, int col) { + return col != 0; + } + + public void addRecord(Map record){ + System.out.println("Adding Record:"); + for (Map.Entry entry : record.entrySet()) { + System.out.println(entry.getKey()+" => "+entry.getValue()); + } + records.add(record); + fireTableRowsInserted(records.size()-1, records.size()-1); + } + + public void removeRecordAt(int row){ + records.remove(row); + fireTableRowsDeleted(row, row); + } + + public List getHeaders() { + return headers; + } + + public List> getRecords() { + return records; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DoubleBoundedRangeModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DoubleBoundedRangeModel.java new file mode 100644 index 0000000..396c624 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DoubleBoundedRangeModel.java @@ -0,0 +1,59 @@ +package com.nuix.nx.controls.models; + +import javax.swing.*; + +@SuppressWarnings("serial") +public class DoubleBoundedRangeModel extends DefaultBoundedRangeModel { + private int digitsToMaintain; + + public DoubleBoundedRangeModel(double value, double extent, double min, double max, int digitsToMaintain) { + super(convertToInt(value, digitsToMaintain), + convertToInt(extent, digitsToMaintain), + convertToInt(min, digitsToMaintain), + convertToInt(max, digitsToMaintain)); + this.digitsToMaintain = digitsToMaintain; + } + + public void setExtent(double extent) { + super.setExtent(convertToInt(extent, digitsToMaintain)); + } + + public void setMaximum(double max) { + super.setMinimum(convertToInt(max, digitsToMaintain)); + } + + public void setMinimum(double min) { + super.setMinimum(convertToInt(min, digitsToMaintain)); + } + + public void setValue(double value) { + super.setValue(convertToInt(value, digitsToMaintain)); + } + + public double getExtentAsDouble() { + return convertToDouble(getExtent(), digitsToMaintain); + } + + public double getMaximumAsDouble() { + return convertToDouble(getMaximum(), digitsToMaintain); + } + + public double getMinimumAsDouble() { + return convertToDouble(getMinimum(), digitsToMaintain); + } + + public double getValueAsDouble() { + return convertToDouble(getValue(), digitsToMaintain); + } + + private static int convertToInt(double toConvert, int digitsToMaintain) { + double multiplier = Math.pow(10.0, digitsToMaintain); + double results = toConvert * multiplier; + return (int)Math.round(results); + } + + private static double convertToDouble(int toConvert, int digitsToMaintain) { + double divider = Math.pow(10.0, digitsToMaintain); + return ((double)toConvert)/divider; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableModel.java new file mode 100644 index 0000000..f4962d4 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableModel.java @@ -0,0 +1,601 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.table.AbstractTableModel; + +import com.nuix.nx.controls.filters.DynamicTableAllRecordsFilter; +import com.nuix.nx.controls.filters.DynamicTableCheckedRecordsFilter; +import com.nuix.nx.controls.filters.DynamicTableContainsFilter; +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; +import com.nuix.nx.controls.filters.DynamicTableRegexFilter; +import com.nuix.nx.controls.filters.DynamicTableUncheckedRecordsFilter; + +/*** + * Table model used to store data for a {@link com.nuix.nx.controls.DynamicTableControl} + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class DynamicTableModel extends AbstractTableModel { + // Built in handling for filters ":checked:" and ":unchecked:" + private static final DynamicTableFilterProvider checkedRecordsFilter = new DynamicTableCheckedRecordsFilter(); + private static final DynamicTableFilterProvider uncheckedRecordsFilter = new DynamicTableUncheckedRecordsFilter(); + + // Built in handling for when there are no externally provided filters that want to handle a filter expression. + // Logic goes: + // 1. If expression is null or empty or only whitespace, all records filter is used + // 2. If regex filter says it will handle the expression (expression compiles successfully to regex), then it will handle + // 3. Finally a "text contains" filter is used which just checks which records contain the provided expression + private static final DynamicTableFilterProvider allRecordsFilter = new DynamicTableAllRecordsFilter(); + private static final DynamicTableFilterProvider regexRecordsFilter = new DynamicTableRegexFilter(); + private static final DynamicTableFilterProvider textContainsRecordsFilter = new DynamicTableContainsFilter(); + + private List headers; + private List records; + private List recordSelection; + private DynamicTableValueCallback valueCallback; + private String filterExpression = ""; + private ChoiceTableModelChangeListener changeListener; + private Map filterMap; + private Set additionalEditableColumns = new HashSet(); + private boolean defaultCheckState = false; + + private List customFilterProviders = new ArrayList<>(); + + /*** + * Create a new instance + * @param headers The headers for each column + * @param records A collection of records to be displayed + * @param valueCallback Callback that yields a value for a cell given a particular record and column number + * @param defaultCheckState Determines whether by default are records checked + */ + public DynamicTableModel(List headers, List records, DynamicTableValueCallback valueCallback, boolean defaultCheckState){ + this.headers = headers; + this.records = records; + this.valueCallback = valueCallback; + this.defaultCheckState = defaultCheckState; + recordSelection = new ArrayList(); + for (int i = 0; i < records.size(); i++) { + recordSelection.add(defaultCheckState); + } + filterMap = new HashMap(); + applyFiltering(); + } + + /*** + * Set a listener which will be notified when changes are made + * @param listener The listener to be notified of changes + */ + public void setChangeListener(ChoiceTableModelChangeListener listener){ + changeListener = listener; + } + + /** + * Get the listener which will be notified whn changes are made. + * @return the listener that is notified of changes + */ + public ChoiceTableModelChangeListener getChangeListener() { + return changeListener; + } + + public void removeChangeListener(ChoiceTableModelChangeListener listener) { + if(null != changeListener && changeListener.equals(listener)) { + changeListener = null; + } + } + + /** + * A reference to the callback used for retrieving values for display. + * @return {@link DynamicTableValueCallback} used to get the values displayed in the table + */ + public DynamicTableValueCallback getValueCallback() { + return this.valueCallback; + } + + @Override + public int getColumnCount() { + return headers.size()+1; + } + + @Override + public int getRowCount() { + return filterMap.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if(columnIndex == 0) + return recordSelection.get(resolveFilterIndex(rowIndex)); + else{ + try { + Object record = records.get(resolveFilterIndex(rowIndex)); + Object value = valueCallback.interact(record,columnIndex-1,false,null); + return value; + } catch (Exception e) { + e.printStackTrace(); + return "Error Occurred: "+e.getMessage(); + } + } + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == 0 || additionalEditableColumns.contains(columnIndex-1); + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + //System.out.println("Setting "+rowIndex+"("+resolveFilterIndex(rowIndex)+"),"+columnIndex+" to "+aValue); + try { + if(columnIndex == 0){ + recordSelection.set(resolveFilterIndex(rowIndex), (Boolean)aValue); + } + else if(additionalEditableColumns.contains(columnIndex-1)){ + Object record = records.get(resolveFilterIndex(rowIndex)); + valueCallback.interact(record,columnIndex-1,true,aValue); + } + notifyChanged(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public String getColumnName(int columnIndex) { + if(columnIndex == 0){ + return ""; + } + else { + return headers.get(columnIndex-1); + } + } + + public void setColumnName(int columnIndex, String updatedValue) { + if(columnIndex == 0){ return; } + else { + headers.set(columnIndex-1, updatedValue); + fireTableStructureChanged(); + changeListener.structureChanged(); + } + } + + @Override + public Class getColumnClass(int columnIndex) { + switch(columnIndex){ + case 0: + return Boolean.class; + default: + return String.class; + } + } + + /*** + * Notify listeners that changes were made + */ + private void notifyChanged(){ + if(changeListener != null){ + changeListener.dataChanged(); + } + + if(filterExpression.equalsIgnoreCase(":checked:") || filterExpression.equalsIgnoreCase(":unchecked:")){ + applyFiltering(); + } + } + + /*** + * Filter the displayed records. When a method such as {@link #getValueAt(int, int)} is called by DynamicTable, the given method will use + * the index mapping stored in {@value #filterMap} to determine for the given display index what item to fetch from + * the actual underlying full collection of records. The act of applying filtering is therefore really just building + * a modified mapping. This method takes the filter expression that has been provided and iteratively apply it to each record + * while building a new index mapping. Once a new mapping has been constructed the associated DynamicTable is informed that data + * has changed and it will re-populate. + */ + private void applyFiltering(){ + Map tempFilterMap = new HashMap(); + + DynamicTableFilterProvider filterProviderToUse = null; + + // If filter expression is empty or null, we interpret that as a "all records" filter + // so we can effectively just build a filter map where each index is present and maps to + // the same index value (key == value). + if(filterExpression == null || filterExpression.trim().isEmpty()) { + filterProviderToUse = allRecordsFilter; + } else { + // If we reach here, that means we have an expression so we need to determine who will + // handle the filtering. We will first check a few built in DynamicTableFilterProviders, then + // any user supplied ones and then finally the fall back built-in regex based filter if nobody + // takes ownership for handling the provided filter expression. + if(checkedRecordsFilter.handlesExpression(filterExpression)) { + filterProviderToUse = checkedRecordsFilter; + } else if(uncheckedRecordsFilter.handlesExpression(filterExpression)) { + filterProviderToUse = uncheckedRecordsFilter; + } else { + + // Now we will see if there is a user provided filter that wants to handle filtering + if(customFilterProviders != null) { + for(DynamicTableFilterProvider customFilterProvider : customFilterProviders) { + if(customFilterProvider.handlesExpression(filterExpression)) { + filterProviderToUse = customFilterProvider; + break; + } + } + } + + // Finally, if we still haven't determined a filter provider to use, then we are going to use + // the built in Regex based filter if it tells us that the provided filter can be compiled into + // a regex properly. If it cannot, we will finally fall back to a basic "text contains" type filter. + if(filterProviderToUse == null) { + if(regexRecordsFilter.handlesExpression(filterExpression)) { filterProviderToUse = regexRecordsFilter; } + else { filterProviderToUse = textContainsRecordsFilter; } + } + } + } + + // Now that we have determined the filter to use, we use it to actual filter the records and build our + // new index mapping. First we call beforeFilter method, then keepRecord on each record and finally afterFilter. + filterProviderToUse.beforeFiltering(filterExpression, records); + + int columnCount = headers.size(); + Map recordValues = new HashMap(); + int filterIndex = 0; + + for (int i = 0; i < records.size(); i++) { + boolean recordIsChecked = recordSelection.get(i); + + // Convert record to columns map using values callback to that filter can inspect displayed values without + // needing deeper knowledge of the underlying record + Object record = records.get(i); + recordValues.clear(); + for (int c = 0; c < columnCount; c++) { + Object colValue = ""; + try { + colValue = valueCallback.interact(record, c, false, null); + } catch (Exception e) { + e.printStackTrace(); + } + recordValues.put(headers.get(c), colValue); + } + + boolean keepRecord = filterProviderToUse.keepRecord(i, recordIsChecked, filterExpression, record, recordValues); + if(keepRecord) { + // Here we record the actual mapping where filter index is the index that will be + // asked for externally and i is the actual index into the full records collection. + tempFilterMap.put(filterIndex, i); + filterIndex++; + } + } + + filterProviderToUse.afterFiltering(); + + // Make the models filter map the one we just built + filterMap = tempFilterMap; + + // Tell the outside world we changed the data + this.fireTableDataChanged(); + + } + + /*** + * Needed to translate record indices between entire collection and + * the currently displayed filter subset of records + * @param filteredIndex + * @return + */ + private int resolveFilterIndex(int filteredIndex){ + if(filterMap.size() < 1){ + return filteredIndex; + } + else{ + return filterMap.get(filteredIndex); + } + } + + /*** + * Set the current filter string + * @param filter The filter string to use + */ + public void setFilter(String filter){ + this.filterExpression = filter; + applyFiltering(); + notifyChanged(); + } + + /*** + * Used to determine whether a given record is checked in the table + * @param record The record to check for + * @return True if the record is present and found to be checked + */ + public boolean isSelected(Object record){ + int recordIndex = records.lastIndexOf(record); + return recordSelection.get(recordIndex); + } + + /*** + * Gets the records associated + * @return The current full set of records + */ + public List getRecords(){ + return records; + } + + /*** + * Sets the records associated + * @param records The records to associate + */ + public void setRecords(List records){ + this.records = records; + for (int i = 0; i < records.size(); i++) { + recordSelection.add(defaultCheckState); + } + filterMap = new HashMap(); + setFilter(""); + } + + /*** + * Adds a single record + * @param record The record to add + */ + public void addRecord(Object record){ + if(record != null) { + this.records.add(record); + recordSelection.add(defaultCheckState); + setFilter(""); + } + } + + /*** + * Remove a record at a specified index + * @param rowIndex The index of the row containing the record to remove + */ + public void remove(int rowIndex){ + this.records.remove(rowIndex); + recordSelection.remove(rowIndex); + setFilter(""); + } + + /*** + * Set the checked state of a record at a given index + * @param index The index to set the checked state of + * @param value The checked state to set + */ + public void setCheckedAtIndex(int index, boolean value){ + if(index >= 0 && index < recordSelection.size()){ + recordSelection.set(index, value); + } + notifyChanged(); + } + + /*** + * Sets the checked state of the currently displayed records to checked. If no filtering + * is currently applied this is all records, otherwise it will be just the filtered subset. + */ + public void checkDisplayedRecords(){ + for(Map.Entry entry : filterMap.entrySet()){ + recordSelection.set(entry.getValue(), true); + this.fireTableCellUpdated(entry.getKey(), 0); + } + notifyChanged(); + } + + /*** + * Sets the checked state of the currently displayed records to unchecked. If no filtering + * is currently applied this is all records, otherwise it will be just the filtered subset. + */ + public void uncheckDisplayedRecords(){ + for(Map.Entry entry : filterMap.entrySet()){ + recordSelection.set(entry.getValue(), false); + this.fireTableCellUpdated(entry.getKey(), 0); + } + notifyChanged(); + } + + /*** + * Gets a list of records which are checked, regardless of whether they are currently displayed + * @return A list of checked records + */ + public List getCheckedRecords(){ + List result = new ArrayList(); + for (int i = 0; i < recordSelection.size(); i++) { + if(recordSelection.get(i) == true) + result.add(records.get(i)); + } + return result; + } + + /*** + * Hashes a record by the values in its columns. Used to store settings to JSON + * @param record The record to hash + * @return An MD5 string based on a concatenation of the column values + */ + protected String hashRecord(Object record){ + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + StringBuffer hashBuffer = new StringBuffer(); + StringBuffer recordContent = new StringBuffer(); + for (int i = 0; i < headers.size(); i++) { + recordContent.append(valueCallback.interact(record, i,false,null).toString()); + } + md.update(recordContent.toString().getBytes()); + byte[] digest = md.digest(); + for (byte b : digest) { + hashBuffer.append(String.format("%02x", b & 0xff)); + } + return hashBuffer.toString(); + } + + /*** + * Generates a series of hashes representing each record by calling {@link #hashRecord(Object)} + * on each record. + * @param records The record to generate hashes for. + * @return A Set of distinct MD5 hash strings + */ + protected Set getRecordHashes(List records){ + Set hashes = new HashSet(); + for(Object record : records){ + hashes.add(hashRecord(record)); + } + + return hashes; + } + + /*** + * Gets the MD5 hashes for all the currently checked records using {@link #getRecordHashes} + * @return MD5 hashes for all the currently checked records + */ + public Set getCheckedRecordHashes(){ + return getRecordHashes(getCheckedRecords()); + } + + /*** + * Sets the checked state of loaded records to checked for records with MD5 hash values + * matching those in the provided list. Used to restore a selection of items which has + * previously been saved. + * @param hashStrings The MD5 hashes to match to records to be checked + */ + public void setCheckedRecordsFromHashes(List hashStrings){ + Set hashes = new HashSet(); + for(String hash : hashStrings){ + hashes.add(hash); + } + for (int i = 0; i < records.size(); i++) { + if(hashes.contains(hashRecord(records.get(i)))){ + recordSelection.set(i, true); + this.fireTableCellUpdated(i, 0); + } else { + recordSelection.set(i, false); + this.fireTableCellUpdated(i, 0); + } + } + } + + /*** + * Gets a count of how many records are currently checked + * @return The checked record count + */ + public int getCheckedValueCount(){ + int result = 0; + for (int i = 0; i < recordSelection.size(); i++) { + if(recordSelection.get(i) == true) + result++; + } + return result; + } + + /*** + * Gets the count of records which are currently displayed. If no filtering is currently applied + * this will be to total record count. If filtering is currently applied this will be the number + * of displayed records. + * @return A count of currently visible records + */ + public int getVisibleValueCount(){ + return filterMap.size(); + } + + /*** + * Gets the total count of records, regardless of check state or display state + * @return The total count of records + */ + public int getTotalValueCount(){ + return records.size(); + } + + /*** + * Shift a series of rows up 1 + * @param positions Position indices of the rows to be shifted + * @return The resulting new positions + */ + public int[] shiftRowsUp(int[] positions){ + return shiftRows(positions,-1); + } + + /*** + * Shift a series of rows down 1 + * @param positions Position indices of the rows to be shifted + * @return The resulting new positions + */ + public int[] shiftRowsDown(int[] positions){ + return shiftRows(positions,1); + } + + /*** + * Shifts a given set of rows (based on row index) a given offset. A value of -1 for the offset is up (earlier in the list) + * while a value of 1 is down (later in the list). + * @param positions Position indices of the rows to be shifted + * @param offset The offset to shift the rows. + * @return The resulting new positions + */ + public int[] shiftRows(int[] positions, int offset){ + List selection = new ArrayList(); + for (int i = 0; i < positions.length; i++) { + if(positions[i] + offset < 0 || positions[i] + offset > records.size() - 1) + return positions; + else + selection.add(positions[i]); + } + Collections.sort(selection); + int minPos = selection.get(0); + Collections.reverse(selection); + List selectedObjects = new ArrayList(); + for(int i : selection){ + selectedObjects.add(records.remove(i)); + } + Collections.reverse(selectedObjects); + records.addAll(minPos+offset, selectedObjects); + this.fireTableDataChanged(); + return new int[]{minPos+offset,minPos+offset+positions.length-1}; + } + + /*** + * Allows caller to define whether a given column is allowed to be editable. The column index + * provided is relative to user data and therefore index 0 is the first record column. + * @param column The column index to set as editable + */ + public void setColumnEditable(int column){ + additionalEditableColumns.add(column); + } + + /*** + * Sets the default checked state of records + * @param defaultCheckState The default check state to use + */ + public void setDefaultCheckState(boolean defaultCheckState) { + this.defaultCheckState = defaultCheckState; + } + + /*** + * Gets the list of filter providers beyond those that are built in, allowing you to add or remove + * custom filter providers. + * @return The current list of custom filter providers + */ + public List getCustomFilterProviders() { + return customFilterProviders; + } + + /*** + * Sets the list of filter providers beyond those that are built in. + * @param customFilterProviders The new list of custom filter providers + */ + public void setCustomFilterProviders(List customFilterProviders) { + this.customFilterProviders = customFilterProviders; + } + + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableValueCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableValueCallback.java new file mode 100644 index 0000000..2a089eb --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/DynamicTableValueCallback.java @@ -0,0 +1,15 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; +/*** + * Callback used by {@link com.nuix.nx.controls.DynamicTableControl} to allow calling code (likely a Ruby script) + * to save changes a user has made to a record in the table. + * @author Jason Wells + * + */ +public interface DynamicTableValueCallback { + public Object interact(Object record, int i, boolean setValue, Object aValue); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ItemStatisticsTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ItemStatisticsTableModel.java new file mode 100644 index 0000000..a0ebe78 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ItemStatisticsTableModel.java @@ -0,0 +1,147 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.controls.models; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.table.AbstractTableModel; + +import com.nuix.nx.NuixConnection; +import com.nuix.nx.helpers.FormatHelpers; + +import nuix.ItemType; +import nuix.ProcessedItem; + +/*** + * Table model used by {@link com.nuix.nx.controls.ProcessingStatusControl}. Used in table to display processing numbers. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class ItemStatisticsTableModel extends AbstractTableModel { + + class Stat{ + public String mimeType; + public int totalProcessed; + public int totalCorrupted; + public int totalEncrypted; + public int totalDeleted; + + public Stat(String mimeType){ + this.mimeType = mimeType; + totalProcessed = 0; + totalCorrupted = 0; + totalEncrypted = 0; + totalDeleted = 0; + } + } + + private String[] headers = new String[]{ + "Kind", + "Type", + "Mime Type", + "Processed", + "Corrupted", + "Encrypted", + "Deleted", + }; + + private Map typeLookup = new HashMap(); + private Map stats = new HashMap(); + private List sortedStats = new ArrayList(); + private long lastUpdated = System.currentTimeMillis(); + + public ItemStatisticsTableModel() { + super(); + if(NuixConnection.getUtilities() != null){ + Set allTypes = NuixConnection.getUtilities().getItemTypeUtility().getAllTypes(); + for(ItemType type : allTypes){ + typeLookup.put(type.getName(),new String[]{type.getKind().getName(),type.getLocalisedName()}); + } + } + } + + @Override + public int getColumnCount() { + return headers.length; + } + + @Override + public int getRowCount() { + return stats.size(); + } + + @Override + public Object getValueAt(int row, int col) { + Stat stat = sortedStats.get(row); + switch (col) { + case 0: + if(typeLookup.containsKey(stat.mimeType)) { + return typeLookup.get(stat.mimeType)[0]; + } else { + return "Unknown"; + } + case 1: + if(typeLookup.containsKey(stat.mimeType)) { + return typeLookup.get(stat.mimeType)[1]; + } else { + return "Unknown"; + } + case 2: return stat.mimeType; + case 3: return FormatHelpers.formatNumber(stat.totalProcessed); + case 4: return FormatHelpers.formatNumber(stat.totalCorrupted); + case 5: return FormatHelpers.formatNumber(stat.totalEncrypted); + case 6: return FormatHelpers.formatNumber(stat.totalDeleted); + default: + return "???"; + } + } + + @Override + public String getColumnName(int column) { + return headers[column]; + } + + @Override + public Class getColumnClass(int col) { + switch (col) { + case 0: + case 1: + case 2: return String.class; + default: + return Integer.class; + } + } + + public void record(ProcessedItem item){ + Stat stat = stats.computeIfAbsent(item.getMimeType(),(k) -> { + Stat result = new Stat(item.getMimeType()); + sortedStats.add(result); + return result; + }); + stat.totalProcessed++; + if(item.isCorrupted()){stat.totalCorrupted++;} + if(item.isEncrypted()){stat.totalEncrypted++;} + if(item.isDeleted()){stat.totalDeleted++;} + + // Time based rate limit the update frequency + if (System.currentTimeMillis() - lastUpdated > 250){ + refresh(); + lastUpdated = System.currentTimeMillis(); + } + } + + public void refresh() { + sortedStats.sort((a,b)->{ + return Integer.compare(a.totalProcessed * -1, b.totalProcessed * -1); + }); + fireTableDataChanged(); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ReportDataModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ReportDataModel.java new file mode 100644 index 0000000..08efd1a --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/ReportDataModel.java @@ -0,0 +1,234 @@ +/****************************************** + Copyright 2022 Nuix + http://www.apache.org/licenses/LICENSE-2.0 + *******************************************/ +package com.nuix.nx.controls.models; + +import javax.swing.*; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.*; + +/** + * Data model for use with the {@link com.nuix.nx.controls.ReportDisplayPanel}. + *

+ * The report is represented by a group of sections, each section being a group of data labels and their values. + * A report might be displayed as: + *

+ *
+ *  SECTION 1
+ *  --------
+ *  Data Field 1                  Value 1
+ *  Data Field 2                  Value 2
+ *
+ *  SECTION 2
+ *  --------
+ *  Data Field 3                  Value 3
+ *
+ *  ...
+ *
+ *

+ * The sections names should be strings, the data field names should be strings, and the data values can be any + * object that has a reasonable toString() representation. + *

+ *

+ * No effort is made by this class to make building the list of sections and data labels threadsafe. As such, the + * sections and data should be built prior to displaying the data in any UI. Updating data values will be + * run from the Swing thread so updating these values during display is safe. + *

+ */ +public class ReportDataModel { + + Map> report = new LinkedHashMap<>(); + + List listeners = new ArrayList<>(); + + /** + * Add a PropertyChangeListener to this object. The listener will be updated when new sections are added and when + * data field values are updated. When a section is added, the Property Name will be the name of the section. When + * a data field value is updated the property name will be a string containing the Section Name and the Data Field + * Name connected with the SECTION_FIELD_DELIM (for example, "Section 1::Data Field 1".) + * @param listener A property change listener to be informed when section and data changes are made. + */ + public void addPropertyChangeListener(PropertyChangeListener listener) { + SwingUtilities.invokeLater( () -> { if (!listeners.contains(listener)) listeners.add(listener); } ); + } + + /** + * Remove the provided listener from this object. + * @param listener The PropertyChangeListener to remove. + */ + public void removePropertyChangeListener(PropertyChangeListener listener) { + SwingUtilities.invokeLater( () -> { if (!listeners.contains(listener)) listeners.remove(listener); } ); + } + + /** + * Add a section to the report, providing data as the section is created. + * + * This method is not guaranteed to be threadsafe. It will inform listeners of the new section. + * + * If the section already exists it will be replaced with the provided data. + * @param sectionName The name of the section. This is for both identification and display purposes so make it + * meaningful for display and also unique. + * @param dataInSection The data to display in the form of a Map. The keys to the map are the data field names and + * are used both for display and as ids, so make them meaningful and unique. + */ + public void addSection(String sectionName, Map dataInSection) { + Map copied = new LinkedHashMap<>(); + + for (String dataField : dataInSection.keySet()) { + Object value = dataInSection.get(dataField); + if (null == value) { + throw new IllegalArgumentException(String .format("The value for the data field named %s is null, which is not allowed.", dataField)); + } else { + copied.put(dataField, value); + } + } + + Map oldSection = report.getOrDefault(sectionName, null); + report.put(sectionName, copied); + notifyOfChange(sectionName, null, oldSection, copied); + } + + /** + * Add a new, empty section to the report. + * + * This method is not guaranteed to be thread safe. + * + * @param sectionName The name of the new section. The name is both an id and displayed, so make it meaningful and + * unique. If the section already exists, it will be replaced and the data in it will be lost. + */ + public void addSection(String sectionName) { + addSection(sectionName, new LinkedHashMap()); + } + + /** + * Add data to the given section. If the section doesn't already exist it will be added with the new data. If + * the data field already exists in the section, it will be replaced with the new value. + * + * This method is not guaranteed to be thread safe. It will not notify the UI of a new data field, though if + * it results in a new section, that section will be added to the UI with the new data field. + * + * @param sectionName The name of the section to add the data to. + * @param dataField The name of the data to add - this will be used both for id and display so make it unique in the + * section and also meaningful to the user. + * @param value The value of the data field - any object with a meaningful toString() method. + */ + public void addData(String sectionName, String dataField, Object value) { + if (report.containsKey(sectionName)) { + Map section = report.get(sectionName); + + if (null == value) { + throw new IllegalArgumentException("The value being added must not be null."); + } else { + Object oldValue = section.getOrDefault(dataField, null); + + if (!value.equals(oldValue)) { + section.put(dataField, value); + notifyOfChange(sectionName, dataField, oldValue, value); + } + } + } else { + this.addSection(sectionName, Map.of(dataField, value)); + } + } + + /** + * Update an existing data field in the given section with a new value. If the section doesn't exist an exception + * will be thrown. If the data field doesn't exist in the section then an exception will be thrown. Otherwise, + * the existing value for the data field will be replaced with the one provided here. + * + * This method will update listeners with new values and the changes should be reflected in the UI. + * + * @param sectionName The name of the section with the data field to update. It must already exist in the report. + * @param dataField The name of the data field to update. It must exist in the section provided. + * @param newValue The value to replace any value currently in the data field. Any object with a meaningful + * toString() method + */ + public void updateData(String sectionName, String dataField, Object newValue) { + if (report.containsKey(sectionName)) { + Map section = report.get(sectionName); + if (section.containsKey(dataField)) { + if (null == newValue) { + throw new IllegalArgumentException("The value being set must not be null."); + } else { + Object oldValue = section.get(dataField); + + if (!newValue.equals(oldValue)) { + section.put(dataField, newValue); + notifyOfChange(sectionName, dataField, oldValue, newValue); + } + + } + } else { + throw new IllegalArgumentException(String.format("The section %s does not have a value for %s", sectionName, dataField)); + } + } else { + throw new IllegalArgumentException(String.format("This report has no section named %s", sectionName)); + } + } + + /** + * Get a String representation of the value of a data field. + * + * If either the section doesn't exist in the report or the data field is not found in the section provided then + * this will return an empty string. + * + * @param sectionName The name of the section where the data can be found + * @param dataField The name of the field whose data is to be retrieved + * @return A string representation of the data field value, or an empty string if the data field can't be located. + */ + public String getDataFieldValue(String sectionName, String dataField) { + if (report.containsKey(sectionName)) { + Map section = report.get(sectionName); + if (section.containsKey(dataField)) { + return section.get(dataField).toString(); + } + } + + // Either section or data field don't exist, return empty value. + return ""; + } + + /** + * Get the list of data fields in the provided section. + * + * If the section doesn't exist in this report an empty set will be provided. + * + * @param sectionName The name of the section whose data fields are to be retrieved. + * @return A Set of strings with the data field names, or an empty Set if the section doesn't exist. + */ + public Set getDataFieldsInSection(String sectionName) { + if (report.containsKey(sectionName)) { + return new LinkedHashSet<>(report.get(sectionName).keySet()); + } + + // Section not in report, return an empty Set + return Set.of(); + } + + /** + * Get the list of sections in this report. + * + * @return a Set of Strings with the names of all the sections in this report. + */ + public Set getSections() { + return new LinkedHashSet<>(report.keySet()); + } + + public static final String SECTION_FIELD_DELIM = "::"; + + private void notifyOfChange(String sectionName, String dataField, Object oldValue, Object newValue) { + SwingUtilities.invokeLater(() -> { + for (PropertyChangeListener listener : listeners) { + String propertyName = dataField == null ? sectionName : sectionName + SECTION_FIELD_DELIM + dataField; + listener.propertyChange(new PropertyChangeEvent( + this, + propertyName, + oldValue, newValue)); + } + }); + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/StringListTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/StringListTableModel.java new file mode 100644 index 0000000..be84ce6 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/models/StringListTableModel.java @@ -0,0 +1,81 @@ +package com.nuix.nx.controls.models; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.table.AbstractTableModel; + +@SuppressWarnings("serial") +public class StringListTableModel extends AbstractTableModel { + + private List values = new ArrayList(); + private boolean editable = false; + + @Override + public int getRowCount() { return values.size(); } + + @Override + public int getColumnCount() { return 1; } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return values.get(rowIndex); + } + + @Override + public String getColumnName(int column) { + return "Values"; + } + + @Override + public Class getColumnClass(int columnIndex) { + return String.class; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return editable; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if(editable) { + values.set(rowIndex, (String)aValue); + } + } + + public int getValueCount() { + return values.size(); + } + + public String getValueAt(int index) { + return values.get(index); + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + this.fireTableDataChanged(); + } + + public void addValue(String value) { + values.add(value); + this.fireTableDataChanged(); + } + + public void removeValueAt(int rowIndex) { + values.remove(rowIndex); + this.fireTableRowsDeleted(rowIndex, rowIndex); + } + + public boolean isEditable() { + return editable; + } + + public void setEditable(boolean editable) { + this.editable = editable; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/page_save.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/page_save.png new file mode 100644 index 0000000000000000000000000000000000000000..caea546af549a0302848f4f478c5bd4aae15bc01 GIT binary patch literal 774 zcmV+h1Nr=kP)SV2@MRD}JQ4(c%G%=dG@_vxH?>gcH#*Ue2HC}9sapf8X?R$Z;XEnm&g zW99mh)5jNw008mK8)r^`_{yH0rNn%u1|SpC(tjf#om=+r#lh+?Kb>DVb9`|C0Bvbv zN3U(>f4-tAC1hosRoA7p(b(hL*V}(j>ug<`&U)|l$6o$)!>PBQ9RQSwn9asj2p*|xhU*R^vq?*Twb0t!lm5}`yW5lRy-U0ZYK?8to!;o!r!XeOE$ z0HB3T+6EEoI4PlR=wonwqJ+TvCoWh&$?CAPVYcU= zD{DS0?AkOtb@-hh^ZLq~FMjxYf19X?pa_YqtgZGvv2TaxcF#KT?O%=_*a-kW_;N|D zakkWsOe!)HsT5WRBiC+p;N-c>0Qwy(1D2MDBC595oXSiR07)sKNk-%9*rDBOO^HUD zZW#;)R&EZpqha<(HK$(tZYU#V29<@0qCXgU{gXeGpc_|pTqQD-WO|}%yKZbeX7k*H z2W~CK$v8NBAq~czrc5A(v51g0Wma7`G8}f=ZcuAiYYxZan@gP(;Ku66M6?bquGiHe z3Q0ya)%Lvk@kLixZfZyU@#UFbv+>pYhcj8TRKSr_sWG8i^X~UA**LvbD3(_Lba3xm ziYcpup*A9qJ$?AA=Og05lndxfwr`!C+O~h|B~4 z01q8H`StcY);%&mId7_+)76ovRpeNWRp&4M?#jx@|E-)x%P*A6t^fc407*qoM6N<$ Ef@ddc(f|Me literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/tick.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/tick.png new file mode 100644 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 zcmV+!0_OdRP)Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pN2bPDNB8 zb~7$DE-^7j^FlWO00Oc}L_t(IPoU$Admhd`_j&>NFaCHie?Ho8Hs+Ml5*E17U`|;EU5K|^7wGK?VJ?<4k-p~BeCJPj0Cr_AY!%s z2l?-=>$_pEEQGa0g3Zw(d|Fw;6y0ndW#s+6J-obk7gKpsI65AnGMw1;1n2{NcGvV> zu-%ZucC!dycRn-Hmyhq6J1xJc*T5uBgjtpe$HR6g!VU#cM?)^PG+?=@4$}qcn6E0w zx1AkE{=UDD1#JzCqIj566Jgg>!>U%JER;CdLPx+c)zH;TSRd@elq?=eu@i}7J) znQE?uAvq2sqH8dwB;jpO7g}RuP#Q`cyu{W(Z{Ow+w$oBv2vXmJiHuZ?iIXszl7JDK zWJ(q#Vzs*yqcSN9xGZM@k2p9+ng%XgSQ|mO&H1??`+8v4sxcvzU`&#Zg*!D^?dpUv zQ-T~W%T38gKcrvO3fRJ`aALdt@>$q4YP@c1#S(?}b`@GKMj?;G+Lj-ZX^sTY+=^iP zslo`Qf=`e|JeEt&Wx1$El0uooA^!d|{X6jb0hq_A{`&4ju>b%707*qoM6N<$f|nz3 AwEzGB literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/zoom_out.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/controls/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..07bf98a79cfea526e250703356dbefdb6b80d166 GIT binary patch literal 708 zcmV;#0z3VQP)TNkCP1&*^7LC~A?iZQEu_hKZoQoXI zA7tfTv}|~Fb8b^XuP>qvDk=)P)vYKtT12;}bKn-mwHWl`1Bb)&{XXC4IY$Nnvj5@N zfekg1Y}gcI!)Cq|u?lR+A{2&=d~S$}&0ei1|7pO6jkZ$6%&{R8TNpk>=dV#j&aWqO zgE~4pNU_-giktFkY-J5_XDlv`7+j?n3mXtxgadILp+c<9cr~t!x1LM6m69Z~V#pLL z22Cs~BoIdtZHTjo7Q|_U0a2OmSF=gCGFB$RVZIP(pixmBqE!^15yd!#9Z{Wh)zB%o zikBFa!WJPvMB(noe(U;k1e~Y|r$}@wh*Ymykd6>E3t69z5DT&Jq-fSG-dPdU{SG;i zbSb3<`RfKgJD|lQC`6(Cdut1PbDV&$M=Y?U)x)A(0iQN+gAeOBg2Z6fr$_Is!%M70 z=n*z7{*s%3rO7yazIO)}qa&~o@WZ=R>!b#mOSR zlCR8M*iRy2j7!PmWiiegA>Og~W1?FLk0*NI^}`$RW The data type of the choice values. Allows any value to be supported as a choice value. + */ +@SuppressWarnings("serial") +public class ChoiceDialog extends JDialog { + + private final JPanel contentPanel = new JPanel(); + private boolean dialogResult = false; + private JTable choiceTable; + private ChoiceTableModel tableModel; + + /*** + * Create a new instance + * @param valueTypeName Determines what the label of the value column will be. + */ + public ChoiceDialog(String valueTypeName) { + setIconImage(Toolkit.getDefaultToolkit().getImage(ChoiceDialog.class.getResource("/icons/nuix_icon.png"))); + setModal(true); + setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); + setSize(400,300); + setLocationRelativeTo(null); + getContentPane().setLayout(new BorderLayout()); + contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5)); + getContentPane().add(contentPanel, BorderLayout.CENTER); + contentPanel.setLayout(new BorderLayout(0, 0)); + tableModel = new ChoiceTableModel(); + tableModel.setChoiceTypeName(valueTypeName); + choiceTable = new JTable(tableModel){ + + //Implement table cell tool tips. + public String getToolTipText(MouseEvent e) { + String tip = null; + java.awt.Point p = e.getPoint(); + int rowIndex = rowAtPoint(p); + try { + //comment row, exclude heading + if(rowIndex != 0){ + tip = tableModel.getDisplayedChoice(rowIndex).getToolTip(); + } + } catch (RuntimeException e1) { + //catch null pointer exception if mouse is over an empty line + } + + return tip; + } + }; + contentPanel.add(choiceTable, BorderLayout.NORTH); + + TableColumn checkColumn = choiceTable.getColumnModel().getColumn(0); + checkColumn.setMinWidth(30); + checkColumn.setMaxWidth(30); + { + JPanel buttonPane = new JPanel(); + buttonPane.setLayout(new FlowLayout(FlowLayout.RIGHT)); + getContentPane().add(buttonPane, BorderLayout.SOUTH); + { + JButton okButton = new JButton("OK"); + okButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + ChoiceDialog.this.dialogResult = true; + ChoiceDialog.this.dispose(); + } + }); + okButton.setActionCommand("OK"); + buttonPane.add(okButton); + getRootPane().setDefaultButton(okButton); + } + { + JButton cancelButton = new JButton("Cancel"); + cancelButton.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + ChoiceDialog.this.dialogResult = false; + ChoiceDialog.this.dispose(); + } + }); + cancelButton.setActionCommand("Cancel"); + buttonPane.add(cancelButton); + } + } + } + + /*** + * Provides a value signifying whether the dialog was cancelled/closed or user hit ok. + * @return True if user selected ok button, cancel otherwise. + */ + public boolean getDialogResult() { + return dialogResult; + } + + public ChoiceTableModel getTableModel() { + return tableModel; + } + + public void setTableModel(ChoiceTableModel tableModel) { + this.tableModel = tableModel; + } + + /*** + * Shows a choice dialog for a provided collection of values. + * @param choiceValues A collection of values to show the user. + * @param typeName Determines the label placed on the second column. + * @param title Determines the title of the dialog. + * @return A list of selected values, or null if the user cancels or closes the dialog. + * @param The data type of the choice values. Allows any value to be supported as a choice value. + */ + public static List forValues(Collection choiceValues, String typeName, String title){ + ChoiceDialog dialog = new ChoiceDialog(typeName); + dialog.setTitle(title); + List> choices = new ArrayList>(); + for(T value : choiceValues){ + choices.add(new Choice(value)); + } + return forChoices(choices,typeName,title); + } + + /*** + * Shows a choice dialog for a provided list of choices. + * @param choices A collection of choices to show the user. + * @param typeName Determines the label placed on the second column. + * @param title Determines the title of the dialog. + * @param singleSelectMode Whether we wish to restrict user to a single selection + * @return A list of selected values, or null if the user cancels or closes the dialog. + * @param The data type of the choice values. Allows any value to be supported as a choice value. + */ + public static List forChoices(List> choices, String typeName, String title, boolean singleSelectMode){ + ChoiceDialog dialog = new ChoiceDialog(typeName); + dialog.setTitle(title); + dialog.getTableModel().setChoices(choices); + dialog.getTableModel().setSingleSelectMode(singleSelectMode); + // With single select mode lets check first choice by default + if(singleSelectMode && choices.size() >= 1) { + dialog.getTableModel().setValueAt(true, 0, 0); + } + dialog.setVisible(true); + if(dialog.getDialogResult() == true) + return dialog.tableModel.getCheckedValues(); + else + return null; + } + + /*** + * Shows a choice dialog for a provided list of choices. + * @param choices A collection of choices to show the user. + * @param typeName Determines the label placed on the second column. + * @param title Determines the title of the dialog. + * @return A list of selected values, or null if the user cancels or closes the dialog. + * @param The data type of the choice values. Allows any value to be supported as a choice value. + */ + public static List forChoices(List> choices, String typeName, String title){ + return forChoices(choices,typeName,title,false); + } + + /*** + * Presents the user with a dialog where they can select tag names. + * @param nuixCase The case to obtain the list of possible tags from. If null is provided will attempt to use result of {@link NuixConnection#getCurrentCase()} + * @return A list of selected tag names, or null if the user cancelled or closed the dialog. + * @throws IOException May throw exception caused by call into Nuix API + */ + public static List forTags(Case nuixCase) throws IOException{ + if(nuixCase == null) + nuixCase = NuixConnection.getCurrentCase(); + return forValues(nuixCase.getAllTags(),"Tag","Select Tags"); + } + + /*** + * Presents the user with a dialog where they can select custodian names. + * @param nuixCase The case to obtain the list of possible custodian names from. If null is provided will attempt to use result of {@link NuixConnection#getCurrentCase()} + * @return A list of selected custodian names, or null if the user cancelled or closed the dialog. + * @throws IOException May throw exception caused by call into Nuix API + */ + public static List forCustodians(Case nuixCase) throws IOException{ + if(nuixCase == null) + nuixCase = NuixConnection.getCurrentCase(); + return forValues(nuixCase.getAllCustodians(),"Custodian","Select Custodians"); + } + + /*** + * Presents the user with a dialog where they can select productions sets. + * @param nuixCase The case to obtain the list of possible production sets from. If null is provided will attempt to use result of {@link NuixConnection#getCurrentCase()} + * @return A list of selected production sets, or null if the user cancelled or closed the dialog. + * @throws IOException May throw exception caused by call into Nuix API + */ + public static List forProductionSets(Case nuixCase) throws IOException{ + if(nuixCase == null) + nuixCase = NuixConnection.getCurrentCase(); + return forValues(nuixCase.getProductionSets(),"Production Set","Select Production Sets"); + } + + /*** + * Presents the user with a dialog where they can select item sets. + * @param nuixCase The case to obtain the list of possible item sets from. If null is provided will attempt to use result of {@link NuixConnection#getCurrentCase()} + * @return A list of selected item sets, or null if the user cancelled or closed the dialog. + * @throws IOException May throw exception caused by call into Nuix API + */ + public static List forItemSets(Case nuixCase) throws IOException{ + List> choices = new ArrayList>(); + if(nuixCase == null) + nuixCase = NuixConnection.getCurrentCase(); + for(ItemSet itemSet : nuixCase.getAllItemSets()){ + choices.add(new Choice(itemSet,itemSet.getName())); + } + return forChoices(choices,"Item Set","Selected Item Sets"); + } + + /*** + * Presents the user with a dialog where they can select evidence items. + * @param nuixCase The case to obtain the list of possible evidence items from. If null is provided will attempt to use result of {@link NuixConnection#getCurrentCase()} + * @return A list of selected evidence items, or null if the user cancelled or closed the dialog. + * @throws IOException May throw exception caused by call into Nuix API + */ + public static List forEvidenceItems(Case nuixCase) throws IOException{ + List> choices = new ArrayList>(); + if(nuixCase == null) + nuixCase = NuixConnection.getCurrentCase(); + for(Item item : nuixCase.getRootItems()){ + choices.add(new Choice(item,item.getName())); + } + return forChoices(choices,"Evidence","Selected Evidence"); + } + + /*** + * Presents the user with a dialog where they can select item kinds. + * @return A list of selected item kinds, or null if the user cancelled or closed the dialog. + */ + public static List forKinds(){ + return forValues(NuixConnection.getUtilities().getItemTypeUtility().getAllKinds(),"Item Kind","Select Item Kinds"); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CommonDialogs.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CommonDialogs.java new file mode 100644 index 0000000..9d6a7f8 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CommonDialogs.java @@ -0,0 +1,416 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.dialogs; + +import java.awt.Component; +import java.io.File; +import java.util.List; + +import javax.swing.JFileChooser; +import javax.swing.JOptionPane; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; + +/*** + * Provides convenience methods for displaying common dialogs. + * @author Jason Wells + * + */ +public class CommonDialogs { + /*** + * Shows a plain message dialog. + * @param message The message + * @param title The dialog title + */ + public static void showMessage(String message, String title){ + JOptionPane.showMessageDialog(null,message,title,JOptionPane.PLAIN_MESSAGE); + } + + /*** + * Shows a plain message dialog. + * @param message The message + */ + public static void showMessage(String message){ + showMessage(message,"Message"); + } + + /*** + * Shows an error message dialog. + * @param message The message + * @param title The dialog title + */ + public static void showError(String message, String title){ + JOptionPane.showMessageDialog(null,message,title,JOptionPane.ERROR_MESSAGE); + } + + /*** + * Shows an error message dialog. + * @param message The message + */ + public static void showError(String message){ + showMessage(message,"Error"); + } + + /*** + * Shows an information message dialog. + * @param message The message + * @param title The title + */ + public static void showInformation(String message, String title){ + JOptionPane.showMessageDialog(null,message,title,JOptionPane.INFORMATION_MESSAGE); + } + + /*** + * Shows an information message dialog. + * @param message The message + */ + public static void showInformation(String message){ + showInformation(message,"Information"); + } + + /*** + * Shows a warning message dialog. + * @param message The message + * @param title The title + */ + public static void showWarning(String message, String title){ + JOptionPane.showMessageDialog(null,message,title,JOptionPane.WARNING_MESSAGE); + } + + /*** + * Shows a warning message dialog. + * @param message The message + */ + public static void showWarning(String message){ + showWarning(message,"Warning"); + } + + /*** + * Shows a confirmation dialog where the users selects "Yes" or "No". + * @param parentComponent The parent component that this dialog is modal to. + * @param message The message + * @param title The dialog title + * @return True if the user selects "Yes", False if the user selects "No" or closes the dialog. + */ + public static boolean getConfirmation(Component parentComponent, String message, String title){ + int result = JOptionPane.showConfirmDialog(parentComponent, message, title, JOptionPane.YES_NO_OPTION); + return result == JOptionPane.YES_OPTION; + } + + /*** + * Shows a confirmation dialog where the users selects "Yes" or "No". + * @param message The message + * @param title The dialog title + * @return True if the user selects "Yes", False if the user selects "No" or closes the dialog. + */ + public static boolean getConfirmation(String message, String title){ + int result = JOptionPane.showConfirmDialog(null, message, title, JOptionPane.YES_NO_OPTION); + return result == JOptionPane.YES_OPTION; + } + + /*** + * Shows a confirmation dialog where the users selects "Yes" or "No". + * @param message The message + * @return True if the user selects "Yes", False if the user selects "No" or closes the dialog. + */ + public static boolean getConfirmation(String message){ + return getConfirmation(message,"Confirm?"); + } + + /*** + * Shows a dialog allowing the user to input some text. + * @param message The message + * @param defaultValue The default value of the text field when the dialog is displayed. + * @return The text the user provided. + */ + public static String getInput(String message, String defaultValue){ + return JOptionPane.showInputDialog(message, defaultValue); + } + + /*** + * Shows a dialog allowing the user to input some text. + * @param message The message + * @return The text the user provided. + */ + public static String getInput(String message){ + return getInput(message,""); + } + + /*** + * Shows a dialog with a drop down, allowing the user to select one of several values. + * @param message The message + * @param choices The choices to present to the user. + * @param defaultValue The default choice. + * @param title The dialog title + * @return The choice the user selected. + */ + public static String getSelection(String message, List choices, String defaultValue, String title){ + if(defaultValue == null){ + defaultValue = choices.get(0); + } + return (String) JOptionPane.showInputDialog(null, message, title, JOptionPane.PLAIN_MESSAGE, null, choices.toArray(), defaultValue); + } + + /*** + * Shows a dialog with a drop down, allowing the user to select one of several values. + * @param message The message + * @param choices The choices to present to the user. + * @param defaultValue The default choice. + * @return The choice the user selected. + */ + public static String getSelection(String message, List choices, String defaultValue){ + return getSelection(message,choices,defaultValue,"Select a Choice"); + } + + /*** + * Shows a dialog with a drop down, allowing the user to select one of several values. + * @param message The message + * @param choices The choices to present to the user. + * @return The choice the user selected. + */ + public static String getSelection(String message, List choices){ + return getSelection(message,choices,null); + } + + /*** + * Shows a dialog allowing the user to select a directory. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File getDirectory(File initialDirectory, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setCurrentDirectory(initialDirectory); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int result = chooser.showOpenDialog(null); + if(result == JFileChooser.APPROVE_OPTION) + return chooser.getSelectedFile(); + else + return null; + } + + /*** + * Shows a dialog allowing the user to select a directory. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File getDirectory(String initialDirectory, String title){ + return getDirectory(new File(initialDirectory), title); + } + + /*** + * Shows a dialog allowing the user to select a file to open. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param fileTypeName The name of the file type to show in the filter such as "Comma Separated Values (*.csv)" + * @param fileExtension The extension of the file type to show in the filter such as "csv". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File openFileDialog(File initialDirectory,String fileTypeName, String fileExtension, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setCurrentDirectory(initialDirectory); + FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter(fileTypeName,fileExtension); + chooser.addChoosableFileFilter(extensionFilter); + chooser.setFileFilter(extensionFilter); + int result = chooser.showOpenDialog(null); + if(result == JFileChooser.APPROVE_OPTION) + return chooser.getSelectedFile(); + else + return null; + } + + /*** + * Shows a dialog allowing the user to select one or more files to open. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param fileTypeName The name of the file type to show in the filter such as "Comma Separated Values (*.csv)" + * @param fileExtension The extension of the file type to show in the filter such as "csv". If null will default to "All Files". + * @param title The dialog title + * @return An array of java.io.File objects representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File[] openMultipleFilesDialog(File initialDirectory,String fileTypeName, String fileExtension, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setCurrentDirectory(initialDirectory); + chooser.setMultiSelectionEnabled(true); + + if(fileExtension != null){ + FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter(fileTypeName,fileExtension); + chooser.addChoosableFileFilter(extensionFilter); + chooser.setFileFilter(extensionFilter); + } + + int result = chooser.showOpenDialog(null); + if(result == JFileChooser.APPROVE_OPTION) + return chooser.getSelectedFiles(); + else + return null; + } + + /*** + * Shows a dialog allowing the user to select one or more files to open. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param fileTypeName The name of the file type to show in the filter such as "Comma Separated Values (*.csv)" + * @param fileExtension The extension of the file type to show in the filter such as "csv". If null will default to "All Files". + * @param title The dialog title + * @return An array of java.io.File objects representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File[] openMultipleFilesDialog(String initialDirectory,String fileTypeName, String fileExtension, String title){ + return openMultipleFilesDialog(new File(initialDirectory),fileTypeName,fileExtension,title); + } + + /*** + * Shows a dialog allowing the user to select a file to open. Applies no extension filtering. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File openFileDialog(File initialDirectory, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setCurrentDirectory(initialDirectory); + chooser.setFileFilter(new FileFilter(){ + @Override + public boolean accept(File arg0) { + return true; + } + + @Override + public String getDescription() { + return "All Files"; + } + + }); + int result = chooser.showOpenDialog(null); + if(result == JFileChooser.APPROVE_OPTION) + return chooser.getSelectedFile(); + else + return null; + } + + public static File[] selectFilesDialog(File initialDirectory, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setMultiSelectionEnabled(true); + chooser.setCurrentDirectory(initialDirectory); + chooser.setFileFilter(new FileFilter(){ + @Override + public boolean accept(File arg0) { + return true; + } + + @Override + public String getDescription() { + return "All Files"; + } + + }); + int result = chooser.showOpenDialog(null); + if(result == JFileChooser.APPROVE_OPTION) + return chooser.getSelectedFiles(); + else + return null; + } + + public static File[] selectFilesDialog(String initialDirectory, String title){ + return selectFilesDialog(new File(initialDirectory),title); + } + + public static File[] selectDirectories(File initialDirectory, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setCurrentDirectory(initialDirectory); + chooser.setMultiSelectionEnabled(true); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + int result = chooser.showOpenDialog(null); + if(result == JFileChooser.APPROVE_OPTION) + return chooser.getSelectedFiles(); + else + return null; + } + + public static File[] selectDirectories(String initialDirectory, String title){ + return selectDirectories(new File(initialDirectory),title); + } + + /*** + * Shows a dialog allowing the user to select a file to open. Applies no extension filtering. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File openFileDialog(String initialDirectory, String title){ + return openFileDialog(new File(initialDirectory),title); + } + + /*** + * Shows a dialog allowing the user to select a file to open. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param fileTypeName The name of the file type to show in the filter such as "Comma Separated Values (*.csv)" + * @param fileExtension The extension of the file type to show in the filter such as "csv". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File openFileDialog(String initialDirectory,String fileTypeName, String fileExtension, String title){ + return openFileDialog(new File(initialDirectory),fileTypeName,fileExtension,title); + } + + /*** + * Shows a dialog allowing the user to select a file to save. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param fileTypeName The name of the file type to show in the filter such as "Comma Separated Values (*.csv)" + * @param fileExtension The extension of the file type to show in the filter such as "csv". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File saveFileDialog(File initialDirectory,String fileTypeName, String fileExtension, String title){ + JFileChooser chooser = new JFileChooser(); + chooser.setDialogTitle(title); + if(initialDirectory == null) + initialDirectory = new File("C:\\"); + chooser.setCurrentDirectory(initialDirectory); + FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter(fileTypeName,fileExtension); + chooser.addChoosableFileFilter(extensionFilter); + chooser.setFileFilter(extensionFilter); + int result = chooser.showSaveDialog(null); + if(result == JFileChooser.APPROVE_OPTION){ + File selectedFile = chooser.getSelectedFile(); + //Ensure there is an extension + if(!selectedFile.getPath().toLowerCase().endsWith("."+fileExtension.toLowerCase())){ + selectedFile = new File(selectedFile.getPath()+"."+fileExtension); + } + return selectedFile; + } + else + return null; + } + + /*** + * Shows a dialog allowing the user to select a file to save. + * @param initialDirectory The initial directory to start in. If null, will default to "C:\". + * @param fileTypeName The name of the file type to show in the filter such as "Comma Separated Values (*.csv)" + * @param fileExtension The extension of the file type to show in the filter such as "csv". + * @param title The dialog title + * @return A java.io.File object representing the users selection, or null if the user selected "Cancel" or closed the dialog. + */ + public static File saveFileDialog(String initialDirectory,String fileTypeName, String fileExtension, String title){ + return saveFileDialog(new File(initialDirectory),fileTypeName,fileExtension,title); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CustomTabPanel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CustomTabPanel.java new file mode 100644 index 0000000..9cb19bc --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/CustomTabPanel.java @@ -0,0 +1,2106 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.dialogs; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.GridLayout; +import java.awt.Insets; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Consumer; + +import javax.imageio.ImageIO; +import javax.swing.BorderFactory; +import javax.swing.BoundedRangeModel; +import javax.swing.ButtonGroup; +import javax.swing.DefaultBoundedRangeModel; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JSlider; +import javax.swing.JSpinner; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.SpinnerNumberModel; +import javax.swing.SwingConstants; +import javax.swing.border.EmptyBorder; +import javax.swing.border.MatteBorder; +import javax.swing.border.TitledBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import javax.swing.text.JTextComponent; + +import org.jdesktop.swingx.JXDatePicker; +import org.joda.time.DateTime; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.jidesoft.swing.SearchableUtils; +import com.nuix.nx.NuixConnection; +import com.nuix.nx.controls.BatchExporterLoadFileSettings; +import com.nuix.nx.controls.BatchExporterNativeSettings; +import com.nuix.nx.controls.BatchExporterPdfSettings; +import com.nuix.nx.controls.BatchExporterTextSettings; +import com.nuix.nx.controls.BatchExporterTraversalSettings; +import com.nuix.nx.controls.ButtonRow; +import com.nuix.nx.controls.ChoiceTableControl; +import com.nuix.nx.controls.ComboItem; +import com.nuix.nx.controls.ComboItemBox; +import com.nuix.nx.controls.CsvTable; +import com.nuix.nx.controls.DynamicTableControl; +import com.nuix.nx.controls.LocalWorkerSettings; +import com.nuix.nx.controls.MultipleChoiceComboBox; +import com.nuix.nx.controls.OcrSettings; +import com.nuix.nx.controls.PathList; +import com.nuix.nx.controls.PathSelectedCallback; +import com.nuix.nx.controls.PathSelectionControl; +import com.nuix.nx.controls.PathSelectionControl.ChooserType; +import com.nuix.nx.controls.StringList; +import com.nuix.nx.controls.models.Choice; +import com.nuix.nx.controls.models.ControlDeserializationHandler; +import com.nuix.nx.controls.models.ControlSerializationHandler; +import com.nuix.nx.controls.models.DoubleBoundedRangeModel; +import com.nuix.nx.controls.models.DynamicTableValueCallback; + +/*** + * This class represents a tab in the {@link TabbedCustomDialog} class. This tab component hosts all the + * various methods for adding controls to a tab. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class CustomTabPanel extends JPanel{ + protected String label = "New Tab"; + protected TabbedCustomDialog owner; + Map controls; + protected Map buttonGroups; + private static final Insets genericInsets = new Insets(2,2,2,2); + GridBagLayout rootLayout; + protected int LABEL_COLUMN_WIDTH = 50; + protected int CONTROL_COLUMN_WIDTH = 500; + private int headersCount = 0; + private int choiceTableHeight = 200; + private boolean hasVerticalFiller = false; + Map enabledStates = null; + private Set skipSerializing = new HashSet(); + + protected CustomTabPanel() { + // Only here so derived class can have custom contructor which does not need to call super() + } + + public CustomTabPanel(String label,TabbedCustomDialog owner) { + this.label = label; + this.owner = owner; + buttonGroups = new HashMap(); + controls = new HashMap(); + + setBorder(new EmptyBorder(5,5,5,5)); + rootLayout = new GridBagLayout(); + rootLayout.columnWidths = new int[]{LABEL_COLUMN_WIDTH,CONTROL_COLUMN_WIDTH}; + setLayout(rootLayout); + } + + protected void addBasicLabelledComponent(String label, Component component){ + addBasicLabelledComponent(label,component,false,true); + } + + protected void addBasicLabelledComponent(String label, Component component, boolean fillVertical) { + addBasicLabelledComponent(label,component,fillVertical,true); + } + + protected GridBagConstraints makeLabelConstraintsForNextRow() { + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = controls.size()+headersCount; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 0; + c.weighty = 0; + c.fill = GridBagConstraints.HORIZONTAL; + c.insets = genericInsets; + c.anchor = GridBagConstraints.EAST; + return c; + } + + protected JLabel makeComponentLabel(String text) { + JLabel labelComponent = new JLabel(text); + labelComponent.setHorizontalAlignment(SwingConstants.RIGHT); + labelComponent.setHorizontalTextPosition(SwingConstants.RIGHT); + labelComponent.setVerticalAlignment(SwingConstants.CENTER); + Font font = labelComponent.getFont(); + Font boldFont = new Font(font.getFontName(), Font.BOLD, font.getSize()); + labelComponent.setFont(boldFont); + + return labelComponent; + } + + protected void addBasicLabelledComponent(String label, Component component, boolean fillVertical, boolean fillHorizontal){ + if(fillVertical) + hasVerticalFiller = true; + GridBagConstraints c = makeLabelConstraintsForNextRow(); + addComponent(makeComponentLabel(label),c); + + c = new GridBagConstraints(); + c.gridx = 1; + c.gridy = controls.size()+headersCount; + c.gridwidth = 1; + c.gridheight = 1; + c.weightx = 0; + + if(fillVertical){ + c.weighty = 1.0; + } + else{c.weighty = 0;} + + if(fillVertical && fillHorizontal){ + c.fill = GridBagConstraints.BOTH; + } else if(fillVertical){ + c.fill = GridBagConstraints.VERTICAL; + } else if(fillHorizontal){ + c.fill = GridBagConstraints.HORIZONTAL; + } + else { + c.fill = GridBagConstraints.NONE; + } + c.insets = genericInsets; + c.anchor = GridBagConstraints.NORTHWEST; + addComponent(component,c); + } + + /*** + * Adds a panel to fill remaining vertical space if none of the controls which have + * been already added are vertical space filling. Helps ensure that controls are packed + * nicely in the GridBagLayout. + */ + void addVerticalFillerAsNeeded(){ + GridBagConstraints c = new GridBagConstraints(); + c.gridx = 0; + c.gridy = controls.size()+headersCount; + c.gridwidth = 2; + c.gridheight = 1; + c.weightx = 1.0; + c.weighty = 1.0; + if(hasVerticalFiller){c.weighty = 0;} + c.fill = GridBagConstraints.BOTH; + c.insets = genericInsets; + c.anchor = GridBagConstraints.NORTHWEST; + JPanel filler = new JPanel(); + //filler.setBorder(BorderFactory.createLineBorder(Color.BLUE, 1)); + addComponent(filler,c); + } + + protected void addComponent(Component component, int col){ + addComponent(component,controls.size()+headersCount,col,1,1,false); + } + + protected void addComponents(Component leftComponent, Component rightComponent){ + int row = controls.size()+headersCount; + addComponent(leftComponent,row,0,1,1,false); + addComponent(rightComponent,row,1,1,1,false); + } + + protected void addComponent(Component component, int row, int col, int width, int height){ + addComponent(component,row,col,width,height,false); + } + + protected void addComponent(Component component, int row, int col, int width, int height, boolean fillVertical){ + if(fillVertical) + hasVerticalFiller = true; + double weighty = 0; + if(fillVertical) weighty = 1.0; + addComponent(component,row,col,width,height,0,weighty); + } + + protected void addComponent(Component component, int row, int col, int width, int height, double weightx, double weighty){ + GridBagConstraints c = new GridBagConstraints(); + c.gridx = col; + c.gridy = row; + c.gridwidth = width; + c.gridheight = height; + c.weightx = weightx; + c.weighty = weighty; + c.fill = GridBagConstraints.BOTH; + c.insets = genericInsets; + c.anchor = GridBagConstraints.NORTHEAST; + addComponent(component,c); + } + + protected void addComponent(Component component, GridBagConstraints c){ + rootLayout.setConstraints(component,c); + add(component); + } + + /*** + * Registers control to be tracked which is important to ensuring that control values are able to be + * passed back to script and eligible for being saved to or loaded from JSON. + * @param identifier Unique identifier associated with this control + * @param component The actual control + * @throws Exception Thrown is something goes wrong + */ + public void trackComponent(String identifier, Component component) throws Exception{ + if(controls.containsKey(identifier) || owner.controls.containsKey(identifier)) + throw new Exception("Cannot append component, component with the identifier already exists: "+identifier); + else { + controls.put(identifier, component); + owner.controls.put(identifier, component); + } + } + + /*** + * Appends a check box control to the tab. + * Calls to {@link #getControl(String)} should cast result to JCheckBox. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param isChecked Whether this is checked initially. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendCheckBox(String identifier, String controlLabel, boolean isChecked) throws Exception{ + JCheckBox component = new JCheckBox(controlLabel); + component.setSelected(isChecked); + addComponent(component,1); + trackComponent(identifier, component); + return this; + } + + /*** + * Appends 2 check boxes, in a single row, to the tab. + * @param identifierA The unique identifier for the first check box. + * @param controlLabelA The label for the first checkbox. + * @param isCheckedA Whether the first check box is checked by default. + * @param identifierB The unique identifier of the second check box. + * @param controlLabelB The label for the second checkbox. + * @param isCheckedB Whether the second check box is checked by default. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if a provided identifier has already been used. + */ + public CustomTabPanel appendCheckBoxes(String identifierA, String controlLabelA, boolean isCheckedA, + String identifierB, String controlLabelB, boolean isCheckedB) throws Exception{ + + JCheckBox componentA = new JCheckBox(controlLabelA); + componentA.setSelected(isCheckedA); + + JCheckBox componentB = new JCheckBox(controlLabelB); + componentB.setSelected(isCheckedB); + + JPanel gridPanel = new JPanel(); + GridLayout gridLayout = new GridLayout(1,2); + gridPanel.setLayout(gridLayout); + gridPanel.add(componentA); + gridPanel.add(componentB); + + addComponent(gridPanel,1); + + trackComponent(identifierA, componentA); + trackComponent(identifierB, componentB); + + return this; + } + + /*** + * Appends a radio button control to the dialog. + * Calls to {@link #getControl(String)} should cast result to JRadioButton. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param radioButtonGroupName The name of the radio button group to assign this to. The group determines what other radio buttons are + * unchecked when a given radio button is checked. + * @param isChecked Whether this is checked initially. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendRadioButton(String identifier, String controlLabel, String radioButtonGroupName, boolean isChecked) throws Exception{ + JRadioButton component = new JRadioButton(controlLabel); + buttonGroups.putIfAbsent(radioButtonGroupName, new ButtonGroup()); + buttonGroups.get(radioButtonGroupName).add(component); + component.setSelected(isChecked); + addComponent(component,1); + trackComponent(identifier, component); + return this; + } + + public CustomTabPanel appendRadioButtonLeft(String identifier, String controlLabel, String radioButtonGroupName, boolean isChecked) throws Exception{ + JRadioButton component = new JRadioButton(controlLabel); + buttonGroups.putIfAbsent(radioButtonGroupName, new ButtonGroup()); + buttonGroups.get(radioButtonGroupName).add(component); + component.setSelected(isChecked); + addComponent(component,0); + trackComponent(identifier, component); + return this; + } + + public CustomTabPanel appendRadioButtonGroup(String groupLabel, String radioButtonGroupName, Map radioButtonChoices) throws Exception{ + JPanel radioButtonContainerPanel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + radioButtonContainerPanel.getInsets().set(1, 1, 1, 1); + + addBasicLabelledComponent(groupLabel, radioButtonContainerPanel); + buttonGroups.putIfAbsent(radioButtonGroupName, new ButtonGroup()); + ButtonGroup group = buttonGroups.get(radioButtonGroupName); + int index = 0; + for(Map.Entry entry : radioButtonChoices.entrySet()){ + JRadioButton rb = new JRadioButton(entry.getKey()); + group.add(rb); + radioButtonContainerPanel.add(rb); + trackComponent(entry.getValue(), rb); + if(index == 0){ rb.setSelected(true); } + index++; + } + + return this; + } + + /*** + * Appends a header label that spans 2 columns. + * @param text The text of the label. + * @return Returns this CustomTabPanel instance to allow for method chaining. + */ + public CustomTabPanel appendHeader(String text){ + JLabel component = new JLabel(text); + Font f = new Font("serif", Font.BOLD, 16); + component.setFont(f); + addComponent(component,controls.size()+headersCount,0,2,1); + headersCount++; + return this; + } + + /*** + * Appends a label that spans 2 columns. + * @param identifier The unique identifier for this control. + * @param text The text of the label. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if this identifier has already been used + */ + public CustomTabPanel appendLabel(String identifier, String text) throws Exception{ + JLabel component = new JLabel(text); + addComponent(component,controls.size()+headersCount,0,2,1); + trackComponent(identifier, component); + headersCount++; + return this; + } + + /*** + * Appends an image to the tab + * @param imageFile File object representing the image file on disk + * @return Returns this CustomTabPanel instance to allow for method chaining. + */ + public CustomTabPanel appendImage(File imageFile){ + BufferedImage picture = null; + try { + picture = ImageIO.read(imageFile); + JLabel component = new JLabel(new ImageIcon(picture)); + component.setAlignmentX(LEFT_ALIGNMENT); + Font f = new Font("serif", Font.BOLD, 16); + component.setFont(f); + addComponent(component,controls.size()+headersCount,0,2,1); + headersCount++; + } catch (IOException e) { + e.printStackTrace(); + } + return this; + } + + /*** + * Appends an image to the tab + * @param imageFile String representing path to the image file on disk + * @return Returns this CustomTabPanel instance to allow for method chaining. + */ + public CustomTabPanel appendImage(String imageFile){ + return appendImage(new File(imageFile)); + } + + /*** + * Appends a separator that spans 2 columns. + * @param label Label text that will appear in the center of the separator. + * @return Returns this CustomTabPanel instance to allow for method chaining. + */ + public CustomTabPanel appendSeparator(String label){ + MatteBorder mb = new MatteBorder(1, 0, 0, 0, Color.BLACK); + TitledBorder tb = new TitledBorder(mb, label, TitledBorder.CENTER, TitledBorder.DEFAULT_POSITION); + JPanel component = new JPanel(); + component.setBorder(tb); + addComponent(component,controls.size()+headersCount,0,2,1); + headersCount++; + return this; + } + + /*** + * Appends a text field control to the dialog. + * Calls to {@link #getControl(String)} should cast result to JTextField. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param text The initial text this text field should contain. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendTextField(String identifier, String controlLabel, String text) throws Exception{ + JTextField component = new JTextField(); + component.setText(text); + addBasicLabelledComponent(controlLabel, component); + trackComponent(identifier, component); + return this; + } + + /*** + * Appends a text field with an associated check box. Text field is enabled/disabled based on whether + * check box is checked. + * @param checkBoxId The unique identifier of the check box. + * @param isChecked Whether the check box is checked by default. + * @param textFieldId The unique identifier of the text field. + * @param textFieldDefault The default text of the text field. + * @param controlLabel The label of the control. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if a provided identifier has already been used. + */ + public CustomTabPanel appendCheckableTextField(String checkBoxId, boolean isChecked, + String textFieldId, String textFieldDefault, String controlLabel) throws Exception{ + + JCheckBox checkComponent = new JCheckBox(controlLabel); + checkComponent.setSelected(isChecked); + + JTextField textComponent = new JTextField(); + textComponent.setText(textFieldDefault); + + addComponents(checkComponent, textComponent); + + trackComponent(checkBoxId, checkComponent); + trackComponent(textFieldId, textComponent); + + enabledOnlyWhenChecked(textFieldId, checkBoxId); + + return this; + } + + /*** + * Appends a JButton control with the specified label and attaches the provided action listener to the + * button. From Ruby pass a block to add a handler to the button. + * @param identifier The unique identifier for this control. + * @param controlLabel The label text of the button + * @param actionListener The action listener to attach to the button. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendButton(String identifier, String controlLabel, ActionListener actionListener) throws Exception{ + JButton component = new JButton(controlLabel); + component.addActionListener(actionListener); + Double preferredHeight = component.getPreferredSize().getHeight(); + component.setPreferredSize(new Dimension(150,preferredHeight.intValue())); + addBasicLabelledComponent("", component, false, false); + trackComponent(identifier, component); + return this; + } + + public ButtonRow appendButtonRow(String identifier) { + ButtonRow buttonRow = new ButtonRow(this); + addComponent(buttonRow,controls.size()+headersCount,0,2,1); + return buttonRow; + } + + /** + * Put together the UI for a Slider control + *

+ * This method doesn't know about the underlying data or its type. But given the name, label, the data model + * which does know this information, and a callback that can translate into a JLabel text, this method can + * construct the visual UI. + *

+ * @param identifier The unique identifier for this control, used to modify the control or get its result value + * @param controlLabel String to display in the UI to label this control + * @param model The {@link BoundedRangeModel} which controls and stores the value and its range limits + * @param displayAdapter A {@link Consumer} which can take a JLabel and display the model's current value in it. + * The consumer will need its own reference to the model, as it will not get the model from + * this callback. + * @return this CustomTabPanel instance to allow method chaining + * @throws Exception if the identifier has already been used + */ + protected CustomTabPanel buildGenericSlider(String identifier, String controlLabel, + BoundedRangeModel model, + Consumer displayAdapter) throws Exception { + JSlider component = new JSlider(JSlider.HORIZONTAL); + component.setModel(model); + + JLabel valueDisplay = new JLabel(); + valueDisplay.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + valueDisplay.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + displayAdapter.accept(valueDisplay); + + model.addChangeListener(event -> { + displayAdapter.accept(valueDisplay); + }); + + GridBagConstraints c = makeLabelConstraintsForNextRow(); + addComponent(makeComponentLabel(controlLabel),c); + + addComponent(component, controls.size()+headersCount, 1, 1, 1, false); + addComponent(valueDisplay, controls.size()+headersCount, 2, 1, 1, false); + + trackComponent(identifier, component); + return this; + } + + /** + * Creates a new slider control that lets the user specify a value within a range using doubles. + *

+ * A slider is best used for setting a value over a long, continuous range where precision may not be most + * important. For example, on a scale of 0 to 10,000 selecting 15 or 16 isn't all that important, but + * moving along the range of that length of scale would be. + *

+ *

+ * This method uses doubles for storage, and allows the selection of numbers up to 5 decimal places deep. + * Behind the spinner is an instance of {@link DoubleBoundedRangeModel} which stores the range and value + * and can be used to update the field. This can be retrieved using: + *

+ *
+	 *     panel = panel.appendSlider(identifier, label, 0.0, 0.0, 1.0);
+	 *     JSlider slider = (JSlider)panel.getControl(identifier);
+	 *     DoubleBoundedRangeModel model = slider.getModel();
+	 * 
+ * @param identifier The unique identifier for this control, used to modify the control or get its result value + * @param controlLabel String to display in the UI to label this control + * @param initialValue The initial position for slider and resulting value + * @param min The minimum assignable value + * @param max The maximum assignable value + * @return this CustomTabPanel instance to allow method chaining + * @throws Exception if the identifier has already been used + */ + public CustomTabPanel appendSlider(String identifier, String controlLabel, double initialValue, double min, double max) throws Exception { + DoubleBoundedRangeModel model = new DoubleBoundedRangeModel(initialValue, 0.0, min, max,5); + model.setValue(initialValue); + + long integral = Double.valueOf(max).longValue(); + int integralLength = String.valueOf(integral).length(); + int decimalLength = 6; // Period plus 5 decimal places + String displayFormat = "%" + (integralLength + decimalLength) + ".5f"; + + return buildGenericSlider(identifier, controlLabel, model, label -> { + label.setText(String.format(displayFormat, model.getValueAsDouble())); + }); + } + + /** + * Creates a new slider control that lets the user specify a value within the range of 0.0 to 1.0. + *

+ * A slider is best used for setting a value over a long, continuous range where precision may not be most + * important. For example, on a scale of 0 to 10,000 selecting 15 or 16 isn't all that important, but + * moving along the range of that length of scale would be. + *

+ *

+ * This method uses doubles for storage, and allows the selection of numbers from 0 to 1 with up to 5 decimal + * places precision. Behind the spinner is an instance of {@link DoubleBoundedRangeModel} which stores the + * range and value and can be used to update the field. This can be retrieved using: + *

+ *
+	 *     panel = panel.appendSlider(identifier, label, 0.0);
+	 *     JSlider slider = (JSlider)panel.getControl(identifier);
+	 *     DoubleBoundedRangeModel model = (DoubleBoundedRangeModel)slider.getModel();
+	 * 
+ * @param identifier The unique identifier for this control, used to modify the control or get its result value + * @param controlLabel String to display in the UI to label this control + * @param initialValue The initial position for slider and resulting value + * @return this CustomTabPanel instance to allow method chaining + * @throws Exception if the identifier has already been used + */ + public CustomTabPanel appendSlider(String identifier, String controlLabel, double initialValue) throws Exception { + return appendSlider(identifier, controlLabel, initialValue, 0.0, 1.0); + } + + /** + * Creates a new slider control that lets the user specify a value within a range using integers. + *

+ * A slider is best used for setting a value over a long, continuous range where precision may not be most + * important. For example, on a scale of 0 to 10,000 selecting 15 or 16 isn't all that important, but + * moving along the range of that length of scale would be. + *

+ *

+ * This method uses ints for storage Behind the spinner is an instance of {@link DefaultBoundedRangeModel} + * which stores the range and value and can be used to update the field. This can be retrieved using: + *

+ *
+	 *     panel = panel.appendSlider(identifier, label, 10, 0, 100);
+	 *     JSlider slider = (JSlider)panel.getControl(identifier);
+	 *     BoundedRangeModel model = slider.getModel();
+	 * 
+ * @param identifier The unique identifier for this control, used to modify the control or get its result value + * @param controlLabel String to display in the UI to label this control + * @param initialValue The initial position for slider and resulting value + * @param min The minimum assignable value + * @param max The maximum assignable value + * @return this CustomTabPanel instance to allow method chaining + * @throws Exception if the identifier has already been used + */ + public CustomTabPanel appendSlider(String identifier, String controlLabel, int initialValue, int min, int max) throws Exception { + DefaultBoundedRangeModel model = new DefaultBoundedRangeModel(initialValue, 0, min, max); + model.setValue(initialValue); + int integralLength = String.valueOf(max).length(); + + String displayFormat = "%" + integralLength + "d"; + + return buildGenericSlider(identifier, controlLabel, model, label -> { + label.setText(String.format(displayFormat, model.getValue())); + }); + } + + /** + * Creates a new slider control that lets the user specify a value in the range 0 to 100. + *

+ * A slider is best used for setting a value over a long, continuous range where precision may not be most + * important. For example, on a scale of 0 to 10,000 selecting 15 or 16 isn't all that important, but + * moving along the range of that length of scale would be. + *

+ *

+ * This method uses ints for storage Behind the spinner is an instance of {@link DefaultBoundedRangeModel} + * which stores the range and value and can be used to update the field. This can be retrieved using: + *

+ *
+	 *     panel = panel.appendSlider(identifier, label, 10);
+	 *     JSlider slider = (JSlider)panel.getControl(identifier);
+	 *     BoundedRangeModel model = slider.getModel();
+	 * 
+ * @param identifier The unique identifier for this control, used to modify the control or get its result value + * @param controlLabel String to display in the UI to label this control + * @param initialValue The initial position for slider and resulting value + * @return this CustomTabPanel instance to allow method chaining + * @throws Exception if the identifier has already been used + */ + public CustomTabPanel appendSlider(String identifier, String controlLabel, int initialValue) throws Exception { + return appendSlider(identifier, controlLabel, initialValue, 0, 100); + } + + /** + * Creates a new slider control that lets the user specify a value in the range 0 to 100 with an initial value of + * 50. + *

+ * A slider is best used for setting a value over a long, continuous range where precision may not be most + * important. For example, on a scale of 0 to 10,000 selecting 15 or 16 isn't all that important, but + * moving along the range of that length of scale would be. + *

+ *

+ * This method uses ints for storage Behind the spinner is an instance of {@link DefaultBoundedRangeModel} + * which stores the range and value and can be used to update the field. This can be retrieved using: + *

+ *
+	 *     panel = panel.appendSlider(identifier, label);
+	 *     JSlider slider = (JSlider)panel.getControl(identifier);
+	 *     BoundedRangeModel model = slider.getModel();
+	 * 
+ * @param identifier The unique identifier for this control, used to modify the control or get its result value + * @param controlLabel String to display in the UI to label this control + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception if the identifier has already been used + */ + public CustomTabPanel appendSlider(String identifier, String controlLabel) throws Exception { + return appendSlider(identifier, controlLabel, 50, 0, 100); + } + + /*** + * Creates a up/down number picker control (known in Java as a Spinner). + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param initialValue Initial value for the control. + * @param min The minimum value for the control. + * @param max The maximum value for the control. + * @param step Determines the "step" value, which determines how much up/down buttons increment. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendSpinner(String identifier, String controlLabel, int initialValue, int min, int max, int step) throws Exception { + JSpinner component = new JSpinner(); + component.setValue(initialValue); + double preferredHeight = component.getPreferredSize().getHeight(); + component.setPreferredSize(new Dimension(150, (int) preferredHeight)); + component.setModel(new SpinnerNumberModel(initialValue, min, max, step)); + addBasicLabelledComponent(controlLabel, component, false, false); + trackComponent(identifier, component); + return this; + } + + /*** + * Creates a up/down number picker control (known in Java as a Spinner). Uses a default step of 1. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param initialValue Initial value for the control. + * @param min The minimum value for the control. + * @param max The maximum value for the control. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendSpinner(String identifier, String controlLabel, int initialValue, int min, int max) throws Exception { + return appendSpinner(identifier,controlLabel,initialValue,min,max,1); + } + + /*** + * Creates a up/down number picker control (known in Java as a Spinner). Uses a default step of 1, a minimum of 0 + * and a maximum of Integer.MAX_VALUE. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param initialValue Initial value for the control. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendSpinner(String identifier, String controlLabel, int initialValue) throws Exception { + return appendSpinner(identifier,controlLabel,initialValue,0,Integer.MAX_VALUE,1); + } + + /*** + * Creates a up/down number picker control (known in Java as a Spinner). Uses a default step of 1, a minimum of 0 + * , a maximum of Integer.MAX_VALUE and an initial value of 0. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendSpinner(String identifier, String controlLabel) throws Exception { + return appendSpinner(identifier,controlLabel,0,0,Integer.MAX_VALUE,1); + } + + /*** + * Appends a date picker field control to the dialog + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param defaultDate The default date to display. Can be null for no default, a java.util.Date object or a String in the format "yyyymmdd". + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendDatePicker(String identifier, String controlLabel, Object defaultDate) throws Exception{ + JXDatePicker component = new JXDatePicker(); + component.setFormats(new String[] {"yyyyMMdd"}); + + if(defaultDate != null){ + if(defaultDate instanceof Date){ + component.setDate((Date) defaultDate); + } + else if (defaultDate instanceof DateTime){ + component.setDate(((DateTime)defaultDate).toDate()); + } + else if (defaultDate instanceof String){ + DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); + Date date = dateFormat.parse((String) defaultDate); + component.setDate((Date) date); + } + } + + Double preferredHeight = component.getPreferredSize().getHeight(); + component.setPreferredSize(new Dimension(150,preferredHeight.intValue())); + addBasicLabelledComponent(controlLabel, component,false,false); + trackComponent(identifier, component); + return this; + } + + /*** + * Appends a date picker field control to the dialog with the default date being today's date. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendDatePicker(String identifier, String controlLabel) throws Exception{ + return appendDatePicker(identifier, controlLabel, null); + } + + /*** + * Appends a text area control to the dialog. + * Calls to {@link #getControl(String)} should cast result to JTextArea. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param text The initial text this text area should contain. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendTextArea(String identifier, String controlLabel, String text) throws Exception{ + JPanel panel = new JPanel(); + //panel.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,150)); + panel.setLayout(new BorderLayout()); + JTextArea textArea = new JTextArea(); + JScrollPane scroll = new JScrollPane(textArea); + panel.add(scroll,BorderLayout.CENTER); + textArea.setText(text); + if(controlLabel != null && controlLabel.length() > 0){ + addBasicLabelledComponent(controlLabel, panel, true); + } else { + addComponent(panel,controls.size()+headersCount,0,2,1,true); + headersCount++; + } + + trackComponent(identifier, textArea); + return this; + } + + /*** + * Appends a read only text area control for you to place some user information. + * Calls to {@link #getControl(String)} should cast result to JTextArea. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param text The initial text this text area should contain. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendInformation(String identifier, String controlLabel, String text) throws Exception{ + JPanel panel = new JPanel(); + //panel.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,100)); + panel.setLayout(new BorderLayout()); + JTextArea textArea = new JTextArea(); + JScrollPane scroll = new JScrollPane(textArea); + scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + panel.add(scroll,BorderLayout.CENTER); + textArea.setText(text); + textArea.setEditable(false); + addComponent(panel,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier, textArea); + return this; + } + + /*** + * Appends a read only text area control for you to place some user information similar to {@link #appendInformation(String, String, String)}. + * This method differs from {@link #appendInformation(String, String, String)} in that the created text area will be assigned a monospaced + * font to preserve formatting of the provided text. + * Calls to {@link #getControl(String)} should cast result to JTextArea. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param text The initial text this text area should contain. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendFormattedInformation(String identifier, String controlLabel, String text) throws Exception{ + JPanel panel = new JPanel(); + //panel.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,100)); + panel.setLayout(new BorderLayout()); + JTextArea textArea = new JTextArea(); + Font f = new Font("Consolas", Font.PLAIN, 11); + textArea.setFont(f); + JScrollPane scroll = new JScrollPane(textArea); + scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + panel.add(scroll,BorderLayout.CENTER); + textArea.setText(text); + textArea.setEditable(false); + addComponent(panel,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier, textArea); + return this; + } + + /*** + * Appends a control with controls used to provide worker settings, as passed to {@link nuix.ParallelProcessingConfigurable#setParallelProcessingSettings(Map)}. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendLocalWorkerSettings(String identifier) throws Exception{ + LocalWorkerSettings component = new LocalWorkerSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a control with controls used to provide traversal settings, as passed to {@link nuix.BatchExporter#setTraversalOptions(Map)}. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendBatchExporterTraversalSettings(String identifier) throws Exception { + BatchExporterTraversalSettings component = new BatchExporterTraversalSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a control with controls used to provide native export settings, as passed to {@link nuix.BatchExporter#addProduct(String, Map)} for the "native" product. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendBatchExporterNativeSettings(String identifier) throws Exception { + BatchExporterNativeSettings component = new BatchExporterNativeSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a control with controls used to provide text export settings, as passed to {@link nuix.BatchExporter#addProduct(String, Map)} for the "text" product. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendBatchExporterTextSettings(String identifier) throws Exception { + BatchExporterTextSettings component = new BatchExporterTextSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a control with controls used to provide PDF export settings, as passed to {@link nuix.BatchExporter#addProduct(String, Map)} for the "pdf" product. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendBatchExporterPdfSettings(String identifier) throws Exception { + BatchExporterPdfSettings component = new BatchExporterPdfSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a control with controls used to provide loadfile export settings, as passed to {@link nuix.BatchExporter#addLoadFile(String, Map)}. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendBatchExporterLoadFileSettings(String identifier) throws Exception { + BatchExporterLoadFileSettings component = new BatchExporterLoadFileSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a control with controls used to provide OCR settings, as passed to {@link nuix.OcrProcessor}. + * @param identifier The unique identifier of this control. Note values of nested controls will be returns as a Map under this identifier. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendOcrSettings(String identifier) throws Exception { + OcrSettings component = new OcrSettings(); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier,component); + return this; + } + + /*** + * Appends a password text field control to the dialog. + * Calls to {@link #getControl(String)} should cast result to JPasswordField. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param text The initial text this field should contain. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendPasswordField(String identifier, String controlLabel, String text) throws Exception{ + JPasswordField component = new JPasswordField(); + component.setText(text); + addBasicLabelledComponent(controlLabel, component); + trackComponent(identifier, component); + return this; + } + + /*** + * Appends a control which allows the user to select multiple choices. + * See {@link #appendStringChoiceTable(String, String, Collection)} for a simpler usage. + * @param identifier The unique identifier for this control. + * @param controlLabel The label for this control. + * @param choices The list of {@link Choice} objects to display. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + * @param The data type of the choice values. Allows any value to be supported as a choice value. + */ + public CustomTabPanel appendChoiceTable(String identifier, String controlLabel, List> choices) throws Exception{ + ChoiceTableControl component = new ChoiceTableControl(); + component.setChoices(choices); + component.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,choiceTableHeight)); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier, component); + return this; + } + + /*** + * Appends a table control with the specified headers, which is capable of importing a CSV with the same headers. + * @param identifier The unique identifier for this control. + * @param headers List of headers for the table. Also determines import CSV columns. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendCsvTable(String identifier, List headers) throws Exception{ + CsvTable component = new CsvTable(headers); + component.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,choiceTableHeight)); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier, component); + return this; + } + + /*** + * Appends a table control with the specified headers, which is capable of importing a CSV with the same headers. + * @param identifier The unique identifier for this control. + * @param headers List of headers for the table. Also determines import CSV columns. + * @param defaultImportDirectory Directory path that should be default directory opened when user clicks import. + * @return Returns this CustomTabPanel instance to allow for method chaining. + * @throws Exception May throw an exception if the provided identifier has already been used. + */ + public CustomTabPanel appendCsvTable(String identifier, List headers, String defaultImportDirectory) throws Exception{ + CsvTable component = new CsvTable(headers); + component.setDefaultImportDirectory(defaultImportDirectory); + component.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,choiceTableHeight)); + addComponent(component,controls.size()+headersCount,0,2,1,true); + headersCount++; + trackComponent(identifier, component); + return this; + } + + /*** + * Appends a fairly flexible table control to the tab. Table control relies on provided callback to get column values and optionally write + * column value changes back to underlying row objects. + *
+ 	 * {@code
+	 * # Define what the headers will be
+	 * headers = [
+	 * 	"First",
+	 * 	"Last",
+	 * 	"Location",
+	 * 	"Occupation",
+	 * ]
+	 * 
+	 * # Define the records which will be displayed, this can essentially look
+	 * # like whatever you want as later the callback we define will be responsible
+	 * # for getting/setting values for individual records
+	 * records = [
+	 * 	{first: "Luke", last: "Skywalker", location: "Tatooine", occupation: "Moisture Farmer"},
+	 * 	{first: "Beru", last: "Lars", location: "Tatooine", occupation: "Moisture Farmer"},
+	 * 	{first: "Owen", last: "Lars", location: "Tatooine", occupation: "Moisture Farmer"},
+	 * 	{first: "Obi-wan", last: "Kenobi", location: "Tatooine", occupation: "Hermit"},
+	 * ]
+	 * 
+	 * # Now we add the dynamic table, configuring headers, records and callback which will get/set cell values
+	 * # Method signature
+	 * # public CustomTabPanel appendDynamicTable(String identifier, String controlLabel, List headers,
+	 * # 	List records, DynamicTableValueCallback callback)
+	 * #
+	 * # Callback signature
+	 * # interact(Object record, int i, boolean setValue, Object aValue)
+	 * #
+	 * main_tab.appendDynamicTable("characters_table","Characters",headers,records) do |record, column_index, setting_value, value|
+	 * 	# record: The current record the table wants to interact with from the records array
+	 * 	# column_index: The column index the table wants to interact with
+	 * 	# setting_value: True if the table wishes to set a new value for this record/column index, false if reading the current value
+	 * 	# value: If setting_value is true, the value the table wishes to store back on the item
+	 * 
+	 * 	# Debugging messages
+	 * 	show_debug = false
+	 * 	if show_debug
+	 * 		if setting_value
+	 * 			puts "Setting column #{column_index} with value '#{value}' in object:\n#{record.inspect}"
+	 * 		else
+	 * 			puts "Getting column #{column_index} in object:\n#{record.inspect}"
+	 * 		end
+	 * 	end
+	 * 
+	 * 	if setting_value
+	 * 		# Logic for setting values
+	 * 		case column_index
+	 * 		when 0
+	 * 			# Example of modifying value before storing it
+	 * 			record[:first] = value.capitalize
+	 * 		when 1
+	 * 			record[:last] = value.capitalize
+	 * 		when 2
+	 * 			record[:location] = value
+	 * 		when 3
+	 * 			record[:occupation] = value
+	 * 		end
+	 * 	else
+	 * 		# Logic for getting values
+	 * 		case column_index
+	 * 		when 0
+	 * 			next record[:first]
+	 * 		when 1
+	 * 			next record[:last]
+	 * 		when 2
+	 * 			next record[:location]
+	 * 		when 3
+	 * 			next record[:occupation]
+	 * 		end
+	 * 	end
+	 * end
+	 * }
+	 * 
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param headers List of headers for this control.
+	 * @param records A List of objects representing each row in the table.  Can be any object provided callback is able to get values from.
+	 * @param callback A callback which is responsible for reading and potentially writing values associated to each column in the table.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendDynamicTable(String identifier, String controlLabel,
+			List headers, List records, DynamicTableValueCallback callback) throws Exception{
+		DynamicTableControl component = new DynamicTableControl(headers,records,callback);
+		component.setPreferredSize(new Dimension(CONTROL_COLUMN_WIDTH,choiceTableHeight));
+		addComponent(component,controls.size()+headersCount,0,2,1,true);
+		headersCount++;
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows the user to select multiple choices.
+	 * Calls to {@link #getControl(String)} should cast result to ChoiceTableControl<String>.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices The collection of String choices to display.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendStringChoiceTable(String identifier, String controlLabel, Collection choices) throws Exception{
+		List> actualChoices = new ArrayList>();
+		for(String choice : choices){
+			actualChoices.add(new Choice(choice));
+		}
+		return appendChoiceTable(identifier, controlLabel, actualChoices);
+	}
+
+	/***
+	 * Appends a combo box control allowing a user to select one of many choices.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices A collection of strings which will be the available choices
+	 * @param callback Optional (may be null) callback which will be invoked when the combo box value changes
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendComboBox(String identifier, String controlLabel, Collection choices, Runnable callback) throws Exception{
+		JComboBox component = new JComboBox();
+		for(String choice : choices){
+			component.addItem(choice);
+		}
+		
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		
+		if(callback != null){
+			component.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					callback.run();
+				}
+			});
+		}
+		
+		return this;
+	}
+	
+	/***
+	 * Appends a combo box control allowing a user to select one of many choices and allows for filtering choices by typing in a value.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices A collection of strings which will be the available choices
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendSearchableComboBox(String identifier, String controlLabel, Collection choices) throws Exception{
+		JComboBox component = new JComboBox();
+		for(String choice : choices){
+			component.addItem(choice);
+		}
+		
+		component.setEditable(false);
+		SearchableUtils.installSearchable(component);
+		
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		
+		return this;
+	}
+	
+	/***
+	 * Appends a combo box control allowing a user to select one of many choices.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices A collection of strings which will be the available choices
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendComboBox(String identifier, String controlLabel, Collection choices) throws Exception {
+		return appendComboBox(identifier,controlLabel,choices,null);
+	}
+	
+	/***
+	 * Appends a combo box control which takes a list of {@link ComboItem} instances, allowing you to have each entry represent a specific value
+	 * while having a separate value as the labeled choice displayed in the combo box.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices A collection of {@link ComboItem} objects to be used as the choices.
+	 * @param callback Optional (may be null) callback which will be invoked when the combo box value changes.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendComboItemBox(String identifier, String controlLabel, List choices, Runnable callback) throws Exception{
+		ComboItemBox component = new ComboItemBox();
+		component.setValues(choices);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		
+		if(callback != null){
+			component.addActionListener(new ActionListener() {
+				@Override
+				public void actionPerformed(ActionEvent e) {
+					callback.run();
+				}
+			});
+		}
+		
+		return this;
+	}
+	
+	/***
+	 * Appends a combo box which allows you to select multiple choices from its drop down list by checking them.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices A List of String choices
+	 * @param defaultCheckedChoices A List of String choices to be checked initially
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendMultipleChoiceComboBox(String identifier, String controlLabel, List choices, List defaultCheckedChoices) throws Exception {
+		MultipleChoiceComboBox component = new MultipleChoiceComboBox();
+		component.setChoices(choices);
+		component.setCheckedChoices(defaultCheckedChoices);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+				
+		return this;
+	}
+	
+	/***
+	 * Appends a combo box which allows you to select multiple choices from its drop down list by checking them.  Starts
+	 * off with no choices initially checked.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param choices A List of String choices
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendMultipleChoiceComboBox(String identifier, String controlLabel, List choices) throws Exception {
+		MultipleChoiceComboBox component = new MultipleChoiceComboBox();
+		component.setChoices(choices);
+		component.uncheckAll();
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+				
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a directory.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendDirectoryChooser(String identifier, String controlLabel) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.DIRECTORY,null,null,"Choose Directory");
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a directory.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param initialDirectory A string containing a directory path which will be the initially selected directory when selection dialog is shown.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendDirectoryChooser(String identifier, String controlLabel, String initialDirectory) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.DIRECTORY,null,null,"Choose Directory");
+		component.setInitialDirectory(initialDirectory);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a directory.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param callback Callback which will be invoked when user selects a file using the choose button
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendDirectoryChooser(String identifier, String controlLabel, PathSelectedCallback callback) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.DIRECTORY,null,null,"Choose Directory");
+		component.whenPathSelected(callback);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a directory.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param initialDirectory A string containing a directory path which will be the initially selected directory when selection dialog is shown.
+	 * @param callback Callback which will be invoked when user selects a file using the choose button
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendDirectoryChooser(String identifier, String controlLabel, String initialDirectory,
+			PathSelectedCallback callback) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.DIRECTORY,null,null,"Choose Directory");
+		component.setInitialDirectory(initialDirectory);
+		component.whenPathSelected(callback);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a file to open.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param fileTypeName The name portion of the file type filter.
+	 * @param fileExtension The extension (without period) to filter the visible files on.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendOpenFileChooser(String identifier, String controlLabel, String fileTypeName, String fileExtension) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.OPEN_FILE,fileTypeName,fileExtension,"Choose Existing File");
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a file to open.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param fileTypeName The name portion of the file type filter.
+	 * @param fileExtension The extension (without period) to filter the visible files on.
+	 * @param initialDirectory A string containing a directory path which will be the initially selected directory when selection dialog is shown.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendOpenFileChooser(String identifier, String controlLabel, String fileTypeName, String fileExtension,
+			String initialDirectory) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.OPEN_FILE,fileTypeName,fileExtension,"Choose Existing File");
+		component.setInitialDirectory(initialDirectory);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a file to open.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param fileTypeName The name portion of the file type filter.
+	 * @param fileExtension The extension (without period) to filter the visible files on.
+	 * @param callback Callback which will be invoked when user selects a file using the choose button
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendOpenFileChooser(String identifier, String controlLabel, String fileTypeName, String fileExtension, PathSelectedCallback callback) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.OPEN_FILE,fileTypeName,fileExtension,"Choose Existing File");
+		component.whenPathSelected(callback);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a file to open.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param fileTypeName The name portion of the file type filter.
+	 * @param fileExtension The extension (without period) to filter the visible files on.
+	 * @param initialDirectory A string containing a directory path which will be the initially selected directory when selection dialog is shown.
+	 * @param callback Callback which will be invoked when user selects a file using the choose button
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendOpenFileChooser(String identifier, String controlLabel, String fileTypeName, String fileExtension, String initialDirectory,
+			PathSelectedCallback callback) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.OPEN_FILE,fileTypeName,fileExtension,"Choose Existing File");
+		component.setInitialDirectory(initialDirectory);
+		component.whenPathSelected(callback);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a file to save.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param fileTypeName The name portion of the file type filter.
+	 * @param fileExtension The extension (without period) to filter the visible files on.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendSaveFileChooser(String identifier, String controlLabel, String fileTypeName, String fileExtension) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.SAVE_FILE,fileTypeName,fileExtension,"Choose File");
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a control which allows a user to select a file to save.
+	 * @param identifier The unique identifier for this control.
+	 * @param controlLabel The label for this control.
+	 * @param fileTypeName The name portion of the file type filter.
+	 * @param fileExtension The extension (without period) to filter the visible files on.
+	 * @param initialDirectory A string containing a directory path which will be the initially selected directory when selection dialog is shown.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendSaveFileChooser(String identifier, String controlLabel, String fileTypeName, String fileExtension,
+			String initialDirectory) throws Exception{
+		PathSelectionControl component = new PathSelectionControl(ChooserType.SAVE_FILE,fileTypeName,fileExtension,"Choose File");
+		component.setInitialDirectory(initialDirectory);
+		addBasicLabelledComponent(controlLabel, component);
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a list box allowing the user to specify multiple file and directory paths.
+	 * @param identifier The unique identifier for this control.
+	 * @param initialPaths Initial values to populate the list with, can be null.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendPathList(String identifier, List initialPaths) throws Exception{
+		PathList component = new PathList();
+		if(initialPaths != null)
+			component.setPaths(initialPaths);
+		addComponent(component,controls.size()+headersCount,0,2,1,true);
+		headersCount++;
+		trackComponent(identifier, component);
+		return this;
+	}
+	
+	/***
+	 * Appends a list box allowing the user to specify multiple file and directory paths.
+	 * @param identifier The unique identifier for this control.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendPathList(String identifier) throws Exception{
+		return appendPathList(identifier,null);
+	}
+	
+	/***
+	 * Appends a list box allowing the user to specify string values.
+	 * @param identifier The unique identifier for this control.
+	 * @param initialValues Initial values to populate the list with, can be null.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendStringList(String identifier, List initialValues) throws Exception{
+		return appendStringList(identifier,initialValues,false);
+	}
+	
+	/***
+	 * Appends a list box allowing the user to specify string values.
+	 * @param identifier The unique identifier for this control.
+	 * @param initialValues Initial values to populate the list with, can be null.
+	 * @param editable Whether the user is able to edit entries in the list.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendStringList(String identifier, List initialValues, boolean editable) throws Exception{
+		StringList component = new StringList();
+		if(initialValues != null)
+			component.setValues(initialValues);
+		addComponent(component,controls.size()+headersCount,0,2,1,true);
+		headersCount++;
+		trackComponent(identifier, component);
+		component.setEditable(editable);
+		return this;
+	}
+	
+	/***
+	 * Appends a list box allowing the user to specify string values.
+	 * @param identifier The unique identifier for this control.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendStringList(String identifier) throws Exception{
+		return appendStringList(identifier,null,false);
+	}
+	
+	/***
+	 * Appends a list box allowing the user to specify string values.
+	 * @param identifier The unique identifier for this control.
+	 * @param editable Whether the user is able to edit entries in the list.
+	 * @return Returns this CustomTabPanel instance to allow for method chaining.
+	 * @throws Exception Exception May throw an exception if the provided identifier has already been used.
+	 */
+	public CustomTabPanel appendStringList(String identifier,boolean editable) throws Exception{
+		return appendStringList(identifier,null,editable);
+	}
+	
+	/***
+	 * Registers an event handle such that a given control is only enabled when another checkable control is checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifier The identifier of the already added checkable control which will determine the enabled state of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenChecked(String dependentControlIdentifier, String targetCheckableIdentifier) throws Exception{
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		Component targetComponent = controls.get(targetCheckableIdentifier);
+		boolean currentCheckedState = isChecked(targetCheckableIdentifier);
+		dependentComponent.setEnabled(currentCheckedState);
+		((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+			@Override
+			public void itemStateChanged(ItemEvent arg0) {
+				try {
+					controls.get(dependentControlIdentifier).setEnabled(isChecked(targetCheckableIdentifier));
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		});
+	}
+	
+	/***
+	 * Similar to {@link #enabledOnlyWhenChecked(String, String)}, this method registers event handlers on one or more checkable controls
+	 * such that a given dependent control is only enabled when all of the specified target checkable controls are checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifiers The identifier of the one or more already added checkable controls which will determine the enabled state
+	 * of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenAllChecked(String dependentControlIdentifier, String... targetCheckableIdentifiers)
+			throws Exception {
+		owner.enabledOnlyWhenAllChecked(dependentControlIdentifier, targetCheckableIdentifiers);
+	}
+
+	/***
+	 * Similar to {@link #enabledOnlyWhenChecked(String, String)}, this method registers event handlers on one or more checkable controls
+	 * such that a given dependent control is only enabled when none of the specified target checkable controls are checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifiers The identifier of the one or more already added checkable controls which will determine the enabled state
+	 * of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenNoneChecked(String dependentControlIdentifier, String... targetCheckableIdentifiers)
+			throws Exception {
+		owner.enabledOnlyWhenNoneChecked(dependentControlIdentifier, targetCheckableIdentifiers);
+	}
+
+	/***
+	 * Similar to {@link #enabledOnlyWhenChecked(String, String)}, this method registers event handlers on one or more checkable controls
+	 * such that a given dependent control is only enabled when at least one of the specified target checkable controls are checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifiers The identifier of the one or more already added checkable controls which will determine the enabled state
+	 * of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledIfAnyChecked(String dependentControlIdentifier, String... targetCheckableIdentifiers)
+			throws Exception {
+		owner.enabledIfAnyChecked(dependentControlIdentifier, targetCheckableIdentifiers);
+	}
+
+	/***
+	 * Registers an event handle such that a given control is only enabled when another checkable control is not checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifier The identifier of the already added checkable control which will determine the enabled state of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenNotChecked(String dependentControlIdentifier, String targetCheckableIdentifier) throws Exception{
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		Component targetComponent = controls.get(targetCheckableIdentifier);
+		boolean currentCheckedState = isChecked(targetCheckableIdentifier);
+		dependentComponent.setEnabled(!currentCheckedState);
+		((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+			@Override
+			public void itemStateChanged(ItemEvent arg0) {
+				try {
+					controls.get(dependentControlIdentifier).setEnabled(!isChecked(targetCheckableIdentifier));
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		});
+	}
+	
+	/***
+	 * Gets whether a particular Checkbox or RadioButton is checked.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @return True if the control is checked, false otherwise.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
+	 */
+	public boolean isChecked(String identifier) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JCheckBox){
+			return ((JCheckBox)controls.get(identifier)).isSelected();	
+		}
+		else if(component instanceof JRadioButton){
+			return ((JRadioButton)controls.get(identifier)).isSelected();
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a JCheckbox or JRadioButton");
+	}
+	
+	/***
+	 * Sets whether a particular Checkbox or RadioButton is checked.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @param isChecked True to check the control, false to uncheck the control.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
+	 */
+	public void setChecked(String identifier, boolean isChecked) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JCheckBox){
+			((JCheckBox)controls.get(identifier)).setSelected(isChecked);
+		}
+		else if(component instanceof JRadioButton){
+			((JRadioButton)controls.get(identifier)).setSelected(isChecked);
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a JCheckbox or JRadioButton");
+	}
+	
+	/***
+	 * Gets the text present in a TextField or PasswordField.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @return The text present in the control.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
+	 */
+	public String getText(String identifier) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JPasswordField){
+			return new String(((JPasswordField)component).getPassword());
+		}
+		else if (component instanceof JTextField){
+			return ((JTextField)component).getText();
+		}
+		else if(component instanceof PathSelectionControl){
+			return ((PathSelectionControl)component).getPath();
+		}
+		else if(component instanceof ComboItemBox){
+			return ((ComboItemBox)component).getSelectedValue();
+		}
+		else if(component instanceof JComboBox){
+			return (String)((JComboBox)component).getSelectedItem();
+		}
+		else if(component instanceof JTextArea){
+			return ((JTextArea)component).getText();
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a supported control type: JPasswordField, JTextField, PathSelectionControl, JTextArea");
+	}
+	
+	/***
+	 * Sets the text present in a TextField or PasswordField.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @param text The text value to set.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
+	 */
+	public void setText(String identifier, String text) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JPasswordField){
+			((JPasswordField)component).setText(text);
+		}
+		else if (component instanceof JTextField){
+			((JTextField)component).setText(text);
+		}
+		else if(component instanceof PathSelectionControl){
+			((PathSelectionControl)component).setPath(text);
+		}
+		else if(component instanceof JComboBox){
+			((JComboBox)component).setSelectedItem(text);
+		}
+		else if (component instanceof JTextArea){
+			((JTextArea)component).setText(text);
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a supported control type: JPasswordField, JTextField, PathSelectionControl, JTextArea");
+	}
+	
+	/***
+	 * Sets the date contained in a date picker control previously added through a call to {@link #appendDatePicker(String, String)} or 
+	 * {@link #appendDatePicker(String, String, Object)}.
+	 * @param identifier The unique identifier of the previously added date picker control.
+	 * @param value The value to set the date picker to.  Accepts values of {@link Date}, {@link DateTime} or a date
+	 * String formatted "yyyyMMdd".
+	 * @throws Exception May be thrown if identifier does not point to a valid/existing control or date format string is invalid.
+	 */
+	public void setDate(String identifier, Object value) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JXDatePicker){
+			JXDatePicker datePickerComponent = (JXDatePicker)component;
+			if(value != null){
+				if(value instanceof Date){
+					datePickerComponent.setDate((Date) value);
+				}
+				else if (value instanceof DateTime){
+					datePickerComponent.setDate(((DateTime)value).toDate());
+				}
+				else if (value instanceof String){
+					DateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
+					Date date = dateFormat.parse((String) value);
+					datePickerComponent.setDate((Date) date);
+				}
+			}
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a supported control type: JXDatePicker");
+	}
+	
+	/***
+	 * Allows you to get the actual Java Swing control.  You will likely need to cast it to the appropriate type before use.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @return The control as base class Component.  See documentation for various append methods for control types.
+	 */
+	public Component getControl(String identifier){
+		return controls.get(identifier);
+	}
+	
+	/***
+	 * Returns a Map of the control values.
+	 * @return Map where the assigned identifier is the key and the control's value is the value.
+	 */
+	public Map toMap(){
+		return toMap(false);
+	}
+	
+	/***
+	 * Returns a Map of the control values.
+	 * @param forJsonCreation Set to true if the output is intended to be serialized to JSON.  Some
+	 * of the values in the map may be generated differently to better cooperate with what JSON
+	 * is capable of storing.
+	 * @return Map where the assigned identifier is the key and the control's value is the value.
+	 */
+	public Map toMap(boolean forJsonCreation){
+		Map result = new HashMap();
+		for(String identifier : controls.keySet()){
+			// Only skip serializing fields marked to be skipped and
+			// if we are serializing control values to build JSON
+			if(forJsonCreation && skipSerializing.contains(identifier)){
+				continue;
+			}
+			Component component = controls.get(identifier);
+			Object value = null;
+			ControlSerializationHandler handler = owner.getSerializer(identifier);
+			if(handler != null && forJsonCreation){
+				value = handler.serializeControlData(component);
+			}
+			else if(component instanceof JCheckBox){
+				value = ((JCheckBox)component).isSelected();	
+			}
+			else if(component instanceof JRadioButton){
+				value = ((JRadioButton)component).isSelected();
+			}
+			else if(component instanceof JPasswordField){
+				value = new String(((JPasswordField)component).getPassword());
+			}
+			else if (component instanceof JTextField){
+				value = ((JTextField)component).getText();
+			}
+			else if (component instanceof ChoiceTableControl){
+				if(forJsonCreation)
+					value = ((ChoiceTableControl)component).getTableModel().getCheckedLabels();
+				else
+					value = ((ChoiceTableControl)component).getTableModel().getCheckedValues();
+			}
+			else if(component instanceof PathSelectionControl){
+				value = ((PathSelectionControl)component).getPath();
+			}
+			else if(component instanceof ComboItemBox){
+				value = ((ComboItemBox)component).getSelectedComboItem().getValue();
+			}
+			else if(component instanceof JComboBox){
+				value = ((JComboBox)component).getSelectedItem();
+			}
+			else if(component instanceof JTextArea){
+				value = ((JTextArea)component).getText();
+			}
+			else if(component instanceof JXDatePicker){
+				value = ((JXDatePicker)component).getDate();
+			}
+			else if(component instanceof PathList){
+				value = ((PathList)component).getPaths();
+			}
+			else if(component instanceof StringList){
+				value = ((StringList)component).getValues();
+			}
+			else if(component instanceof JSpinner){
+				value = ((JSpinner)component).getValue();
+			}
+			else if (component instanceof JSlider) {
+				BoundedRangeModel model = ((JSlider)component).getModel();
+				if(model instanceof  DoubleBoundedRangeModel) {
+					value = ((DoubleBoundedRangeModel) model).getValueAsDouble();
+				} else {
+					value = model.getValue();
+				}
+			}
+			else if(component instanceof DynamicTableControl){
+				if(forJsonCreation){
+					value = ((DynamicTableControl)component).getTableModel().getCheckedRecordHashes();
+				}else{
+					value = ((DynamicTableControl)component).getTableModel().getCheckedRecords();	
+				}
+			}
+			else if(component instanceof MultipleChoiceComboBox) {
+				MultipleChoiceComboBox mccb = (MultipleChoiceComboBox)component;
+				value = mccb.getCheckedChoices();
+			}
+			else if(component instanceof LocalWorkerSettings){
+				Map workerSettings = new HashMap();
+				LocalWorkerSettings lws = ((LocalWorkerSettings)component);
+				workerSettings.put("workerCount",lws.getWorkerCount());
+				workerSettings.put("workerMemory",lws.getMemoryPerWorker());
+				workerSettings.put("workerTemp",lws.getWorkerTempDirectory());
+				value = workerSettings;
+			}
+			else if(component instanceof BatchExporterTraversalSettings){
+				Map traversalSettings = new HashMap();
+				BatchExporterTraversalSettings control = ((BatchExporterTraversalSettings)component);
+				traversalSettings.put("strategy",control.getComboTraversal().getSelectedValue());
+				traversalSettings.put("deduplication",control.getComboDedupe().getSelectedValue());
+				traversalSettings.put("sortOrder",control.getComboSortOrder().getSelectedValue());
+				value = traversalSettings;
+			}
+			else if(component instanceof BatchExporterNativeSettings){
+				Map nativeSettings = new HashMap();
+				BatchExporterNativeSettings control = ((BatchExporterNativeSettings)component);
+				nativeSettings.put("naming",control.getComboNaming().getSelectedValue());
+				nativeSettings.put("path",control.getTxtPath().getText());
+				nativeSettings.put("suffix",control.getTxtSuffix().getText());
+				
+				nativeSettings.put("mailFormat",control.getComboMailFormat().getSelectedValue());
+				nativeSettings.put("includeAttachments",control.getChckbxIncludeAttachments().isSelected());
+				nativeSettings.put("regenerateStored",control.getChckbxRegenerateStored().isSelected());
+				
+				value = nativeSettings;
+			}
+			else if(component instanceof BatchExporterTextSettings){
+				Map textSettings = new HashMap();
+				BatchExporterTextSettings control = ((BatchExporterTextSettings)component);
+				textSettings.put("naming",control.getComboNaming().getSelectedValue());
+				textSettings.put("path",control.getTxtPath().getText());
+				textSettings.put("suffix",control.getTxtSuffix().getText());
+				
+				if(forJsonCreation){
+					textSettings.put("wrapLinesChecked",control.getChckbxWrapLines().isSelected());
+					textSettings.put("wrapLines",(Integer)control.getSpinnerWrapLength().getValue());
+				}
+				else {
+					if(control.getChckbxWrapLines().isSelected()){
+						textSettings.put("wrapLines",(Integer)control.getSpinnerWrapLength().getValue());
+					}
+				}
+				textSettings.put("perPage",control.getChckbxPerPage().isSelected());
+				textSettings.put("lineSeparator",control.getComboLineSeparator().getSelectedValue());
+				textSettings.put("encoding",control.getComboEncoding().getSelectedValue());
+				
+				value = textSettings;
+			}
+			else if(component instanceof BatchExporterPdfSettings){
+				Map pdfSettings = new HashMap();
+				BatchExporterPdfSettings control = ((BatchExporterPdfSettings)component);
+				pdfSettings.put("naming",control.getComboNaming().getSelectedValue());
+				pdfSettings.put("path",control.getTxtPath().getText());
+				pdfSettings.put("suffix",control.getTxtSuffix().getText());
+				
+				pdfSettings.put("regenerateStored",control.getChckbxRegenerateStored().isSelected());
+				
+				value = pdfSettings;
+			}
+			else if(component instanceof BatchExporterLoadFileSettings){
+				Map lfSettings = new HashMap();
+				BatchExporterLoadFileSettings control = ((BatchExporterLoadFileSettings)component);
+				lfSettings.put("type",control.getComboLoadFileType().getSelectedValue());
+				lfSettings.put("metadataProfile",control.getComboProfile().getSelectedValue());
+				lfSettings.put("encoding",control.getComboEncoding().getSelectedValue());
+				lfSettings.put("lineSeparator",control.getComboLineSeparator().getSelectedValue());
+				
+				value = lfSettings;
+			}
+			else if(component instanceof OcrSettings){
+				Map ocrSettings = new HashMap();
+				OcrSettings control = ((OcrSettings)component);
+				ocrSettings.put("regeneratePdfs",control.getChckbxRegeneratePdfs().isSelected());
+				ocrSettings.put("updatePdf",control.getChckbxUpdatePdfText().isSelected());
+				ocrSettings.put("updateText",control.getChckbxUpdateItemText().isSelected());
+				ocrSettings.put("textModification",control.getComboTextModification().getSelectedValue());
+				ocrSettings.put("quality",control.getComboQuality().getSelectedValue());
+				ocrSettings.put("rotation",control.getComboRotation().getSelectedValue());
+				ocrSettings.put("deskew",control.getChckbxDeskew().isSelected());
+				ocrSettings.put("outputDirectory",control.getOutputDirectory().getPath());
+				ocrSettings.put("languages",control.getLanguageChoices().getTableModel().getCheckedValues());
+				if(NuixConnection.getCurrentNuixVersion().isAtLeast("7.2.0")){
+					ocrSettings.put("updateDuplicates", control.getUpdateDuplicates());
+					ocrSettings.put("timeout", control.getTimeoutMinutes());
+				}
+				value = ocrSettings;
+			} else if (component instanceof CsvTable){
+				CsvTable table = (CsvTable)component;
+				value = table.getRecords();
+			}
+			
+			result.put(identifier, value);
+		}
+		return result;
+	}
+	
+	/***
+	 * Gets a JSON String equivalent of the dialog's values.  This is a convenience method for calling
+	 * {@link #toMap} and then converting that Map to a JSON string.
+	 * @return A JSON string representation of the dialogs values (based on the Map returned by {@link #toMap()}).
+	 */
+	public String toJson(){
+		GsonBuilder builder = new GsonBuilder();
+		builder.setPrettyPrinting();
+		Gson gson = builder.create();
+		return gson.toJson(toMap());
+	}
+	
+	/**
+	 * @return The height of choice table controls
+	 */
+	public int getChoiceTableHeight() {
+		return choiceTableHeight;
+	}
+
+	/**
+	 * @param choiceTableHeight The choiceTableHeight to set
+	 */
+	public void setChoiceTableHeight(int choiceTableHeight) {
+		this.choiceTableHeight = choiceTableHeight;
+	}
+
+	/***
+	 * Gets the label of this tab.
+	 * @return The label of this tab.
+	 */
+	public String getLabel() {
+		return label;
+	}
+
+	/***
+	 * Sets the label of this tab.
+	 * @param label The label to set.
+	 */
+	public void setLabel(String label) {
+		this.label = label;
+	}
+	
+	/***
+	 * Allows you to specify code which customizes how a particular control's value is serialized.
+	 * @param identifier The unique identifier of the control to which you are providing custom serialization logic for.
+	 * @param handler Provides logic regarding how to serialize the control's value.
+	 */
+	public void whenSerializing(String identifier, ControlSerializationHandler handler){
+		owner.whenSerializing(identifier,handler);
+	}
+	
+	/***
+	 * Allows you to specify code which customizes how a particular control's value is deserialized.
+	 * @param identifier The unique identifier of the control to which you are providing custom deserialization logic for.
+	 * @param handler Provides logic regarding how to deserialize the control's value.
+	 */
+	public void whenDeserializing(String identifier, ControlDeserializationHandler handler){
+		owner.whenDeserializing(identifier,handler);
+	}
+
+	@Override
+	public void setEnabled(boolean value) {
+		if(value == true){
+			if(enabledStates != null){
+				for(Map.Entry state : enabledStates.entrySet()){
+					getControl(state.getKey()).setEnabled(state.getValue());
+				}
+				enabledStates = null;
+			}
+		} else {
+			enabledStates = new HashMap();
+			for(Map.Entry controlEntry : controls.entrySet()){
+				enabledStates.put(controlEntry.getKey(),controlEntry.getValue().isEnabled());
+			}
+			for(Component c : getComponents()){
+				c.setEnabled(false);
+			}
+		}
+	}
+
+	/***
+	 * Allows you to specify that a particular control's value should not be serialized in calls to {@link #toMap(boolean)} with a value of true (meaning it is generating map of setting for generating JSON).
+	 * @param identifier The unique identified of the control to be skipped.
+	 */
+	public void doNotSerialize(String identifier){
+		skipSerializing.add(identifier);
+	}
+	
+	/***
+	 * Registers a callback which is notified when a particular text control's value is modified.
+	 * @param identifier The unique of identifier of the text control to monitor.
+	 * @param callback Callback invoked when the text control's value is modified.
+	 * @throws Exception May be thrown if identifier does not refer to a supported/existing control.
+	 */
+	public void whenTextChanged(String identifier, Consumer callback) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JTextComponent){
+			JTextComponent textComponent = ((JTextComponent)component); 
+			textComponent.getDocument().addDocumentListener(new DocumentListener() {
+				@Override
+				public void removeUpdate(DocumentEvent e) {
+					updated();
+				}
+				
+				@Override
+				public void insertUpdate(DocumentEvent e) {
+					updated();
+				}
+				
+				@Override
+				public void changedUpdate(DocumentEvent e) {
+					updated();
+				}
+				
+				private void updated(){
+					callback.accept(textComponent.getText());
+				}
+			});
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a supported control type: JPasswordField, JTextField, PathSelectionControl, JTextArea");
+	}
+}
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProcessingStatusDialog.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProcessingStatusDialog.java
new file mode 100644
index 0000000..cdf3d29
--- /dev/null
+++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProcessingStatusDialog.java
@@ -0,0 +1,153 @@
+/******************************************
+Copyright 2018 Nuix
+http://www.apache.org/licenses/LICENSE-2.0
+*******************************************/
+
+package com.nuix.nx.dialogs;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.Timer;
+import javax.swing.border.EmptyBorder;
+
+import org.apache.log4j.Logger;
+
+import com.nuix.nx.controls.ProcessingFinishedListener;
+import com.nuix.nx.controls.ProcessingStatusControl;
+
+import nuix.Processor;
+
+/***
+ * A dialog which starts and monitors a processing job.  Also has buttons to pause, resume, stop and abort the job.
+ * @author Jason Wells
+ *
+ */
+@SuppressWarnings("serial")
+public class ProcessingStatusDialog extends JDialog {
+	private static Logger logger = Logger.getLogger(ProcessingStatusDialog.class);
+	
+	private final JPanel contentPanel = new JPanel();
+	private ProcessingStatusControl processingStatusControl;
+	private boolean closeWindowAllowed = false;
+	private JButton btnClose;
+	private Timer autoCloseTimer;
+
+	public ProcessingStatusDialog() {
+		//We will own closing this
+		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+		setModal(true);
+		setTitle("Processing Status");
+		setIconImage(Toolkit.getDefaultToolkit().getImage(ProcessingStatusDialog.class.getResource("/icons/nuix_icon.png")));
+		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+		//setSize(screenSize.width - 200,screenSize.height - 200);
+		setSize(1024,screenSize.height - 200);
+		setLocationRelativeTo(null);
+		getContentPane().setLayout(new BorderLayout());
+		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+		getContentPane().add(contentPanel, BorderLayout.CENTER);
+		contentPanel.setLayout(new BorderLayout(0, 0));
+		{
+			processingStatusControl = new ProcessingStatusControl();
+			contentPanel.add(processingStatusControl, BorderLayout.CENTER);
+			
+			btnClose = new JButton("Close");
+			btnClose.addActionListener(new ActionListener() {
+				public void actionPerformed(ActionEvent event) {
+					if(closeWindowAllowed){
+	            		dispose();
+	            	}
+				}
+			});
+			btnClose.setEnabled(false);
+			GridBagConstraints gbc_btnClose = new GridBagConstraints();
+			gbc_btnClose.anchor = GridBagConstraints.EAST;
+			gbc_btnClose.gridx = 0;
+			gbc_btnClose.gridy = 2;
+			processingStatusControl.add(btnClose, gbc_btnClose);
+		}
+		
+		
+		this.addWindowListener( new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent we) {
+            	System.out.println("closeWindowAllowed: "+closeWindowAllowed);
+            	if(closeWindowAllowed){
+            		autoCloseTimer.stop();
+            		dispose();
+            	}
+            }
+        });
+	}
+
+	/***
+	 * Logs a message to the log text area and the Nuix logs
+	 * @param message The message to log
+	 */
+	public void log(String message){
+		processingStatusControl.log(message);
+		logger.info(message);
+	}
+
+	/***
+	 * Displays the dialog and begins processing, showing status while processing is occurring.
+	 * @param processor The processor to start and monitor
+	 */
+	public void displayAndBeginProcessing(Processor processor){
+		Thread t = new Thread(new Runnable() {
+			@Override
+			public void run() {
+				setVisible(true);				
+			}
+		});
+		t.start();
+		
+		closeWindowAllowed = false;
+		btnClose.setEnabled(false);
+		try {
+			processingStatusControl.beginProcessing(processor);
+		} catch (Exception e) {
+			String message = "Unexecpected Error:\n\n"+e.getMessage();
+			CommonDialogs.showError(message);
+			logger.error(message,e);
+		}
+		closeWindowAllowed = true;
+		btnClose.setEnabled(true);
+		// Auto close this dialog in 60 seconds
+		autoCloseTimer = new Timer(60 * 1000, new ActionListener() {
+			@Override
+			public void actionPerformed(ActionEvent e) {
+				autoCloseTimer.stop();
+				dispose();
+			}
+		});
+		autoCloseTimer.setRepeats(false);
+		autoCloseTimer.start();
+		processingStatusControl.log("Window will automatically close in 60 seconds...");
+	}
+	
+	/***
+	 * Add a callback which will be invoked when processing ends
+	 * @param listener The callback to add
+	 */
+	public void addProcessingFinishedListener(ProcessingFinishedListener listener){
+		processingStatusControl.addProcessingFinishedListener(listener);
+	}
+	
+	/***
+	 * Removes a previously added callback
+	 * @param listener The callback to remove
+	 */
+	public void removeProcessingFinishedListener(ProcessingFinishedListener listener){
+		processingStatusControl.removeProcessingFinishedListener(listener);
+	}
+}
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialog.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialog.java
new file mode 100644
index 0000000..6c0e08a
--- /dev/null
+++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialog.java
@@ -0,0 +1,524 @@
+/******************************************
+Copyright 2018 Nuix
+http://www.apache.org/licenses/LICENSE-2.0
+*******************************************/
+
+package com.nuix.nx.dialogs;
+
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+
+import com.nuix.nx.controls.ReportDisplayPanel;
+import com.nuix.nx.controls.models.ReportDataModel;
+import org.joda.time.DateTime;
+
+import java.net.URL;
+
+/***
+ * Provides a configurable progress dialog.  Note that you do not create an instance of it
+ * directly. Instead use the static method {@link #forBlock(ProgressDialogBlockInterface)} to
+ * get an instance which will exist for the duration of the provided callback.
+ * @author Jason Wells
+ *
+ */
+@SuppressWarnings("serial")
+public class ProgressDialog extends JDialog {
+	
+	private final JPanel contentPanel = new JPanel();
+	private boolean abortWasRequested = false;
+	private boolean closeAllowed = false;
+	private boolean logAllStatusUpdates = false;
+	private JLabel lblMainStatus;
+	private JLabel lblSubStatus;
+	private JProgressBar subProgress;
+	private JProgressBar mainProgress;
+	private JButton btnAbort;
+	private Runnable abortCallback;
+	private JTextArea txtrLog;
+	private JScrollPane scrollPane;
+
+	private ReportDisplayPanel reportDisplay;
+	private ProgressDialogLoggingCallback loggingCallback;
+	private JPanel buttonsPanel;
+	private JButton btnClose;
+	private boolean timestampLoggedMessages = false;
+
+	private ProgressDialog() {
+		super((JDialog)null);
+		URL iconUri = ProgressDialog.class.getResource("/icons/nuix_icon.png");
+		setIconImage(Toolkit.getDefaultToolkit().getImage(iconUri));
+		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
+		setTitle("Progress Dialog");
+		setSize(new Dimension(800,600));
+		setLocationRelativeTo(null);
+		getContentPane().setLayout(new BorderLayout());
+		contentPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
+		getContentPane().add(contentPanel, BorderLayout.CENTER);
+		GridBagLayout gbl_contentPanel = new GridBagLayout();
+		gbl_contentPanel.columnWidths = new int[]{0, 0};
+		//gbl_contentPanel.rowHeights = new int[]{0, 25, 25, 25, 300, 0, 0, 0}; // Sections control their own size
+		gbl_contentPanel.columnWeights = new double[]{1.0, Double.MIN_VALUE};
+		gbl_contentPanel.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0};
+		contentPanel.setLayout(gbl_contentPanel);
+		
+		lblMainStatus = new JLabel("...");
+		lblMainStatus.setFont(new Font("Tahoma", Font.PLAIN, 16));
+		GridBagConstraints gbc_lblMainStatus = new GridBagConstraints();
+		gbc_lblMainStatus.anchor = GridBagConstraints.WEST;
+		gbc_lblMainStatus.insets = new Insets(0, 0, 5, 0);
+		gbc_lblMainStatus.gridx = 0;
+		gbc_lblMainStatus.gridy = 0;
+		contentPanel.add(lblMainStatus, gbc_lblMainStatus);
+		
+		mainProgress = new JProgressBar();
+		mainProgress.setStringPainted(true);
+		GridBagConstraints gbc_mainProgress = new GridBagConstraints();
+		gbc_mainProgress.insets = new Insets(0, 0, 5, 0);
+		gbc_mainProgress.fill = GridBagConstraints.BOTH;
+		gbc_mainProgress.gridx = 0;
+		gbc_mainProgress.gridy = 1;
+		contentPanel.add(mainProgress, gbc_mainProgress);
+		
+		lblSubStatus = new JLabel("...");
+		GridBagConstraints gbc_lblSubStatus = new GridBagConstraints();
+		gbc_lblSubStatus.anchor = GridBagConstraints.WEST;
+		gbc_lblSubStatus.insets = new Insets(0, 0, 5, 0);
+		gbc_lblSubStatus.gridx = 0;
+		gbc_lblSubStatus.gridy = 2;
+		contentPanel.add(lblSubStatus, gbc_lblSubStatus);
+		
+		subProgress = new JProgressBar();
+		subProgress.setStringPainted(true);
+		GridBagConstraints gbc_subProgress = new GridBagConstraints();
+		gbc_subProgress.insets = new Insets(0, 0, 5, 0);
+		gbc_subProgress.fill = GridBagConstraints.BOTH;
+		gbc_subProgress.gridx = 0;
+		gbc_subProgress.gridy = 3;
+		contentPanel.add(subProgress, gbc_subProgress);
+		
+		scrollPane = new JScrollPane();
+		scrollPane.setPreferredSize(new Dimension(700, 300));
+		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+		GridBagConstraints gbc_scrollPane = new GridBagConstraints();
+		gbc_scrollPane.insets = new Insets(0, 0, 5, 0);
+		gbc_scrollPane.fill = GridBagConstraints.BOTH;
+		gbc_scrollPane.gridx = 0;
+		gbc_scrollPane.gridy = 4;
+		contentPanel.add(scrollPane, gbc_scrollPane);
+		
+		txtrLog = new JTextArea();
+		txtrLog.setBackground(Color.WHITE);
+		txtrLog.setEditable(false);
+		scrollPane.setViewportView(txtrLog);
+
+		reportDisplay = new ReportDisplayPanel();
+		GridBagConstraints reportConstraints = new GridBagConstraints();
+		//reportConstraints.anchor = GridBagConstraints.EAST;
+		reportConstraints.fill = GridBagConstraints.BOTH;
+		reportConstraints.gridx = 0;
+		reportConstraints.gridy = 5;
+		contentPanel.add(reportDisplay, reportConstraints);
+
+
+		buttonsPanel = new JPanel();
+		GridBagConstraints gbc_buttonsPanel = new GridBagConstraints();
+		gbc_buttonsPanel.anchor = GridBagConstraints.EAST;
+		gbc_buttonsPanel.fill = GridBagConstraints.VERTICAL;
+		gbc_buttonsPanel.gridx = 0;
+		gbc_buttonsPanel.gridy = 6;
+		contentPanel.add(buttonsPanel, gbc_buttonsPanel);
+		buttonsPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
+		
+		btnAbort = new JButton("Abort");
+		buttonsPanel.add(btnAbort);
+		btnAbort.setFont(new Font("Tahoma", Font.BOLD, 13));
+		
+		btnClose = new JButton("Close");
+		btnClose.setEnabled(false);
+		btnClose.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				ProgressDialog.this.dispose();
+			}
+		});
+		buttonsPanel.add(btnClose);
+		btnAbort.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				ProgressDialog.this.confirmAbort();
+			}
+		});
+		
+		this.addWindowListener( new WindowAdapter() {
+            @Override
+            public void windowClosing(WindowEvent we) {
+            	//If the abort button is hidden we wont allow user to close the window until
+            	//callback has completed.  If abort button is visible we will allow the user
+            	//the option to abort.  Script is responsible to notice this and shutdown
+            	//gracefully.
+            	if(ProgressDialog.this.getAbortButtonVisible() == true){
+	                if(closeAllowed)
+	                	ProgressDialog.this.dispose();
+	                else
+	                	ProgressDialog.this.confirmAbort();
+            	}
+            	else if(closeAllowed){
+            		ProgressDialog.this.dispose();
+            	}
+            }
+        });
+	}
+	
+	protected void confirmAbort() {
+		String message = "Are you sure you want to abort?";
+		String title = "Abort?";
+		if(JOptionPane.showConfirmDialog(ProgressDialog.this, message, title, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION){
+			abortWasRequested = true;
+			btnAbort.setText("Abort Requested...");
+			btnAbort.setEnabled(false);
+			if(abortCallback != null){
+				try
+				{
+					abortCallback.run();
+				} catch(Exception exc){
+					logMessage("An exception occurred in the onAbort callback:");
+					logMessage(exc.getMessage());
+					StringWriter sw = new StringWriter();
+					PrintWriter pw = new PrintWriter(sw);
+					exc.printStackTrace(pw);
+					logMessage(sw.toString());
+				}
+			}
+		}
+	}
+
+	/***
+	 * Used to determine if the user requested to abort.
+	 * @return True if the user clicked abort and clicked yes on the confirmation dialog.
+	 */
+	public boolean abortWasRequested(){
+		return abortWasRequested;
+	}
+	
+	/***
+	 * Allows you to supply a callback which will be called when the user
+	 * aborts by clicking and confirming the abort button or closing the dialog.
+	 * @param callback The callback to invoke on abort.
+	 */
+	public void onAbort(Runnable callback){
+		abortCallback = callback;
+	}
+	
+	/***
+	 * Set the main status label text.
+	 * @param status The value set it to.
+	 */
+	public void setMainStatus(String status){
+		lblMainStatus.setText(status);
+		if(logAllStatusUpdates)
+			logMessage(status);
+	}
+	
+	/***
+	 * Set the main status label and writes it as a log message.
+	 * @param status The value set it to.
+	 */
+	public void setMainStatusAndLogIt(String status){
+		lblMainStatus.setText(status);
+		logMessage(status);
+	}
+	
+	/***
+	 * Set the sub status label text.
+	 * @param status The value to set it to.
+	 */
+	public void setSubStatus(String status){
+		lblSubStatus.setText(status);
+		if(logAllStatusUpdates)
+			logMessage(status);
+	}
+	
+	/***
+	 * Set the sub status label and writes it as a log message.
+	 * @param status The value to set it to.
+	 */
+	public void setSubStatusAndLogIt(String status){
+		lblSubStatus.setText(status);
+		logMessage(status);
+	}
+	
+	/***
+	 * Sets the value and maximum value for the main progress bar.
+	 * @param value The current value to set it to.
+	 * @param max The maximum value to set it to.
+	 */
+	public void setMainProgress(int value,int max){
+		mainProgress.setMaximum(max);
+		mainProgress.setValue(value);
+	}
+	
+	/***
+	 * Sets the current value for the main progress bar without changing the maximum value.
+	 * @param value The current value to set it to.
+	 */
+	public void setMainProgress(int value){
+		mainProgress.setValue(value);
+	}
+	
+	/***
+	 * Increases the current value of the main progress bar by 1.
+	 */
+	public void incrementMainProgress() {
+		mainProgress.setValue(mainProgress.getValue()+1);
+	}
+	
+	/***
+	 * Sets whether the main progress bar is visible.
+	 * @param value True for visible, false for hidden.
+	 */
+	public void setMainProgressVisible(boolean value){
+		mainProgress.setVisible(value);
+	}
+	
+	/***
+	 * Sets the value and maximum value for the sub progress bar.
+	 * @param value The current value to set it to.
+	 * @param max The maximum value to set it to.
+	 */
+	public void setSubProgress(int value,int max){
+		subProgress.setValue(value);
+		subProgress.setMaximum(max);
+	}
+	
+	/***
+	 * Sets the current value for the sub progress bar without changing the maximum value.
+	 * @param value The current value to set it to.
+	 */
+	public void setSubProgress(int value){
+		subProgress.setValue(value);
+	}
+	
+	/***
+	 * Increases the current value of the sub progress bar by 1.
+	 */
+	public void incrememntSubProgress() {
+		subProgress.setValue(subProgress.getValue()+1);
+	}
+	
+	/***
+	 * Sets whether the sub progress bar is visible.
+	 * @param value True for visible, false for hidden.
+	 */
+	public void setSubProgressVisible(boolean value){
+		subProgress.setVisible(value);
+	}
+
+	/***
+	 * Sets whether the abort button should be visible.  Useful to hide the abort button if you
+	 * do not plan on supporting responding to it.
+	 * @param value True if you wish the button to be visible, false if you don't.
+	 */
+	public void setAbortButtonVisible(boolean value){
+		btnAbort.setVisible(value);
+	}
+	
+	/***
+	 * Gets whether the abort button is currently visible.
+	 * @return True if the button is currently visible.
+	 */
+	public boolean getAbortButtonVisible(){
+		return btnAbort.isVisible();
+	}
+	
+	/***
+	 * Sets whether the log text area should be visible.  Useful if you will not be logging any messages
+	 * while the progress dialog is up.
+	 * @param value True to make the log text area visible, false to hide it.
+	 */
+	public void setLogVisible(boolean value){
+		if(scrollPane.isVisible() && value == false){
+			//Shrink the dialog a bit to make up for empty space
+			Dimension current = getSize();
+			Dimension resized = new Dimension(current.width,current.height-300);
+			setSize(resized);
+		}
+		else if(!scrollPane.isVisible() && value == true){
+			//Enlarge dialog to make room for soon to be visible log area
+			Dimension current = getSize();
+			Dimension resized = new Dimension(current.width,current.height+300);
+			setSize(resized);
+		}
+		scrollPane.setVisible(value);
+	}
+	
+	/***
+	 * Logs a message to the log text area.
+	 * @param message The message to write.  A newline is automatically appended.
+	 */
+	public void logMessage(String message){
+		if(timestampLoggedMessages){
+			txtrLog.append(DateTime.now().toString("YYYY-MM-dd hh:mm:ss") + ": " + message+"\n");
+		} else {
+			txtrLog.append(message+"\n");			
+		}
+		
+		txtrLog.setCaretPosition(txtrLog.getDocument().getLength());
+		
+		if(loggingCallback != null){
+			loggingCallback.messageLogged(message);
+		} else {
+			System.out.println(message);	
+		}
+	}
+	
+	/***
+	 * Sets whether text in the message area show be line/word wrapped.
+	 * @param wrapText True enables wrapping, false (default) disables it.
+	 */
+	public void setTextWrapping(boolean wrapText) {
+		txtrLog.setLineWrap(wrapText);
+		txtrLog.setWrapStyleWord(wrapText);
+	}
+	
+	/***
+	 * Clears the log text area of all message.
+	 */
+	public void clearLog(){
+		txtrLog.setText("");
+	}
+	
+	/***
+	 * Gets the current text in the log text area.
+	 * @return The log text area's current contents.
+	 */
+	public String getLogText(){
+		return txtrLog.getText();
+	}
+	
+	/***
+	 * Gets a value indicating whether all status message updates will be logged.
+	 * @return True if all status messages will be logged
+	 */
+	public boolean getLogAllStatusUpdates() {
+		return logAllStatusUpdates;
+	}
+
+	/***
+	 * Sets a value indicating whether all status message updates will be logged.
+	 * @param logAllStatusUpdates True if all status messages should be logged
+	 */
+	public void setLogAllStatusUpdates(boolean logAllStatusUpdates) {
+		this.logAllStatusUpdates = logAllStatusUpdates;
+	}
+
+	/**
+	 * Displays a progress dialog for the duration of called method.
+	 * @see ProgressDialogBlockInterface#DoWork
+	 * @param block Creates and displays a progress dialog for the life span of the call to {@link ProgressDialogBlockInterface#DoWork}
+	 */
+	public static void forBlock(ProgressDialogBlockInterface block){
+		ProgressDialog dialog = new ProgressDialog();
+		dialog.setVisible(true);
+		try
+		{
+			block.DoWork(dialog);
+		}
+		catch(Exception exc){
+			dialog.logMessage("Error occured in provided block:");
+			dialog.logMessage(exc.getMessage());
+			StringWriter sw = new StringWriter();
+			PrintWriter pw = new PrintWriter(sw);
+			exc.printStackTrace(pw);
+			dialog.logMessage(sw.toString());
+			exc.printStackTrace();
+		}
+		dialog.setAbortButtonVisible(false);
+		dialog.btnClose.setEnabled(true);
+		dialog.closeAllowed = true;
+	}
+	
+	/***
+	 * Allows you to provide a callback which will be called each time a message is logged
+	 * to this progress dialog.  Useful if you wish messages logged to the progress dialog
+	 * to additionally be recorded elsewhere.
+	 * @param callback Callback interface object which will receive logged messages.
+	 */
+	public void onMessageLogged(ProgressDialogLoggingCallback callback){
+		loggingCallback = callback;
+	}
+	
+	/***
+	 * Enlarges the progress dialog to match the screen size less some margin on all sides.
+	 * @param margin The amount in pixels of "margin" to consider when enlarging this progress dialog.
+	 */
+	public void embiggen(int margin){
+		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+		setSize(new Dimension(screenSize.width - margin, screenSize.height - margin));
+		setLocationRelativeTo(null);
+	}
+	
+	/***
+	 * This is a convenience method for setting the progress dialog into a "script completed" state.
+	 * Main status is set to "Completed" and this is logged.
+	 * Sub status if cleared.
+	 * Main progress is set to 100%.
+	 * Sub progress is set to 100%.
+	 */
+	public void setCompleted(){
+		setMainStatusAndLogIt("Completed");
+		setSubStatus("");
+		setMainProgress(1,1);
+		setSubProgress(1,1);
+	}
+
+	/***
+	 * Sets the value determining whether messages logged will lead with a time stamp.
+	 * @return boolean True if you time stamps will be logged before each message.
+	 */
+	public boolean getTimestampLoggedMessages() {
+		return timestampLoggedMessages;
+	}
+
+	/***
+	 * Sets the value determining whether messages logged will lead with a time stamp.
+	 * @param timestampLoggedMessages True if you want time stamps logged before each message.
+	 */
+	public void setTimestampLoggedMessages(boolean timestampLoggedMessages) {
+		this.timestampLoggedMessages = timestampLoggedMessages;
+	}
+
+	/**
+	 * Adds a section to the bottom of the dialog as a Report.  Uses the provided {@link ReportDataModel} to make a
+	 * {@link ReportDisplayPanel} which gets inserted under the log area and above the buttons.  This method will
+	 * ensure the report is visible.  Use {@link #setReportDisplayVisible(boolean)} with {@code false} to hide the
+	 * panel once it is made visible.
+	 * @param reportDataModel The data model to display at the bottom of the dialog.  Must
+	 *                        not be null.
+	 */
+	public void addReport(ReportDataModel reportDataModel) {
+		SwingUtilities.invokeLater(() -> {
+			reportDisplay.setReportDataModel(reportDataModel);
+			reportDisplay.setVisible(true);
+		});
+	}
+
+	/**
+	 * Sets whether the report section is visible.  If the section is made visible with no {@link ReportDataModel}
+	 * provided via the {@link #addReport(ReportDataModel)} method, then the report will take no space and not be
+	 * visible.
+	 * @param value True for visible, false for hidden.
+	 */
+	public void setReportDisplayVisible(boolean value){
+		SwingUtilities.invokeLater(() -> {
+			reportDisplay.setVisible(value);
+		});
+	}
+
+
+}
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogBlockInterface.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogBlockInterface.java
new file mode 100644
index 0000000..22d849c
--- /dev/null
+++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogBlockInterface.java
@@ -0,0 +1,15 @@
+/******************************************
+Copyright 2018 Nuix
+http://www.apache.org/licenses/LICENSE-2.0
+*******************************************/
+
+package com.nuix.nx.dialogs;
+
+/**
+ * Interface to be implemented to provide code to be ran by the {@link ProgressDialog}.
+ * @author Jason Wells
+ *
+ */
+public interface ProgressDialogBlockInterface {
+	public void DoWork(ProgressDialog dialog);
+}
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.java
new file mode 100644
index 0000000..f6dbe02
--- /dev/null
+++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.java
@@ -0,0 +1,15 @@
+/******************************************
+Copyright 2018 Nuix
+http://www.apache.org/licenses/LICENSE-2.0
+*******************************************/
+
+package com.nuix.nx.dialogs;
+
+/***
+ * 
+ * @author Jason Wells
+ *
+ */
+public interface ProgressDialogLoggingCallback {
+	public void messageLogged(String message);
+}
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ScrollableCustomTabPanel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ScrollableCustomTabPanel.java
new file mode 100644
index 0000000..791521c
--- /dev/null
+++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ScrollableCustomTabPanel.java
@@ -0,0 +1,44 @@
+package com.nuix.nx.dialogs;
+
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.GridBagLayout;
+import java.util.HashMap;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.border.EmptyBorder;
+
+@SuppressWarnings("serial")
+public class ScrollableCustomTabPanel extends CustomTabPanel {
+
+	private JPanel wrappedPanel;
+
+	public ScrollableCustomTabPanel(String label, TabbedCustomDialog owner) {
+		this.label = label;
+		this.owner = owner;
+		buttonGroups = new HashMap();
+		controls = new HashMap();
+		
+		setBorder(new EmptyBorder(5,5,5,5));
+		
+		BorderLayout outerLayout = new BorderLayout();
+		setLayout(outerLayout);
+		JScrollPane outerScroller = new JScrollPane();
+		outerScroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
+		super.add(outerScroller);
+		
+		wrappedPanel = new JPanel();
+		outerScroller.setViewportView(wrappedPanel);
+		
+		rootLayout = new GridBagLayout();
+		rootLayout.columnWidths = new int[]{LABEL_COLUMN_WIDTH, CONTROL_COLUMN_WIDTH};
+		wrappedPanel.setLayout(rootLayout);
+	}
+
+	@Override
+	public Component add(Component comp) {
+		return wrappedPanel.add(comp);
+	}
+}
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/TabbedCustomDialog.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/TabbedCustomDialog.java
new file mode 100644
index 0000000..c9c4423
--- /dev/null
+++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/TabbedCustomDialog.java
@@ -0,0 +1,1153 @@
+/******************************************
+Copyright 2018 Nuix
+http://www.apache.org/licenses/LICENSE-2.0
+*******************************************/
+
+package com.nuix.nx.dialogs;
+
+import java.awt.Component;
+import java.awt.Desktop;
+import java.awt.Dimension;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowListener;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import javax.swing.*;
+
+import com.nuix.nx.controls.models.DoubleBoundedRangeModel;
+import org.apache.log4j.Logger;
+import org.jdesktop.swingx.JXDatePicker;
+
+import com.google.common.base.Joiner;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import com.nuix.nx.NuixConnection;
+import com.nuix.nx.controls.BatchExporterLoadFileSettings;
+import com.nuix.nx.controls.BatchExporterNativeSettings;
+import com.nuix.nx.controls.BatchExporterPdfSettings;
+import com.nuix.nx.controls.BatchExporterTextSettings;
+import com.nuix.nx.controls.BatchExporterTraversalSettings;
+import com.nuix.nx.controls.ChoiceTableControl;
+import com.nuix.nx.controls.ComboItemBox;
+import com.nuix.nx.controls.CsvTable;
+import com.nuix.nx.controls.DynamicTableControl;
+import com.nuix.nx.controls.LocalWorkerSettings;
+import com.nuix.nx.controls.MultipleChoiceComboBox;
+import com.nuix.nx.controls.OcrSettings;
+import com.nuix.nx.controls.PathList;
+import com.nuix.nx.controls.PathSelectionControl;
+import com.nuix.nx.controls.StringList;
+import com.nuix.nx.controls.models.Choice;
+import com.nuix.nx.controls.models.ControlDeserializationHandler;
+import com.nuix.nx.controls.models.ControlSerializationHandler;
+
+/***
+ * Allows you to build a settings dialog with multiple tabs.  Each tab is a {@link CustomTabPanel} which
+ * suports easily adding various controls such as check boxes, text field, radio buttons and so on.
+ * @author Jason Wells
+ *
+ */
+@SuppressWarnings("serial")
+public class TabbedCustomDialog extends JDialog {
+	private static Logger logger = Logger.getLogger(TabbedCustomDialog.class);
+	
+	private Map tabs = new LinkedHashMap();
+	Map controls;
+	private boolean dialogResult = false;
+	private ValidationCallback validationCallback;
+	private boolean stickySettingsEnabled = false;
+	private String stickySettingsFilePath = "";
+	private File helpFile = null;
+	private String helpUrl = null;
+	private String dateSerializationFormat = "yyyy-MM-dd HH:mm:ss";
+	private SimpleDateFormat sdf = new SimpleDateFormat(dateSerializationFormat);
+	
+	private Map serializationHandlers = new HashMap();
+	private Map deserializationHandlers = new HashMap();
+	
+	private JTabbedPane tabbedPane;
+	private JButton btnOk;
+	private JButton btnCancel;
+	private JMenuBar menuBar;
+	private JMenu mnFile;
+	private JMenuItem mntmSaveSettings;
+	private JMenuItem mntmLoadSettings;
+	private JMenu mnHelp;
+	private JMenuItem mntmViewHelp;
+	private Runnable jsonFileLoadedCallback;
+	
+	/***
+	 * Create a new instance.
+	 */
+	public TabbedCustomDialog() {
+		 this("Script"); 
+	}
+	
+	/***
+	 * Create a new instance with the specified title.
+	 * @param title The inital title of the dialog.
+	 */
+	public TabbedCustomDialog(String title) {
+		super((JDialog)null);
+		setTitle(title);
+		setIconImage(Toolkit.getDefaultToolkit().getImage(TabbedCustomDialog.class.getResource("/icons/nuix_icon.png")));
+		controls = new HashMap();
+		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+		this.setModal(true);
+		setSize(new Dimension(1024,768));
+		GridBagLayout gridBagLayout = new GridBagLayout();
+		gridBagLayout.columnWidths = new int[]{432, 0};
+		gridBagLayout.rowHeights = new int[]{0, 0, 0};
+		gridBagLayout.columnWeights = new double[]{1.0, Double.MIN_VALUE};
+		gridBagLayout.rowWeights = new double[]{1.0, 0.0, Double.MIN_VALUE};
+		getContentPane().setLayout(gridBagLayout);
+		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
+		GridBagConstraints gbc_tabbedPane = new GridBagConstraints();
+		gbc_tabbedPane.insets = new Insets(0, 0, 5, 0);
+		gbc_tabbedPane.fill = GridBagConstraints.BOTH;
+		gbc_tabbedPane.gridx = 0;
+		gbc_tabbedPane.gridy = 0;
+		getContentPane().add(tabbedPane, gbc_tabbedPane);
+		
+		JPanel buttonsPanel = new JPanel();
+		GridBagConstraints gbc_buttonsPanel = new GridBagConstraints();
+		gbc_buttonsPanel.anchor = GridBagConstraints.EAST;
+		gbc_buttonsPanel.gridx = 0;
+		gbc_buttonsPanel.gridy = 1;
+		getContentPane().add(buttonsPanel, gbc_buttonsPanel);
+		
+		btnOk = new JButton("Ok");
+		btnOk.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				if(TabbedCustomDialog.this.validationCallback != null){
+					try{
+						if(validationCallback.validate(TabbedCustomDialog.this.toMap()) == false){
+							return;
+						}
+					}
+					catch(Exception exc){
+						System.out.println("Validation callback on TabbedCustomDialog threw an exception!");
+						exc.printStackTrace();
+					}
+				}
+				TabbedCustomDialog.this.dialogResult = true;
+				if(stickySettingsEnabled){
+					try {
+						saveJsonFile(stickySettingsFilePath);
+					} catch (Exception e) {
+						
+					}
+				}
+				TabbedCustomDialog.this.dispose();
+			}
+		});
+		buttonsPanel.add(btnOk);
+		
+		btnCancel = new JButton("Cancel");
+		btnCancel.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				dialogResult = false;
+				TabbedCustomDialog.this.dispose();
+			}
+		});
+		buttonsPanel.add(btnCancel);
+		
+		menuBar = new JMenuBar();
+		setJMenuBar(menuBar);
+		
+		mnFile = new JMenu("File");
+		mnFile.setIcon(new ImageIcon(TabbedCustomDialog.class.getResource("/icons/page_white_text.png")));
+		menuBar.add(mnFile);
+		
+		mntmSaveSettings = new JMenuItem("Save Settings...");
+		mntmSaveSettings.setIcon(new ImageIcon(TabbedCustomDialog.class.getResource("/icons/page_white_put.png")));
+		mntmSaveSettings.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				File saveLocation = CommonDialogs.saveFileDialog("", "Settings JSON File", "json", "Save Settings to File");
+				if(saveLocation != null){
+					try {
+						saveJsonFile(saveLocation.getPath());
+					} catch (Exception e) {
+						CommonDialogs.showError("Error while saving settings: "+e.getMessage());
+						e.printStackTrace();
+					}
+				}
+			}
+		});
+		mnFile.add(mntmSaveSettings);
+		
+		mntmLoadSettings = new JMenuItem("Load Settings...");
+		mntmLoadSettings.setIcon(new ImageIcon(TabbedCustomDialog.class.getResource("/icons/page_white_get.png")));
+		mntmLoadSettings.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				File loadLocation = CommonDialogs.openFileDialog("", "Settings JSON File", "json", "Load Settings to File");
+				if(loadLocation != null){
+					try {
+						loadJsonFile(loadLocation.getPath());
+					} catch (IOException e1) {
+						CommonDialogs.showError("Error while loading settings: " + e1.getMessage());
+					}
+				}
+			}
+		});
+		mnFile.add(mntmLoadSettings);
+		
+		mnHelp = new JMenu("Help");
+		mnHelp.setIcon(new ImageIcon(TabbedCustomDialog.class.getResource("/icons/help.png")));
+		mnHelp.setVisible(false);
+		menuBar.add(mnHelp);
+		
+		mntmViewHelp = new JMenuItem("View Help");
+		mntmViewHelp.setVisible(false);
+		mntmViewHelp.setIcon(new ImageIcon(TabbedCustomDialog.class.getResource("/icons/help.png")));
+		mntmViewHelp.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent arg0) {
+				if(helpFile != null){
+					if(helpFile.exists()){
+						try {
+							Desktop.getDesktop().open(helpFile);
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+					} else {
+						CommonDialogs.showWarning("Could not find help file at: "+helpFile.getPath());
+					}
+				}
+			}
+		});
+		mnHelp.add(mntmViewHelp);
+		
+		mntmViewOnlineHelp = new JMenuItem("View Online Help");
+		mntmViewOnlineHelp.setVisible(false);
+		mntmViewOnlineHelp.addActionListener(new ActionListener() {
+			public void actionPerformed(ActionEvent e) {
+				try {
+					Desktop.getDesktop().browse(java.net.URI.create(helpUrl));
+				} catch (IOException e1) {
+					CommonDialogs.showError("Unable to open help page at "+helpUrl+"\n\n"+e1.getMessage());
+				}
+			}
+		});
+		mntmViewOnlineHelp.setIcon(new ImageIcon(TabbedCustomDialog.class.getResource("/icons/help.png")));
+		mnHelp.add(mntmViewOnlineHelp);
+	}
+	
+	/***
+	 * Displays this custom dialog.  Dialog is modal so this call will block caller until dialog is closed.  To determine
+	 * whether user clicked "Ok", "Cancel" or closed the dialog, call {@link #getDialogResult()} afterwards.
+	 */
+	public void display(){
+		dialogResult = false;
+		if(stickySettingsEnabled){
+			try{
+				loadJsonFile(stickySettingsFilePath);
+			}catch(Exception exc){
+				String message = String.format("Error while loading sticky settings JSON file '%s'", stickySettingsFilePath); 
+				logger.error(message,exc);
+			}
+		}
+		
+		if(helpFile != null && helpFile.exists()) {
+			mnHelp.setVisible(true);
+			mntmViewHelp.setVisible(true);
+		}
+			
+		if(helpUrl != null && !helpUrl.trim().isEmpty()) {
+			mnHelp.setVisible(true);
+			mntmViewOnlineHelp.setVisible(true);
+		}
+		
+		for(CustomTabPanel tab : tabs.values()){
+			tab.addVerticalFillerAsNeeded();
+			tabbedPane.addTab(tab.getLabel(), tab);
+		}
+		//pack();
+		setLocationRelativeTo(null);
+		setVisible(true);
+	}
+	
+	/***
+	 * Similar to {@link #display()} except that the dialog will be displayed non-modal and will invoke the provided callback
+	 * when the dialog is closed and the result of {@link #getDialogResult()} returns true.  Note that invoking this from a
+	 * script essentially behaves as asynchronous call from the script's perspective!
+	 * @param callback The callback to invoke when the dialog is closed.
+	 */
+	public void displayNonModal(Consumer callback){
+		dialogResult = false;
+		if(stickySettingsEnabled){
+			try{
+				loadJsonFile(stickySettingsFilePath);
+			}catch(Exception exc){
+				String message = String.format("Error while loading sticky settings JSON file '%s'", stickySettingsFilePath); 
+				logger.error(message,exc);
+			}
+		}
+		
+		if(helpFile != null && helpFile.exists()) {
+			mnHelp.setVisible(true);
+			mntmViewHelp.setVisible(true);
+		}
+			
+		if(helpUrl != null && !helpUrl.trim().isEmpty()) {
+			mnHelp.setVisible(true);
+			mntmViewOnlineHelp.setVisible(true);
+		}
+		
+		for(CustomTabPanel tab : tabs.values()){
+			tab.addVerticalFillerAsNeeded();
+			tabbedPane.addTab(tab.getLabel(), tab);
+		}
+
+		//Call users callback on successful close
+		this.addWindowListener(new WindowListener(){
+
+			@Override
+			public void windowOpened(WindowEvent e) { /*ignored for this use*/  }
+
+			@Override
+			public void windowClosing(WindowEvent e) { /*ignored for this use*/  }
+
+			@Override
+			public void windowClosed(WindowEvent e) {
+				if(getDialogResult() == true){
+					callback.accept(getDialogResult());
+				}
+			}
+
+			@Override
+			public void windowIconified(WindowEvent e) { /*ignored for this use*/  }
+
+			@Override
+			public void windowDeiconified(WindowEvent e) { /*ignored for this use*/  }
+
+			@Override
+			public void windowActivated(WindowEvent e) { /*ignored for this use*/  }
+
+			@Override
+			public void windowDeactivated(WindowEvent e) { /*ignored for this use*/ }
+		});
+		
+		setModal(false);
+		setLocationRelativeTo(null);
+		setVisible(true);
+	}
+	
+	/***
+	 * Resizes the dialog to fill the screen, less the specified margin on all sides.
+	 * @param margins The margin size on all sides
+	 */
+	public void fillScreen(int margins){
+		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+		Dimension fillSize = new Dimension((int) screenSize.getWidth() - (margins * 2),
+				(int) screenSize.getHeight() - (margins * 2));
+		setSize(fillSize);
+	}
+	
+	/***
+	 * Gets the tab with the specified ID
+	 * @param id The ID specified when the tab was created
+	 * @return The tab associated with the specified ID
+	 */
+	public CustomTabPanel getTab(String id) {
+		return tabs.get(id);
+	}
+	
+	/***
+	 * Adds a new tab to the dialog.
+	 * @param id The case sensitive unique identifier used to reference this tab
+	 * @param label The label for the tab
+	 * @return A newly created tab associated to this dialog
+	 */
+	public CustomTabPanel addTab(String id, String label) {
+		if(tabs.containsKey(id))
+			throw new RuntimeException("Dialog already contains a tab with the ID: "+id);
+		
+		CustomTabPanel newTab = new CustomTabPanel(label,this);
+		tabs.put(id,newTab);
+		controls.put(id, newTab);
+		return newTab;
+	}
+	
+	public ScrollableCustomTabPanel addScrollableTab(String id, String label) {
+		if(tabs.containsKey(id))
+			throw new RuntimeException("Dialog already contains a tab with the ID: "+id);
+		
+		ScrollableCustomTabPanel newTab = new ScrollableCustomTabPanel(label,this);
+		tabs.put(id,newTab);
+		controls.put(id, newTab);
+		return newTab;
+	}
+	
+	/***
+	 * Updates the label for given tab to a new value
+	 * @param tabId Id assigned to the tab when it was added
+	 * @param label The new label value for the tab
+	 */
+	public void setTabLabel(String tabId, String label){
+		tabbedPane.setTitleAt(tabbedPane.indexOfComponent(getTab(tabId)), label);
+	}
+	
+	/***
+	 * Allows you to change the orientation of the tabs in the dialog by providing one of the
+	 * JTabbedPane alignment constants
+	 * @param tabPlacement A JTabbedPane alignment constant, such as JTabbedPane.LEFT
+	 */
+	public void setTabPlacement(int tabPlacement){
+		tabbedPane.setTabPlacement(tabPlacement);
+	}
+	
+	/***
+	 * Changes the orientation of the dialogs tabs to be along the left side of the dialog
+	 */
+	public void setTabPlacementLeft(){
+		setTabPlacement(JTabbedPane.LEFT);
+	}
+
+	/***
+	 * Gets the result of showing the dialog.
+	 * @return True if the user clicked the 'Ok' button.  False if otherwise ('Cancel' button or closed the dialog).
+	 */
+	public boolean getDialogResult() {
+		return dialogResult;
+	}
+	
+	/***
+	 * Returns a Map of the control values.
+	 * @return Map where the assigned identifier is the key and the control's value is the value.
+	 */
+	public Map toMap(){
+		return toMap(false);
+	}
+	
+	/***
+	 * Returns a Map of the control values.
+	 * @param forJsonCreation Set to true if the output is intended to be serialized to JSON.  Some
+	 * of the values in the map may be generated differently to better cooperate with what JSON
+	 * is capable of storing.
+	 * @return Map where the assigned identifier is the key and the control's value is the value.
+	 */
+	public Map toMap(boolean forJsonCreation){
+		Map result = new HashMap();
+		for(CustomTabPanel tab : tabs.values()){
+			result.putAll(tab.toMap(forJsonCreation));
+		}
+		return result;
+	}
+	
+	/***
+	 * Registers an event handle such that a given control is only enabled when another checkable control is checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifier The identifier of the already added checkable control which will determine the enabled state of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenChecked(String dependentControlIdentifier, String targetCheckableIdentifier) throws Exception{
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		Component targetComponent = controls.get(targetCheckableIdentifier);
+		boolean currentCheckedState = isChecked(targetCheckableIdentifier);
+		dependentComponent.setEnabled(currentCheckedState);
+		((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+			@Override
+			public void itemStateChanged(ItemEvent arg0) {
+				try {
+					controls.get(dependentControlIdentifier).setEnabled(isChecked(targetCheckableIdentifier));
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		});
+	}
+	
+	/***
+	 * Similar to {@link #enabledOnlyWhenChecked(String, String)}, this method registers event handlers on one or more checkable controls
+	 * such that a given dependent control is only enabled when all of the specified target checkable controls are checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifiers The identifier of the one or more already added checkable controls which will determine the enabled state
+	 * of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenAllChecked(String dependentControlIdentifier, String... targetCheckableIdentifiers) throws Exception {
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		
+		for (int i = 0; i < targetCheckableIdentifiers.length; i++) {
+			Component targetComponent = controls.get(targetCheckableIdentifiers[i]);
+			if(targetComponent instanceof java.awt.ItemSelectable) {
+				((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+					@Override
+					public void itemStateChanged(ItemEvent arg0) {
+						try {
+							boolean currentCheckedState = allAreChecked(targetCheckableIdentifiers);
+							dependentComponent.setEnabled(currentCheckedState);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				});
+			}
+		}
+		
+		// Set initial state
+		boolean currentCheckedState = allAreChecked(targetCheckableIdentifiers);
+		dependentComponent.setEnabled(currentCheckedState);
+	}
+	
+	/***
+	 * Similar to {@link #enabledOnlyWhenChecked(String, String)}, this method registers event handlers on one or more checkable controls
+	 * such that a given dependent control is only enabled when none of the specified target checkable controls are checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifiers The identifier of the one or more already added checkable controls which will determine the enabled state
+	 * of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenNoneChecked(String dependentControlIdentifier, String... targetCheckableIdentifiers) throws Exception {
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		
+		for (int i = 0; i < targetCheckableIdentifiers.length; i++) {
+			Component targetComponent = controls.get(targetCheckableIdentifiers[i]);
+			if(targetComponent instanceof java.awt.ItemSelectable) {
+				((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+					@Override
+					public void itemStateChanged(ItemEvent arg0) {
+						try {
+							boolean currentCheckedState = noneAreChecked(targetCheckableIdentifiers);
+							dependentComponent.setEnabled(currentCheckedState);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				});
+			}
+		}
+		
+		// Set initial state
+		boolean currentCheckedState = noneAreChecked(targetCheckableIdentifiers);
+		dependentComponent.setEnabled(currentCheckedState);
+	}
+	
+	/***
+	 * Similar to {@link #enabledOnlyWhenChecked(String, String)}, this method registers event handlers on one or more checkable controls
+	 * such that a given dependent control is only enabled when at least one of the specified target checkable controls are checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifiers The identifier of the one or more already added checkable controls which will determine the enabled state
+	 * of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledIfAnyChecked(String dependentControlIdentifier, String... targetCheckableIdentifiers) throws Exception {
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		
+		for (int i = 0; i < targetCheckableIdentifiers.length; i++) {
+			Component targetComponent = controls.get(targetCheckableIdentifiers[i]);
+			if(targetComponent instanceof java.awt.ItemSelectable) {
+				((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+					@Override
+					public void itemStateChanged(ItemEvent arg0) {
+						try {
+							boolean currentCheckedState = anyAreChecked(targetCheckableIdentifiers);
+							dependentComponent.setEnabled(currentCheckedState);
+						} catch (Exception e) {
+							e.printStackTrace();
+						}
+					}
+				});
+			}
+		}
+		
+		// Set initial state
+		boolean currentCheckedState = anyAreChecked(targetCheckableIdentifiers);
+		dependentComponent.setEnabled(currentCheckedState);
+	}
+	
+	/***
+	 * Registers an event handle such that a given control is only enabled when another checkable control is not checked.
+	 * @param dependentControlIdentifier The identifier of the already added control for which the enabled state depends on another checkable control.
+	 * @param targetCheckableIdentifier The identifier of the already added checkable control which will determine the enabled state of the dependent control.
+	 * @throws Exception This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier
+	 * does not point to a checkable control (CheckBox or RadioButton).
+	 */
+	public void enabledOnlyWhenNotChecked(String dependentControlIdentifier, String targetCheckableIdentifier) throws Exception{
+		Component dependentComponent = controls.get(dependentControlIdentifier);
+		Component targetComponent = controls.get(targetCheckableIdentifier);
+		boolean currentCheckedState = isChecked(targetCheckableIdentifier);
+		dependentComponent.setEnabled(!currentCheckedState);
+		((java.awt.ItemSelectable)targetComponent).addItemListener(new ItemListener(){
+			@Override
+			public void itemStateChanged(ItemEvent arg0) {
+				try {
+					controls.get(dependentControlIdentifier).setEnabled(!isChecked(targetCheckableIdentifier));
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		});
+	}
+	
+	/***
+	 * Gets whether a particular Checkbox or RadioButton is checked.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @return True if the control is checked, false otherwise.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
+	 */
+	public boolean isChecked(String identifier) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JCheckBox){
+			return ((JCheckBox)controls.get(identifier)).isSelected();	
+		}
+		else if(component instanceof JRadioButton){
+			return ((JRadioButton)controls.get(identifier)).isSelected();
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a JCheckbox or JRadioButton");
+	}
+	
+	public boolean allAreChecked(String... identifiers) throws Exception {
+		for (int i = 0; i < identifiers.length; i++) {
+			if(!isChecked(identifiers[i])) { return false; }
+		}
+		return true;
+	}
+	
+	public boolean noneAreChecked(String... identifiers) throws Exception {
+		for (int i = 0; i < identifiers.length; i++) {
+			if(isChecked(identifiers[i])) { return false; }
+		}
+		return true;
+	}
+	
+	public boolean anyAreChecked(String... identifiers) throws Exception {
+		for (int i = 0; i < identifiers.length; i++) {
+			if(isChecked(identifiers[i])) { return true; }
+		}
+		return false;
+	}
+	
+	/***
+	 * Sets whether a particular Checkbox or RadioButton is checked.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @param isChecked True to check the control, false to uncheck the control.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
+	 */
+	public void setChecked(String identifier, boolean isChecked) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JCheckBox){
+			((JCheckBox)controls.get(identifier)).setSelected(isChecked);
+		}
+		else if(component instanceof JRadioButton){
+			((JRadioButton)controls.get(identifier)).setSelected(isChecked);
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a JCheckbox or JRadioButton");
+	}
+	
+	/***
+	 * Gets the text present in a TextField or PasswordField.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @return The text present in the control.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
+	 */
+	public String getText(String identifier) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JPasswordField){
+			return new String(((JPasswordField)component).getPassword());
+		}
+		else if (component instanceof JTextField){
+			return ((JTextField)component).getText();
+		}
+		else if(component instanceof PathSelectionControl){
+			return ((PathSelectionControl)component).getPath();
+		}
+		else if(component instanceof JComboBox){
+			return (String)((JComboBox)component).getSelectedItem();
+		}
+		else if(component instanceof JTextArea){
+			return ((JTextArea)component).getText();
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a supported control type: JPasswordField, JTextField, PathSelectionControl, JTextArea");
+	}
+	
+	/***
+	 * Sets the text present in a TextField or PasswordField.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @param text The text value to set.
+	 * @throws Exception Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
+	 */
+	public void setText(String identifier, String text) throws Exception{
+		Component component = controls.get(identifier);
+		if(component instanceof JPasswordField){
+			((JPasswordField)component).setText(text);
+		}
+		else if (component instanceof JTextField){
+			((JTextField)component).setText(text);
+		}
+		else if(component instanceof PathSelectionControl){
+			((PathSelectionControl)component).setPath(text);
+		}
+		else if(component instanceof ComboItemBox){
+			((ComboItemBox)component).setSelectedValue(text);
+		}
+		else if(component instanceof JComboBox){
+			((JComboBox)component).setSelectedItem(text);
+		}
+		else if (component instanceof JTextArea){
+			((JTextArea)component).setText(text);
+		}
+		else
+			throw new Exception("Control for identifier '"+identifier+"' is not a supported control type: JPasswordField, JTextField, PathSelectionControl, JTextArea");
+	}
+	
+	/***
+	 * Allows you to get the actual Java Swing control.  You will likely need to cast it to the appropriate type before use.
+	 * @param identifier The unique identifier assigned to the control when it was appended to this dialog.
+	 * @return The control as base class Component.  See documentation for various append methods for control types.
+	 */
+	public Component getControl(String identifier){
+		return controls.get(identifier);
+	}
+	
+	/***
+	 * This enables "sticky settings" where the dialog will save a JSON file of settings when 'Okay' is clicked and will attempt to
+	 * load previously saved settings when the dialog is displayed.  This currently only works with controls added to the dialog which
+	 * support {@link setText} and {@link setChecked}.  See {@link #toJson} and {@link #loadJson}.
+	 * @param filePath The full file path where you expect the settings JSON file to be located.  Likely you will generate a path relative to your script at runtime.
+	 */
+	public void enableStickySettings(String filePath){
+		stickySettingsEnabled = true;
+		stickySettingsFilePath = filePath;
+	}
+	
+	/***
+	 * Allows code to implement and provide a callback which can validate whether things are okay.
+	 * @param callback Callback should return false if things are not satisfactory, true otherwise.
+	 */
+	public void validateBeforeClosing(ValidationCallback callback){
+		validationCallback = callback;
+	}
+	
+	/***
+	 * Gets a JSON String equivalent of the dialog values.  This is a convenience method for calling
+	 * {@link #toMap} and then converting that Map to a JSON string.
+	 * @return A JSON string representation of the dialogs values (based on the Map returned by {@link toMap}).
+	 */
+	public String toJson(){
+		GsonBuilder builder = new GsonBuilder();
+		builder.setPrettyPrinting();
+		builder.setDateFormat(dateSerializationFormat);
+		Gson gson = builder.create();
+		String jsonString = gson.toJson(toMap(true));
+		// https://github.com/google/gson/issues/388#issuecomment-83704872
+		StringBuilder result = new StringBuilder();
+		for(char c : jsonString.toCharArray()) {
+			if (c <= 0x7F) {
+				result.append(c);
+			} else {
+				// Escape
+				result.append(String.format("\\u%04x", (int) c));
+			}
+		}
+		return result.toString();
+	}
+	
+	/***
+	 * Attempts to set control values based on entries in JSON file.  Entries which are unknown or cause errors are ignored.
+	 * Loads JSON onto any controls in any tabs contained by this TabbedCustomDialog instance.
+	 * @param json A JSON string to attempt to load.
+	 */
+	public void loadJson(String json){
+		loadJson(json,controls);
+	}
+	
+	/***
+	 * Loads JSON but only to the controls contained within the specified tab.
+	 * @param json A JSON string to attempt to load
+	 * @param tabIdentifier Identifier of existing tab to which you would like to load the JSON into.
+	 */
+	public void loadJson(String json, String tabIdentifier){
+		loadJson(json,tabs.get(tabIdentifier).controls);
+	}
+	
+	/***
+	 * Attempts to set control values based on entries in JSON file.  Entries which are unknown or cause errors are ignored.
+	 * @param json A JSON string to attempt to load.
+	 * @param controlMap A map of components to load the JSON onto.
+	 */
+	@SuppressWarnings({ "rawtypes", "unchecked" })
+	public void loadJson(String json, Map controlMap){
+		Gson gson = new Gson();
+		System.out.println("Parsing JSON...");
+		Map fieldValues = gson.fromJson(json,new TypeToken>(){}.getType());
+		System.out.println("Assigning values to controls...");
+		for(Map.Entry entry : fieldValues.entrySet()){
+			String controlIdentifier = entry.getKey();
+			Component control = controlMap.get(controlIdentifier);
+			try{
+				if(deserializationHandlers.containsKey(controlIdentifier)){
+					//Dynamic table needs to have filter cleared before being meddled with
+					if (control instanceof DynamicTableControl){
+						((DynamicTableControl)control).setFilter("");
+					}
+					
+					deserializationHandlers.get(controlIdentifier).deserializeControlData(entry.getValue(), control);
+				}
+				else if (entry.getValue() instanceof Boolean){
+					// Call general purpose set checked method
+					setChecked(controlIdentifier,(Boolean)entry.getValue());
+				}
+				else if(control instanceof JSpinner){
+					((JSpinner)control).setValue(entry.getValue());
+				}
+				else if(control instanceof JSlider) {
+					BoundedRangeModel model = ((JSlider) control).getModel();
+					if(model instanceof DoubleBoundedRangeModel) {
+						((DoubleBoundedRangeModel)model).setValue(((Number)entry.getValue()).doubleValue());
+					} else {
+						model.setValue(((Number)entry.getValue()).intValue());
+					}
+				}
+				// These require a bit more logic to deserialize
+				else if(control instanceof ChoiceTableControl){
+					ChoiceTableControl choiceTable = (ChoiceTableControl) control;
+					choiceTable.getTableModel().uncheckAllChoices();
+					List selectedLabels = new ArrayList();
+					for(String value : (Iterable)entry.getValue()){
+						selectedLabels.add(value);
+					}
+					choiceTable.getTableModel().setCheckedByLabels(selectedLabels, true);
+					choiceTable.getTableModel().sortCheckedToTop();
+				} else if(control instanceof PathList){
+					PathList pathList = (PathList) control;
+					List values = new ArrayList();
+					for(String value : (Iterable)entry.getValue()){
+						values.add(value);
+					}
+					pathList.setPaths(values);
+				}
+				else if(control instanceof StringList){
+					StringList stringList = (StringList) control;
+					List values = new ArrayList();
+					for(String value : (Iterable)entry.getValue()){
+						values.add(value);
+					}
+					stringList.setValues(values);
+				}
+				else if(control instanceof MultipleChoiceComboBox) {
+					MultipleChoiceComboBox mccb = (MultipleChoiceComboBox) control;
+					List values = (ArrayList) entry.getValue();
+					mccb.setCheckedChoices(values);
+				}
+				else if(control instanceof LocalWorkerSettings){
+					LocalWorkerSettings lws = (LocalWorkerSettings) control;
+					Map settings = (Map)entry.getValue();
+					//System.out.println(settings);
+					lws.setWorkerCount(((Double) settings.get("workerCount")).intValue());
+					lws.setMemoryPerWorker(((Double) settings.get("workerMemory")).intValue());
+					lws.setWorkerTempDirectory((String) settings.get("workerTemp"));
+				}
+				else if(control instanceof BatchExporterTraversalSettings){
+					BatchExporterTraversalSettings bets = (BatchExporterTraversalSettings) control;
+					Map settings = (Map)entry.getValue();
+					bets.getComboTraversal().setSelectedValue((String)settings.get("strategy"));
+					bets.getComboDedupe().setSelectedValue((String)settings.get("deduplication"));
+					bets.getComboSortOrder().setSelectedValue((String)settings.get("sortOrder"));
+				}
+				else if(control instanceof BatchExporterNativeSettings){
+					BatchExporterNativeSettings bens = (BatchExporterNativeSettings) control;
+					Map settings = (Map)entry.getValue();
+					bens.getComboNaming().setSelectedValue((String)settings.get("naming"));
+					bens.getTxtPath().setText((String)settings.get("path"));
+					bens.getTxtSuffix().setText((String)settings.get("suffix"));
+					bens.getComboMailFormat().setSelectedValue((String)settings.get("mailFormat"));
+					bens.getChckbxIncludeAttachments().setSelected((Boolean)settings.get("includeAttachments"));
+					bens.getChckbxRegenerateStored().setSelected((Boolean)settings.get("regenerateStored"));
+				}
+				else if(control instanceof BatchExporterTextSettings){
+					BatchExporterTextSettings bets = (BatchExporterTextSettings) control;
+					Map settings = (Map)entry.getValue();
+					bets.getComboNaming().setSelectedValue((String)settings.get("naming"));
+					bets.getTxtPath().setText((String)settings.get("path"));
+					bets.getTxtSuffix().setText((String)settings.get("suffix"));
+					bets.getChckbxWrapLines().setSelected((Boolean)settings.get("wrapLinesChecked"));
+					bets.getSpinnerWrapLength().setValue(((Double)settings.get("wrapLines")).intValue());
+					bets.getComboLineSeparator().setSelectedValue((String)settings.get("lineSeparator"));
+					bets.getComboEncoding().setSelectedValue((String)settings.get("encoding"));
+				}
+				else if(control instanceof BatchExporterPdfSettings){
+					BatchExporterPdfSettings beps = (BatchExporterPdfSettings) control;
+					Map settings = (Map)entry.getValue();
+					beps.getComboNaming().setSelectedValue((String)settings.get("naming"));
+					beps.getTxtPath().setText((String)settings.get("path"));
+					beps.getTxtSuffix().setText((String)settings.get("suffix"));
+					beps.getChckbxRegenerateStored().setSelected((Boolean)settings.get("regenerateStored"));
+				}
+				else if(control instanceof BatchExporterLoadFileSettings){
+					BatchExporterLoadFileSettings belfs = (BatchExporterLoadFileSettings) control;
+					Map settings = (Map)entry.getValue();
+					belfs.getComboLoadFileType().setSelectedValue((String)settings.get("type"));
+					belfs.getComboProfile().setSelectedValue((String)settings.get("metadataProfile"));
+					belfs.getComboEncoding().setSelectedValue((String)settings.get("encoding"));
+					belfs.getComboLineSeparator().setSelectedValue((String)settings.get("lineSeparator"));
+				}
+				else if(control instanceof OcrSettings){
+					OcrSettings os = (OcrSettings) control;
+					Map settings = (Map)entry.getValue();
+					os.getChckbxRegeneratePdfs().setSelected((Boolean)settings.get("regeneratePdfs"));
+					os.getChckbxUpdatePdfText().setSelected((Boolean)settings.get("updatePdf"));
+					os.getChckbxUpdateItemText().setSelected((Boolean)settings.get("updateText"));
+					os.getComboTextModification().setSelectedValue((String)settings.get("textModification"));
+					os.getComboQuality().setSelectedValue((String)settings.get("quality"));
+					os.getComboRotation().setSelectedValue((String)settings.get("rotation"));
+					os.getChckbxDeskew().setSelected((Boolean)settings.get("deskew"));
+					os.getOutputDirectory().setPath((String)settings.get("outputDirectory"));
+					
+					if(NuixConnection.getCurrentNuixVersion().isAtLeast("7.2.0") && settings.containsKey("updateDuplicates")){
+						os.setUpdateDuplicates((Boolean)settings.get("updateDuplicates"));
+					}
+					
+					if(NuixConnection.getCurrentNuixVersion().isAtLeast("7.2.0") && settings.containsKey("timeout")){
+						os.setTimeoutMinutes(((Double)settings.get("timeout")).intValue());
+					}
+					
+					ChoiceTableControl choiceTable = os.getLanguageChoices();
+					// Should clear check state before loading in new check state
+					choiceTable.getTableModel().uncheckAllChoices();
+					List loadedChoices = new ArrayList();
+					for(String value : (Iterable)settings.get("languages")){
+						Choice choice = choiceTable.getTableModel().getFirstChoiceByLabel(value);
+						if(choice != null){
+							choiceTable.getTableModel().setChoiceSelection(choice, true);
+							loadedChoices.add(choice);
+						}
+						else {
+							System.out.println("Unable to resolve choice for "+entry.getKey()+" => "+value);
+						}
+					}
+					choiceTable.getTableModel().sortChoicesToTop(loadedChoices);
+				}
+				else if (control instanceof DynamicTableControl){
+					((DynamicTableControl)control).setFilter("");
+					List values = new ArrayList();
+					for(String value : (Iterable)entry.getValue()){
+						values.add(value);
+					}
+					((DynamicTableControl)control).getTableModel().setCheckedRecordsFromHashes(values);
+				}
+				else if (control instanceof CsvTable){
+					CsvTable table = (CsvTable)control;
+					List> records = (List>)entry.getValue();
+					for (Map record : records) {
+						table.addRecord(record);
+					}
+				}
+				else if(entry.getValue() instanceof String){
+					if(control instanceof JXDatePicker){
+						((JXDatePicker)control).setDate(sdf.parse((String)entry.getValue()));
+					} else {
+						// Call general purpose set text method
+						setText(controlIdentifier,(String)entry.getValue());
+					}
+				}
+			}catch(Exception exc){
+				System.out.println("Error while deserializing JSON field '"+controlIdentifier+"':");
+				System.out.println(exc.toString());
+				exc.printStackTrace();
+			}
+		}
+	}
+	
+	/***
+	 * Saves the settings of this dialog to a JSON file
+	 * @param filePath Path to the JSON file settings will be saved to
+	 * @throws Exception Thrown if there are exceptions while saving the file
+	 */
+	public void saveJsonFile(String filePath) throws Exception{
+		FileWriter fw = null;
+		PrintWriter pw = null;
+		try{
+			fw = new FileWriter(filePath);
+			pw = new PrintWriter(fw);
+			pw.print(toJson());
+		}catch(Exception exc){
+			throw exc;
+		}
+		finally{
+			try {
+				if(fw != null) { fw.close(); }
+				if(pw != null) { pw.close(); }
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+	
+	/***
+	 * Loads the settings of this dialog from a JSON file
+	 * @param filePath Path to the JSON file settings will be loaded from
+	 * @throws IOException Thrown if there are exceptions while loading the file
+	 */
+	public void loadJsonFile(String filePath) throws IOException{
+		System.out.println("Loading JSON file "+filePath);
+		List lines = Files.readAllLines(Paths.get(filePath));
+		System.out.println("File lines read...");
+		loadJson(Joiner.on("\n").join(lines));
+		if (jsonFileLoadedCallback != null){
+			jsonFileLoadedCallback.run();
+		}
+	}
+	
+	/***
+	 * The File currently associated to the "Help" menu "View Documentation" entry
+	 * @return The currently associated help file
+	 */
+	public File getHelpFile() {
+		return helpFile;
+	}
+	
+	/***
+	 * Sets the path to a help file which will be associated to the "Help" menu "View Documentation" entry
+	 * @param helpFile Path to a help file (set null to hide help menu, default is null)
+	 */
+	public void setHelpFile(File helpFile) {
+		this.helpFile = helpFile;
+	}
+	
+	/***
+	 * Sets the path to a help file which will be associated to the "Help" menu "View Help" entry
+	 * @param helpFile Path to a help file (set null to hide help menu, default is null)
+	 */
+	public void setHelpFile(String helpFile) {
+		setHelpFile(new File(helpFile));
+	}
+
+	/***
+	 * Sets the URL which will be associated to the "Help" menu "View Online Help" entry.
+	 * @param helpUrl URL to a web site
+	 */
+	public void setHelpUrl(String helpUrl) {
+		this.helpUrl = helpUrl;
+	}
+
+	/***
+	 * Hides the file menu from the user (effectively disabling save and load).  Mostly included for situations
+	 * where settings cannot be reasonably saved to JSON so you wish to hide those choices from the user.
+	 */
+	public void hideFileMenu(){
+		mnFile.setVisible(false);
+	}
+	
+	/***
+	 * Allows you to provide a callback to run when a JSON file is loaded.
+	 * @param callback The callback to run
+	 */
+	public void whenJsonFileLoaded(Runnable callback){
+		jsonFileLoadedCallback = callback;
+	}
+	
+	/***
+	 * Advanced!  Allows you to define a callback which will handle serialization of a particular control
+	 * to JSON.
+	 * @param identifier The identifier provided when the control was added to the dialog.
+	 * @param handler The callback which will handle serializing the controls data.
+	 */
+	public void whenSerializing(String identifier, ControlSerializationHandler handler){
+		serializationHandlers.put(identifier, handler);
+	}
+	
+	/***
+	 * Advanced!  Allows you to define a callback which will handle deserialization of a particular control
+	 * from JSON.
+	 * @param identifier The identifier provided when the control was added to the dialog.
+	 * @param handler The callback which will handle deserializing the controls data.
+	 */
+	public void whenDeserializing(String identifier, ControlDeserializationHandler handler){
+		deserializationHandlers.put(identifier, handler);
+	}
+	
+	/***
+	 * Gets the previously provided deserialization handler for a particular control
+	 * @param identifier Control id to which the desired deserializer was assigned
+	 * @return The deserialization handler if one was provided
+	 */
+	public ControlDeserializationHandler getDeserializer(String identifier){
+		return deserializationHandlers.get(identifier);
+	}
+	
+	/***
+	 * Gets the previously provided serialization handler for a particular control
+	 * @param identifier Control id to which the desired serializer was assigned
+	 * @return The serialization handler if one was provided
+	 */
+	public ControlSerializationHandler getSerializer(String identifier){
+		return serializationHandlers.get(identifier);
+	}
+	
+	private Map parentMenus = new HashMap();
+	private JMenuItem mntmViewOnlineHelp;
+	
+	/***
+	 * Adds a menu entry to the menu bar and then a menu item to that menu.
+	 * @param parentMenuLabel The label of the menu to be added to the menu bar.  If one already exists with this name (exact matching) then the created
+	 * menu item will be added to that existing menu.  If a menu with this label does not already exist, it is created.
+	 * @param menuItemLabel The label of the menu item to be added to the specified parent menu.
+	 * @param action The action to perform when the given menu item is clicked.  Example:
+	 * 
{@code
+	 * dialog.addMenu("Add Queries","Add Custodian Queries") do
+	 *	$current_case.getAllCustodians.each do |custodian_name|
+	 *			record = {
+	 *				:name => "Custodian: #{custodian_name}",
+	 *				:query => "custodian:\"#{custodian_name}\"",
+	 *			}
+	 *			dynamic_table.getModel.addRecord(record)
+	 *		end
+	 *		dialog.setSelectedTabIndex(2)
+	 * 	end
+	 * }
+ */ + public void addMenu(String parentMenuLabel, String menuItemLabel, Runnable action) { + JMenu parentMenu = null; + if(!parentMenus.containsKey(parentMenuLabel)) { + parentMenu = new JMenu(parentMenuLabel); + menuBar.add(parentMenu); + parentMenus.put(parentMenuLabel, parentMenu); + } else { + parentMenu = parentMenus.get(parentMenuLabel); + } + + JMenuItem menuItem = new JMenuItem(menuItemLabel); + menuItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { action.run(); } + }); + parentMenu.add(menuItem); + } + + /*** + * Sets which tab is currently selected. + * @param index The index of the tab to make selected (index starts at 0). + */ + public void setSelectedTabIndex(int index) { + tabbedPane.setSelectedIndex(index); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/Toast.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/Toast.java new file mode 100644 index 0000000..e8a4299 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/Toast.java @@ -0,0 +1,171 @@ +package com.nuix.nx.dialogs; + +import javax.swing.*; +import javax.swing.border.EmptyBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +/** + * A Toast is a short-lived informational message displayed in the UI. + *

+ * Generally, Toasts are displayed in the bottom right corner of the UI - either the screen or the window. They + * are meant for non-critical information display not required by the current user workflow. For example if a + * licenses was about to expire, a Toast might be used to display the time left until expiration. + *

+ *

+ * This Toast class represents a reusable container that can display text in a user-defined position on the screen. + * Although the only limits to the position are that they must be fully on-screen, it will be generally useful to + * ensure it is positions towards the bottom of the display as the Toast will animate on screen from below. This + * Toast will have an in-animation that moves the message into view from off the bottom of the screen and an out- + * animation that fades the screen out. Animations are handled in a thread to avoid blocking the UI or scripting + * thread context + *

+ *

+ * Use the {@link #showToast(String, Rectangle)} method to display the message in the location of interest: + *

+ *
+ *         Toast toast = new Toast();
+ *
+ *         String message = "Title\nThis is a brief message about something, but no worries, won't kill the application.";
+ *         Rectangle position = new Rectangle(1400, 1000, 500, 80);
+ *         toast.showToast(message, position);
+ * 
+ *

+ * TODO: I have found the threading can cause slower than expected motion when the computer is under heavy load. + *

+ */ +public class Toast { + private int toastTimeInSeconds = 5; + private String lastMessage = ""; + private Rectangle lastPosition = new Rectangle(0,0,0,0); + + /** + * @param seconds The period of time, in seconds, the Toast should remain on screen after the in-animation + * completes and before the out-animation starts. The full time on screen will be longer than this + * as the animation runs. Defaults to 5 seconds if not set. + */ + public void setToastTimeInSeconds(int seconds) { toastTimeInSeconds = seconds; } + + /** + * @return The period of time, in seconds, the Toast will be displayed on screen after it reaches its destination + * and before it begins to fade out. The actual time on screen will be longer than this as the animations run. + */ + public int getToastTimeInSeconds() { return toastTimeInSeconds; } + + /** + * @return The string contents of the last message sent to the Toast + */ + public String getLastMessage() { return lastMessage; } + + /** + * Display the provided message at the position specified. + *

+ * When this method is called, the Toast will be created and animate in by sliding up to the desired position + * from off the bottom of the screen. Once in position it holds for several seconds then fades away. + * This tool does not manage the display of multiple toasts at one time. + *

+ * @param message A message to display. The message can be multi-line, can include line breaks (\n) and will word + * wrap. + * @param targetPosition A {@link Rectangle} defining the location and size of the box to display the message in. + * The location is relative to the top left of the screen (not window). The width will be + * fixed at the defined size, and the height will be maximized at the defined size (but + * could be smaller if the message wouldn't fill the area). + * @throws RuntimeException if the target position is illegal, such as fully or partially off-screen. + */ + public void showToast(String message, Rectangle targetPosition) { + if (targetPosition.x < 0 || targetPosition.y < 0) + throw new RuntimeException("Target position location must be >= 0"); + + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + if (targetPosition.x > (screenSize.width - targetPosition.width) || + targetPosition.y > (screenSize.height - targetPosition.height)) + throw new RuntimeException("Target position must not be off screen."); + + this.lastMessage = message; + this.lastPosition = targetPosition; + + JWindow toastWindow = new JWindow(); + toastWindow.setBackground(new Color(0,0,0,0)); + toastWindow.setLayout(new FlowLayout()); + + // Get the size of the characters in the font, using "M" as a representative character for width + Font displayFont = new Font(Font.SERIF, Font.PLAIN, 12); + FontMetrics metrics = toastWindow.getFontMetrics(displayFont); + int fontHeight = metrics.getHeight(); + int charWidth = metrics.charWidth('M'); + + int borderSize = 10; + // Create a Text Area - define the number of Rows and Columns to display based on the sized of the character + JTextArea toastPainter = new JTextArea((targetPosition.height-borderSize*2)/fontHeight, + (targetPosition.width-borderSize*2)/charWidth); + + // Other text area configurations + toastPainter.setText(message); + toastPainter.setFont(displayFont); + + toastPainter.setEditable(false); + toastPainter.setBackground(new Color(230, 230, 230)); + toastPainter.setForeground(Color.BLACK); + toastPainter.setBorder(new EmptyBorder(borderSize, borderSize, borderSize, borderSize)); + toastPainter.setOpaque(true); + toastPainter.setLineWrap(true); + toastPainter.setWrapStyleWord(true); + + toastWindow.add(toastPainter); + + // The expected size of the text display + Dimension painterSize = toastPainter.getPreferredSize(); + // Set the x position = the desired position + desired width - expected with + int displayX = (targetPosition.x + targetPosition.width) - painterSize.width; + Point startingPosition = new Point(displayX, screenSize.height); + + toastWindow.setLocation(startingPosition); + toastWindow.setSize(painterSize); + + + toastWindow.setOpacity(1.0f); + toastWindow.setVisible(true); + + Timer animateOutTask = new Timer(20, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + toastWindow.setOpacity(toastWindow.getOpacity() - 0.04f); + + if (toastWindow.getOpacity() < 0.04f) { + toastWindow.setVisible(false); + toastWindow.dispose(); + + ((Timer)e.getSource()).stop(); + } + } + }); + animateOutTask.setRepeats(true); + animateOutTask.setInitialDelay(toastTimeInSeconds * 1000); + + + Timer animateInTask = new Timer(20, new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Point currentPosition = toastWindow.getLocation(); + Point newPosition = new Point(currentPosition.x, currentPosition.y - 5); + toastWindow.setLocation(newPosition); + + if (newPosition.y <= targetPosition.y) { + ((Timer)e.getSource()).stop(); + animateOutTask.start(); + } + } + }); + animateInTask.setRepeats(true); + animateInTask.setInitialDelay(0); + animateInTask.start(); + } + + /** + * Reshow the last message that was displayed, in the same location it was displayed in. + */ + public void showLastToast() { + this.showToast(lastMessage, lastPosition); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ValidationCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ValidationCallback.java new file mode 100644 index 0000000..98e9944 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/ValidationCallback.java @@ -0,0 +1,23 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.dialogs; + +import java.util.Map; + +/*** + * Interface for a callback that allows the code being called to approve or disapprove of the current state of the settings in + * a {@link TabbedCustomDialog}. Used by {@link TabbedCustomDialog#validateBeforeClosing(ValidationCallback)}. + * @author Jason Wells + * + */ +public interface ValidationCallback { + /*** + * A method used to validate. + * @param currentValues A map of the current control values + * @return Return false if something is not acceptable, otherwise true. + */ + public boolean validate(Map currentValues); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/help.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/help.png new file mode 100644 index 0000000000000000000000000000000000000000..5c870176d4dea68aab9e51166cc3d7a582f326d6 GIT binary patch literal 786 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 N002ovPDHLkV1kkt*XsZP literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/page_white_text.png b/IntelliJ/Nx/src/main/java/com/nuix/nx/dialogs/page_white_text.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MK + * {@code + * # Ruby example + * java_import com.nuix.nx.digest + * + * digest_name = Time.now.strftime("%Y%m%d_%H-%M-%S") + * puts "Digest Name: #{digest_name}" + * + * items = $current_case.search(query) + * puts "Input Items Count: #{items.size}" + * + * helper = DigestHelper.new + * helper.addAllItems(items) + * + * save_location = DigestHelper::getDigestListLocation(digest_name) + * puts "Save Location: #{save_location}" + * saved = helper.saveDigestList(save_location) + * puts "Digests Saved: #{saved}" + * + * digest_hits = $current_case.search("digest-list:\"#{digest_name}\"") + * puts "Digest Hits: #{digest_hits.size}" + * puts "Count Matches: #{digest_hits.size == items.size}" + * + * helper2 = DigestHelper.new + * loaded = helper2.loadDigestList(save_location) + * puts "Loaded from File Count: #{loaded}" + * puts "Matches Saved: #{saved == loaded}" + * } + * + */ +public class DigestHelper { + /*** + * Returns the assumed directory containing digest lists. + * @return File representing the digest lists directory. + */ + public static File getDigestListDirectory(){ + String appData = System.getenv("APPDATA"); + return new File(appData+"\\Nuix\\Digest Lists"); + } + + /*** + * Returns the assumed location of a particular named digest list. + * @param name The named of the digest list. + * @return File represent the digest list location. + */ + public static File getDigestListLocation(String name){ + return new File(getDigestListDirectory()+"\\"+name+".hash"); + } + + /*** + * Convenience method for converting hex string to byte array. + * @param hex String of hexadecimal. + * @return Byte array equivalent. + */ + public static byte[] hexToBytes(String hex){ + return DatatypeConverter.parseHexBinary(hex); + } + + /*** + * Convenience method for converting a byte array to a hex string. + * @param bytes The bytes to convert. + * @return A string representation of the byte array as hexadecimal. + */ + public static String bytesToHex(byte[] bytes){ + return DatatypeConverter.printHexBinary(bytes); + } + + /*** + * Creates an instance of DigestHelper containing the digests from all specified digest lists. + * @param digestFiles Collection of digest files to load into the resulting instance. + * @return A DigestHelper instance containing all the digests from the provided existing digest lists. + * @throws IOException Thrown if there is an issue with the file stream. + */ + public static DigestHelper createFromExistingDigestLists(Collection digestFiles) throws IOException{ + DigestHelper result = new DigestHelper(); + for(File digestFile : digestFiles){ + result.loadDigestList(digestFile); + } + return result; + } + + /*** + * Creates an instance of DigestHelper containing the digests from all specified digest lists. + * Assumes digest lists are stored in "%appdata%\Nuix\Digest Lists" + * @param existingDigestNames A collection of digest list names. + * @return A DigestHelper instance containing all the digests from the provided existing digest lists. + * @throws IOException Thrown if there is an issue with the file stream. + */ + public static DigestHelper createFromExistingDigestListsByName(Collection existingDigestNames) throws IOException{ + return createFromExistingDigestLists(existingDigestNames.stream().map(name -> getDigestListLocation(name)).collect(Collectors.toList())); + } + + private Set digestSet; + + public DigestHelper(){ + digestSet = new HashSet(); + } + + /*** + * Add a collection of MD5 values where each MD5 is represented as its equivalent byte array. + * @param md5DigestByteArrays A collection of MD5 byte arrays. + */ + public void addAllMd5ByteArrays(Collection md5DigestByteArrays){ + digestSet.addAll(md5DigestByteArrays); + } + + /*** + * Add a collection of MD5 values where MD5 is represented as a hexadecimal string. + * @param md5DigestStrings A collection of MD5 hexadecimal strings. Null or empty values are ignored. + */ + public void addAllMd5Strings(Collection md5DigestStrings){ + for(String digest : md5DigestStrings){ + digestSet.add(hexToBytes(digest)); + } + addAllMd5ByteArrays(md5DigestStrings.stream() + .filter(v -> v != null && !v.isEmpty()) + .map(md5 -> hexToBytes(md5)) + .collect(Collectors.toSet())); + } + + /*** + * Add a collection of items, using each item's MD5 value. + * @param items Collection of items to add to this instance. Items which return a null or empty MD5 string will be ignored. + */ + public void addAllItems(Collection items){ + addAllMd5Strings(items.stream() + .map(i -> i.getDigests().getMd5()) + .filter(v -> v != null && !v.isEmpty()) + .collect(Collectors.toSet())); + } + + /*** + * Saves a Nuix digest list based on data which has been added so far using methods {@link #addAllItems(Collection)} or + * {@link #addAllMd5Strings(Collection)} or {@link #addAllMd5ByteArrays(Collection)}. + * @param location The location in which to save the Nuix formatted digest list file. + * @return The number of digests saved. Should match the count returned by {@link #getDistinctDigestCount()} before this call was made. + * @throws IOException If there is an issue with the output stream. + */ + public int saveDigestList(File location) throws IOException{ + int countSaved = 0; + FileOutputStream outputStream = null; + try{ + outputStream = new FileOutputStream(location); + outputStream.write("F2DL".getBytes()); + outputStream.write(ByteBuffer.allocate(4).order(ByteOrder.BIG_ENDIAN).putInt(1).array()); + outputStream.write(ByteBuffer.allocate(2).order(ByteOrder.BIG_ENDIAN).putShort((short) 3).array()); + outputStream.write("MD5".getBytes()); + for(byte[] digestBytes : digestSet.stream().sorted(UnsignedBytes.lexicographicalComparator()).collect(Collectors.toList())){ + outputStream.write(digestBytes); + countSaved++; + } + }finally{ + if(outputStream != null) + outputStream.close(); + } + return countSaved; + } + + /*** + * Saves a digest list to the appropriate location with provided name. + * Assumes digest lists are stored in "%appdata%\Nuix\Digest Lists" + * @param name The name of the digest list to save. + * @return The number of digests saved. Should match the count returned by {@link #getDistinctDigestCount()} before this call was made. + * @throws IOException If there is an issue with the output stream. + */ + public int saveDigestListByName(String name) throws IOException{ + return saveDigestList(getDigestListLocation(name)); + } + + /*** + * Saves a Nuix digest list based on data which has been added so far using methods {@link #addAllItems(Collection)} or + * {@link #addAllMd5Strings(Collection)} or {@link #addAllMd5ByteArrays(Collection)}. + * @param location The location in which to save the Nuix formatted digest list file. + * @return The number of digests saved. Should match the count returned by {@link #getDistinctDigestCount()} before this call was made. + * @throws IOException Caused by an issue with the output stream. + */ + public int saveDigestList(String location) throws IOException{ + return saveDigestList(new File(location)); + } + + /*** + * Includes all entries from an existing Nuix digest list file. + * @param location The location of the existing digest list file. + * @return The count of digests loaded from the file. + * @throws IOException Caused by an issue with the input stream. + */ + public int loadDigestList(File location) throws IOException{ + FileInputStream inputStream = null; + int countRead = 0; + try{ + inputStream = new FileInputStream(location); + inputStream.skip(13); + byte[] buffer = new byte[16]; + while(inputStream.available() != 0){ + inputStream.read(buffer); + digestSet.add(buffer); + countRead++; + } + }finally{ + if(inputStream != null) + inputStream.close(); + } + return countRead; + } + + /*** + * Includes all entries from an the appropriate existing Nuix digest list file based on the provided name. + * Assumes digest lists are stored in "%appdata%\Nuix\Digest Lists" + * @param name The name of the existing Nuix digest list to load. + * @return The count of digests loaded from the file. + * @throws IOException Caused by an issue with the input stream. + */ + public int loadDigestListByName(String name) throws IOException{ + return loadDigestList(getDigestListLocation(name)); + } + + /*** + * Includes all entries from an existing Nuix digest list file. + * @param location The location of the existing digest list file. + * @return The count of digests loaded from the file. + * @throws IOException Caused by an issue with the input stream. + */ + public int loadDigestList(String location) throws IOException{ + return loadDigestList(new File(location)); + } + + /*** + * Returns the counts of distinct digests currently stored in this instance. + * @return Count of distinct digests stored. + */ + public int getDistinctDigestCount(){ + return digestSet.size(); + } + + /*** + * Clears out all digests currently being tracked by this instance. + */ + public void clear(){ + digestSet.clear(); + } + + /*** + * Whether this instance currently contains the specific digest. + * @param md5 MD5 as byte array. + * @return True if this instance contains this digest. + */ + public boolean currentlyContains(byte[] md5){ + return digestSet.contains(md5); + } + + /*** + * Whether this instance currently contains the specific digest. + * @param md5 MD5 as hexadecimal string. + * @return True if this instance contains this digest. + */ + public boolean currentlyContains(String md5){ + return digestSet.contains(hexToBytes(md5)); + } + + /*** + * Whether this instance currently contains the specific digest for the provided item. + * @param item The item which will have it's MD5 checked for. + * @return True if this instance contains the digest for this item. + */ + public boolean currentlyContains(Item item){ + return currentlyContains(item.getDigests().getMd5()); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/export/CombinedPdfExporter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/export/CombinedPdfExporter.java new file mode 100644 index 0000000..56aaadc --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/export/CombinedPdfExporter.java @@ -0,0 +1,138 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.export; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import nuix.Item; +import nuix.SingleItemExporter; +import nuix.Utilities; + +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.pdf.PdfCopy; +import com.itextpdf.text.pdf.PdfReader; +import com.nuix.nx.NuixConnection; + +/*** + * This class assists in generating combined PDFs outside of Nuix using iText. + * @author Jason Wells + * + */ +public class CombinedPdfExporter { + /*** + * This method generates a new PDF by concatenating several existing PDFs. + * @param destination The destination to where the new PDF should be written. + * @param sources List of source PDFs to combine, in order they should be combined in. + * @throws DocumentException Possibly thrown by iText + * @throws IOException Possibly thrown on IO error + */ + public static void mergeExistingPdfFiles(File destination, List sources) throws DocumentException, IOException{ + Document document = new Document(); + PdfCopy copy = new PdfCopy(document,new FileOutputStream(destination)); + document.open(); + PdfReader reader = null; + for(File sourceFile : sources){ + reader = new PdfReader(sourceFile.getPath()); + int totalPages = reader.getNumberOfPages(); + for(int i = 0;i < totalPages;i++){ + copy.addPage(copy.getImportedPage(reader,i+1)); + } + copy.freeReader(reader); + reader.close(); + } + document.close(); + } + + private File tempDirectory = null; + + /*** + * Gets the temporary directory used to house the per item temporary PDF files. + * @return The temporary directory + */ + public File getTempDirectory() { + return tempDirectory; + } + + /*** + * Sets the temporary directory used to house the per item temporary PDF files. + * @param tempDirectory The temporary directory + */ + public void setTempDirectory(File tempDirectory) { + this.tempDirectory = tempDirectory; + } + + /*** + * Sets the temporary directory used to house the per item temporary PDF files. + * @param tempDirectory The temporary directory + */ + public void setTempDirectory(String tempDirectory) { + this.tempDirectory = new File(tempDirectory); + } + + /*** + * Creates a new instance. + * @param tempDirectory The temporary directory which will be used to produce the per item PDFs. + */ + public CombinedPdfExporter(String tempDirectory){ + this(new File(tempDirectory)); + } + + /*** + * Creates a new instance. + * @param tempDirectory The temporary directory which will be used to produce the per item PDFs. + */ + public CombinedPdfExporter(File tempDirectory){ + this.tempDirectory = tempDirectory; + } + + /*** + * Creates a single PDF from several different items by exporting a PDF for each item then concatenating them and finally cleaning up the temporary PDF files. + * them together using {@link #mergeExistingPdfFiles(File, List)}. See Nuix documentation here + * and here for more information about supported settings. + * @param destination The destination path for the final combined PDF + * @param items A list of items to create a combined PDF for, in the order to combine them in. + * @param settings Optional settings map (can be null) + * @throws IOException Thrown if there is an IO error + * @throws DocumentException Thrown if iText has an error + */ + public void exportItems(String destination, List items, Map settings) throws IOException, DocumentException{ + exportItems(new File(destination),items,settings); + } + + /*** + * Creates a single PDF from several different items by exporting a PDF for each item then concatenating them and finally cleaning up the temporary PDF files. + * them together using {@link #mergeExistingPdfFiles(File, List)}. See Nuix documentation here + * and here for more information about supported settings. + * @param destination The destination path for the final combined PDF + * @param items A list of items to create a combined PDF for, in the order to combine them in. + * @param settings Optional settings map (can be null) + * @throws IOException Thrown if there is an IO error + * @throws DocumentException Thrown if iText has an error + */ + public void exportItems(File destination, List items, Map settings) throws IOException, DocumentException{ + Utilities utilities = NuixConnection.getUtilities(); + SingleItemExporter pdfExporter = utilities.getPdfPrintExporter(); + List tempPdfFiles = new ArrayList(); + //Generate temp per item PDFs + for(Item item : items){ + File tempPdfFile = new File(tempDirectory,item.getGuid()+".pdf"); + tempPdfFiles.add(tempPdfFile); + if(settings != null){ pdfExporter.exportItem(item, tempPdfFile, settings); } + else { pdfExporter.exportItem(item, tempPdfFile); } + } + mergeExistingPdfFiles(destination, tempPdfFiles); + //Cleanup temp PDFs + for(File tempPdfFile : tempPdfFiles){ + tempPdfFile.delete(); + } + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableAllRecordsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableAllRecordsFilter.java new file mode 100644 index 0000000..ed27670 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableAllRecordsFilter.java @@ -0,0 +1,20 @@ +package com.nuix.nx.filters; + +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; + +import java.util.Map; + +public class DynamicTableAllRecordsFilter extends DynamicTableFilterProvider { + + @Override + public boolean handlesExpression(String filterExpression) { + return true; + } + + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + return true; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.java new file mode 100644 index 0000000..ea87358 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.java @@ -0,0 +1,28 @@ +package com.nuix.nx.filters; + +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; + +import java.util.Map; + +public class DynamicTableCheckedRecordsFilter extends DynamicTableFilterProvider { + + /*** + * {@inheritDoc}
+ * This implementation returns true if provided expression is ":checked:" (case-insensitive). + */ + @Override + public boolean handlesExpression(String filterExpression) { + return filterExpression.equalsIgnoreCase(":checked:"); + } + + /*** + * {@inheritDoc}
+ * This implementation returns true if isChecked is true. + */ + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + return isChecked == true; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableContainsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableContainsFilter.java new file mode 100644 index 0000000..a182220 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableContainsFilter.java @@ -0,0 +1,32 @@ +package com.nuix.nx.filters; + +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; + +import java.util.Map; + +public class DynamicTableContainsFilter extends DynamicTableFilterProvider { + + @Override + public boolean handlesExpression(String filterExpression) { + return true; + } + + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, Object record, + Map rowValues) { + boolean result = false; + for(Map.Entry entry : rowValues.entrySet()) { + // Easy way to get string value of most common types + String stringValue = String.format("%s", entry.getValue()); + // Does string value contain the filter expression? + if(stringValue.contains(filterExpression)) { + // Any match will be considered a success and keeps the record so we + // do not need to keep looking + result = true; + break; + } + } + return result; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableFilterProvider.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableFilterProvider.java new file mode 100644 index 0000000..dbe44a5 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableFilterProvider.java @@ -0,0 +1,47 @@ +package com.nuix.nx.filters; + +import java.util.List; +import java.util.Map; + +import com.nuix.nx.controls.models.DynamicTableModel; +import com.nuix.nx.controls.models.DynamicTableValueCallback; + +public abstract class DynamicTableFilterProvider { + /*** + * Whether this filter provider handles the given filter expression. If true is returned, {@link #keepRecord(int, boolean, String, Object, Map)} + * will be called for each record to determine whether the given record is filtered out or not. If false is returned then + * the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + * string since {@link DynamicTableModel} has built in logic to handle that before asking filters. + * @param filterExpression The expression the user has provided. + * @return True if this filter should handle this expression. False otherwise. + */ + public abstract boolean handlesExpression(String filterExpression); + + /*** + * If {@link #handlesExpression(String)} returns true, this method will be invoked for each record. It should return + * true for records that should make it into the final collection and false for records that should be filtered out. + * @param sourceIndex The index of the record in the full un-filtered source collection. + * @param isChecked Whether the given record is currently checked + * @param filterExpression The filter expression provided by the user. This value should never be null, only whitespace or empty. + * @param record The record to inspect and make a decision about. + * @param rowValues A map of the values actual represented as columns in the table. Relies on table model's {@link DynamicTableValueCallback}. + * @return True to keep the record, false to filter it out. + */ + public abstract boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues); + + /*** + * Invoked once before filtering begins, allowing for up front work to be performed that might + * then be leveraged in subsequent calls to {@link #keepRecord(int, boolean, String, Object, Map)}. + * Override in derived implementation, default implementation does nothing. + * @param filterExpression The filter expression that was provided + * @param allRecords All the of records pre-filtering + */ + public void beforeFiltering(String filterExpression, List allRecords) {} + + /*** + * Called once after filtering. Can be used to clean up any resources that may have been created by calls to {@link #beforeFiltering(String, List)} + * and/or {@link #keepRecord(int, boolean, String, Object, Map)}. + */ + public void afterFiltering() {} +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableRegexFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableRegexFilter.java new file mode 100644 index 0000000..4b932ef --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableRegexFilter.java @@ -0,0 +1,56 @@ +package com.nuix.nx.filters; + +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; + +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +public class DynamicTableRegexFilter extends DynamicTableFilterProvider { + private Pattern filterPattern; + + /*** + * {@inheritDoc}
+ * This is meant to be a fallback filter so it will happily accept any filter expression except when + * given value does not correctly compile to a regular expression. + */ + @Override + public boolean handlesExpression(String filterExpression) { + try { + Pattern.compile(filterExpression, Pattern.CASE_INSENSITIVE); + } catch (Exception e) { + return false; + } + return true; + } + + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + boolean result = false; + for(Map.Entry entry : rowValues.entrySet()) { + // Easy way to get string value of most common types + String stringValue = String.format("%s", entry.getValue()); + // Does string value match against our regex? + if(filterPattern.matcher(stringValue).find()) { + // Any match will be considered a success and keeps the record so we + // do not need to keep looking + result = true; + break; + } + } + return result; + } + + @Override + public void beforeFiltering(String filterExpression, List allRecords) { + this.filterPattern = Pattern.compile(Pattern.quote(filterExpression), Pattern.CASE_INSENSITIVE); + } + + @Override + public void afterFiltering() { + filterPattern = null; + } + + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.java new file mode 100644 index 0000000..b268005 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.java @@ -0,0 +1,28 @@ +package com.nuix.nx.filters; + +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; + +import java.util.Map; + +public class DynamicTableUncheckedRecordsFilter extends DynamicTableFilterProvider { + + /*** + * {@inheritDoc}
+ * This implementation returns true if provided expression is ":unchecked:" (case-insensitive). + */ + @Override + public boolean handlesExpression(String filterExpression) { + return filterExpression.equalsIgnoreCase(":unchecked:"); + } + + /*** + * {@inheritDoc}
+ * This implementation returns true if isChecked is false. + */ + @Override + public boolean keepRecord(int sourceIndex, boolean isChecked, String filterExpression, + Object record, Map rowValues) { + return isChecked == false; + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/FormatHelpers.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/FormatHelpers.java new file mode 100644 index 0000000..7b4c83c --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/FormatHelpers.java @@ -0,0 +1,57 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.helpers; + +import java.text.NumberFormat; +import java.util.Locale; + +/*** + * Provides some methods for common formatting tasks. + * @author Jason Wells + * + */ +public class FormatHelpers { + /*** + * Converts a given number of seconds into and elapsed string which breaks down + * time into seconds, minutes and hours + * @param offsetSeconds Number of seconds elapsed + * @return Seconds formatting into an elapsed string + */ + public static String secondsToElapsedString(double offsetSeconds){ + Long millis = (long)(offsetSeconds*1000.0f); + int seconds = (int) (millis / 1000) % 60 ; + int minutes = (int) ((millis / (1000*60)) % 60); + int hours = (int) ((millis / (1000*60*60)) % 24); + return String.format("%02d:%02d:%02d",hours,minutes,seconds); + } + + /*** + * Convenience method for formatting an int into a string using US locale + * @param number The number to format + * @return The number formatted as a string + */ + public static String formatNumber(int number){ + return NumberFormat.getNumberInstance(Locale.US).format(number); + } + + /*** + * Convenience method for formatting a long int into a string using US locale + * @param number The number to format + * @return The number formatted as a string + */ + public static String formatNumber(long number){ + return NumberFormat.getNumberInstance(Locale.US).format(number); + } + + /*** + * Convenience method for formatting a double into a string using US locale + * @param number The number to format + * @return The number formatted as a string + */ + public static String formatNumber(double number){ + return NumberFormat.getNumberInstance(Locale.US).format(number); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/MetadataProfileHelper.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/MetadataProfileHelper.java new file mode 100644 index 0000000..77d023e --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/MetadataProfileHelper.java @@ -0,0 +1,25 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.helpers; + +import nuix.MetadataProfile; + +/*** + * Class containing helper methods for working with Nuix metadata profiles. + * @author Jason Wells + * + */ +public class MetadataProfileHelper { + /*** + * Convenience method for determining if a given meta data profile contains a field with the given name. + * @param name The name to test for + * @param profile The profile to inspect + * @return True if a field with the given name (case ignored) is found in the given profile. + */ + public static boolean profileContainsField(String name, MetadataProfile profile){ + return profile.getMetadata().stream().anyMatch(f -> f.getName().equalsIgnoreCase(name)); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/package-info.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/package-info.java new file mode 100644 index 0000000..f82cb1e --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/helpers/package-info.java @@ -0,0 +1 @@ +package com.nuix.nx.helpers; \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/misc/PlaceholderResolver.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/misc/PlaceholderResolver.java new file mode 100644 index 0000000..58fe353 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/misc/PlaceholderResolver.java @@ -0,0 +1,115 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.misc; + +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/*** + * This class provides a way to allow user input to make use of place holder values which will be + * substituted at run time with appropriate values. + * @author Jason Wells + * + */ +public class PlaceholderResolver { + private Map placeholderData = new LinkedHashMap(); + private Map placeholderPatterns = new LinkedHashMap(); + private Set placeholderPaths = new HashSet(); + + /*** + * Set they value for a given placeholder + * @param key The placeholder name without '{' or '}' + * @param value The value to associate + */ + public void set(String key, String value) { + key = key.toLowerCase(); + placeholderData.put(key,value); + placeholderPatterns.put(key,Pattern.compile(Pattern.quote("{"+key+"}"),Pattern.CASE_INSENSITIVE)); + } + + /*** + * Similar to the {@link #set} method except this has logic to appropriately handle file paths. + * @param key The placeholder name without '{' or '}' + * @param value The file/directory path value to associate + */ + public void setPath(String key, String value) { + key = key.toLowerCase(); + placeholderData.put(key,value); + placeholderPatterns.put(key,Pattern.compile(Pattern.quote("{"+key+"}"),Pattern.CASE_INSENSITIVE)); + placeholderPaths.add(key); + } + + /*** + * Get the value currently associated for a given placeholder + * @param key The placeholder name without '{' or '}' + * @return The currently associated placeholder value + */ + public String get(String key) { + return placeholderData.get(key.toLowerCase()); + } + + /*** + * Clears all currently associated place holders (keys and values) + */ + public void clear() { + placeholderData.clear(); + } + + /*** + * Gets the Map containing all the current place holder data + * @return A Map containing all the current place holder data + */ + public Map getPlaceholderData(){ + return placeholderData; + } + + /*** + * Resolves place holders into a string based on the currently associated values + * @param template The input string containing place holders + * @return The input string in which place holders have been replaced with associated values + */ + public String resolveTemplate(String template) { + String result = template; + for(Map.Entry entry : placeholderPatterns.entrySet()){ + Pattern p = entry.getValue(); + String value = Matcher.quoteReplacement(get(entry.getKey())); + result = p.matcher(result).replaceAll(value); + } + return result; + } + + /*** + * Resolves place holders into a path string based on the currently associated values. Contains logic + * to sterilize the resulting path string so that it does not contain common illegal path characters. + * @param template A file/directory path string containing place holders + * @return The input string in which place holders have been replaced with associated values + */ + public String resolveTemplatePath(String template) { + String result = template; + for(Map.Entry entry : placeholderPatterns.entrySet()){ + Pattern p = entry.getValue(); + String value = Matcher.quoteReplacement(get(entry.getKey())); + if(!placeholderPaths.contains(entry.getKey())){ + value = cleanPathString(value); + } + result = p.matcher(result).replaceAll(value); + } + return result; + } + + /*** + * Helper method to strip common illegal path characters from a string + * @param input The string to clean up + * @return The string with illegal path characters replaced with '_' + */ + public static String cleanPathString(String input){ + return input.replaceAll("[\\Q<>:\"|?*[]\\E]","_"); + } +} \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/misc/package-info.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/misc/package-info.java new file mode 100644 index 0000000..0ec9458 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/misc/package-info.java @@ -0,0 +1 @@ +package com.nuix.nx.misc; \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ArrangeableListModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ArrangeableListModel.java new file mode 100644 index 0000000..b5a1336 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ArrangeableListModel.java @@ -0,0 +1,98 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import javax.swing.AbstractListModel; +import javax.swing.SwingUtilities; + +/*** + * Custom ArrayList wrapper around an ArrayList which offers methods for shifting a contiguous range + * of entries earlier or later in the list (for shifting rows). + * @author Jason Wells + * + * @param Generic data type this list will contain. + */ +@SuppressWarnings("serial") +public class ArrangeableListModel extends AbstractListModel { + private List elements = new ArrayList(); + + @Override + public E getElementAt(int index) { + return elements.get(index); + } + + @Override + public int getSize() { + if(elements == null){ + return 0; + } else { + return elements.size(); + } + } + + public int size(){ + if(elements == null){ + return 0; + } else { + return elements.size(); + } + } + + public boolean shiftRowsUp(int firstRowIndex, int lastRowIndex){ + if(firstRowIndex <= 0) + return false; + + for (int i = firstRowIndex; i <= lastRowIndex; i++) { + Collections.swap(elements, i, i-1); + } + + fireContentsChanged(this, firstRowIndex, lastRowIndex); + + return true; + } + + public boolean shiftRowsDown(int firstRowIndex, int lastRowIndex){ + if(lastRowIndex >= elements.size() - 1) + return false; + + for (int i = firstRowIndex; i <= lastRowIndex; i++) { + Collections.swap(elements, i, i+1); + } + + fireContentsChanged(this, firstRowIndex, lastRowIndex); + + return true; + } + + public void addElement(E element){ + SwingUtilities.invokeLater(()->{ + elements.add(element); + fireIntervalAdded(this, elements.size()-1, elements.size()-1); + }); + } + + public void remove(int index){ + SwingUtilities.invokeLater(()->{ + elements.remove(index); + fireIntervalRemoved(this, index, index); + }); + } + + public void clear(){ + SwingUtilities.invokeLater(()->{ + try { + int lastIndex = elements.size()-1; + elements.clear(); + fireIntervalRemoved(this, 0, lastIndex); + } catch (Exception e) { + } + }); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/Choice.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/Choice.java new file mode 100644 index 0000000..91bf185 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/Choice.java @@ -0,0 +1,130 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +/*** + * This class represents a choice in some controls and has an associated label, tool tip, value and whether the choice is checked. + * @author Jason Wells + * + * @param The data type of the value help by this instance + */ +public class Choice { + private String label = ""; + private String toolTip; + private boolean isSelected = false; + private T value; + + public Choice(){} + + /*** + * Creates a choice object. Label and tool tip will be based on calling toString on the value provided. + * @param value The value this choice object represents. + */ + public Choice(T value){ + this.value = value; + this.toolTip = this.label = value.toString(); + } + + /*** + * Creates a choice object. Tool tip will be based on the provided label string. + * @param value The value this choice object represents. + * @param label The displayed string for this choice. + */ + public Choice(T value,String label){ + this.value = value; + this.toolTip = this.label = label; + } + + /*** + * Creates a choice object. + * @param value The value this choice object represents. + * @param label The displayed string for this choice. + * @param toolTip The tool tip associated to this choice. + */ + public Choice(T value,String label,String toolTip){ + this.value = value; + this.label = label; + this.toolTip = toolTip; + } + + /*** + * Creates a choice object. + * @param value The value this choice object represents. + * @param label The displayed string for this choice. + * @param toolTip The tool tip associated to this choice. + * @param isSelected Whether this choice is checked by default. + */ + public Choice(T value,String label,String toolTip, boolean isSelected){ + this.value = value; + this.label = label; + this.toolTip = toolTip; + this.isSelected = isSelected; + } + + /*** + * Whether this choice is currently selected + * @return True if this choice is selected. + */ + public boolean isSelected() { + return isSelected; + } + + /*** + * Sets whether this choice is currently selected. + * @param isSelected Provide true to select this choice. + */ + public void setSelected(boolean isSelected) { + this.isSelected = isSelected; + } + + /*** + * The tool tip which will be associated to this choice. + * @return The tool tip. + */ + public String getToolTip() { + return toolTip; + } + + /*** + * Sets the tool tip associated to this choice. + * @param toolTip The tool tip. + */ + public void setToolTip(String toolTip) { + this.toolTip = toolTip; + } + + /*** + * Gets the label used to display this choice. + * @return The label string. + */ + public String getLabel() { + return label; + } + + /*** + * Sets the label used to display this choice. + * @param label The label string to use. + */ + public void setLabel(String label) { + this.label = label; + } + + /*** + * Gets the value associated to this choice. + * @return The value associated. + */ + public T getValue() { + return value; + } + + /*** + * Sets the value associated to this choice. + * @param value The value to be associated. + */ + public void setValue(T value) { + this.value = value; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModel.java new file mode 100644 index 0000000..1a2f921 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModel.java @@ -0,0 +1,414 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import javax.swing.table.AbstractTableModel; + +import com.nuix.nx.controls.models.Choice; +import com.nuix.nx.controls.models.ChoiceTableModelChangeListener; +import org.apache.log4j.Logger; + +/*** + * Table model used by the {@link com.nuix.nx.controls.ChoiceTableControl} + * @author Jason Wells + * + * @param The data type of the of the {@link com.nuix.nx.controls.models.Choice} instances which will be held by this model. + */ +@SuppressWarnings("serial") +public class ChoiceTableModel extends AbstractTableModel { + private static Logger logger = Logger.getLogger(ChoiceTableModel.class); + + private List> choices; + private List> displayedChoices; + private String filter = ""; + private ChoiceTableModelChangeListener changeListener; + private Pattern whitespaceSplitter = Pattern.compile("\\s+"); + private boolean singleSelectMode = false; + + /*** + * Create a new instance + */ + public ChoiceTableModel(){ + choices = new ArrayList>(); + setFilter(""); + } + + /*** + * Set a listener callback which will be notified of changes + * @param listener The listener to be notified of changes + */ + public void setChangeListener(ChoiceTableModelChangeListener listener){ + changeListener = listener; + } + + /*** + * Notify listeners that a change occurred + */ + private void notifyChanged(){ + if(changeListener != null){ + changeListener.dataChanged(); + } + + if(filter.equalsIgnoreCase(":checked:") || filter.equalsIgnoreCase(":unchecked:")){ + applyFiltering(); + } + } + + public List> setCheckedByLabels(Collection labels, boolean setChecked) { + Set labelLookup = new HashSet(); + labelLookup.addAll(labels); + List> updatedChoices = new ArrayList>(); + for (int i = 0; i < choices.size(); i++) { + if((i+1) % 1000 == 0 || (i+1) == choices.size()) { + logger.info(String.format("Restored check state to %s choices...", i+1)); + } + com.nuix.nx.controls.models.Choice c = choices.get(i); + if(labelLookup.contains(c.getLabel())) { + c.setSelected(setChecked); + updatedChoices.add(c); + } + } + fireTableDataChanged(); + notifyChanged(); + return updatedChoices; + } + + /*** + * Attempt to find a choice in the model with a matching label + * @param label The label to look for + * @return A corresponding {@link com.nuix.nx.controls.models.Choice} object if a match was found + */ + public com.nuix.nx.controls.models.Choice getFirstChoiceByLabel(String label){ + com.nuix.nx.controls.models.Choice result = null; + for(com.nuix.nx.controls.models.Choice choice : choices){ + if(choice.getLabel().equals(label)){ + result = choice; + break; + } + } + return result; + } + + /*** + * Attempt to find a choice in the model with a matching value + * @param value The value to look for + * @return A corresponding {@link com.nuix.nx.controls.models.Choice} object if a match was found + */ + public com.nuix.nx.controls.models.Choice getFirstChoiceByValue(T value){ + com.nuix.nx.controls.models.Choice result = null; + for(com.nuix.nx.controls.models.Choice choice : choices){ + if(choice.getValue().equals(value)){ + result = choice; + break; + } + } + return result; + } + + /*** + * Gets the list of choices associated + * @return The choices + */ + public List> getChoices() { + return choices; + } + + /*** + * Sets the list of choices associated + * @param choices The choices to associate + */ + public void setChoices(List> choices) { + this.choices = choices; + applyFiltering(); + notifyChanged(); + } + + private String[] columns = new String[]{ + "", + "" + }; + + @Override + public int getColumnCount() { + return columns.length; + } + + @Override + public int getRowCount() { + return displayedChoices.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + switch(columnIndex){ + case 0: + return displayedChoices.get(rowIndex).isSelected(); + case 1: + return displayedChoices.get(rowIndex).getLabel(); + default: + return ""; + } + } + + @Override + public Class getColumnClass(int columnIndex) { + switch(columnIndex){ + case 0: + return Boolean.class; + case 1: + return String.class; + default: + return null; + } + } + + @Override + public String getColumnName(int column) { + return columns[column]; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + if(columnIndex == 0) return true; + else return false; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if(columnIndex == 0){ + boolean value = (boolean)aValue; + if(singleSelectMode) { + if(value == true) { + uncheckAllChoices(); + } else { + // In single select mode we don't allow user to deselect + // the only selected choice + return; + } + } + displayedChoices.get(rowIndex).setSelected(value); + notifyChanged(); + } + } + + private void applyFiltering(){ + if(filter.isEmpty()){ + displayedChoices = choices; + } else if (filter.equalsIgnoreCase(":checked:")) { + displayedChoices = choices.stream().filter(c -> c.isSelected()).collect(Collectors.toList()); + }else if (filter.equalsIgnoreCase(":unchecked:")) { + displayedChoices = choices.stream().filter(c -> !c.isSelected()).collect(Collectors.toList()); + } else { + try { + // we will treat spaces as a delimiter allowing for multiple things AND'ed + String[] criteria = whitespaceSplitter.split(filter); + displayedChoices = choices; + for(String criterion : criteria) { + Pattern p = Pattern.compile(criterion,Pattern.CASE_INSENSITIVE); + displayedChoices = displayedChoices.stream().filter(c -> p.matcher(c.getLabel().toLowerCase()).find()).collect(Collectors.toList()); + } + } + catch(Exception exc) { + displayedChoices = new ArrayList>(); + } + } + this.fireTableDataChanged(); + } + + public void refreshTable() { + this.fireTableDataChanged(); + } + + public void setFilter(String filter){ + this.filter = filter; + applyFiltering(); + notifyChanged(); + } + + public com.nuix.nx.controls.models.Choice getChoice(int rowIndex){ + return choices.get(rowIndex); + } + + public com.nuix.nx.controls.models.Choice getDisplayedChoice(int rowIndex){ + return displayedChoices.get(rowIndex); + } + + public void addChoice(com.nuix.nx.controls.models.Choice choice){ + choices.add(choice); + int lastIndex = choices.size()-1; + this.fireTableRowsInserted(lastIndex, lastIndex); + notifyChanged(); + } + + public void setChoiceSelection(com.nuix.nx.controls.models.Choice choice, boolean value){ + int index = choices.indexOf(choice); + choices.get(index).setSelected(value); + this.fireTableCellUpdated(index, 0); + notifyChanged(); + } + + public void checkDisplayedChoices(){ + for(com.nuix.nx.controls.models.Choice choice : displayedChoices){ + choice.setSelected(true); + } + refreshTable(); + notifyChanged(); + } + + public void uncheckDisplayedChoices(){ + for(com.nuix.nx.controls.models.Choice choice : displayedChoices){ + choice.setSelected(false); + } + refreshTable(); + notifyChanged(); + } + + public void uncheckAllChoices(){ + for(com.nuix.nx.controls.models.Choice choice : choices){ + if(choice.isSelected()) { + choice.setSelected(false); + } + } + fireTableDataChanged(); + notifyChanged(); + } + + public List> getCheckedChoices(){ + return choices.stream().filter(c -> c.isSelected()).collect(Collectors.toList()); + } + + public List> getUncheckedChoices(){ + return choices.stream().filter(c -> !c.isSelected()).collect(Collectors.toList()); + } + + public List getCheckedValues(){ + List result = new ArrayList(); + for(com.nuix.nx.controls.models.Choice choice : getCheckedChoices()){ + result.add(choice.getValue()); + } + notifyChanged(); + return result; + } + + public List getCheckedLabels(){ + List result = new ArrayList(); + for(com.nuix.nx.controls.models.Choice choice : getCheckedChoices()){ + result.add(choice.getLabel()); + } + return result; + } + + public int getCheckedValueCount(){ + return getCheckedChoices().size(); + } + + public int getVisibleValueCount(){ + return displayedChoices.size(); + } + + public int getTotalValueCount(){ + return choices.size(); + } + + public void setChoiceTypeName(String name){ + columns[1] = name; + this.fireTableStructureChanged(); + } + + public int[] shiftRowsUp(int[] positions){ + return shiftRows(positions,-1); + } + + public int[] shiftRowsDown(int[] positions){ + return shiftRows(positions,1); + } + + public int[] shiftRows(int[] positions, int offset){ + List selection = new ArrayList(); + for (int i = 0; i < positions.length; i++) { + if(positions[i] + offset < 0 || positions[i] + offset > choices.size() - 1) + return positions; + else + selection.add(positions[i]); + } + Collections.sort(selection); + int minPos = selection.get(0); + Collections.reverse(selection); + List> selectedObjects = new ArrayList>(); + for(int i : selection){ + selectedObjects.add(choices.remove(i)); + } + Collections.reverse(selectedObjects); + choices.addAll(minPos+offset, selectedObjects); + this.fireTableDataChanged(); + return new int[]{minPos+offset,minPos+offset+positions.length-1}; + } + + public int[] shiftRows(List> list, int offset){ + if(offset > 0){ + Collections.reverse(list); + } + for(com.nuix.nx.controls.models.Choice entry : list){ + int previousIndex = choices.indexOf(entry); + int newIndex = previousIndex + offset; + if(newIndex < 0){ + newIndex = choices.size() - 1; + } else if (newIndex > choices.size() - 1){ + newIndex = 0; + } + choices.remove(entry); + choices.add(newIndex,entry); + } + fireTableDataChanged(); + int[] newIndices = new int[list.size()]; + for(int i=0;i> checked = new ArrayList>(choices.size()/2); + List> unchecked = new ArrayList>(choices.size()/2); + for (int i = 0; i < choices.size(); i++) { + com.nuix.nx.controls.models.Choice c = choices.get(i); + if(c.isSelected()) { checked.add(c); } + else { unchecked.add(c); } + } + choices.clear(); + choices.addAll(checked); + choices.addAll(unchecked); + fireTableDataChanged(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public void sortChoicesToTop(List choicesToSort){ + List reversed = new ArrayList(); + reversed.addAll(choicesToSort); + Collections.reverse(reversed); + for(Choice choice : reversed){ + choices.remove(choice); + choices.add(0, choice); + } + } + + public boolean isSingleSelectMode() { + return singleSelectMode; + } + + public void setSingleSelectMode(boolean singleSelectMode) { + this.singleSelectMode = singleSelectMode; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModelChangeListener.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModelChangeListener.java new file mode 100644 index 0000000..8aa1d81 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ChoiceTableModelChangeListener.java @@ -0,0 +1,16 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +/*** + * Used to notify listeners that a {@link com.nuix.nx.controls.ChoiceTableControl} has changed in some way. + * @author Jason Wells + * + */ +public interface ChoiceTableModelChangeListener { + public void dataChanged(); + public void structureChanged(); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlDeserializationHandler.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlDeserializationHandler.java new file mode 100644 index 0000000..8e7d643 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlDeserializationHandler.java @@ -0,0 +1,17 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.awt.Component; + +/*** + * Callback used to allow code to define a custom de-serialization for a particular control from JSON. + * @author Jason Wells + * + */ +public interface ControlDeserializationHandler { + public void deserializeControlData(Object data, Component destinationControl); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlSerializationHandler.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlSerializationHandler.java new file mode 100644 index 0000000..0c22c06 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ControlSerializationHandler.java @@ -0,0 +1,17 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.awt.Component; + +/*** + * Callback used to allow code to define a custom serialization for a particular control to JSON. + * @author Jason Wells + * + */ +public interface ControlSerializationHandler { + public Object serializeControlData(Component sourceControl); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/CsvTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/CsvTableModel.java new file mode 100644 index 0000000..59194f8 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/CsvTableModel.java @@ -0,0 +1,98 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.swing.table.AbstractTableModel; + +/*** + * Table model for {@link com.nuix.nx.controls.CsvTable}. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class CsvTableModel extends AbstractTableModel { + + private List headers = null; + private List> records = new ArrayList>(); + + public CsvTableModel(List headers){ + this.headers = headers; + } + + @Override + public int getColumnCount() { + return headers.size()+1; + } + + @Override + public int getRowCount() { + return records.size(); + } + + @Override + public Object getValueAt(int row, int col) { + if(col == 0){ + return row + 1; + } else { + Map record = records.get(row); + String header = headers.get(col-1); + if (record.containsKey(header)){ + return record.get(header); + } + else { + return ""; + } + } + } + + @Override + public void setValueAt(Object aValue, int row, int col) { + if(col > 0){ + Map record = records.get(row); + record.put(headers.get(col-1),(String)aValue); + } + } + + @Override + public String getColumnName(int col) { + if(col == 0){ + return "#"; + } else { + return headers.get(col-1); + } + } + + @Override + public boolean isCellEditable(int row, int col) { + return col != 0; + } + + public void addRecord(Map record){ + System.out.println("Adding Record:"); + for (Map.Entry entry : record.entrySet()) { + System.out.println(entry.getKey()+" => "+entry.getValue()); + } + records.add(record); + fireTableRowsInserted(records.size()-1, records.size()-1); + } + + public void removeRecordAt(int row){ + records.remove(row); + fireTableRowsDeleted(row, row); + } + + public List getHeaders() { + return headers; + } + + public List> getRecords() { + return records; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DoubleBoundedRangeModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DoubleBoundedRangeModel.java new file mode 100644 index 0000000..903dc64 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DoubleBoundedRangeModel.java @@ -0,0 +1,59 @@ +package com.nuix.nx.models; + +import javax.swing.*; + +@SuppressWarnings("serial") +public class DoubleBoundedRangeModel extends DefaultBoundedRangeModel { + private int digitsToMaintain; + + public DoubleBoundedRangeModel(double value, double extent, double min, double max, int digitsToMaintain) { + super(convertToInt(value, digitsToMaintain), + convertToInt(extent, digitsToMaintain), + convertToInt(min, digitsToMaintain), + convertToInt(max, digitsToMaintain)); + this.digitsToMaintain = digitsToMaintain; + } + + public void setExtent(double extent) { + super.setExtent(convertToInt(extent, digitsToMaintain)); + } + + public void setMaximum(double max) { + super.setMinimum(convertToInt(max, digitsToMaintain)); + } + + public void setMinimum(double min) { + super.setMinimum(convertToInt(min, digitsToMaintain)); + } + + public void setValue(double value) { + super.setValue(convertToInt(value, digitsToMaintain)); + } + + public double getExtentAsDouble() { + return convertToDouble(getExtent(), digitsToMaintain); + } + + public double getMaximumAsDouble() { + return convertToDouble(getMaximum(), digitsToMaintain); + } + + public double getMinimumAsDouble() { + return convertToDouble(getMinimum(), digitsToMaintain); + } + + public double getValueAsDouble() { + return convertToDouble(getValue(), digitsToMaintain); + } + + private static int convertToInt(double toConvert, int digitsToMaintain) { + double multiplier = Math.pow(10.0, digitsToMaintain); + double results = toConvert * multiplier; + return (int)Math.round(results); + } + + private static double convertToDouble(int toConvert, int digitsToMaintain) { + double divider = Math.pow(10.0, digitsToMaintain); + return ((double)toConvert)/divider; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableModel.java new file mode 100644 index 0000000..896921e --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableModel.java @@ -0,0 +1,603 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.table.AbstractTableModel; + +import com.nuix.nx.controls.filters.DynamicTableAllRecordsFilter; +import com.nuix.nx.controls.filters.DynamicTableCheckedRecordsFilter; +import com.nuix.nx.controls.filters.DynamicTableContainsFilter; +import com.nuix.nx.controls.filters.DynamicTableFilterProvider; +import com.nuix.nx.controls.filters.DynamicTableRegexFilter; +import com.nuix.nx.controls.filters.DynamicTableUncheckedRecordsFilter; +import com.nuix.nx.controls.models.ChoiceTableModelChangeListener; +import com.nuix.nx.controls.models.DynamicTableValueCallback; + +/*** + * Table model used to store data for a {@link com.nuix.nx.controls.DynamicTableControl} + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class DynamicTableModel extends AbstractTableModel { + // Built in handling for filters ":checked:" and ":unchecked:" + private static final DynamicTableFilterProvider checkedRecordsFilter = new DynamicTableCheckedRecordsFilter(); + private static final DynamicTableFilterProvider uncheckedRecordsFilter = new DynamicTableUncheckedRecordsFilter(); + + // Built in handling for when there are no externally provided filters that want to handle a filter expression. + // Logic goes: + // 1. If expression is null or empty or only whitespace, all records filter is used + // 2. If regex filter says it will handle the expression (expression compiles successfully to regex), then it will handle + // 3. Finally a "text contains" filter is used which just checks which records contain the provided expression + private static final DynamicTableFilterProvider allRecordsFilter = new DynamicTableAllRecordsFilter(); + private static final DynamicTableFilterProvider regexRecordsFilter = new DynamicTableRegexFilter(); + private static final DynamicTableFilterProvider textContainsRecordsFilter = new DynamicTableContainsFilter(); + + private List headers; + private List records; + private List recordSelection; + private DynamicTableValueCallback valueCallback; + private String filterExpression = ""; + private ChoiceTableModelChangeListener changeListener; + private Map filterMap; + private Set additionalEditableColumns = new HashSet(); + private boolean defaultCheckState = false; + + private List customFilterProviders = new ArrayList<>(); + + /*** + * Create a new instance + * @param headers The headers for each column + * @param records A collection of records to be displayed + * @param valueCallback Callback that yields a value for a cell given a particular record and column number + * @param defaultCheckState Determines whether by default are records checked + */ + public DynamicTableModel(List headers, List records, DynamicTableValueCallback valueCallback, boolean defaultCheckState){ + this.headers = headers; + this.records = records; + this.valueCallback = valueCallback; + this.defaultCheckState = defaultCheckState; + recordSelection = new ArrayList(); + for (int i = 0; i < records.size(); i++) { + recordSelection.add(defaultCheckState); + } + filterMap = new HashMap(); + applyFiltering(); + } + + /*** + * Set a listener which will be notified when changes are made + * @param listener The listener to be notified of changes + */ + public void setChangeListener(ChoiceTableModelChangeListener listener){ + changeListener = listener; + } + + /** + * Get the listener which will be notified whn changes are made. + * @return the listener that is notified of changes + */ + public ChoiceTableModelChangeListener getChangeListener() { + return changeListener; + } + + public void removeChangeListener(ChoiceTableModelChangeListener listener) { + if(null != changeListener && changeListener.equals(listener)) { + changeListener = null; + } + } + + /** + * A reference to the callback used for retrieving values for display. + * @return {@link DynamicTableValueCallback} used to get the values displayed in the table + */ + public DynamicTableValueCallback getValueCallback() { + return this.valueCallback; + } + + @Override + public int getColumnCount() { + return headers.size()+1; + } + + @Override + public int getRowCount() { + return filterMap.size(); + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + if(columnIndex == 0) + return recordSelection.get(resolveFilterIndex(rowIndex)); + else{ + try { + Object record = records.get(resolveFilterIndex(rowIndex)); + Object value = valueCallback.interact(record,columnIndex-1,false,null); + return value; + } catch (Exception e) { + e.printStackTrace(); + return "Error Occurred: "+e.getMessage(); + } + } + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return columnIndex == 0 || additionalEditableColumns.contains(columnIndex-1); + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + //System.out.println("Setting "+rowIndex+"("+resolveFilterIndex(rowIndex)+"),"+columnIndex+" to "+aValue); + try { + if(columnIndex == 0){ + recordSelection.set(resolveFilterIndex(rowIndex), (Boolean)aValue); + } + else if(additionalEditableColumns.contains(columnIndex-1)){ + Object record = records.get(resolveFilterIndex(rowIndex)); + valueCallback.interact(record,columnIndex-1,true,aValue); + } + notifyChanged(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public String getColumnName(int columnIndex) { + if(columnIndex == 0){ + return ""; + } + else { + return headers.get(columnIndex-1); + } + } + + public void setColumnName(int columnIndex, String updatedValue) { + if(columnIndex == 0){ return; } + else { + headers.set(columnIndex-1, updatedValue); + fireTableStructureChanged(); + changeListener.structureChanged(); + } + } + + @Override + public Class getColumnClass(int columnIndex) { + switch(columnIndex){ + case 0: + return Boolean.class; + default: + return String.class; + } + } + + /*** + * Notify listeners that changes were made + */ + private void notifyChanged(){ + if(changeListener != null){ + changeListener.dataChanged(); + } + + if(filterExpression.equalsIgnoreCase(":checked:") || filterExpression.equalsIgnoreCase(":unchecked:")){ + applyFiltering(); + } + } + + /*** + * Filter the displayed records. When a method such as {@link #getValueAt(int, int)} is called by DynamicTable, the given method will use + * the index mapping stored in {@value #filterMap} to determine for the given display index what item to fetch from + * the actual underlying full collection of records. The act of applying filtering is therefore really just building + * a modified mapping. This method takes the filter expression that has been provided and iteratively apply it to each record + * while building a new index mapping. Once a new mapping has been constructed the associated DynamicTable is informed that data + * has changed and it will re-populate. + */ + private void applyFiltering(){ + Map tempFilterMap = new HashMap(); + + DynamicTableFilterProvider filterProviderToUse = null; + + // If filter expression is empty or null, we interpret that as a "all records" filter + // so we can effectively just build a filter map where each index is present and maps to + // the same index value (key == value). + if(filterExpression == null || filterExpression.trim().isEmpty()) { + filterProviderToUse = allRecordsFilter; + } else { + // If we reach here, that means we have an expression so we need to determine who will + // handle the filtering. We will first check a few built in DynamicTableFilterProviders, then + // any user supplied ones and then finally the fall back built-in regex based filter if nobody + // takes ownership for handling the provided filter expression. + if(checkedRecordsFilter.handlesExpression(filterExpression)) { + filterProviderToUse = checkedRecordsFilter; + } else if(uncheckedRecordsFilter.handlesExpression(filterExpression)) { + filterProviderToUse = uncheckedRecordsFilter; + } else { + + // Now we will see if there is a user provided filter that wants to handle filtering + if(customFilterProviders != null) { + for(DynamicTableFilterProvider customFilterProvider : customFilterProviders) { + if(customFilterProvider.handlesExpression(filterExpression)) { + filterProviderToUse = customFilterProvider; + break; + } + } + } + + // Finally, if we still haven't determined a filter provider to use, then we are going to use + // the built in Regex based filter if it tells us that the provided filter can be compiled into + // a regex properly. If it cannot, we will finally fall back to a basic "text contains" type filter. + if(filterProviderToUse == null) { + if(regexRecordsFilter.handlesExpression(filterExpression)) { filterProviderToUse = regexRecordsFilter; } + else { filterProviderToUse = textContainsRecordsFilter; } + } + } + } + + // Now that we have determined the filter to use, we use it to actual filter the records and build our + // new index mapping. First we call beforeFilter method, then keepRecord on each record and finally afterFilter. + filterProviderToUse.beforeFiltering(filterExpression, records); + + int columnCount = headers.size(); + Map recordValues = new HashMap(); + int filterIndex = 0; + + for (int i = 0; i < records.size(); i++) { + boolean recordIsChecked = recordSelection.get(i); + + // Convert record to columns map using values callback to that filter can inspect displayed values without + // needing deeper knowledge of the underlying record + Object record = records.get(i); + recordValues.clear(); + for (int c = 0; c < columnCount; c++) { + Object colValue = ""; + try { + colValue = valueCallback.interact(record, c, false, null); + } catch (Exception e) { + e.printStackTrace(); + } + recordValues.put(headers.get(c), colValue); + } + + boolean keepRecord = filterProviderToUse.keepRecord(i, recordIsChecked, filterExpression, record, recordValues); + if(keepRecord) { + // Here we record the actual mapping where filter index is the index that will be + // asked for externally and i is the actual index into the full records collection. + tempFilterMap.put(filterIndex, i); + filterIndex++; + } + } + + filterProviderToUse.afterFiltering(); + + // Make the models filter map the one we just built + filterMap = tempFilterMap; + + // Tell the outside world we changed the data + this.fireTableDataChanged(); + + } + + /*** + * Needed to translate record indices between entire collection and + * the currently displayed filter subset of records + * @param filteredIndex + * @return + */ + private int resolveFilterIndex(int filteredIndex){ + if(filterMap.size() < 1){ + return filteredIndex; + } + else{ + return filterMap.get(filteredIndex); + } + } + + /*** + * Set the current filter string + * @param filter The filter string to use + */ + public void setFilter(String filter){ + this.filterExpression = filter; + applyFiltering(); + notifyChanged(); + } + + /*** + * Used to determine whether a given record is checked in the table + * @param record The record to check for + * @return True if the record is present and found to be checked + */ + public boolean isSelected(Object record){ + int recordIndex = records.lastIndexOf(record); + return recordSelection.get(recordIndex); + } + + /*** + * Gets the records associated + * @return The current full set of records + */ + public List getRecords(){ + return records; + } + + /*** + * Sets the records associated + * @param records The records to associate + */ + public void setRecords(List records){ + this.records = records; + for (int i = 0; i < records.size(); i++) { + recordSelection.add(defaultCheckState); + } + filterMap = new HashMap(); + setFilter(""); + } + + /*** + * Adds a single record + * @param record The record to add + */ + public void addRecord(Object record){ + if(record != null) { + this.records.add(record); + recordSelection.add(defaultCheckState); + setFilter(""); + } + } + + /*** + * Remove a record at a specified index + * @param rowIndex The index of the row containing the record to remove + */ + public void remove(int rowIndex){ + this.records.remove(rowIndex); + recordSelection.remove(rowIndex); + setFilter(""); + } + + /*** + * Set the checked state of a record at a given index + * @param index The index to set the checked state of + * @param value The checked state to set + */ + public void setCheckedAtIndex(int index, boolean value){ + if(index >= 0 && index < recordSelection.size()){ + recordSelection.set(index, value); + } + notifyChanged(); + } + + /*** + * Sets the checked state of the currently displayed records to checked. If no filtering + * is currently applied this is all records, otherwise it will be just the filtered subset. + */ + public void checkDisplayedRecords(){ + for(Map.Entry entry : filterMap.entrySet()){ + recordSelection.set(entry.getValue(), true); + this.fireTableCellUpdated(entry.getKey(), 0); + } + notifyChanged(); + } + + /*** + * Sets the checked state of the currently displayed records to unchecked. If no filtering + * is currently applied this is all records, otherwise it will be just the filtered subset. + */ + public void uncheckDisplayedRecords(){ + for(Map.Entry entry : filterMap.entrySet()){ + recordSelection.set(entry.getValue(), false); + this.fireTableCellUpdated(entry.getKey(), 0); + } + notifyChanged(); + } + + /*** + * Gets a list of records which are checked, regardless of whether they are currently displayed + * @return A list of checked records + */ + public List getCheckedRecords(){ + List result = new ArrayList(); + for (int i = 0; i < recordSelection.size(); i++) { + if(recordSelection.get(i) == true) + result.add(records.get(i)); + } + return result; + } + + /*** + * Hashes a record by the values in its columns. Used to store settings to JSON + * @param record The record to hash + * @return An MD5 string based on a concatenation of the column values + */ + protected String hashRecord(Object record){ + MessageDigest md = null; + try { + md = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + StringBuffer hashBuffer = new StringBuffer(); + StringBuffer recordContent = new StringBuffer(); + for (int i = 0; i < headers.size(); i++) { + recordContent.append(valueCallback.interact(record, i,false,null).toString()); + } + md.update(recordContent.toString().getBytes()); + byte[] digest = md.digest(); + for (byte b : digest) { + hashBuffer.append(String.format("%02x", b & 0xff)); + } + return hashBuffer.toString(); + } + + /*** + * Generates a series of hashes representing each record by calling {@link #hashRecord(Object)} + * on each record. + * @param records The record to generate hashes for. + * @return A Set of distinct MD5 hash strings + */ + protected Set getRecordHashes(List records){ + Set hashes = new HashSet(); + for(Object record : records){ + hashes.add(hashRecord(record)); + } + + return hashes; + } + + /*** + * Gets the MD5 hashes for all the currently checked records using {@link #getRecordHashes} + * @return MD5 hashes for all the currently checked records + */ + public Set getCheckedRecordHashes(){ + return getRecordHashes(getCheckedRecords()); + } + + /*** + * Sets the checked state of loaded records to checked for records with MD5 hash values + * matching those in the provided list. Used to restore a selection of items which has + * previously been saved. + * @param hashStrings The MD5 hashes to match to records to be checked + */ + public void setCheckedRecordsFromHashes(List hashStrings){ + Set hashes = new HashSet(); + for(String hash : hashStrings){ + hashes.add(hash); + } + for (int i = 0; i < records.size(); i++) { + if(hashes.contains(hashRecord(records.get(i)))){ + recordSelection.set(i, true); + this.fireTableCellUpdated(i, 0); + } else { + recordSelection.set(i, false); + this.fireTableCellUpdated(i, 0); + } + } + } + + /*** + * Gets a count of how many records are currently checked + * @return The checked record count + */ + public int getCheckedValueCount(){ + int result = 0; + for (int i = 0; i < recordSelection.size(); i++) { + if(recordSelection.get(i) == true) + result++; + } + return result; + } + + /*** + * Gets the count of records which are currently displayed. If no filtering is currently applied + * this will be to total record count. If filtering is currently applied this will be the number + * of displayed records. + * @return A count of currently visible records + */ + public int getVisibleValueCount(){ + return filterMap.size(); + } + + /*** + * Gets the total count of records, regardless of check state or display state + * @return The total count of records + */ + public int getTotalValueCount(){ + return records.size(); + } + + /*** + * Shift a series of rows up 1 + * @param positions Position indices of the rows to be shifted + * @return The resulting new positions + */ + public int[] shiftRowsUp(int[] positions){ + return shiftRows(positions,-1); + } + + /*** + * Shift a series of rows down 1 + * @param positions Position indices of the rows to be shifted + * @return The resulting new positions + */ + public int[] shiftRowsDown(int[] positions){ + return shiftRows(positions,1); + } + + /*** + * Shifts a given set of rows (based on row index) a given offset. A value of -1 for the offset is up (earlier in the list) + * while a value of 1 is down (later in the list). + * @param positions Position indices of the rows to be shifted + * @param offset The offset to shift the rows. + * @return The resulting new positions + */ + public int[] shiftRows(int[] positions, int offset){ + List selection = new ArrayList(); + for (int i = 0; i < positions.length; i++) { + if(positions[i] + offset < 0 || positions[i] + offset > records.size() - 1) + return positions; + else + selection.add(positions[i]); + } + Collections.sort(selection); + int minPos = selection.get(0); + Collections.reverse(selection); + List selectedObjects = new ArrayList(); + for(int i : selection){ + selectedObjects.add(records.remove(i)); + } + Collections.reverse(selectedObjects); + records.addAll(minPos+offset, selectedObjects); + this.fireTableDataChanged(); + return new int[]{minPos+offset,minPos+offset+positions.length-1}; + } + + /*** + * Allows caller to define whether a given column is allowed to be editable. The column index + * provided is relative to user data and therefore index 0 is the first record column. + * @param column The column index to set as editable + */ + public void setColumnEditable(int column){ + additionalEditableColumns.add(column); + } + + /*** + * Sets the default checked state of records + * @param defaultCheckState The default check state to use + */ + public void setDefaultCheckState(boolean defaultCheckState) { + this.defaultCheckState = defaultCheckState; + } + + /*** + * Gets the list of filter providers beyond those that are built in, allowing you to add or remove + * custom filter providers. + * @return The current list of custom filter providers + */ + public List getCustomFilterProviders() { + return customFilterProviders; + } + + /*** + * Sets the list of filter providers beyond those that are built in. + * @param customFilterProviders The new list of custom filter providers + */ + public void setCustomFilterProviders(List customFilterProviders) { + this.customFilterProviders = customFilterProviders; + } + + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableValueCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableValueCallback.java new file mode 100644 index 0000000..e9a16c1 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/DynamicTableValueCallback.java @@ -0,0 +1,15 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; +/*** + * Callback used by {@link com.nuix.nx.controls.DynamicTableControl} to allow calling code (likely a Ruby script) + * to save changes a user has made to a record in the table. + * @author Jason Wells + * + */ +public interface DynamicTableValueCallback { + public Object interact(Object record, int i, boolean setValue, Object aValue); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ItemStatisticsTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ItemStatisticsTableModel.java new file mode 100644 index 0000000..6cc4471 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ItemStatisticsTableModel.java @@ -0,0 +1,147 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.models; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.swing.table.AbstractTableModel; + +import com.nuix.nx.NuixConnection; +import com.nuix.nx.helpers.FormatHelpers; + +import nuix.ItemType; +import nuix.ProcessedItem; + +/*** + * Table model used by {@link com.nuix.nx.controls.ProcessingStatusControl}. Used in table to display processing numbers. + * @author Jason Wells + * + */ +@SuppressWarnings("serial") +public class ItemStatisticsTableModel extends AbstractTableModel { + + class Stat{ + public String mimeType; + public int totalProcessed; + public int totalCorrupted; + public int totalEncrypted; + public int totalDeleted; + + public Stat(String mimeType){ + this.mimeType = mimeType; + totalProcessed = 0; + totalCorrupted = 0; + totalEncrypted = 0; + totalDeleted = 0; + } + } + + private String[] headers = new String[]{ + "Kind", + "Type", + "Mime Type", + "Processed", + "Corrupted", + "Encrypted", + "Deleted", + }; + + private Map typeLookup = new HashMap(); + private Map stats = new HashMap(); + private List sortedStats = new ArrayList(); + private long lastUpdated = System.currentTimeMillis(); + + public ItemStatisticsTableModel() { + super(); + if(NuixConnection.getUtilities() != null){ + Set allTypes = NuixConnection.getUtilities().getItemTypeUtility().getAllTypes(); + for(ItemType type : allTypes){ + typeLookup.put(type.getName(),new String[]{type.getKind().getName(),type.getLocalisedName()}); + } + } + } + + @Override + public int getColumnCount() { + return headers.length; + } + + @Override + public int getRowCount() { + return stats.size(); + } + + @Override + public Object getValueAt(int row, int col) { + Stat stat = sortedStats.get(row); + switch (col) { + case 0: + if(typeLookup.containsKey(stat.mimeType)) { + return typeLookup.get(stat.mimeType)[0]; + } else { + return "Unknown"; + } + case 1: + if(typeLookup.containsKey(stat.mimeType)) { + return typeLookup.get(stat.mimeType)[1]; + } else { + return "Unknown"; + } + case 2: return stat.mimeType; + case 3: return FormatHelpers.formatNumber(stat.totalProcessed); + case 4: return FormatHelpers.formatNumber(stat.totalCorrupted); + case 5: return FormatHelpers.formatNumber(stat.totalEncrypted); + case 6: return FormatHelpers.formatNumber(stat.totalDeleted); + default: + return "???"; + } + } + + @Override + public String getColumnName(int column) { + return headers[column]; + } + + @Override + public Class getColumnClass(int col) { + switch (col) { + case 0: + case 1: + case 2: return String.class; + default: + return Integer.class; + } + } + + public void record(ProcessedItem item){ + Stat stat = stats.computeIfAbsent(item.getMimeType(),(k) -> { + Stat result = new Stat(item.getMimeType()); + sortedStats.add(result); + return result; + }); + stat.totalProcessed++; + if(item.isCorrupted()){stat.totalCorrupted++;} + if(item.isEncrypted()){stat.totalEncrypted++;} + if(item.isDeleted()){stat.totalDeleted++;} + + // Time based rate limit the update frequency + if (System.currentTimeMillis() - lastUpdated > 250){ + refresh(); + lastUpdated = System.currentTimeMillis(); + } + } + + public void refresh() { + sortedStats.sort((a,b)->{ + return Integer.compare(a.totalProcessed * -1, b.totalProcessed * -1); + }); + fireTableDataChanged(); + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ReportDataModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ReportDataModel.java new file mode 100644 index 0000000..cbc6620 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/ReportDataModel.java @@ -0,0 +1,234 @@ +/****************************************** + Copyright 2022 Nuix + http://www.apache.org/licenses/LICENSE-2.0 + *******************************************/ +package com.nuix.nx.models; + +import javax.swing.*; + +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.*; + +/** + * Data model for use with the {@link com.nuix.nx.controls.ReportDisplayPanel}. + *

+ * The report is represented by a group of sections, each section being a group of data labels and their values. + * A report might be displayed as: + *

+ *
+ *  SECTION 1
+ *  --------
+ *  Data Field 1                  Value 1
+ *  Data Field 2                  Value 2
+ *
+ *  SECTION 2
+ *  --------
+ *  Data Field 3                  Value 3
+ *
+ *  ...
+ *
+ *

+ * The sections names should be strings, the data field names should be strings, and the data values can be any + * object that has a reasonable toString() representation. + *

+ *

+ * No effort is made by this class to make building the list of sections and data labels threadsafe. As such, the + * sections and data should be built prior to displaying the data in any UI. Updating data values will be + * run from the Swing thread so updating these values during display is safe. + *

+ */ +public class ReportDataModel { + + Map> report = new LinkedHashMap<>(); + + List listeners = new ArrayList<>(); + + /** + * Add a PropertyChangeListener to this object. The listener will be updated when new sections are added and when + * data field values are updated. When a section is added, the Property Name will be the name of the section. When + * a data field value is updated the property name will be a string containing the Section Name and the Data Field + * Name connected with the SECTION_FIELD_DELIM (for example, "Section 1::Data Field 1".) + * @param listener A property change listener to be informed when section and data changes are made. + */ + public void addPropertyChangeListener(PropertyChangeListener listener) { + SwingUtilities.invokeLater( () -> { if (!listeners.contains(listener)) listeners.add(listener); } ); + } + + /** + * Remove the provided listener from this object. + * @param listener The PropertyChangeListener to remove. + */ + public void removePropertyChangeListener(PropertyChangeListener listener) { + SwingUtilities.invokeLater( () -> { if (!listeners.contains(listener)) listeners.remove(listener); } ); + } + + /** + * Add a section to the report, providing data as the section is created. + * + * This method is not guaranteed to be threadsafe. It will inform listeners of the new section. + * + * If the section already exists it will be replaced with the provided data. + * @param sectionName The name of the section. This is for both identification and display purposes so make it + * meaningful for display and also unique. + * @param dataInSection The data to display in the form of a Map. The keys to the map are the data field names and + * are used both for display and as ids, so make them meaningful and unique. + */ + public void addSection(String sectionName, Map dataInSection) { + Map copied = new LinkedHashMap<>(); + + for (String dataField : dataInSection.keySet()) { + Object value = dataInSection.get(dataField); + if (null == value) { + throw new IllegalArgumentException(String .format("The value for the data field named %s is null, which is not allowed.", dataField)); + } else { + copied.put(dataField, value); + } + } + + Map oldSection = report.getOrDefault(sectionName, null); + report.put(sectionName, copied); + notifyOfChange(sectionName, null, oldSection, copied); + } + + /** + * Add a new, empty section to the report. + * + * This method is not guaranteed to be thread safe. + * + * @param sectionName The name of the new section. The name is both an id and displayed, so make it meaningful and + * unique. If the section already exists, it will be replaced and the data in it will be lost. + */ + public void addSection(String sectionName) { + addSection(sectionName, new LinkedHashMap()); + } + + /** + * Add data to the given section. If the section doesn't already exist it will be added with the new data. If + * the data field already exists in the section, it will be replaced with the new value. + * + * This method is not guaranteed to be thread safe. It will not notify the UI of a new data field, though if + * it results in a new section, that section will be added to the UI with the new data field. + * + * @param sectionName The name of the section to add the data to. + * @param dataField The name of the data to add - this will be used both for id and display so make it unique in the + * section and also meaningful to the user. + * @param value The value of the data field - any object with a meaningful toString() method. + */ + public void addData(String sectionName, String dataField, Object value) { + if (report.containsKey(sectionName)) { + Map section = report.get(sectionName); + + if (null == value) { + throw new IllegalArgumentException("The value being added must not be null."); + } else { + Object oldValue = section.getOrDefault(dataField, null); + + if (!value.equals(oldValue)) { + section.put(dataField, value); + notifyOfChange(sectionName, dataField, oldValue, value); + } + } + } else { + this.addSection(sectionName, Map.of(dataField, value)); + } + } + + /** + * Update an existing data field in the given section with a new value. If the section doesn't exist an exception + * will be thrown. If the data field doesn't exist in the section then an exception will be thrown. Otherwise, + * the existing value for the data field will be replaced with the one provided here. + * + * This method will update listeners with new values and the changes should be reflected in the UI. + * + * @param sectionName The name of the section with the data field to update. It must already exist in the report. + * @param dataField The name of the data field to update. It must exist in the section provided. + * @param newValue The value to replace any value currently in the data field. Any object with a meaningful + * toString() method + */ + public void updateData(String sectionName, String dataField, Object newValue) { + if (report.containsKey(sectionName)) { + Map section = report.get(sectionName); + if (section.containsKey(dataField)) { + if (null == newValue) { + throw new IllegalArgumentException("The value being set must not be null."); + } else { + Object oldValue = section.get(dataField); + + if (!newValue.equals(oldValue)) { + section.put(dataField, newValue); + notifyOfChange(sectionName, dataField, oldValue, newValue); + } + + } + } else { + throw new IllegalArgumentException(String.format("The section %s does not have a value for %s", sectionName, dataField)); + } + } else { + throw new IllegalArgumentException(String.format("This report has no section named %s", sectionName)); + } + } + + /** + * Get a String representation of the value of a data field. + * + * If either the section doesn't exist in the report or the data field is not found in the section provided then + * this will return an empty string. + * + * @param sectionName The name of the section where the data can be found + * @param dataField The name of the field whose data is to be retrieved + * @return A string representation of the data field value, or an empty string if the data field can't be located. + */ + public String getDataFieldValue(String sectionName, String dataField) { + if (report.containsKey(sectionName)) { + Map section = report.get(sectionName); + if (section.containsKey(dataField)) { + return section.get(dataField).toString(); + } + } + + // Either section or data field don't exist, return empty value. + return ""; + } + + /** + * Get the list of data fields in the provided section. + * + * If the section doesn't exist in this report an empty set will be provided. + * + * @param sectionName The name of the section whose data fields are to be retrieved. + * @return A Set of strings with the data field names, or an empty Set if the section doesn't exist. + */ + public Set getDataFieldsInSection(String sectionName) { + if (report.containsKey(sectionName)) { + return new LinkedHashSet<>(report.get(sectionName).keySet()); + } + + // Section not in report, return an empty Set + return Set.of(); + } + + /** + * Get the list of sections in this report. + * + * @return a Set of Strings with the names of all the sections in this report. + */ + public Set getSections() { + return new LinkedHashSet<>(report.keySet()); + } + + public static final String SECTION_FIELD_DELIM = "::"; + + private void notifyOfChange(String sectionName, String dataField, Object oldValue, Object newValue) { + SwingUtilities.invokeLater(() -> { + for (PropertyChangeListener listener : listeners) { + String propertyName = dataField == null ? sectionName : sectionName + SECTION_FIELD_DELIM + dataField; + listener.propertyChange(new PropertyChangeEvent( + this, + propertyName, + oldValue, newValue)); + } + }); + } + +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/models/StringListTableModel.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/StringListTableModel.java new file mode 100644 index 0000000..fff0740 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/models/StringListTableModel.java @@ -0,0 +1,81 @@ +package com.nuix.nx.models; + +import java.util.ArrayList; +import java.util.List; + +import javax.swing.table.AbstractTableModel; + +@SuppressWarnings("serial") +public class StringListTableModel extends AbstractTableModel { + + private List values = new ArrayList(); + private boolean editable = false; + + @Override + public int getRowCount() { return values.size(); } + + @Override + public int getColumnCount() { return 1; } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return values.get(rowIndex); + } + + @Override + public String getColumnName(int column) { + return "Values"; + } + + @Override + public Class getColumnClass(int columnIndex) { + return String.class; + } + + @Override + public boolean isCellEditable(int rowIndex, int columnIndex) { + return editable; + } + + @Override + public void setValueAt(Object aValue, int rowIndex, int columnIndex) { + if(editable) { + values.set(rowIndex, (String)aValue); + } + } + + public int getValueCount() { + return values.size(); + } + + public String getValueAt(int index) { + return values.get(index); + } + + public List getValues() { + return values; + } + + public void setValues(List values) { + this.values = values; + this.fireTableDataChanged(); + } + + public void addValue(String value) { + values.add(value); + this.fireTableDataChanged(); + } + + public void removeValueAt(int rowIndex) { + values.remove(rowIndex); + this.fireTableRowsDeleted(rowIndex, rowIndex); + } + + public boolean isEditable() { + return editable; + } + + public void setEditable(boolean editable) { + this.editable = editable; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitCallback.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitCallback.java new file mode 100644 index 0000000..4b3d938 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitCallback.java @@ -0,0 +1,22 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.sourceitem; + +import nuix.SourceItem; + +/*** + * Callback used by {@link SourceItemVisitor}. + * @author Jason Wells + * + */ +public interface SourceItemVisitCallback { + /*** + * Called once for each allowed item. + * @param sourceItem The source item being visited. + * @return True if children should be visited as well, false if children should not be visited. + */ + public boolean visitSourceItem(SourceItem sourceItem); +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitor.java b/IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitor.java new file mode 100644 index 0000000..7b2df2b --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/nx/sourceitem/SourceItemVisitor.java @@ -0,0 +1,83 @@ +/****************************************** +Copyright 2018 Nuix +http://www.apache.org/licenses/LICENSE-2.0 +*******************************************/ + +package com.nuix.nx.sourceitem; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Map; + +import com.nuix.nx.NuixConnection; + +import nuix.SourceItem; +import nuix.SourceItemFactory; + +/*** + * A helper class for visiting all items recursively in a tree of source items. + * @author Jason Wells + * + */ +public class SourceItemVisitor { + private SourceItemVisitCallback visitCallback; + + /*** + * Provides a callback which will be called once for each source item located. + * @param callback A callback which will be invoked each time a source item is visited. + */ + public void onVisit(SourceItemVisitCallback callback){ + visitCallback = callback; + } + + /*** + * Creates a SourceItemFactory and begins recursing the source item tree for the provided file. + * @param file The file to recurse. + * @param sourceItemFactorySettings Settings you might provide to a call to Utilities.getSourceItemFactory, can be null to use defaults + * @param fileSettings Settings you might provide to a call to SourceItemFactory.openFile, can be null to use defaults + * @throws FileNotFoundException Thrown by SourceItemFactory if the provided file does not exist. + */ + public void visit(File file, Map sourceItemFactorySettings, Map fileSettings) throws FileNotFoundException{ + SourceItemFactory factory = null; + SourceItem root = null; + + if(sourceItemFactorySettings != null) + factory = NuixConnection.getUtilities().createSourceItemFactory(sourceItemFactorySettings); + else + factory = NuixConnection.getUtilities().createSourceItemFactory(); + + if(fileSettings != null) + root = factory.openFile(file,fileSettings); + else + root = factory.openFile(file); + + recursivelyVisit(root); + factory.close(); + } + + /*** + * Creates a SourceItemFactory and begins recursing the source item tree for the provided file. + * @param file The file to recurse. + * @param sourceItemFactorySettings Settings you might provide to a call to Utilities.getSourceItemFactory, can be null to use defaults + * @param fileSettings Settings you might provide to a call to SourceItemFactory.openFile, can be null to use defaults + * @throws FileNotFoundException Thrown by SourceItemFactory if the provided file does not exist. + */ + public void visit(String file, Map sourceItemFactorySettings, Map fileSettings) throws FileNotFoundException{ + visit(new File(file),sourceItemFactorySettings, fileSettings); + } + + /*** + * Recursively visits source items and their children unless callback specifies skipping children for a given source item. + * @param sourceItem The source item to visit and potentially recursively visit children of. + */ + protected void recursivelyVisit(SourceItem sourceItem){ + boolean visitChildren = visitCallback.visitSourceItem(sourceItem); + if(visitChildren){ + for(SourceItem child : sourceItem.getChildren()){ + recursivelyVisit(child); + child.close(); + } + } + sourceItem.close(); + } +} diff --git a/IntelliJ/Nx/src/main/resources/icons/accept.png b/IntelliJ/Nx/src/main/resources/icons/accept.png new file mode 100644 index 0000000000000000000000000000000000000000..89c8129a490b329f3165f32fa0781701aab417ea GIT binary patch literal 781 zcmV+o1M>WdP)4-QibtN)VXQDpczE`xXAkUjh%RI>;okxb7K@0kpyQ1k_Y(|Oe7$m(^ zNYX>mI||sUbmn+c3<&FnE=4u#()KBS^SH8e)Qs5i!#lY=$-1gbH6VluzU=m=EP78&5vQ z-?+fFP-G2l&l_QzYealK$;1Rl?FkzXR&Jv@fBPNjCr#AYRyJ7UJQ0v#?)7Ott=>3`#-pV!7>9}>Q1jL)H6h&gkP@3nI=+F3nA~M>u#(n* z8T!#8oEw&-mED4!h4s!N@Jo3S7N&Q6%6l3}nlcd~X@>;uelvPsSkXIgg~e+^T1zSf z3SNj(5%jK~i8@b;C9VHk(~TedF+gQSL8D5xnVSSWAVY>J9b+m>@{iq7_KE}go~11+5s4;8hc+i0Xa zI1j@EX5!S+Me6HNqKzU5YQwL;-W5$p%ZMKMeR<%zp69-~?<4?8|C8S?bklXr4v&Ov zb&06v2|-x?qB`90yn>Qi%Sh2^G4n)$ZdyvTPf9}1)_buUT7>`e2G&2VU@~Bb(o+Mz zi4)>IxlSY${Dj4k={-9RzU^W5g9|2V5RZ2ZulL9s2xQbZ@r6eP9Ra5u(s|C0Nj#&4>wTSkb?%#=9?@ z^oxDy-O@tyN{L@by(WWvQ3%CyEu8x{+#Jb4-h&K9Owi)2pgg+heWDyked|3R$$kL@A z#sp1v-r+=G4B8D6DqsDH0@7OztA7aT9qc1Py{()w`m``?Y0&gi2=ROcc-9+nU^I6< zT=e_Y=vSnG@?3Ue{BW5ONFttcE!R-R_W4O01|0-|K-YNXLo2`4Qv z`r1LxR6#yf3FB%T95gJnaKKivA~Z}S9A(ZxEDK}O3T04USJ P00000NkvXXu0mjf^IS-S literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/arrow_down.png b/IntelliJ/Nx/src/main/resources/icons/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4e279377bf348f9cf53894e76bb673ccf067bd GIT binary patch literal 379 zcmV->0fhdEP)RB*?~^j!LKVQ>(O&A{Xr%)RXLn#U zs4LtZ6rCMFY5|B2$)yG$6aaIF6w#wHUuW*nL5>vZR zlg{G&%mT~|kL3ei%GW0*UOHUMs5XI$4uxe-L?I@SAefq*207}Iqtjm#e5*fP53AiC z)C|RQfwzxx<#_WfANRGZx{+tFDl8~Q?;~Ve=lM^*8UTTnVL?HTDz8uta0D@d28E9S z_)i8aLz^UE6PPKymi;2GJ`34{eIia-CtfAt0H61rk0 SPTNud0000C#5QQ<|d}62BjvZR2H60wE-%s@N{tu(Kvs0!a}YF0}=J!QSUY7M7z;-RJ$7n8*6-IkwdUVS%nn(+HZ=IM>KhySVgJojLZytKsQlJks9 zg>q@PUpbdv;&|+P!{NQ{65)mBh3B(*yP58!PISKz-O48F^~6K0e}RJHfr*NaZ|Z(M akrr=d7xdAvd!`9=1B0ilpUXO@geCyB6I2-h literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/cancel.png b/IntelliJ/Nx/src/main/resources/icons/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..c149c2bc017d5ce5a8ae9330dd7dbd012482e0f4 GIT binary patch literal 587 zcmV-R0<`^!P)FS^-G}e*;M)Q6>s#cP zI`Y#S($G6W`W@NI5g|L-MKl0Zmu$m^(0~^Lwo5OO~d#(vPfzU3VE{tZoOXQ3gborPd)C!*bfsFfgUA%b`K z{k54{z0H}ACRrHvW^d-rdyicUV+{VYtX~gCqfs0|(-=vN2o1PiuPW{>+#Atov}dlj zm>FQRf_YAoB-!b7g57TC=llI0*6TIQX0twmlwz@1Su_y<#c()O27`fy#f%p1x~?-# z)7Wme<7b=AhIKj}t=(=bMjvNzr~MuZg=Ct#TCD`Id5F*FgY9+;-ENndyrfd8-V+sI zk|x?lbD>axN~J2Ai^W%{R^I>_0Z9u6gEF#73lqsO`axO|3~qzj{hRS`0}LC%>-AD? zlFkeU5t@ED93Che0EA(j5rE6(g7f(t5ddbb)O7oPG}&BpJRae6I)RyiO6J&XwmSe5 z5k7R5;6} zlgp~&KoEw{L*wq6jM9+RMU)_iNO6K~b@$|K=nj zb2!5=4Mjq_zrU*f>U2#vSVnMZ9ja4cY`AdOM*t}k^goWqfa3Iq(>2kSH;P81hAqIyBm_{t1>+!KRdtb~{1AK7>C~ zD-Nov`UX!X6ET_La7f{B_|*cRuZGR%^C`gjd@jmW6h*+;8;{2{8ja|Fzf-YTq+l@k zGLg?!DijI~9$+CG0P)O;^z5vZ zY!uIB*x&E}vNJj4{?GTJBigE^o7UKdzE#&EBXnfjM2N9qUNJ=7T*(!I*v$dVF@wV! zPcbfCO)dpCHwm6#49koVc}1IZ;f0opGWdxBx;Rl@XzG}46S&UgQ6wI6lQE987w+r= zQ{sp)?}bM^PuEoyT++I zn$b9r%cFfhHe2K68PkBu*@^<$y+7xQ$wJ~;c5aBx$R=xq*41Wo zhwQus_VOgm0hughj}MhOvs#{>Vg09Y8WxjWUJY5YW zJ?&8eG!59Cz=|E%Ns@013KLWOLV)CObIIj_5{>{#k%TEAMs_GbdDV`x-iYsGH z#=Z{USAQA>NY(}X7=3{K8#C4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/eye.png b/IntelliJ/Nx/src/main/resources/icons/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..564a1a9714ff37aee1c8758109113e434eff7862 GIT binary patch literal 750 zcmVWW=I5Rl}zuENrQ28Pt;CX(qKOcDU|M8F&Z%jVGSZA7t& zSX&s1bi|{*v*DgAz3ST9+K6Us3~0Q9*~BWe6PID=&0x|wWdf!IWgI(}6lv9v-FpSS zw1U9OL{Ex%ACuJL>=wxTZg0 zEf8`!jsrze5UvA~SqG-HeEY!{P)iC{?3#nq?S616TB~hnMW{0-6j9tLvf?&u+XiC{ z?O_E0jiYQZlqIojGL$5a1qk9N)mlxpmZq1W6gHT`ec`8K>j$jl3}`WfukS z{=!u2#P1a^U!H8Xl5T`7??NT1t zUc_pqB=&-xQ}oxwg~5^6HaUDuDLGXE;y3!@QP_pOFSc-kKKIu gX8xa5{%_a#2W_ovs9z>%07*qoM6N<$f|edvg8%>k literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/folder_page.png b/IntelliJ/Nx/src/main/resources/icons/folder_page.png new file mode 100644 index 0000000000000000000000000000000000000000..1ef6e11438f3226f88bdc457f55d677d1f2f8409 GIT binary patch literal 688 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 Ef@ddc(f|Me literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/page_white_get.png b/IntelliJ/Nx/src/main/resources/icons/page_white_get.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a1ecba1b60e54f3777717ed105cdde745b7184 GIT binary patch literal 516 zcmV+f0{i`mP)o)wchR-92qq~y6`XqbKmElbB3z{pkZs0VPF`CFvS?7jDn^mFo>d9Y&06* z&1MsS!M-CH3ee+h_sy)Ms%B*ec3R0RpVi9?*mU84yoq(Bw8 z<4(999dJJE!V%pWT~HGRIAb;(#O%2K3?uRpz}AfgE8e9q&OSdr^e^}lC$QXZz;S2A z)w>^oHy>?v)q--`!pmuBe96PxP0u*inQvyFW(llfv9 zXV1s*Jh`y2H%B3ZTA(AzpsQ?hb6_PyZ=c1?_B4fbl>G%!@ubJln=!)x0000JNR5;6( zlS@kiVHAe7MZY2;Xi-5)WxDDgv@tCUl*&p14T@Z~3ThM5LP4tuQfLu@EnG;nXc<8S z6&3BN?fx-cv-Kp6>HRiNTHE>$X( zD&=w+?GWC>?RLAGC6Yix;an~UmSt)tSf}1VS6N1N2ONORdD? zaj}w6DAZZdOud9Ep?M?{iQWbE5^9HLLZZF|1kdy0Tu4InEuboP9@nvbZ-P0n4AZTy zyMRIxRDmUE#LdqYuD=-Qz4N^bC`_#S7vcLn1M}{J(Wl3#c4VWczu&)AjUlh(11>gp>f`wv{KnjF%!aA*Jk N002ovPDHLkV1kkt*XsZP literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/page_white_text.png b/IntelliJ/Nx/src/main/resources/icons/page_white_text.png new file mode 100644 index 0000000000000000000000000000000000000000..813f712f726c935f9adf8d2f2dd0d7683791ef11 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6SkfJR9T^zbpD<_bdI{u9mbgZg z1m~xflqVLYGB~E>C#5QQ<|d}62BjvZR2H60wE-%6;pyTSA|c6o&@eC9QG)Hj&ExYL zO&oVL^)+cM^qd@ApywS>pwx0H@RDN}hq;7mU-SKczYQ-hnrr=;iDAQMZQ+*g=YOM= z!QlMQEn7FbaD->uKAYgo_j9)W&$$zS*W9}m(ey0q$&7l-XEWO0Y(9M=SnhLbwy;d>@~SY$Ku*0xPvIOQeV1x7u_z-2-X>_74(yfh7C znXL|3GZ+d2`3re2hs?MKHs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pN2bPDNB8 zb~7$DE-^7j^FlWO00Oc}L_t(IPoU$Admhd`_j&>NFaCHie?Ho8Hs+Ml5*E17U`|;EU5K|^7wGK?VJ?<4k-p~BeCJPj0Cr_AY!%s z2l?-=>$_pEEQGa0g3Zw(d|Fw;6y0ndW#s+6J-obk7gKpsI65AnGMw1;1n2{NcGvV> zu-%ZucC!dycRn-Hmyhq6J1xJc*T5uBgjtpe$HR6g!VU#cM?)^PG+?=@4$}qcn6E0w zx1AkE{=UDD1#JzCqIj566Jgg>!>U%JER;CdLPx+c)zH;TSRd@elq?=eu@i}7J) znQE?uAvq2sqH8dwB;jpO7g}RuP#Q`cyu{W(Z{Ow+w$oBv2vXmJiHuZ?iIXszl7JDK zWJ(q#Vzs*yqcSN9xGZM@k2p9+ng%XgSQ|mO&H1??`+8v4sxcvzU`&#Zg*!D^?dpUv zQ-T~W%T38gKcrvO3fRJ`aALdt@>$q4YP@c1#S(?}b`@GKMj?;G+Lj-ZX^sTY+=^iP zslo`Qf=`e|JeEt&Wx1$El0uooA^!d|{X6jb0hq_A{`&4ju>b%707*qoM6N<$f|nz3 AwEzGB literal 0 HcmV?d00001 diff --git a/IntelliJ/Nx/src/main/resources/icons/zoom_out.png b/IntelliJ/Nx/src/main/resources/icons/zoom_out.png new file mode 100644 index 0000000000000000000000000000000000000000..07bf98a79cfea526e250703356dbefdb6b80d166 GIT binary patch literal 708 zcmV;#0z3VQP)TNkCP1&*^7LC~A?iZQEu_hKZoQoXI zA7tfTv}|~Fb8b^XuP>qvDk=)P)vYKtT12;}bKn-mwHWl`1Bb)&{XXC4IY$Nnvj5@N zfekg1Y}gcI!)Cq|u?lR+A{2&=d~S$}&0ei1|7pO6jkZ$6%&{R8TNpk>=dV#j&aWqO zgE~4pNU_-giktFkY-J5_XDlv`7+j?n3mXtxgadILp+c<9cr~t!x1LM6m69Z~V#pLL z22Cs~BoIdtZHTjo7Q|_U0a2OmSF=gCGFB$RVZIP(pixmBqE!^15yd!#9Z{Wh)zB%o zikBFa!WJPvMB(noe(U;k1e~Y|r$}@wh*Ymykd6>E3t69z5DT&Jq-fSG-dPdU{SG;i zbSb3<`RfKgJD|lQC`6(Cdut1PbDV&$M=Y?U)x)A(0iQN+gAeOBg2Z6fr$_Is!%M70 z=n*z7{*s%3rO7yazIO)}qa&~o@WZ=R>!b#mOSR zlCR8M*iRy2j7!PmWiiegA>Og~W1?FLk0*NI^}`$RW jvmArgs = bean.getInputArguments(); + for (String arg : jvmArgs) { + System.out.println(arg); + } + + System.out.println("Environment Variables:"); + for (Map.Entry entry : System.getenv().entrySet()) { + System.out.println(String.format("%s => %s", entry.getKey(), entry.getValue())); + } + + testOutputDirectory = new File(System.getenv("TEST_OUTPUT_DIRECTORY")); + testDataDirectory = new File(System.getenv("TEST_DATA_DIRECTORY")); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (deleteTestOutputOnCompletion) { + try { + FileUtils.deleteDirectory(testOutputDirectory); + } catch (IOException exc) { + log.error("Error while deleting output directory: " + testOutputDirectory.getAbsolutePath(), exc); + } + } + })); + } + + @AfterAll + public static void breakdown() { + NuixEngine.closeGlobalContainer(); + } + + public NuixEngine constructNuixEngine(String... additionalRequiredFeatures) { + List features = List.of("CASE_CREATION"); + if (additionalRequiredFeatures != null && additionalRequiredFeatures.length > 0) { + features.addAll(List.of(additionalRequiredFeatures)); + } + + NuixLicenseResolver caseCreationCloud = NuixLicenseResolver.fromCloud() + .withLicenseCredentialsResolvedFromEnvVars() + .withMinWorkerCount(4) + .withRequiredFeatures(features); + + return NuixEngine.usingFirstAvailableLicense(caseCreationCloud) + .setEngineDistributionDirectoryFromEnvVar() + .setLogDirectory(new File(testOutputDirectory, "Logs_" + System.currentTimeMillis())); + } + + @Test + public void GetLicenseTryWithResourcesCleanup() throws Exception { + // Create engine instance using try-with-resources, get utilities, use, closes + // at end of try-with-resources + try (NuixEngine nuixEngine = constructNuixEngine()) { + Utilities utilities = nuixEngine.getUtilities(); + utilities.getItemTypeUtility().getAllTypes(); + } + } + + @Test + public void TestBasicRubyScript() throws Exception { + List outputLines = new ArrayList<>(); + try (NuixEngine nuixEngine = constructNuixEngine()) { + Utilities utilities = nuixEngine.getUtilities(); + Map globalVars = Map.of("$utilities", utilities); + String script = "$utilities.getItemTypeUtility.getAllKinds.each{|kind| puts kind.getName}"; + RubyScriptRunner rubyScriptRunner = new RubyScriptRunner(); + rubyScriptRunner.setStandardOutput(outputLines::add); + rubyScriptRunner.setErrorOutput(outputLines::add); + rubyScriptRunner.runScriptAsync(script, nuixEngine.getNuixVersionString(), globalVars); + rubyScriptRunner.join(); + log.info("Script Output:"); + log.info(String.join("",outputLines)); + assertTrue(outputLines.size() > 0); + } + } +} diff --git a/IntelliJ/Nx/src/test/java/RubyExamples.java b/IntelliJ/Nx/src/test/java/RubyExamples.java new file mode 100644 index 0000000..7c4a4c2 --- /dev/null +++ b/IntelliJ/Nx/src/test/java/RubyExamples.java @@ -0,0 +1,109 @@ +import com.nuix.innovation.enginewrapper.NuixEngine; +import com.nuix.innovation.enginewrapper.NuixLicenseResolver; +import com.nuix.innovation.enginewrapper.RubyScriptRunner; +import nuix.Utilities; +import org.apache.commons.io.FileUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.lang.management.RuntimeMXBean; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class RubyExamples { + protected static Logger log; + protected static File testOutputDirectory; + protected static File testDataDirectory; + protected static File rubyExamplesDirectory; + protected static boolean deleteTestOutputOnCompletion = true; + + @BeforeAll + public static void setup() throws Exception { + log = LogManager.getLogger(RubyExamples.class); + + System.out.println("JVM Arguments:"); + RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean(); + List jvmArgs = bean.getInputArguments(); + for (String arg : jvmArgs) { + System.out.println(arg); + } + + System.out.println("Environment Variables:"); + for (Map.Entry entry : System.getenv().entrySet()) { + System.out.println(String.format("%s => %s", entry.getKey(), entry.getValue())); + } + + testOutputDirectory = new File(System.getenv("TEST_OUTPUT_DIRECTORY")); + testDataDirectory = new File(System.getenv("TEST_DATA_DIRECTORY")); + rubyExamplesDirectory = new File(System.getenv("RUBY_EXAMPLES_DIRECTORY")); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + if (deleteTestOutputOnCompletion) { + try { + FileUtils.deleteDirectory(testOutputDirectory); + } catch (IOException exc) { + log.error("Error while deleting output directory: " + testOutputDirectory.getAbsolutePath(), exc); + } + } + })); + } + + @AfterAll + public static void breakdown() { + NuixEngine.closeGlobalContainer(); + } + + public NuixEngine constructNuixEngine(String... additionalRequiredFeatures) { + List features = List.of("CASE_CREATION"); + if (additionalRequiredFeatures != null && additionalRequiredFeatures.length > 0) { + features.addAll(List.of(additionalRequiredFeatures)); + } + + NuixLicenseResolver caseCreationCloud = NuixLicenseResolver.fromCloud() + .withLicenseCredentialsResolvedFromEnvVars() + .withMinWorkerCount(4) + .withRequiredFeatures(features); + + return NuixEngine.usingFirstAvailableLicense(caseCreationCloud) + .setEngineDistributionDirectoryFromEnvVar() + .setLogDirectory(new File(testOutputDirectory, "Logs_" + System.currentTimeMillis())); + } + + public void executeRubyFile(File rubyScriptFile) throws Exception { + log.info("Preparing to run: " + rubyScriptFile.getCanonicalPath()); + List outputLines = new ArrayList<>(); + try (NuixEngine nuixEngine = constructNuixEngine()) { + Utilities utilities = nuixEngine.getUtilities(); + Map globalVars = Map.of( + "$utilities", utilities, + "NUIX_VERSION", nuixEngine.getNuixVersionString() + ); + RubyScriptRunner rubyScriptRunner = new RubyScriptRunner(); + rubyScriptRunner.setStandardOutput(outputLines::add); + rubyScriptRunner.setErrorOutput(outputLines::add); + rubyScriptRunner.runFileAsync(rubyScriptFile, nuixEngine.getNuixVersionString(), globalVars); + rubyScriptRunner.join(); + log.info("Script Output:"); + log.info(String.join("", outputLines)); + } + } + + public void executeRubyExample(String exampleFileName) throws Exception { + File exampleFile = new File(rubyExamplesDirectory, exampleFileName); + executeRubyFile(exampleFile); + } + + @Test + public void TestDynamicTable01() throws Exception { + executeRubyExample("DynamicTableTest.rb"); + } +} From a3a3cc6aef24c4c155ce9c12dd533c6e723879a7 Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 14:25:11 -0700 Subject: [PATCH 02/17] rename some examples --- Examples/{DynamicTableTest.rb => DynamicTableTest01.rb} | 0 Examples/{DynamicTableTest2.rb => DynamicTableTest02.rb} | 0 Examples/{DynamicTableTest3.rb => DynamicTableTest03.rb} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename Examples/{DynamicTableTest.rb => DynamicTableTest01.rb} (100%) rename Examples/{DynamicTableTest2.rb => DynamicTableTest02.rb} (100%) rename Examples/{DynamicTableTest3.rb => DynamicTableTest03.rb} (100%) diff --git a/Examples/DynamicTableTest.rb b/Examples/DynamicTableTest01.rb similarity index 100% rename from Examples/DynamicTableTest.rb rename to Examples/DynamicTableTest01.rb diff --git a/Examples/DynamicTableTest2.rb b/Examples/DynamicTableTest02.rb similarity index 100% rename from Examples/DynamicTableTest2.rb rename to Examples/DynamicTableTest02.rb diff --git a/Examples/DynamicTableTest3.rb b/Examples/DynamicTableTest03.rb similarity index 100% rename from Examples/DynamicTableTest3.rb rename to Examples/DynamicTableTest03.rb From 2e7a69f0cfdd452d6b8b7cc96c68f367b5f7ba88 Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 14:25:40 -0700 Subject: [PATCH 03/17] run example scripts in or outside Nuix --- IntelliJ/Nx/src/test/java/RubyExamples.java | 25 ++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/IntelliJ/Nx/src/test/java/RubyExamples.java b/IntelliJ/Nx/src/test/java/RubyExamples.java index 7c4a4c2..fd142ca 100644 --- a/IntelliJ/Nx/src/test/java/RubyExamples.java +++ b/IntelliJ/Nx/src/test/java/RubyExamples.java @@ -78,14 +78,13 @@ public NuixEngine constructNuixEngine(String... additionalRequiredFeatures) { .setLogDirectory(new File(testOutputDirectory, "Logs_" + System.currentTimeMillis())); } - public void executeRubyFile(File rubyScriptFile) throws Exception { + public void executeRubyFileInNuix(File rubyScriptFile) throws Exception { log.info("Preparing to run: " + rubyScriptFile.getCanonicalPath()); List outputLines = new ArrayList<>(); try (NuixEngine nuixEngine = constructNuixEngine()) { Utilities utilities = nuixEngine.getUtilities(); Map globalVars = Map.of( - "$utilities", utilities, - "NUIX_VERSION", nuixEngine.getNuixVersionString() + "$utilities", utilities ); RubyScriptRunner rubyScriptRunner = new RubyScriptRunner(); rubyScriptRunner.setStandardOutput(outputLines::add); @@ -97,6 +96,26 @@ public void executeRubyFile(File rubyScriptFile) throws Exception { } } + public void executeRubyExampleInNuix(String exampleFileName) throws Exception { + File exampleFile = new File(rubyExamplesDirectory, exampleFileName); + executeRubyFileInNuix(exampleFile); + } + + public void executeRubyFile(File rubyScriptFile) throws Exception { + log.info("Preparing to run: " + rubyScriptFile.getCanonicalPath()); + List outputLines = new ArrayList<>(); + Map globalVars = Map.of( + "$utilities", "" + ); + RubyScriptRunner rubyScriptRunner = new RubyScriptRunner(); + rubyScriptRunner.setStandardOutput(outputLines::add); + rubyScriptRunner.setErrorOutput(outputLines::add); + rubyScriptRunner.runFileAsync(rubyScriptFile, "9000.0.0.0", globalVars); + rubyScriptRunner.join(); + log.info("Script Output:"); + log.info(String.join("", outputLines)); + } + public void executeRubyExample(String exampleFileName) throws Exception { File exampleFile = new File(rubyExamplesDirectory, exampleFileName); executeRubyFile(exampleFile); From c3206c9f7c312a97899d4b586244a7f2793aaebd Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 15:39:42 -0700 Subject: [PATCH 04/17] Create tests that are capable of running each Ruby example --- .gitignore | 3 + Examples/{Test_ButtonRow.rb => ButtonRow.rb} | 0 ...ring.rb => DynamicTableCustomFiltering.rb} | 0 ...es.rb => EnabledDependsOnCheckedStates.rb} | 4 +- ...Table.rb => HighRecordCountChoiceTable.rb} | 1 - Examples/IngestionProgressDialog.rb | 11 +- .../ProgressDialogProcessingAbortExample.rb | 6 +- Examples/ScrollableTabbedCustomDialog.rb | 4 +- Examples/SourceItemVisitor.rb | 17 - Examples/TabbedCustomDialog.rb | 4 +- Examples/Toasts.rb | 40 +- .../logging/LogEventCallbackAppender.java | 71 ++++ .../main/java/com/nuix/logging/LogHelper.java | 378 ++++++++++++++++++ .../logging/LogMessageCallbackAppender.java | 79 ++++ IntelliJ/Nx/src/test/java/RubyExamples.java | 198 +++++++-- 15 files changed, 731 insertions(+), 85 deletions(-) rename Examples/{Test_ButtonRow.rb => ButtonRow.rb} (100%) rename Examples/{Test_DynamicTableCustomFiltering.rb => DynamicTableCustomFiltering.rb} (100%) rename Examples/{Test_enabledDependensOnCheckedStates.rb => EnabledDependsOnCheckedStates.rb} (96%) rename Examples/{Test_HighRecordCountChoiceTable.rb => HighRecordCountChoiceTable.rb} (92%) delete mode 100644 Examples/SourceItemVisitor.rb create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java create mode 100644 IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java diff --git a/.gitignore b/.gitignore index 523908a..216ce8d 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ buildNumber.properties # Avoid ignoring Maven wrapper jar file (.jar files are usually ignored) !/.mvn/wrapper/maven-wrapper.jar /Java/*.jardesc + +# We do not want to version test run output +TestOutput \ No newline at end of file diff --git a/Examples/Test_ButtonRow.rb b/Examples/ButtonRow.rb similarity index 100% rename from Examples/Test_ButtonRow.rb rename to Examples/ButtonRow.rb diff --git a/Examples/Test_DynamicTableCustomFiltering.rb b/Examples/DynamicTableCustomFiltering.rb similarity index 100% rename from Examples/Test_DynamicTableCustomFiltering.rb rename to Examples/DynamicTableCustomFiltering.rb diff --git a/Examples/Test_enabledDependensOnCheckedStates.rb b/Examples/EnabledDependsOnCheckedStates.rb similarity index 96% rename from Examples/Test_enabledDependensOnCheckedStates.rb rename to Examples/EnabledDependsOnCheckedStates.rb index f9e6bd2..8e69ba7 100644 --- a/Examples/Test_enabledDependensOnCheckedStates.rb +++ b/Examples/EnabledDependsOnCheckedStates.rb @@ -6,8 +6,10 @@ # dialog in your script # ========================================================================== +case_directory ||= "FALLBACK_VALUE" + # Open a test case, change this to a case on your system -$current_case = $utilities.getCaseFactory.open('D:\cases\FakeData_8.0',{:migrate=>true}) +$current_case = $utilities.getCaseFactory.create(case_directory,{}) # Tell the library what the current case is NuixConnection.setCurrentCase($current_case) diff --git a/Examples/Test_HighRecordCountChoiceTable.rb b/Examples/HighRecordCountChoiceTable.rb similarity index 92% rename from Examples/Test_HighRecordCountChoiceTable.rb rename to Examples/HighRecordCountChoiceTable.rb index 000512c..a5b6c57 100644 --- a/Examples/Test_HighRecordCountChoiceTable.rb +++ b/Examples/HighRecordCountChoiceTable.rb @@ -8,7 +8,6 @@ # Create an instance of the tabbed dialog dialog = TabbedCustomDialog.new -dialog.enableStickySettings("D:\\temp\\TestStickSettings.json") require 'securerandom' diff --git a/Examples/IngestionProgressDialog.rb b/Examples/IngestionProgressDialog.rb index adee551..2252b2a 100644 --- a/Examples/IngestionProgressDialog.rb +++ b/Examples/IngestionProgressDialog.rb @@ -1,12 +1,13 @@ # Bootstrap the library require_relative "NxBootstrap.rb" -java_import "com.nuix.nx.dialogs.ProcessingStatusDialog" +# Following variables are expected to be set elsewhere +test_case_location ||= "FALLBACK_VALUE" +test_evidence_location ||= "FALLBACK_VALUE" -test_case_location = "D:\\cases\\FakeData_8.0" -test_evidence_location = "D:\\natives\\FakeData" +java_import "com.nuix.nx.dialogs.ProcessingStatusDialog" -$current_case = $utilities.getCaseFactory.open(test_case_location) +$current_case = $utilities.getCaseFactory.create(test_case_location,{}) processor = $current_case.createProcessor @@ -61,11 +62,11 @@ # should set them explicitly processor.setParallelProcessingSettings({ "workerCount" => 4, - "workerTemp" => "D:\\WorkerTemp", }) processing_status_dialog = ProcessingStatusDialog.new # This will begin processing and display the processing status dialog +puts "Handing off to processing status dialog..." processing_status_dialog.displayAndBeginProcessing(processor) $current_case.close \ No newline at end of file diff --git a/Examples/ProgressDialogProcessingAbortExample.rb b/Examples/ProgressDialogProcessingAbortExample.rb index 2f6c47b..b1032fd 100644 --- a/Examples/ProgressDialogProcessingAbortExample.rb +++ b/Examples/ProgressDialogProcessingAbortExample.rb @@ -14,10 +14,10 @@ require_relative "NxBootstrap.rb" # Directory of an existing Nuix case which will be opened by the script -case_directory = "C:\\@Nuix\\Cases\\Ziggy" +case_directory ||= "C:\\Cases\\Ziggy" # Source data directory or file path -source_data_path = "C:\\@NUIX\\Natives\\Fake Invoices\\10 Images" +source_data_path ||= "C:\\Natives\\Fake Invoices" # Name of the evidence container we will process data under evidence_name = "Data #{Time.now.to_i}" # Just use name based on current time @@ -72,7 +72,7 @@ pd.setAbortButtonVisible(false) # Open the case we will be working with - $current_case = $utilities.getCaseFactory.open(case_directory) + $current_case = $utilities.getCaseFactory.create(case_directory,{}) # Create our processor processor = $current_case.createProcessor diff --git a/Examples/ScrollableTabbedCustomDialog.rb b/Examples/ScrollableTabbedCustomDialog.rb index e7f6553..98b5736 100644 --- a/Examples/ScrollableTabbedCustomDialog.rb +++ b/Examples/ScrollableTabbedCustomDialog.rb @@ -6,8 +6,10 @@ # dialog in your script # ========================================================================== +case_directory ||= "FALLBACK_VALUE" + # Open a test case, change this to a case on your system -$current_case = $utilities.getCaseFactory.open('D:\Cases\FakeData_8.0') +$current_case = $utilities.getCaseFactory.create(case_directory,{}) # Tell the library what the current case is NuixConnection.setCurrentCase($current_case) diff --git a/Examples/SourceItemVisitor.rb b/Examples/SourceItemVisitor.rb deleted file mode 100644 index 433f855..0000000 --- a/Examples/SourceItemVisitor.rb +++ /dev/null @@ -1,17 +0,0 @@ -# Bootstrap the library -require_relative "NxBootstrap.rb" - -# ========================================================================== -# Example usage of SourceItemVisitor class which makes it a little easier to -# traverse source data using the SourceItem class in Nuix -# ========================================================================== - -# SourceItemVisitor is a helper class that exposes the recursive nature of SourceItem in a more iterative manner -java_import "com.nuix.nx.sourceitem.SourceItemVisitor" -visitor = SourceItemVisitor.new -visitor.onVisit do |source_item| - indent = "=" * source_item.getPath.size - puts "#{indent}> #{source_item.getKind} - #{source_item.getLocalisedName}" - next true -end -visitor.visit("C:\\@NUIX\\Natives",nil,nil) \ No newline at end of file diff --git a/Examples/TabbedCustomDialog.rb b/Examples/TabbedCustomDialog.rb index cc070cc..5e8a199 100644 --- a/Examples/TabbedCustomDialog.rb +++ b/Examples/TabbedCustomDialog.rb @@ -6,8 +6,10 @@ # dialog in your script # ========================================================================== +case_directory ||= "FALLBACK_VALUE" + # Open a test case, change this to a case on your system -$current_case = $utilities.getCaseFactory.open('D:\cases\FakeData_8.0',{:migrate=>true}) +$current_case = $utilities.getCaseFactory.create(case_directory,{}) # Tell the library what the current case is NuixConnection.setCurrentCase($current_case) diff --git a/Examples/Toasts.rb b/Examples/Toasts.rb index bbfcebe..edc1935 100644 --- a/Examples/Toasts.rb +++ b/Examples/Toasts.rb @@ -24,22 +24,24 @@ # Wait a while so the previous toast goes away sleep 10 -### -# This is a trick to get the toast to display in the bottom right corner of the Nuix Window. It causes a brief -# flicker in the UI. It creates a new tab, gets screen coordinates, then closes that new tab. -java_import "javax.swing.JPanel" -tempView = JPanel.new -window.addTab "Temp", tempView -screen_location = tempView.location_on_screen -screen_size = tempView.size -tempView.parent.parent.close_selected_tab - -bottom = screen_location.y + screen_size.height -right = screen_location.x + screen_size.width - -toast_size = Dimension.new 500, 80 -toast_location = Point.new right - toast_size.width, bottom - toast_size.height -toast_bounds = Rectangle.new toast_location, toast_size - -toast.show_toast "Example Toast\n" + - "This toast should be in the bottom right of th Workstation.", toast_bounds +if !window.nil? + ### + # This is a trick to get the toast to display in the bottom right corner of the Nuix Window. It causes a brief + # flicker in the UI. It creates a new tab, gets screen coordinates, then closes that new tab. + java_import "javax.swing.JPanel" + tempView = JPanel.new + window.addTab "Temp", tempView + screen_location = tempView.location_on_screen + screen_size = tempView.size + tempView.parent.parent.close_selected_tab + + bottom = screen_location.y + screen_size.height + right = screen_location.x + screen_size.width + + toast_size = Dimension.new 500, 80 + toast_location = Point.new right - toast_size.width, bottom - toast_size.height + toast_bounds = Rectangle.new toast_location, toast_size + + toast.show_toast "Example Toast\n" + + "This toast should be in the bottom right of th Workstation.", toast_bounds +end \ No newline at end of file diff --git a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java new file mode 100644 index 0000000..9e64905 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java @@ -0,0 +1,71 @@ +package com.nuix.logging; + +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; + +import java.util.function.Consumer; +import java.util.function.Function; + +/*** + * A custom log4j2 appender which forwards {@link LogEvent} objects to the provided consumer + */ +public class LogEventCallbackAppender extends AbstractAppender { + + private Consumer eventConsumer; + + /*** + * Creates a new instance with the given name and filter + * @param name The name to assign + * @param filter The filter to apply + */ + public LogEventCallbackAppender(String name, Filter filter) { + super(name, filter, null, false, null); + } + + /*** + * Creates a new instance with the given name and filter + * @param name The name to assign + * @param filteringFunction A function which will be used to determine what events are filtered. + */ + public LogEventCallbackAppender(String name, Function filteringFunction) { + super(name, null, null, false, null); + this.addFilter(LogHelper.getInstance().createPassFailFilter(filteringFunction)); + } + + /*** + * Creates a new instance with the given name and a filter that accepts ALL events + * @param name The name to assign + */ + public LogEventCallbackAppender(String name) { + this(name, (Filter) null); + this.addFilter(LogHelper.getInstance().createAcceptAllFilter()); + } + + /*** + * {@inheritDoc} + * @param event + */ + @Override + public void append(LogEvent event) { + if(eventConsumer != null) { + eventConsumer.accept(event); + } + } + + /*** + * Gets the Consumer that will be provided log events + * @return The Consumer that will receive log events + */ + public Consumer getEventConsumer() { + return eventConsumer; + } + + /*** + * Sets the consumer that will be provided log events + * @param eventConsumer The Consumer to receive log events + */ + public void setEventConsumer(Consumer eventConsumer) { + this.eventConsumer = eventConsumer; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java new file mode 100644 index 0000000..0832da6 --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java @@ -0,0 +1,378 @@ +package com.nuix.logging; + +import lombok.NonNull; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.core.Appender; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.LoggerContext; +import org.apache.logging.log4j.core.appender.ConsoleAppender; +import org.apache.logging.log4j.core.appender.FileAppender; +import org.apache.logging.log4j.core.config.Configuration; +import org.apache.logging.log4j.core.config.LoggerConfig; +import org.apache.logging.log4j.core.filter.AbstractFilter; +import org.apache.logging.log4j.core.layout.PatternLayout; + +import java.io.File; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.regex.Pattern; + + +/*** + * Provides various convenience methods for log4j2 related tasks, since doing some operations programmatically in log4j2 + * are not very straightforward. + */ +public class LogHelper { + private Logger logger; + + private static LogHelper instance; + public static synchronized LogHelper getInstance() { + if(instance == null) { instance = new LogHelper(); } + return instance; + } + private LogHelper(){ + logger = getLogger(); + } + + /*** + * Gets the current level of the root logger + * @return The root logger's current level + */ + public Level getRootLoggerLevel() { + LoggerContext lc = (LoggerContext) LogManager.getContext(false); + return lc.getRootLogger().getLevel(); + } + + /*** + * Sets the root logger's level, returning the level it was set to before changing it, in case you wish to later + * set it back to where it was. + * @param level The new level to assign to the root logger + * @return The root logger's level before changing it + */ + public Level setRootLoggerLevel(Level level) { + // https://stackoverflow.com/questions/23434252/programmatically-change-log-level-in-log4j2 + Level priorLevel = getRootLoggerLevel(); + LoggerContext ctx = (LoggerContext) LogManager.getContext(false); + Configuration config = ctx.getConfiguration(); + LoggerConfig loggerConfig = config.getLoggerConfig(LogManager.ROOT_LOGGER_NAME); + loggerConfig.setLevel(level); + ctx.updateLoggers(); + return priorLevel; + } + + public Level setRootLoggerLevelOff() { return setRootLoggerLevel(Level.OFF); } + public Level setRootLoggerLevelFatal() { return setRootLoggerLevel(Level.FATAL); } + public Level setRootLoggerLevelError() { return setRootLoggerLevel(Level.ERROR); } + public Level setRootLoggerLevelWarn() { return setRootLoggerLevel(Level.WARN); } + public Level setRootLoggerLevelInfo() { return setRootLoggerLevel(Level.INFO); } + public Level setRootLoggerLevelDebug() { return setRootLoggerLevel(Level.DEBUG); } + public Level setRootLoggerLevelTrace() { return setRootLoggerLevel(Level.TRACE); } + public Level setRootLoggerLevelAll() { return setRootLoggerLevel(Level.ALL); } + + /*** + * Creates a file appender which will log to the specified file. If a pattern is provided, it + * will be used as the layout + * (see docs). + * If no pattern is supplied, then a default of "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" will be used. + * If a filter is provided, it will be used to determine which log events are ultimately written to the created + * file appender (and therefore the log file this creates). If no filter is provided, a default one will be used + * which accepts all log events it is provided. + * @param logFile The absolute file path to which this appender will write events + * @param pattern The logging pattern, uses "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" if null provided. + * @param filter The filter used to determine which log events are written. Will accept all events if null is provided. + * @return The FileAppender object, which could be used to later remove/close the appender. + */ + public FileAppender initAlternateLogFile(@NonNull File logFile, String pattern, Filter filter){ + // If we are not provided a filter then we will supply a default "accept all" filter + if(filter == null){ + filter = createAcceptAllFilter(); + } + + // If we are not provided a pattern, use a default Nuix style one + if(pattern == null || pattern.isBlank()){ + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"; + } + + // Attempt to name appender after caller class + String name = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .getCallerClass().getCanonicalName(); + name += "_" + System.currentTimeMillis(); + + LoggerContext lc = (LoggerContext) LogManager.getContext(false); + FileAppender fa = FileAppender.newBuilder().setName(name).withAppend(true) + .setFilter(filter) + .withFileName(logFile.getAbsolutePath()) + .setLayout(PatternLayout.newBuilder().withPattern(pattern).build()) + .setConfiguration(lc.getConfiguration()) + .build(); + + attachLogAppender(fa); + + return fa; + } + + /*** + * Attaches a new {@link ConsoleAppender} + * @param pattern The pattern to use, a null value will default to %d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n + * @param filter The filter to use, a null value will default to filter returned by {@link #createAcceptAllFilter()}. + * @return Returns the newly created and attached console appender + */ + public ConsoleAppender attachConsoleAppender(String pattern, Filter filter) { + // If we are not provided a filter then we will supply a default "accept all" filter + if(filter == null){ + filter = createAcceptAllFilter(); + } + + // If we are not provided a pattern, use a default Nuix style one + if(pattern == null || pattern.isBlank()){ + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"; + } + + // Attempt to name appender after caller class + String name = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .getCallerClass().getCanonicalName(); + name += "_" + System.currentTimeMillis(); + + LoggerContext lc = (LoggerContext) LogManager.getContext(false); + + ConsoleAppender ca = ConsoleAppender.newBuilder() + .setName(name) + .setFilter(filter) + .setLayout(PatternLayout.newBuilder().withPattern(pattern).build()) + .setConfiguration(lc.getConfiguration()).build(); + + attachLogAppender(ca); + + return ca; + } + + /*** + * Attaches the given appender + * @param appender The appender to attach + */ + public void attachLogAppender(@NonNull Appender appender) { + LoggerContext lc = (LoggerContext) LogManager.getContext(false); + appender.start(); + lc.getConfiguration().addAppender(appender); + lc.getRootLogger().addAppender(lc.getConfiguration().getAppender(appender.getName())); + lc.updateLoggers(); + } + + /*** + * Removes the given appender + * @param appender The appender to remove + */ + public void removeAppender(@NonNull Appender appender) { + appender.stop(); + LoggerContext lc = (LoggerContext) LogManager.getContext(false); + lc.getRootLogger().removeAppender(lc.getConfiguration().getAppender(appender.getName())); + lc.updateLoggers(); + } + + /*** + * Attaches a {@link ConsoleAppender} + * @param pattern The pattern to use + * @param filteringFunction A function that will receive each log event, returning True to ACCEPT and False to DENY. + * @return The newly created console appender + */ + public ConsoleAppender attachConsoleAppender(String pattern, Function filteringFunction) { + Filter filter = createPassFailFilter(filteringFunction); + return attachConsoleAppender(pattern, filter); + } + + /*** + * Creates a file appender which will log to the specified file. If a pattern is provided, it + * will be used as the layout + * (see docs). + * If no pattern is supplied, then a default of "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" will be used. + * If a filter is provided, it will be used to determine which log events are ultimately written to the created + * file appender (and therefore the log file this creates). If no filter is provided, a default one will be used + * which accepts all log events it is provided. + * + * This differs from the method {@link #initAlternateLogFile(File, String, Filter)} in that this function accepts + * a generic Function<LogEvent,Boolean> which will be wrapped by an anonymous {@link AbstractFilter} instance. + * When the provided filtering function returns True, the wrapped filter will return an ACCEPT result. When it + * returns False, the wrapped will return a DENY result. This method exists mostly to make working with it from + * a scripting language (such as Ruby) potentially easier. Example in Ruby:
+ * + *
+     * {@code
+     * LogHelper.initAlternateLogFile(java.io.File.new("D:\\temp\\script.log"),nil) do |event|
+     * 	next (!event.nil? && event.getLoggerName.startsWith("proservTest"))
+     * end
+     * }
+     * 
+ * + * @param logFile The absolute file path to which this appender will write events + * @param pattern The logging pattern, uses "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" if null provided. + * @param filteringFunction A function that will receive each log event, returning True to ACCEPT and False to DENY. + */ + public void initAlternateLogFile(@NonNull File logFile, String pattern, Function filteringFunction){ + Filter filter = createPassFailFilter(filteringFunction); + initAlternateLogFile(logFile, pattern, filter); + } + + /*** + * Attaches to logging system and returns a {@link LogMessageCallbackAppender} whose purpose is to forward rendered + * log event strings to a {@link Consumer} which then in turn makes use of that message. + * For example, if you wish to forward log messages to the Nuix script console you might do something like: + *
{@code
+     * pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
+     * appender = LogHelper.getInstance.attachLogMessageCallbackAppender(pattern){|message| puts message}
+     * }
+ * Note that by default, no filtering is applied to log events! If you wish to control which log events get forwarded + * the you will want to instead do something like this: + *
{@code
+     * pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
+     * appender = LogHelper.getInstance.attachLogMessageCallbackAppender(pattern){|message| puts message}
+     * filter = LogHelper.getInstance.createPassFailFilter do |log_event|
+     *  return log_event.getLoggerName == "MY_SPECIAL_LOGGER"
+     * end
+     * appender.addFilter(filter)
+     * }
+ * @param pattern The pattern used to construct the {@link PatternLayout} that will be used to render {@link LogEvent} + * instances into strings. + * @param consumer The consumer which will receive log messages. + * @return The appender so you can remove it at a later time using {@link #removeAppender(Appender)}. + */ + public LogMessageCallbackAppender attachLogMessageCallbackAppender(String pattern, Consumer consumer) { + String name = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .getCallerClass().getCanonicalName(); + name += "_" + System.currentTimeMillis(); + + // If we are not provided a pattern, use a default Nuix style one + if(pattern == null || pattern.isBlank()){ + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"; + } + + PatternLayout layout = PatternLayout.newBuilder().withPattern(pattern).build(); + + LogMessageCallbackAppender appender = new LogMessageCallbackAppender(name, layout); + appender.setMessageConsumer(consumer); + attachLogAppender(appender); + return appender; + } + + /*** + * Attaches to logging system and returns a {@link LogMessageCallbackAppender} whose purpose is to forward rendered + * log event strings to a {@link Consumer} which then in turn makes use of that message. + * This will also attach a {@link Filter} which will accept any LogEvents in which the logger name matches one of the + * provided regex patterns. + * For example, if you wish to forward log messages to the Nuix script console you might do something like: + *
{@code
+     * pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
+     * regex_patterns = ["com\.nuix\.proserv.*"] # Forward events from this library
+     * appender = LogHelper.getInstance.attachLogMessageCallbackAppender(pattern){|message| puts message}
+     * }
+ * @param pattern The pattern used to construct the {@link PatternLayout} that will be used to render {@link LogEvent} + * instances into strings. + * @param regexPatterns One or more regular expressions that will be used by the filter to filter log events by their + * logger name. + * @param consumer The consumer which will receive log messages. + * @return The appender so you can remove it at a later time using {@link #removeAppender(Appender)}. + */ + public LogMessageCallbackAppender attachLogMessageCallbackAppender(String pattern, Collection regexPatterns, + Consumer consumer) { + String name = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .getCallerClass().getCanonicalName(); + name += "_" + System.currentTimeMillis(); + + // If we are not provided a pattern, use a default Nuix style one + if(pattern == null || pattern.isBlank()){ + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"; + } + PatternLayout layout = PatternLayout.newBuilder().withPattern(pattern).build(); + + final List compiledPatterns = new ArrayList<>(); + for(String regexPattern : regexPatterns) { + try { + compiledPatterns.add(Pattern.compile(regexPattern)); + } catch (Exception exc) { + logger.error("attachLogMessageCallbackAppender, invalid regex pattern: "+regexPattern); + } + } + + Function filterFunction = new Function() { + private Set knownPassingNames = new HashSet<>(); + @Override + public Boolean apply(LogEvent logEvent) { + String loggerName = logEvent.getLoggerName(); + + // Have we already previously determined that this name matches? If so + // we can skip having to run regex test. + if(knownPassingNames.contains(loggerName)) { + return true; + } else { + for(Pattern compiledPattern : compiledPatterns) { + if(compiledPattern.matcher(loggerName).matches()){ + // Store that this was a match so we don't need to regex match again + knownPassingNames.add(loggerName); + return true; + } + } + } + + return false; + } + }; + + LogMessageCallbackAppender appender = new LogMessageCallbackAppender(name, layout, createPassFailFilter(filterFunction)); + appender.setMessageConsumer(consumer); + attachLogAppender(appender); + + return appender; + } + + /*** + * Convenience method for obtaining a logger object. + * @param name The name to assign the logger + * @return A logger object + */ + public Logger getLogger(String name) { + return LogManager.getLogger(name); + } + + /*** + * Convenience method for obtaining a logger object, named after the class calling this method. Internally + * the class name is determined and then used in call to {@link #getLogger(String)}. + * @return A logger object + */ + public Logger getLogger() { + String name = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE) + .getCallerClass().getCanonicalName(); + return getLogger(name); + } + + /*** + * Convenience method for converting a Function<LogEvent,Boolean> into a {@link AbstractFilter} which + * will yield ACCEPT when the function returns True and DENY when the function returns False. + * @param filteringFunction A function which will be used to determine what events are filtered. + * @return A {@link Filter} instance + */ + public Filter createPassFailFilter(Function filteringFunction) { + return new AbstractFilter() { + @Override + public Result filter(LogEvent event) { + boolean result = filteringFunction.apply(event); + return (result == true ? Result.ACCEPT : Result.DENY); + } + }; + } + + /*** + * Creates a Filter which accepts all log events. + * @return A Filter which accepts all log events blindly + */ + public Filter createAcceptAllFilter() { + return new AbstractFilter() { + @Override + public Result filter(LogEvent event) { + return Result.ACCEPT; + } + }; + } +} diff --git a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java new file mode 100644 index 0000000..c39210b --- /dev/null +++ b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java @@ -0,0 +1,79 @@ +package com.nuix.logging; + +import lombok.NonNull; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.Layout; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.appender.AbstractAppender; + +import java.util.function.Consumer; +import java.util.function.Function; + +/*** + * A custom log4j2 appender which forwards String rendered {@link LogEvent} objects to the provided consumer, using the + * provded layout to first render the LogEvent. + */ +public class LogMessageCallbackAppender extends AbstractAppender { + private Consumer messageConsumer; + + /*** + * Creates a new instance with the given name and filter + * @param name The name to assign + * @param layout The required layout which will be used to render {@link LogEvent} instances into Strings + * @param filter The filter to apply + */ + public LogMessageCallbackAppender(String name, @NonNull Layout layout, Filter filter) { + super(name, filter, layout, false, null); + } + + /*** + * Creates a new instance with the given name and filter + * @param name The name to assign + * @param layout The required layout which will be used to render {@link LogEvent} instances into Strings + * @param filteringFunction A function which will be used to determine what events are filtered. + */ + public LogMessageCallbackAppender(String name, @NonNull Layout layout, Function filteringFunction) { + super(name, null, layout, false, null); + if(filteringFunction != null) { + Filter filter = LogHelper.getInstance().createPassFailFilter(filteringFunction); + addFilter(filter); + } + } + + /*** + * Creates a new instance with the given name and a filter that accepts ALL events + * @param name The name to assign + */ + public LogMessageCallbackAppender(String name, @NonNull Layout layout) { + this(name,layout, (Filter) null); + this.addFilter(LogHelper.getInstance().createAcceptAllFilter()); + } + + /*** + * {@inheritDoc} + * @param event + */ + @Override + public void append(LogEvent event) { + if(messageConsumer != null) { + String message = new String(getLayout().toByteArray(event)); + messageConsumer.accept(message); + } + } + + /*** + * Gets the Consumer that will be provided log event messages (based on provided layout) + * @return The Consumer that will receive log event messages + */ + public Consumer getMessageConsumer() { + return messageConsumer; + } + + /*** + * Sets the consumer that will be provided log event messages (based on provided layout) + * @param messageConsumer The Consumer to receive log event messages + */ + public void setMessageConsumer(Consumer messageConsumer) { + this.messageConsumer = messageConsumer; + } +} diff --git a/IntelliJ/Nx/src/test/java/RubyExamples.java b/IntelliJ/Nx/src/test/java/RubyExamples.java index fd142ca..d004752 100644 --- a/IntelliJ/Nx/src/test/java/RubyExamples.java +++ b/IntelliJ/Nx/src/test/java/RubyExamples.java @@ -1,6 +1,7 @@ import com.nuix.innovation.enginewrapper.NuixEngine; import com.nuix.innovation.enginewrapper.NuixLicenseResolver; import com.nuix.innovation.enginewrapper.RubyScriptRunner; +import com.nuix.logging.LogHelper; import nuix.Utilities; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; @@ -14,6 +15,7 @@ import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,17 +32,17 @@ public class RubyExamples { public static void setup() throws Exception { log = LogManager.getLogger(RubyExamples.class); - System.out.println("JVM Arguments:"); - RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean(); - List jvmArgs = bean.getInputArguments(); - for (String arg : jvmArgs) { - System.out.println(arg); - } - - System.out.println("Environment Variables:"); - for (Map.Entry entry : System.getenv().entrySet()) { - System.out.println(String.format("%s => %s", entry.getKey(), entry.getValue())); - } +// System.out.println("JVM Arguments:"); +// RuntimeMXBean bean = ManagementFactory.getRuntimeMXBean(); +// List jvmArgs = bean.getInputArguments(); +// for (String arg : jvmArgs) { +// System.out.println(arg); +// } +// +// System.out.println("Environment Variables:"); +// for (Map.Entry entry : System.getenv().entrySet()) { +// System.out.println(String.format("%s => %s", entry.getKey(), entry.getValue())); +// } testOutputDirectory = new File(System.getenv("TEST_OUTPUT_DIRECTORY")); testDataDirectory = new File(System.getenv("TEST_DATA_DIRECTORY")); @@ -55,6 +57,9 @@ public static void setup() throws Exception { } } })); + + LogHelper.getInstance().attachConsoleAppender(null, (event) -> true); + LogHelper.getInstance().setRootLoggerLevelInfo(); } @AfterAll @@ -73,56 +78,175 @@ public NuixEngine constructNuixEngine(String... additionalRequiredFeatures) { .withMinWorkerCount(4) .withRequiredFeatures(features); - return NuixEngine.usingFirstAvailableLicense(caseCreationCloud) + NuixEngine engine = NuixEngine.usingFirstAvailableLicense(caseCreationCloud) .setEngineDistributionDirectoryFromEnvVar() .setLogDirectory(new File(testOutputDirectory, "Logs_" + System.currentTimeMillis())); + engine.showConfidentialValuesInLog(true); + return engine; } - public void executeRubyFileInNuix(File rubyScriptFile) throws Exception { + public void executeRubyFileInNuix(File rubyScriptFile, Map variables) throws Exception { log.info("Preparing to run: " + rubyScriptFile.getCanonicalPath()); - List outputLines = new ArrayList<>(); try (NuixEngine nuixEngine = constructNuixEngine()) { Utilities utilities = nuixEngine.getUtilities(); - Map globalVars = Map.of( - "$utilities", utilities - ); + if (variables == null) { + variables = new HashMap<>(); + } + variables.put("$utilities", utilities); RubyScriptRunner rubyScriptRunner = new RubyScriptRunner(); - rubyScriptRunner.setStandardOutput(outputLines::add); - rubyScriptRunner.setErrorOutput(outputLines::add); - rubyScriptRunner.runFileAsync(rubyScriptFile, nuixEngine.getNuixVersionString(), globalVars); + rubyScriptRunner.setStandardOutput(log::info); + rubyScriptRunner.setErrorOutput(log::error); + rubyScriptRunner.runFileAsync(rubyScriptFile, nuixEngine.getNuixVersionString(), variables); rubyScriptRunner.join(); - log.info("Script Output:"); - log.info(String.join("", outputLines)); } } - public void executeRubyExampleInNuix(String exampleFileName) throws Exception { + public void executeRubyExampleInNuix(String exampleFileName, Map variables) throws Exception { File exampleFile = new File(rubyExamplesDirectory, exampleFileName); - executeRubyFileInNuix(exampleFile); + executeRubyFileInNuix(exampleFile, variables); } - public void executeRubyFile(File rubyScriptFile) throws Exception { + public void executeRubyFile(File rubyScriptFile, Map variables) throws Exception { log.info("Preparing to run: " + rubyScriptFile.getCanonicalPath()); - List outputLines = new ArrayList<>(); - Map globalVars = Map.of( - "$utilities", "" - ); + if (variables == null) { + variables = new HashMap<>(); + } + variables.put("$utilities", ""); RubyScriptRunner rubyScriptRunner = new RubyScriptRunner(); - rubyScriptRunner.setStandardOutput(outputLines::add); - rubyScriptRunner.setErrorOutput(outputLines::add); - rubyScriptRunner.runFileAsync(rubyScriptFile, "9000.0.0.0", globalVars); + rubyScriptRunner.setStandardOutput(log::info); + rubyScriptRunner.setErrorOutput(log::error); + rubyScriptRunner.runFileAsync(rubyScriptFile, "9000.0.0.0", variables); rubyScriptRunner.join(); - log.info("Script Output:"); - log.info(String.join("", outputLines)); } - public void executeRubyExample(String exampleFileName) throws Exception { + public void executeRubyExample(String exampleFileName, Map variables) throws Exception { File exampleFile = new File(rubyExamplesDirectory, exampleFileName); - executeRubyFile(exampleFile); + executeRubyFile(exampleFile, variables); + } + + public File generateCaseDirectory() throws IOException { + return new File(testOutputDirectory, "Case" + System.currentTimeMillis()).getCanonicalFile(); } @Test public void TestDynamicTable01() throws Exception { - executeRubyExample("DynamicTableTest.rb"); + executeRubyExample("DynamicTableTest01.rb", null); + } + + @Test + public void TestDynamicTable02() throws Exception { + executeRubyExample("DynamicTableTest02.rb", null); + } + + @Test + public void TestDynamicTable03() throws Exception { + executeRubyExample("DynamicTableTest03.rb", null); + } + + @Test + public void TestChoiceDialog() throws Exception { + executeRubyExample("ChoiceDialog.rb", null); + } + + @Test + public void TestCommonDialogs() throws Exception { + executeRubyExample("CommonDialogs.rb", null); + } + + @Test + public void TestCsvTable() throws Exception { + executeRubyExample("CsvTableTest.rb", null); + } + + @Test + public void TestMimeTypeSelectionDynamicTable() throws Exception { + executeRubyExample("MimeTypeSelectionDynamicTable.rb", null); + } + + @Test + public void TestIngestionProgressDialog() throws Exception { + File testCaseDirectory = generateCaseDirectory(); + testCaseDirectory.getParentFile().mkdirs(); + File testEvidenceDirectory = rubyExamplesDirectory.getCanonicalFile(); + Map vars = new HashMap<>(); + vars.put("test_case_location", testCaseDirectory); + vars.put("test_evidence_location", testEvidenceDirectory); + executeRubyExampleInNuix("IngestionProgressDialog.rb", vars); + } + + @Test + public void TestProgressDialog() throws Exception { + executeRubyExample("ProgressDialog.rb", null); + } + + @Test + public void TestProgressDialogBasicAbortExample() throws Exception { + executeRubyExample("ProgressDialogBasicAbortExample.rb", null); + } + + @Test + public void TestProgressDialogProcessingAbortExample() throws Exception { + File testCaseDirectory = generateCaseDirectory(); + testCaseDirectory.getParentFile().mkdirs(); + File testEvidenceDirectory = rubyExamplesDirectory.getCanonicalFile(); + Map vars = new HashMap<>(); + vars.put("case_directory", testCaseDirectory); + vars.put("source_data_path", testEvidenceDirectory); + executeRubyExampleInNuix("ProgressDialogProcessingAbortExample.rb", vars); + } + + @Test + public void TestProgressDialogWithReport() throws Exception { + executeRubyExample("ProgressDialogWithReport.rb", null); + } + + @Test + public void TestScrollableTabbedCustomDialog() throws Exception { + File testCaseDirectory = generateCaseDirectory(); + testCaseDirectory.getParentFile().mkdirs(); + File testEvidenceDirectory = rubyExamplesDirectory.getCanonicalFile(); + Map vars = new HashMap<>(); + vars.put("case_directory", testCaseDirectory); + executeRubyExampleInNuix("ScrollableTabbedCustomDialog.rb", vars); + } + + @Test + public void TestTabbedCustomDialog() throws Exception { + File testCaseDirectory = generateCaseDirectory(); + testCaseDirectory.getParentFile().mkdirs(); + File testEvidenceDirectory = rubyExamplesDirectory.getCanonicalFile(); + Map vars = new HashMap<>(); + vars.put("case_directory", testCaseDirectory); + executeRubyExampleInNuix("TabbedCustomDialog.rb", vars); + } + + @Test + public void TestButtonRow() throws Exception { + executeRubyExample("ButtonRow.rb", null); + } + + @Test + public void TestDynamicTableCustomFiltering() throws Exception { + executeRubyExample("DynamicTableCustomFiltering.rb", null); + } + + @Test + public void TestEnabledDependsOnCheckedStates() throws Exception { + File testCaseDirectory = generateCaseDirectory(); + testCaseDirectory.getParentFile().mkdirs(); + File testEvidenceDirectory = rubyExamplesDirectory.getCanonicalFile(); + Map vars = new HashMap<>(); + vars.put("case_directory", testCaseDirectory); + executeRubyExampleInNuix("EnabledDependsOnCheckedStates.rb", vars); + } + + @Test + public void TestHighRecordCountChoiceTable() throws Exception { + executeRubyExample("HighRecordCountChoiceTable.rb", null); + } + + @Test + public void TestToasts() throws Exception { + executeRubyExample("Toasts.rb", null); } } From 46f3c1ab8ebb5e94e4d4e8b4952336ef21473006 Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 15:50:58 -0700 Subject: [PATCH 05/17] remove unused --- IntelliJ/Nx/src/test/java/RubyExamples.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/IntelliJ/Nx/src/test/java/RubyExamples.java b/IntelliJ/Nx/src/test/java/RubyExamples.java index d004752..24ded13 100644 --- a/IntelliJ/Nx/src/test/java/RubyExamples.java +++ b/IntelliJ/Nx/src/test/java/RubyExamples.java @@ -12,15 +12,10 @@ import java.io.File; import java.io.IOException; -import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import static org.junit.jupiter.api.Assertions.assertTrue; - public class RubyExamples { protected static Logger log; protected static File testOutputDirectory; From 5454d1b4a8c410ddd591e4ea990259b5bfb2b485 Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 15:51:16 -0700 Subject: [PATCH 06/17] properly build jar without enginewrapper stuff to JAR dir at root --- IntelliJ/Nx/build.gradle.kts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/IntelliJ/Nx/build.gradle.kts b/IntelliJ/Nx/build.gradle.kts index 78eac1c..48c4441 100644 --- a/IntelliJ/Nx/build.gradle.kts +++ b/IntelliJ/Nx/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } group = "com.nuix.nx" -version = "1.19.0-SNAPSHOT" +version = "1.19.0" val sourceCompatibility = 11 val targetCompatibility = 11 @@ -128,17 +128,18 @@ fun configureTestEnvironment(test: Test) { } // Builds JAR without any of the Engine wrapper stuff included -tasks.create("pluginOnlyJar") { - println("Producing plug-in only JAR file") +tasks.create("nxOnlyJar") { + println("Producing NX only JAR file") from(sourceSets.main.get().output) - exclude("com.nuix.innovation.enginewrapper.*") + exclude("com/nuix/innovation/enginewrapper/**") + destinationDirectory.set(File("${projectDir}/../../JAR")) } // Copies plug-in JAR to lib directory of engine release we're running against tasks.register("copyJarsToEngine") { val name = "@nx" val jarName = "${name}.jar" - dependsOn(tasks.findByName("pluginOnlyJar")) + dependsOn(tasks.findByName("nxOnlyJar")) duplicatesStrategy = org.gradle.api.file.DuplicatesStrategy.INCLUDE @@ -156,7 +157,7 @@ tasks.register("copyJarsToEngine") { } copy { - from(tasks.findByName("pluginOnlyJar")) + from(tasks.findByName("nxOnlyJar")) into(File(engineLibDir)) rename(".*\\.jar", jarName) } From a28bb7ac45c9927365805be15904cb72048fb4f0 Mon Sep 17 00:00:00 2001 From: Jason Wells Date: Wed, 9 Aug 2023 15:54:44 -0700 Subject: [PATCH 07/17] rebuild javadoc --- .../logging/LogEventCallbackAppender.java | 2 +- .../main/java/com/nuix/logging/LogHelper.java | 4 +- .../logging/LogMessageCallbackAppender.java | 3 +- docs/allclasses-frame.html | 74 - docs/allclasses-index.html | 381 +- ...llclasses-noframe.html => allclasses.html} | 50 +- docs/allpackages-index.html | 124 +- .../logging/LogEventCallbackAppender.html | 498 + docs/com/nuix/logging/LogHelper.html | 780 ++ .../logging/LogMessageCallbackAppender.html | 511 + docs/com/nuix/logging/package-summary.html | 180 + docs/com/nuix/logging/package-tree.html | 175 + docs/com/nuix/nx/DialogTester.html | 263 - docs/com/nuix/nx/LookAndFeelHelper.html | 235 +- docs/com/nuix/nx/NuixConnection.html | 298 +- docs/com/nuix/nx/NuixVersion.html | 546 +- .../nx/callbacks/SimpleProgressCallback.html | 179 +- .../class-use/SimpleProgressCallback.html | 149 - docs/com/nuix/nx/callbacks/package-frame.html | 19 - .../nuix/nx/callbacks/package-summary.html | 106 +- docs/com/nuix/nx/callbacks/package-tree.html | 100 +- docs/com/nuix/nx/callbacks/package-use.html | 146 - docs/com/nuix/nx/class-use/DialogTester.html | 98 - .../nuix/nx/class-use/LookAndFeelHelper.html | 98 - .../com/nuix/nx/class-use/NuixConnection.html | 98 - docs/com/nuix/nx/class-use/NuixVersion.html | 212 - .../nx/collections/AddressStatistics.html | 551 - .../nuix/nx/collections/NxItemUtility.html | 565 - .../class-use/AddressStatistics.html | 163 - .../collections/class-use/NxItemUtility.html | 98 - .../nuix/nx/collections/package-frame.html | 20 - .../nuix/nx/collections/package-summary.html | 131 - .../com/nuix/nx/collections/package-tree.html | 114 - docs/com/nuix/nx/collections/package-use.html | 145 - .../BatchExporterLoadFileSettings.html | 410 +- .../controls/BatchExporterNativeSettings.html | 449 +- .../nx/controls/BatchExporterPdfSettings.html | 423 +- .../controls/BatchExporterTextSettings.html | 475 +- .../BatchExporterTraversalSettings.html | 410 +- docs/com/nuix/nx/controls/ButtonRow.html | 390 +- .../nuix/nx/controls/ChoiceTableControl.html | 471 +- docs/com/nuix/nx/controls/ComboItem.html | 263 +- docs/com/nuix/nx/controls/ComboItemBox.html | 489 +- docs/com/nuix/nx/controls/CsvTable.html | 449 +- .../DataProcessingSettingsControl.html | 592 +- .../controls/DisablingGlassPaneWrapper.html | 381 +- .../nuix/nx/controls/DynamicTableControl.html | 566 +- .../nuix/nx/controls/LocalWorkerSettings.html | 462 +- .../nx/controls/MultipleChoiceComboBox.html | 423 +- docs/com/nuix/nx/controls/OcrSettings.html | 527 +- docs/com/nuix/nx/controls/PathList.html | 462 +- .../nx/controls/PathSelectedCallback.html | 175 +- .../PathSelectionControl.ChooserType.html | 301 +- .../nx/controls/PathSelectionControl.html | 494 +- .../controls/ProcessingFinishedListener.html | 175 +- .../nx/controls/ProcessingStatusControl.html | 410 +- ...DisplayPanel.ReportDataChangeListener.html | 231 +- .../nuix/nx/controls/ReportDisplayPanel.html | 388 +- docs/com/nuix/nx/controls/StringList.html | 436 +- .../BatchExporterLoadFileSettings.html | 98 - .../BatchExporterNativeSettings.html | 98 - .../class-use/BatchExporterPdfSettings.html | 98 - .../class-use/BatchExporterTextSettings.html | 98 - .../BatchExporterTraversalSettings.html | 98 - .../nuix/nx/controls/class-use/ButtonRow.html | 181 - .../class-use/ChoiceTableControl.html | 146 - .../nuix/nx/controls/class-use/ComboItem.html | 229 - .../nx/controls/class-use/ComboItemBox.html | 221 - .../nuix/nx/controls/class-use/CsvTable.html | 98 - .../DataProcessingSettingsControl.html | 98 - .../class-use/DisablingGlassPaneWrapper.html | 98 - .../class-use/DynamicTableControl.html | 98 - .../class-use/LocalWorkerSettings.html | 98 - .../class-use/MultipleChoiceComboBox.html | 98 - .../nx/controls/class-use/OcrSettings.html | 98 - .../nuix/nx/controls/class-use/PathList.html | 98 - .../class-use/PathSelectedCallback.html | 213 - .../PathSelectionControl.ChooserType.html | 176 - .../class-use/PathSelectionControl.html | 146 - .../class-use/ProcessingFinishedListener.html | 190 - .../class-use/ProcessingStatusControl.html | 98 - ...DisplayPanel.ReportDataChangeListener.html | 98 - .../class-use/ReportDisplayPanel.html | 98 - .../nx/controls/class-use/StringList.html | 98 - .../filters/DynamicTableAllRecordsFilter.html | 273 +- .../DynamicTableCheckedRecordsFilter.html | 273 +- .../filters/DynamicTableContainsFilter.html | 273 +- .../filters/DynamicTableFilterProvider.html | 290 +- .../filters/DynamicTableRegexFilter.html | 295 +- .../DynamicTableUncheckedRecordsFilter.html | 273 +- .../DynamicTableAllRecordsFilter.html | 98 - .../DynamicTableCheckedRecordsFilter.html | 98 - .../class-use/DynamicTableContainsFilter.html | 98 - .../class-use/DynamicTableFilterProvider.html | 220 - .../class-use/DynamicTableRegexFilter.html | 98 - .../DynamicTableUncheckedRecordsFilter.html | 98 - .../nx/controls/filters/package-summary.html | 106 +- .../nx/controls/filters/package-tree.html | 100 +- .../nuix/nx/controls/filters/package-use.html | 170 - .../controls/models/ArrangeableListModel.html | 370 +- docs/com/nuix/nx/controls/models/Choice.html | 410 +- .../nx/controls/models/ChoiceTableModel.html | 784 +- .../ChoiceTableModelChangeListener.html | 186 +- .../models/ControlDeserializationHandler.html | 179 +- .../models/ControlSerializationHandler.html | 175 +- .../nx/controls/models/CsvTableModel.html | 400 +- .../models/DoubleBoundedRangeModel.html | 372 +- .../nx/controls/models/DynamicTableModel.html | 788 +- .../models/DynamicTableValueCallback.html | 187 +- .../models/ItemStatisticsTableModel.html | 349 +- .../nx/controls/models/ReportDataModel.html | 396 +- .../controls/models/StringListTableModel.html | 463 +- .../class-use/ArrangeableListModel.html | 98 - .../nx/controls/models/class-use/Choice.html | 342 - .../models/class-use/ChoiceTableModel.html | 214 - .../ChoiceTableModelChangeListener.html | 181 - .../ControlDeserializationHandler.html | 179 - .../ControlSerializationHandler.html | 179 - .../models/class-use/CsvTableModel.html | 98 - .../class-use/DoubleBoundedRangeModel.html | 98 - .../models/class-use/DynamicTableModel.html | 172 - .../class-use/DynamicTableValueCallback.html | 236 - .../class-use/ItemStatisticsTableModel.html | 98 - .../models/class-use/ReportDataModel.html | 199 - .../class-use/StringListTableModel.html | 98 - .../nx/controls/models/package-frame.html | 32 - .../nx/controls/models/package-summary.html | 112 +- .../nuix/nx/controls/models/package-tree.html | 102 +- .../nuix/nx/controls/models/package-use.html | 272 - docs/com/nuix/nx/controls/package-frame.html | 47 - .../com/nuix/nx/controls/package-summary.html | 118 +- docs/com/nuix/nx/controls/package-tree.html | 106 +- docs/com/nuix/nx/controls/package-use.html | 231 - docs/com/nuix/nx/dialogs/ChoiceDialog.html | 592 +- docs/com/nuix/nx/dialogs/CommonDialogs.html | 770 +- docs/com/nuix/nx/dialogs/CustomTabPanel.html | 2631 ++-- .../nx/dialogs/ProcessingStatusDialog.html | 456 +- docs/com/nuix/nx/dialogs/ProgressDialog.html | 782 +- .../dialogs/ProgressDialogBlockInterface.html | 175 +- .../ProgressDialogLoggingCallback.html | 175 +- .../nx/dialogs/ScrollableCustomTabPanel.html | 397 +- .../nuix/nx/dialogs/TabbedCustomDialog.html | 1084 +- docs/com/nuix/nx/dialogs/Toast.html | 426 + .../nuix/nx/dialogs/ValidationCallback.html | 175 +- .../nx/dialogs/class-use/ChoiceDialog.html | 98 - .../nx/dialogs/class-use/CommonDialogs.html | 98 - .../nx/dialogs/class-use/CustomTabPanel.html | 758 -- .../class-use/ProcessingStatusDialog.html | 98 - .../nx/dialogs/class-use/ProgressDialog.html | 146 - .../ProgressDialogBlockInterface.html | 148 - .../ProgressDialogLoggingCallback.html | 149 - .../class-use/ScrollableCustomTabPanel.html | 147 - .../dialogs/class-use/TabbedCustomDialog.html | 150 - .../dialogs/class-use/ValidationCallback.html | 148 - docs/com/nuix/nx/dialogs/package-frame.html | 31 - docs/com/nuix/nx/dialogs/package-summary.html | 118 +- docs/com/nuix/nx/dialogs/package-tree.html | 103 +- docs/com/nuix/nx/dialogs/package-use.html | 207 - docs/com/nuix/nx/digest/DigestHelper.html | 525 +- .../nx/digest/class-use/DigestHelper.html | 155 - docs/com/nuix/nx/digest/package-frame.html | 19 - docs/com/nuix/nx/digest/package-summary.html | 106 +- docs/com/nuix/nx/digest/package-tree.html | 100 +- docs/com/nuix/nx/digest/package-use.html | 145 - .../nuix/nx/export/CombinedPdfExporter.html | 339 +- .../export/class-use/CombinedPdfExporter.html | 98 - docs/com/nuix/nx/export/package-frame.html | 19 - docs/com/nuix/nx/export/package-summary.html | 106 +- docs/com/nuix/nx/export/package-tree.html | 100 +- docs/com/nuix/nx/export/package-use.html | 98 - .../filters/DynamicTableAllRecordsFilter.html | 370 + .../DynamicTableCheckedRecordsFilter.html | 370 + .../filters/DynamicTableContainsFilter.html | 370 + .../filters/DynamicTableFilterProvider.html | 397 + .../nx/filters/DynamicTableRegexFilter.html | 417 + .../DynamicTableUncheckedRecordsFilter.html | 370 + docs/com/nuix/nx/filters/package-summary.html | 184 + docs/com/nuix/nx/filters/package-tree.html | 170 + docs/com/nuix/nx/helpers/FormatHelpers.html | 272 +- .../nx/helpers/MetadataProfileHelper.html | 239 +- .../nx/helpers/class-use/FormatHelpers.html | 98 - .../class-use/MetadataProfileHelper.html | 98 - docs/com/nuix/nx/helpers/package-frame.html | 20 - docs/com/nuix/nx/helpers/package-summary.html | 106 +- docs/com/nuix/nx/helpers/package-tree.html | 100 +- docs/com/nuix/nx/helpers/package-use.html | 98 - .../com/nuix/nx/misc/PlaceholderResolver.html | 332 +- .../misc/class-use/PlaceholderResolver.html | 98 - docs/com/nuix/nx/misc/package-frame.html | 19 - docs/com/nuix/nx/misc/package-summary.html | 106 +- docs/com/nuix/nx/misc/package-tree.html | 100 +- docs/com/nuix/nx/misc/package-use.html | 98 - .../nuix/nx/models/ArrangeableListModel.html | 451 + docs/com/nuix/nx/models/Choice.html | 571 + docs/com/nuix/nx/models/ChoiceTableModel.html | 948 ++ .../ChoiceTableModelChangeListener.html | 263 + .../models/ControlDeserializationHandler.html | 251 + .../models/ControlSerializationHandler.html | 249 + docs/com/nuix/nx/models/CsvTableModel.html | 494 + .../nx/models/DoubleBoundedRangeModel.html | 447 + .../com/nuix/nx/models/DynamicTableModel.html | 1094 ++ .../nx/models/DynamicTableValueCallback.html | 256 + .../nx/models/ItemStatisticsTableModel.html | 440 + docs/com/nuix/nx/models/ReportDataModel.html | 600 + .../nuix/nx/models/StringListTableModel.html | 569 + docs/com/nuix/nx/models/package-summary.html | 247 + docs/com/nuix/nx/models/package-tree.html | 190 + docs/com/nuix/nx/package-frame.html | 21 - docs/com/nuix/nx/package-summary.html | 114 +- docs/com/nuix/nx/package-tree.html | 101 +- docs/com/nuix/nx/package-use.html | 145 - .../sourceitem/SourceItemVisitCallback.html | 175 +- .../nuix/nx/sourceitem/SourceItemVisitor.html | 300 +- .../class-use/SourceItemVisitCallback.html | 148 - .../class-use/SourceItemVisitor.html | 98 - .../com/nuix/nx/sourceitem/package-frame.html | 23 - .../nuix/nx/sourceitem/package-summary.html | 112 +- docs/com/nuix/nx/sourceitem/package-tree.html | 102 +- docs/com/nuix/nx/sourceitem/package-use.html | 145 - docs/constant-values.html | 129 +- docs/copy.svg | 33 - docs/deprecated-list.html | 98 +- docs/element-list | 4 +- docs/help-doc.html | 154 +- docs/index-all.html | 3390 +++++ docs/index-files/index-1.html | 463 - docs/index-files/index-10.html | 122 - docs/index-files/index-11.html | 172 - docs/index-files/index-12.html | 125 - docs/index-files/index-13.html | 144 - docs/index-files/index-14.html | 150 - docs/index-files/index-15.html | 175 - docs/index-files/index-16.html | 187 - docs/index-files/index-17.html | 625 - docs/index-files/index-18.html | 151 - docs/index-files/index-19.html | 120 - docs/index-files/index-2.html | 153 - docs/index-files/index-20.html | 138 - docs/index-files/index-21.html | 132 - docs/index-files/index-3.html | 299 - docs/index-files/index-4.html | 199 - docs/index-files/index-5.html | 152 - docs/index-files/index-6.html | 218 - docs/index-files/index-7.html | 631 - docs/index-files/index-8.html | 134 - docs/index-files/index-9.html | 192 - docs/index.html | 125 +- docs/jquery-ui.overrides.css | 3 +- .../external/jquery/jquery.js | 1240 +- docs/jquery/jquery-3.6.1.min.js | 2 + docs/jquery/jquery-ui.min.css | 6 + docs/jquery/jquery-ui.min.js | 6 + .../jszip-utils/dist/jszip-utils-ie.js | 0 .../jszip-utils/dist/jszip-utils-ie.min.js | 0 .../jszip-utils/dist/jszip-utils.js | 0 .../jszip-utils/dist/jszip-utils.min.js | 0 .../jszip/dist/jszip.js | 533 +- docs/jquery/jszip/dist/jszip.min.js | 13 + docs/legal/jquery.md | 8 +- docs/legal/jszip.md | 653 + docs/legal/pako.md | 45 + docs/member-search-index.js | 2 +- docs/member-search-index.zip | Bin 8348 -> 9584 bytes docs/module-search-index.js | 1 - docs/overview-frame.html | 30 - docs/overview-summary.html | 10 +- docs/overview-tree.html | 148 +- docs/package-list | 11 - docs/package-search-index.js | 2 +- docs/package-search-index.zip | Bin 302 -> 307 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 335 -> 0 bytes .../images/ui-bg_glass_65_dadada_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 262 -> 0 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 332 -> 0 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 280 -> 0 bytes .../images/ui-icons_222222_256x240.png | Bin 6922 -> 0 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 4549 -> 0 bytes .../images/ui-icons_454545_256x240.png | Bin 6992 -> 0 bytes .../images/ui-icons_888888_256x240.png | Bin 6999 -> 0 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 4549 -> 0 bytes docs/script-dir/jquery-3.4.1.js | 10598 ---------------- docs/script-dir/jquery-3.5.1.min.js | 2 - docs/script-dir/jquery-ui.css | 582 - docs/script-dir/jquery-ui.js | 2659 ---- docs/script-dir/jquery-ui.min.css | 7 - docs/script-dir/jquery-ui.min.js | 6 - docs/script-dir/jquery-ui.structure.css | 156 - docs/script-dir/jquery-ui.structure.min.css | 5 - docs/script-dir/jszip/dist/jszip.min.js | 15 - docs/script.js | 40 +- docs/search.js | 270 +- docs/serialized-form.html | 1203 +- docs/stylesheet.css | 420 +- docs/system-properties.html | 106 - docs/tag-search-index.js | 1 - docs/type-search-index.js | 2 +- docs/type-search-index.zip | Bin 942 -> 1016 bytes 298 files changed, 38294 insertions(+), 45534 deletions(-) delete mode 100644 docs/allclasses-frame.html rename docs/{allclasses-noframe.html => allclasses.html} (59%) create mode 100644 docs/com/nuix/logging/LogEventCallbackAppender.html create mode 100644 docs/com/nuix/logging/LogHelper.html create mode 100644 docs/com/nuix/logging/LogMessageCallbackAppender.html create mode 100644 docs/com/nuix/logging/package-summary.html create mode 100644 docs/com/nuix/logging/package-tree.html delete mode 100644 docs/com/nuix/nx/DialogTester.html delete mode 100644 docs/com/nuix/nx/callbacks/class-use/SimpleProgressCallback.html delete mode 100644 docs/com/nuix/nx/callbacks/package-frame.html delete mode 100644 docs/com/nuix/nx/callbacks/package-use.html delete mode 100644 docs/com/nuix/nx/class-use/DialogTester.html delete mode 100644 docs/com/nuix/nx/class-use/LookAndFeelHelper.html delete mode 100644 docs/com/nuix/nx/class-use/NuixConnection.html delete mode 100644 docs/com/nuix/nx/class-use/NuixVersion.html delete mode 100644 docs/com/nuix/nx/collections/AddressStatistics.html delete mode 100644 docs/com/nuix/nx/collections/NxItemUtility.html delete mode 100644 docs/com/nuix/nx/collections/class-use/AddressStatistics.html delete mode 100644 docs/com/nuix/nx/collections/class-use/NxItemUtility.html delete mode 100644 docs/com/nuix/nx/collections/package-frame.html delete mode 100644 docs/com/nuix/nx/collections/package-summary.html delete mode 100644 docs/com/nuix/nx/collections/package-tree.html delete mode 100644 docs/com/nuix/nx/collections/package-use.html delete mode 100644 docs/com/nuix/nx/controls/class-use/BatchExporterLoadFileSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/BatchExporterNativeSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/BatchExporterPdfSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/BatchExporterTextSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/BatchExporterTraversalSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ButtonRow.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ChoiceTableControl.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ComboItem.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ComboItemBox.html delete mode 100644 docs/com/nuix/nx/controls/class-use/CsvTable.html delete mode 100644 docs/com/nuix/nx/controls/class-use/DataProcessingSettingsControl.html delete mode 100644 docs/com/nuix/nx/controls/class-use/DisablingGlassPaneWrapper.html delete mode 100644 docs/com/nuix/nx/controls/class-use/DynamicTableControl.html delete mode 100644 docs/com/nuix/nx/controls/class-use/LocalWorkerSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/MultipleChoiceComboBox.html delete mode 100644 docs/com/nuix/nx/controls/class-use/OcrSettings.html delete mode 100644 docs/com/nuix/nx/controls/class-use/PathList.html delete mode 100644 docs/com/nuix/nx/controls/class-use/PathSelectedCallback.html delete mode 100644 docs/com/nuix/nx/controls/class-use/PathSelectionControl.ChooserType.html delete mode 100644 docs/com/nuix/nx/controls/class-use/PathSelectionControl.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ProcessingFinishedListener.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ProcessingStatusControl.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.ReportDataChangeListener.html delete mode 100644 docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.html delete mode 100644 docs/com/nuix/nx/controls/class-use/StringList.html delete mode 100644 docs/com/nuix/nx/controls/filters/class-use/DynamicTableAllRecordsFilter.html delete mode 100644 docs/com/nuix/nx/controls/filters/class-use/DynamicTableCheckedRecordsFilter.html delete mode 100644 docs/com/nuix/nx/controls/filters/class-use/DynamicTableContainsFilter.html delete mode 100644 docs/com/nuix/nx/controls/filters/class-use/DynamicTableFilterProvider.html delete mode 100644 docs/com/nuix/nx/controls/filters/class-use/DynamicTableRegexFilter.html delete mode 100644 docs/com/nuix/nx/controls/filters/class-use/DynamicTableUncheckedRecordsFilter.html delete mode 100644 docs/com/nuix/nx/controls/filters/package-use.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ArrangeableListModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/Choice.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ChoiceTableModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ChoiceTableModelChangeListener.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ControlDeserializationHandler.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ControlSerializationHandler.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/CsvTableModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/DoubleBoundedRangeModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/DynamicTableModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/DynamicTableValueCallback.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ItemStatisticsTableModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/ReportDataModel.html delete mode 100644 docs/com/nuix/nx/controls/models/class-use/StringListTableModel.html delete mode 100644 docs/com/nuix/nx/controls/models/package-frame.html delete mode 100644 docs/com/nuix/nx/controls/models/package-use.html delete mode 100644 docs/com/nuix/nx/controls/package-frame.html delete mode 100644 docs/com/nuix/nx/controls/package-use.html create mode 100644 docs/com/nuix/nx/dialogs/Toast.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ChoiceDialog.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/CommonDialogs.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/CustomTabPanel.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ProcessingStatusDialog.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ProgressDialog.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ProgressDialogBlockInterface.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ProgressDialogLoggingCallback.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ScrollableCustomTabPanel.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/TabbedCustomDialog.html delete mode 100644 docs/com/nuix/nx/dialogs/class-use/ValidationCallback.html delete mode 100644 docs/com/nuix/nx/dialogs/package-frame.html delete mode 100644 docs/com/nuix/nx/dialogs/package-use.html delete mode 100644 docs/com/nuix/nx/digest/class-use/DigestHelper.html delete mode 100644 docs/com/nuix/nx/digest/package-frame.html delete mode 100644 docs/com/nuix/nx/digest/package-use.html delete mode 100644 docs/com/nuix/nx/export/class-use/CombinedPdfExporter.html delete mode 100644 docs/com/nuix/nx/export/package-frame.html delete mode 100644 docs/com/nuix/nx/export/package-use.html create mode 100644 docs/com/nuix/nx/filters/DynamicTableAllRecordsFilter.html create mode 100644 docs/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.html create mode 100644 docs/com/nuix/nx/filters/DynamicTableContainsFilter.html create mode 100644 docs/com/nuix/nx/filters/DynamicTableFilterProvider.html create mode 100644 docs/com/nuix/nx/filters/DynamicTableRegexFilter.html create mode 100644 docs/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.html create mode 100644 docs/com/nuix/nx/filters/package-summary.html create mode 100644 docs/com/nuix/nx/filters/package-tree.html delete mode 100644 docs/com/nuix/nx/helpers/class-use/FormatHelpers.html delete mode 100644 docs/com/nuix/nx/helpers/class-use/MetadataProfileHelper.html delete mode 100644 docs/com/nuix/nx/helpers/package-frame.html delete mode 100644 docs/com/nuix/nx/helpers/package-use.html delete mode 100644 docs/com/nuix/nx/misc/class-use/PlaceholderResolver.html delete mode 100644 docs/com/nuix/nx/misc/package-frame.html delete mode 100644 docs/com/nuix/nx/misc/package-use.html create mode 100644 docs/com/nuix/nx/models/ArrangeableListModel.html create mode 100644 docs/com/nuix/nx/models/Choice.html create mode 100644 docs/com/nuix/nx/models/ChoiceTableModel.html create mode 100644 docs/com/nuix/nx/models/ChoiceTableModelChangeListener.html create mode 100644 docs/com/nuix/nx/models/ControlDeserializationHandler.html create mode 100644 docs/com/nuix/nx/models/ControlSerializationHandler.html create mode 100644 docs/com/nuix/nx/models/CsvTableModel.html create mode 100644 docs/com/nuix/nx/models/DoubleBoundedRangeModel.html create mode 100644 docs/com/nuix/nx/models/DynamicTableModel.html create mode 100644 docs/com/nuix/nx/models/DynamicTableValueCallback.html create mode 100644 docs/com/nuix/nx/models/ItemStatisticsTableModel.html create mode 100644 docs/com/nuix/nx/models/ReportDataModel.html create mode 100644 docs/com/nuix/nx/models/StringListTableModel.html create mode 100644 docs/com/nuix/nx/models/package-summary.html create mode 100644 docs/com/nuix/nx/models/package-tree.html delete mode 100644 docs/com/nuix/nx/package-frame.html delete mode 100644 docs/com/nuix/nx/package-use.html delete mode 100644 docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitCallback.html delete mode 100644 docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitor.html delete mode 100644 docs/com/nuix/nx/sourceitem/package-frame.html delete mode 100644 docs/com/nuix/nx/sourceitem/package-use.html delete mode 100644 docs/copy.svg create mode 100644 docs/index-all.html delete mode 100644 docs/index-files/index-1.html delete mode 100644 docs/index-files/index-10.html delete mode 100644 docs/index-files/index-11.html delete mode 100644 docs/index-files/index-12.html delete mode 100644 docs/index-files/index-13.html delete mode 100644 docs/index-files/index-14.html delete mode 100644 docs/index-files/index-15.html delete mode 100644 docs/index-files/index-16.html delete mode 100644 docs/index-files/index-17.html delete mode 100644 docs/index-files/index-18.html delete mode 100644 docs/index-files/index-19.html delete mode 100644 docs/index-files/index-2.html delete mode 100644 docs/index-files/index-20.html delete mode 100644 docs/index-files/index-21.html delete mode 100644 docs/index-files/index-3.html delete mode 100644 docs/index-files/index-4.html delete mode 100644 docs/index-files/index-5.html delete mode 100644 docs/index-files/index-6.html delete mode 100644 docs/index-files/index-7.html delete mode 100644 docs/index-files/index-8.html delete mode 100644 docs/index-files/index-9.html rename docs/{script-dir => jquery}/external/jquery/jquery.js (91%) create mode 100644 docs/jquery/jquery-3.6.1.min.js create mode 100644 docs/jquery/jquery-ui.min.css create mode 100644 docs/jquery/jquery-ui.min.js rename docs/{script-dir => jquery}/jszip-utils/dist/jszip-utils-ie.js (100%) rename docs/{script-dir => jquery}/jszip-utils/dist/jszip-utils-ie.min.js (100%) rename docs/{script-dir => jquery}/jszip-utils/dist/jszip-utils.js (100%) rename docs/{script-dir => jquery}/jszip-utils/dist/jszip-utils.min.js (100%) rename docs/{script-dir => jquery}/jszip/dist/jszip.js (95%) create mode 100644 docs/jquery/jszip/dist/jszip.min.js create mode 100644 docs/legal/jszip.md create mode 100644 docs/legal/pako.md delete mode 100644 docs/module-search-index.js delete mode 100644 docs/overview-frame.html delete mode 100644 docs/package-list delete mode 100644 docs/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png delete mode 100644 docs/script-dir/images/ui-bg_glass_65_dadada_1x400.png delete mode 100644 docs/script-dir/images/ui-bg_glass_75_dadada_1x400.png delete mode 100644 docs/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png delete mode 100644 docs/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png delete mode 100644 docs/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png delete mode 100644 docs/script-dir/images/ui-icons_222222_256x240.png delete mode 100644 docs/script-dir/images/ui-icons_2e83ff_256x240.png delete mode 100644 docs/script-dir/images/ui-icons_454545_256x240.png delete mode 100644 docs/script-dir/images/ui-icons_888888_256x240.png delete mode 100644 docs/script-dir/images/ui-icons_cd0a0a_256x240.png delete mode 100644 docs/script-dir/jquery-3.4.1.js delete mode 100644 docs/script-dir/jquery-3.5.1.min.js delete mode 100644 docs/script-dir/jquery-ui.css delete mode 100644 docs/script-dir/jquery-ui.js delete mode 100644 docs/script-dir/jquery-ui.min.css delete mode 100644 docs/script-dir/jquery-ui.min.js delete mode 100644 docs/script-dir/jquery-ui.structure.css delete mode 100644 docs/script-dir/jquery-ui.structure.min.css delete mode 100644 docs/script-dir/jszip/dist/jszip.min.js delete mode 100644 docs/system-properties.html delete mode 100644 docs/tag-search-index.js diff --git a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java index 9e64905..2bf44fd 100644 --- a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java +++ b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogEventCallbackAppender.java @@ -44,7 +44,7 @@ public LogEventCallbackAppender(String name) { /*** * {@inheritDoc} - * @param event + * @param event {@inheritDoc} */ @Override public void append(LogEvent event) { diff --git a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java index 0832da6..2e1ee01 100644 --- a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java +++ b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogHelper.java @@ -218,7 +218,7 @@ public void initAlternateLogFile(@NonNull File logFile, String pattern, Function /*** * Attaches to logging system and returns a {@link LogMessageCallbackAppender} whose purpose is to forward rendered - * log event strings to a {@link Consumer} which then in turn makes use of that message. + * log event strings to a {@link Consumer} which then in turn makes use of that message. * For example, if you wish to forward log messages to the Nuix script console you might do something like: *
{@code
      * pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
@@ -259,7 +259,7 @@ public LogMessageCallbackAppender attachLogMessageCallbackAppender(String patter
 
     /***
      * Attaches to logging system and returns a {@link LogMessageCallbackAppender} whose purpose is to forward rendered
-     * log event strings to a {@link Consumer} which then in turn makes use of that message.
+     * log event strings to a {@link Consumer} which then in turn makes use of that message.
      * This will also attach a {@link Filter} which will accept any LogEvents in which the logger name matches one of the
      * provided regex patterns.
      * For example, if you wish to forward log messages to the Nuix script console you might do something like:
diff --git a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java
index c39210b..bf00822 100644
--- a/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java
+++ b/IntelliJ/Nx/src/main/java/com/nuix/logging/LogMessageCallbackAppender.java
@@ -43,6 +43,7 @@ public LogMessageCallbackAppender(String name, @NonNull Layout layout, Function<
     /***
      * Creates a new instance with the given name and a filter that accepts ALL events
      * @param name The name to assign
+     * @param layout The layout to use
      */
     public LogMessageCallbackAppender(String name, @NonNull Layout layout) {
         this(name,layout, (Filter) null);
@@ -51,7 +52,7 @@ public LogMessageCallbackAppender(String name, @NonNull Layout layout) {
 
     /***
      * {@inheritDoc}
-     * @param event
+     * @param event {@inheritDoc}
      */
     @Override
     public void append(LogEvent event) {
diff --git a/docs/allclasses-frame.html b/docs/allclasses-frame.html
deleted file mode 100644
index d0a975f..0000000
--- a/docs/allclasses-frame.html
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-All Classes
-
-
-
-
-

All Classes

- - - diff --git a/docs/allclasses-index.html b/docs/allclasses-index.html index 8d6c28d..07e886d 100644 --- a/docs/allclasses-index.html +++ b/docs/allclasses-index.html @@ -3,36 +3,45 @@ -All Classes +All Classes (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
-
- diff --git a/docs/allclasses-noframe.html b/docs/allclasses.html similarity index 59% rename from docs/allclasses-noframe.html rename to docs/allclasses.html index 6dcfc46..041914a 100644 --- a/docs/allclasses-noframe.html +++ b/docs/allclasses.html @@ -1,18 +1,29 @@ - + -All Classes +All Classes (Nx 1.19.0 API) + + + + + + + + +

All Classes

+
diff --git a/docs/allpackages-index.html b/docs/allpackages-index.html index 2706e33..8079b31 100644 --- a/docs/allpackages-index.html +++ b/docs/allpackages-index.html @@ -3,30 +3,39 @@ -All Packages +All Packages (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
-
- diff --git a/docs/com/nuix/logging/LogEventCallbackAppender.html b/docs/com/nuix/logging/LogEventCallbackAppender.html new file mode 100644 index 0000000..a33a70c --- /dev/null +++ b/docs/com/nuix/logging/LogEventCallbackAppender.html @@ -0,0 +1,498 @@ + + + + + +LogEventCallbackAppender (Nx 1.19.0 API) + + + + + + + + + + + + + + +
+ +
+ +
+
+ +

Class LogEventCallbackAppender

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • org.apache.logging.log4j.core.AbstractLifeCycle
    • +
    • +
        +
      • org.apache.logging.log4j.core.filter.AbstractFilterable
      • +
      • +
          +
        • org.apache.logging.log4j.core.appender.AbstractAppender
        • +
        • +
            +
          • com.nuix.logging.LogEventCallbackAppender
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    org.apache.logging.log4j.core.Appender, org.apache.logging.log4j.core.filter.Filterable, org.apache.logging.log4j.core.impl.LocationAware, org.apache.logging.log4j.core.LifeCycle, org.apache.logging.log4j.core.LifeCycle2
    +
    +
    +
    public class LogEventCallbackAppender
    +extends org.apache.logging.log4j.core.appender.AbstractAppender
    +
    A custom log4j2 appender which forwards LogEvent objects to the provided consumer
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class org.apache.logging.log4j.core.appender.AbstractAppender

        +org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from interface org.apache.logging.log4j.core.LifeCycle

        +org.apache.logging.log4j.core.LifeCycle.State
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      +
        +
      • + + +

        Fields inherited from class org.apache.logging.log4j.core.AbstractLifeCycle

        +DEFAULT_STOP_TIMEOUT, DEFAULT_STOP_TIMEUNIT, LOGGER
      • +
      +
        +
      • + + +

        Fields inherited from interface org.apache.logging.log4j.core.Appender

        +ELEMENT_TYPE
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      LogEventCallbackAppender​(java.lang.String name) +
      Creates a new instance with the given name and a filter that accepts ALL events
      +
      LogEventCallbackAppender​(java.lang.String name, + java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction) +
      Creates a new instance with the given name and filter
      +
      LogEventCallbackAppender​(java.lang.String name, + org.apache.logging.log4j.core.Filter filter) +
      Creates a new instance with the given name and filter
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidappend​(org.apache.logging.log4j.core.LogEvent event)
      java.util.function.Consumer<org.apache.logging.log4j.core.LogEvent>getEventConsumer() +
      Gets the Consumer that will be provided log events
      +
      voidsetEventConsumer​(java.util.function.Consumer<org.apache.logging.log4j.core.LogEvent> eventConsumer) +
      Sets the consumer that will be provided log events
      +
      +
        +
      • + + +

        Methods inherited from class org.apache.logging.log4j.core.appender.AbstractAppender

        +error, error, error, getHandler, getLayout, getName, ignoreExceptions, parseInt, requiresLocation, setHandler, toSerializable, toString
      • +
      +
        +
      • + + +

        Methods inherited from class org.apache.logging.log4j.core.filter.AbstractFilterable

        +addFilter, getFilter, getPropertyArray, hasFilter, isFiltered, removeFilter, start, stop, stop
      • +
      +
        +
      • + + +

        Methods inherited from class org.apache.logging.log4j.core.AbstractLifeCycle

        +equalsImpl, getState, getStatusLogger, hashCodeImpl, initialize, isInitialized, isStarted, isStarting, isStopped, isStopping, setStarted, setStarting, setState, setStopped, setStopping, stop, stop
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface org.apache.logging.log4j.core.LifeCycle

        +getState, initialize, isStarted, isStopped, start, stop
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        LogEventCallbackAppender

        +
        public LogEventCallbackAppender​(java.lang.String name,
        +                                org.apache.logging.log4j.core.Filter filter)
        +
        Creates a new instance with the given name and filter
        +
        +
        Parameters:
        +
        name - The name to assign
        +
        filter - The filter to apply
        +
        +
      • +
      + + + +
        +
      • +

        LogEventCallbackAppender

        +
        public LogEventCallbackAppender​(java.lang.String name,
        +                                java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction)
        +
        Creates a new instance with the given name and filter
        +
        +
        Parameters:
        +
        name - The name to assign
        +
        filteringFunction - A function which will be used to determine what events are filtered.
        +
        +
      • +
      + + + +
        +
      • +

        LogEventCallbackAppender

        +
        public LogEventCallbackAppender​(java.lang.String name)
        +
        Creates a new instance with the given name and a filter that accepts ALL events
        +
        +
        Parameters:
        +
        name - The name to assign
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        append

        +
        public void append​(org.apache.logging.log4j.core.LogEvent event)
        +
        +
        Parameters:
        +
        event -
        +
        +
      • +
      + + + +
        +
      • +

        getEventConsumer

        +
        public java.util.function.Consumer<org.apache.logging.log4j.core.LogEvent> getEventConsumer()
        +
        Gets the Consumer that will be provided log events
        +
        +
        Returns:
        +
        The Consumer that will receive log events
        +
        +
      • +
      + + + +
        +
      • +

        setEventConsumer

        +
        public void setEventConsumer​(java.util.function.Consumer<org.apache.logging.log4j.core.LogEvent> eventConsumer)
        +
        Sets the consumer that will be provided log events
        +
        +
        Parameters:
        +
        eventConsumer - The Consumer to receive log events
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + + diff --git a/docs/com/nuix/logging/LogHelper.html b/docs/com/nuix/logging/LogHelper.html new file mode 100644 index 0000000..ed3265b --- /dev/null +++ b/docs/com/nuix/logging/LogHelper.html @@ -0,0 +1,780 @@ + + + + + +LogHelper (Nx 1.19.0 API) + + + + + + + + + + + + + + +
+ +
+ +
+
+ +

Class LogHelper

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • com.nuix.logging.LogHelper
    • +
    +
  • +
+
+
    +
  • +
    +
    public class LogHelper
    +extends java.lang.Object
    +
    Provides various convenience methods for log4j2 related tasks, since doing some operations programmatically in log4j2 + are not very straightforward.
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      org.apache.logging.log4j.core.appender.ConsoleAppenderattachConsoleAppender​(java.lang.String pattern, + java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction) +
      Attaches a ConsoleAppender
      +
      org.apache.logging.log4j.core.appender.ConsoleAppenderattachConsoleAppender​(java.lang.String pattern, + org.apache.logging.log4j.core.Filter filter) +
      Attaches a new ConsoleAppender
      +
      voidattachLogAppender​(@NonNull org.apache.logging.log4j.core.Appender appender) +
      Attaches the given appender
      +
      LogMessageCallbackAppenderattachLogMessageCallbackAppender​(java.lang.String pattern, + java.util.Collection<java.lang.String> regexPatterns, + java.util.function.Consumer<java.lang.String> consumer) +
      Attaches to logging system and returns a LogMessageCallbackAppender whose purpose is to forward rendered + log event strings to a Consumer which then in turn makes use of that message.
      +
      LogMessageCallbackAppenderattachLogMessageCallbackAppender​(java.lang.String pattern, + java.util.function.Consumer<java.lang.String> consumer) +
      Attaches to logging system and returns a LogMessageCallbackAppender whose purpose is to forward rendered + log event strings to a Consumer which then in turn makes use of that message.
      +
      org.apache.logging.log4j.core.FiltercreateAcceptAllFilter() +
      Creates a Filter which accepts all log events.
      +
      org.apache.logging.log4j.core.FiltercreatePassFailFilter​(java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction) +
      Convenience method for converting a Function<LogEvent,Boolean> into a AbstractFilter which + will yield ACCEPT when the function returns True and DENY when the function returns False.
      +
      static LogHelpergetInstance() 
      org.apache.logging.log4j.LoggergetLogger() +
      Convenience method for obtaining a logger object, named after the class calling this method.
      +
      org.apache.logging.log4j.LoggergetLogger​(java.lang.String name) +
      Convenience method for obtaining a logger object.
      +
      org.apache.logging.log4j.LevelgetRootLoggerLevel() +
      Gets the current level of the root logger
      +
      voidinitAlternateLogFile​(@NonNull java.io.File logFile, + java.lang.String pattern, + java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction) +
      Creates a file appender which will log to the specified file.
      +
      org.apache.logging.log4j.core.appender.FileAppenderinitAlternateLogFile​(@NonNull java.io.File logFile, + java.lang.String pattern, + org.apache.logging.log4j.core.Filter filter) +
      Creates a file appender which will log to the specified file.
      +
      voidremoveAppender​(@NonNull org.apache.logging.log4j.core.Appender appender) +
      Removes the given appender
      +
      org.apache.logging.log4j.LevelsetRootLoggerLevel​(org.apache.logging.log4j.Level level) +
      Sets the root logger's level, returning the level it was set to before changing it, in case you wish to later + set it back to where it was.
      +
      org.apache.logging.log4j.LevelsetRootLoggerLevelAll() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelDebug() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelError() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelFatal() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelInfo() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelOff() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelTrace() 
      org.apache.logging.log4j.LevelsetRootLoggerLevelWarn() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getInstance

        +
        public static LogHelper getInstance()
        +
      • +
      + + + +
        +
      • +

        getRootLoggerLevel

        +
        public org.apache.logging.log4j.Level getRootLoggerLevel()
        +
        Gets the current level of the root logger
        +
        +
        Returns:
        +
        The root logger's current level
        +
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevel

        +
        public org.apache.logging.log4j.Level setRootLoggerLevel​(org.apache.logging.log4j.Level level)
        +
        Sets the root logger's level, returning the level it was set to before changing it, in case you wish to later + set it back to where it was.
        +
        +
        Parameters:
        +
        level - The new level to assign to the root logger
        +
        Returns:
        +
        The root logger's level before changing it
        +
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelOff

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelOff()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelFatal

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelFatal()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelError

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelError()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelWarn

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelWarn()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelInfo

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelInfo()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelDebug

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelDebug()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelTrace

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelTrace()
        +
      • +
      + + + +
        +
      • +

        setRootLoggerLevelAll

        +
        public org.apache.logging.log4j.Level setRootLoggerLevelAll()
        +
      • +
      + + + +
        +
      • +

        initAlternateLogFile

        +
        public org.apache.logging.log4j.core.appender.FileAppender initAlternateLogFile​(@NonNull
        +                                                                                @NonNull java.io.File logFile,
        +                                                                                java.lang.String pattern,
        +                                                                                org.apache.logging.log4j.core.Filter filter)
        +
        Creates a file appender which will log to the specified file. If a pattern is provided, it + will be used as the layout + (see docs). + If no pattern is supplied, then a default of "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" will be used. + If a filter is provided, it will be used to determine which log events are ultimately written to the created + file appender (and therefore the log file this creates). If no filter is provided, a default one will be used + which accepts all log events it is provided.
        +
        +
        Parameters:
        +
        logFile - The absolute file path to which this appender will write events
        +
        pattern - The logging pattern, uses "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" if null provided.
        +
        filter - The filter used to determine which log events are written. Will accept all events if null is provided.
        +
        Returns:
        +
        The FileAppender object, which could be used to later remove/close the appender.
        +
        +
      • +
      + + + +
        +
      • +

        attachConsoleAppender

        +
        public org.apache.logging.log4j.core.appender.ConsoleAppender attachConsoleAppender​(java.lang.String pattern,
        +                                                                                    org.apache.logging.log4j.core.Filter filter)
        +
        Attaches a new ConsoleAppender
        +
        +
        Parameters:
        +
        pattern - The pattern to use, a null value will default to %d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n
        +
        filter - The filter to use, a null value will default to filter returned by createAcceptAllFilter().
        +
        Returns:
        +
        Returns the newly created and attached console appender
        +
        +
      • +
      + + + +
        +
      • +

        attachLogAppender

        +
        public void attachLogAppender​(@NonNull
        +                              @NonNull org.apache.logging.log4j.core.Appender appender)
        +
        Attaches the given appender
        +
        +
        Parameters:
        +
        appender - The appender to attach
        +
        +
      • +
      + + + +
        +
      • +

        removeAppender

        +
        public void removeAppender​(@NonNull
        +                           @NonNull org.apache.logging.log4j.core.Appender appender)
        +
        Removes the given appender
        +
        +
        Parameters:
        +
        appender - The appender to remove
        +
        +
      • +
      + + + +
        +
      • +

        attachConsoleAppender

        +
        public org.apache.logging.log4j.core.appender.ConsoleAppender attachConsoleAppender​(java.lang.String pattern,
        +                                                                                    java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction)
        +
        Attaches a ConsoleAppender
        +
        +
        Parameters:
        +
        pattern - The pattern to use
        +
        filteringFunction - A function that will receive each log event, returning True to ACCEPT and False to DENY.
        +
        Returns:
        +
        The newly created console appender
        +
        +
      • +
      + + + +
        +
      • +

        initAlternateLogFile

        +
        public void initAlternateLogFile​(@NonNull
        +                                 @NonNull java.io.File logFile,
        +                                 java.lang.String pattern,
        +                                 java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction)
        +
        Creates a file appender which will log to the specified file. If a pattern is provided, it + will be used as the layout + (see docs). + If no pattern is supplied, then a default of "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" will be used. + If a filter is provided, it will be used to determine which log events are ultimately written to the created + file appender (and therefore the log file this creates). If no filter is provided, a default one will be used + which accepts all log events it is provided. + + This differs from the method initAlternateLogFile(File, String, Filter) in that this function accepts + a generic Function<LogEvent,Boolean> which will be wrapped by an anonymous AbstractFilter instance. + When the provided filtering function returns True, the wrapped filter will return an ACCEPT result. When it + returns False, the wrapped will return a DENY result. This method exists mostly to make working with it from + a scripting language (such as Ruby) potentially easier. Example in Ruby:
        + +
        + 
        + LogHelper.initAlternateLogFile(java.io.File.new("D:\\temp\\script.log"),nil) do |event|
        + 	next (!event.nil? && event.getLoggerName.startsWith("proservTest"))
        + end
        + 
        + 
        +
        +
        Parameters:
        +
        logFile - The absolute file path to which this appender will write events
        +
        pattern - The logging pattern, uses "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n" if null provided.
        +
        filteringFunction - A function that will receive each log event, returning True to ACCEPT and False to DENY.
        +
        +
      • +
      + + + +
        +
      • +

        attachLogMessageCallbackAppender

        +
        public LogMessageCallbackAppender attachLogMessageCallbackAppender​(java.lang.String pattern,
        +                                                                   java.util.function.Consumer<java.lang.String> consumer)
        +
        Attaches to logging system and returns a LogMessageCallbackAppender whose purpose is to forward rendered + log event strings to a Consumer which then in turn makes use of that message. + For example, if you wish to forward log messages to the Nuix script console you might do something like: +
        
        + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
        + appender = LogHelper.getInstance.attachLogMessageCallbackAppender(pattern){|message| puts message}
        + 
        + Note that by default, no filtering is applied to log events! If you wish to control which log events get forwarded + the you will want to instead do something like this: +
        
        + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
        + appender = LogHelper.getInstance.attachLogMessageCallbackAppender(pattern){|message| puts message}
        + filter = LogHelper.getInstance.createPassFailFilter do |log_event|
        +  return log_event.getLoggerName == "MY_SPECIAL_LOGGER"
        + end
        + appender.addFilter(filter)
        + 
        +
        +
        Parameters:
        +
        pattern - The pattern used to construct the PatternLayout that will be used to render LogEvent + instances into strings.
        +
        consumer - The consumer which will receive log messages.
        +
        Returns:
        +
        The appender so you can remove it at a later time using removeAppender(Appender).
        +
        +
      • +
      + + + +
        +
      • +

        attachLogMessageCallbackAppender

        +
        public LogMessageCallbackAppender attachLogMessageCallbackAppender​(java.lang.String pattern,
        +                                                                   java.util.Collection<java.lang.String> regexPatterns,
        +                                                                   java.util.function.Consumer<java.lang.String> consumer)
        +
        Attaches to logging system and returns a LogMessageCallbackAppender whose purpose is to forward rendered + log event strings to a Consumer which then in turn makes use of that message. + This will also attach a Filter which will accept any LogEvents in which the logger name matches one of the + provided regex patterns. + For example, if you wish to forward log messages to the Nuix script console you might do something like: +
        
        + pattern = "%d{yyyy-MM-dd HH:mm:ss.SSS Z} [%t] %r %-5p %c - %m%n"
        + regex_patterns = ["com\.nuix\.proserv.*"] # Forward events from this library
        + appender = LogHelper.getInstance.attachLogMessageCallbackAppender(pattern){|message| puts message}
        + 
        +
        +
        Parameters:
        +
        pattern - The pattern used to construct the PatternLayout that will be used to render LogEvent + instances into strings.
        +
        regexPatterns - One or more regular expressions that will be used by the filter to filter log events by their + logger name.
        +
        consumer - The consumer which will receive log messages.
        +
        Returns:
        +
        The appender so you can remove it at a later time using removeAppender(Appender).
        +
        +
      • +
      + + + +
        +
      • +

        getLogger

        +
        public org.apache.logging.log4j.Logger getLogger​(java.lang.String name)
        +
        Convenience method for obtaining a logger object.
        +
        +
        Parameters:
        +
        name - The name to assign the logger
        +
        Returns:
        +
        A logger object
        +
        +
      • +
      + + + +
        +
      • +

        getLogger

        +
        public org.apache.logging.log4j.Logger getLogger()
        +
        Convenience method for obtaining a logger object, named after the class calling this method. Internally + the class name is determined and then used in call to getLogger(String).
        +
        +
        Returns:
        +
        A logger object
        +
        +
      • +
      + + + +
        +
      • +

        createPassFailFilter

        +
        public org.apache.logging.log4j.core.Filter createPassFailFilter​(java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction)
        +
        Convenience method for converting a Function<LogEvent,Boolean> into a AbstractFilter which + will yield ACCEPT when the function returns True and DENY when the function returns False.
        +
        +
        Parameters:
        +
        filteringFunction - A function which will be used to determine what events are filtered.
        +
        Returns:
        +
        A Filter instance
        +
        +
      • +
      + + + +
        +
      • +

        createAcceptAllFilter

        +
        public org.apache.logging.log4j.core.Filter createAcceptAllFilter()
        +
        Creates a Filter which accepts all log events.
        +
        +
        Returns:
        +
        A Filter which accepts all log events blindly
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ +
+ +
+ + diff --git a/docs/com/nuix/logging/LogMessageCallbackAppender.html b/docs/com/nuix/logging/LogMessageCallbackAppender.html new file mode 100644 index 0000000..b4b044f --- /dev/null +++ b/docs/com/nuix/logging/LogMessageCallbackAppender.html @@ -0,0 +1,511 @@ + + + + + +LogMessageCallbackAppender (Nx 1.19.0 API) + + + + + + + + + + + + + + +
+ +
+ +
+
+ +

Class LogMessageCallbackAppender

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • org.apache.logging.log4j.core.AbstractLifeCycle
    • +
    • +
        +
      • org.apache.logging.log4j.core.filter.AbstractFilterable
      • +
      • +
          +
        • org.apache.logging.log4j.core.appender.AbstractAppender
        • +
        • +
            +
          • com.nuix.logging.LogMessageCallbackAppender
          • +
          +
        • +
        +
      • +
      +
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    org.apache.logging.log4j.core.Appender, org.apache.logging.log4j.core.filter.Filterable, org.apache.logging.log4j.core.impl.LocationAware, org.apache.logging.log4j.core.LifeCycle, org.apache.logging.log4j.core.LifeCycle2
    +
    +
    +
    public class LogMessageCallbackAppender
    +extends org.apache.logging.log4j.core.appender.AbstractAppender
    +
    A custom log4j2 appender which forwards String rendered LogEvent objects to the provided consumer, using the + provded layout to first render the LogEvent.
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Nested Class Summary

      +
        +
      • + + +

        Nested classes/interfaces inherited from class org.apache.logging.log4j.core.appender.AbstractAppender

        +org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B extends org.apache.logging.log4j.core.appender.AbstractAppender.Builder<B>>
      • +
      +
        +
      • + + +

        Nested classes/interfaces inherited from interface org.apache.logging.log4j.core.LifeCycle

        +org.apache.logging.log4j.core.LifeCycle.State
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Field Summary

      +
        +
      • + + +

        Fields inherited from class org.apache.logging.log4j.core.AbstractLifeCycle

        +DEFAULT_STOP_TIMEOUT, DEFAULT_STOP_TIMEUNIT, LOGGER
      • +
      +
        +
      • + + +

        Fields inherited from interface org.apache.logging.log4j.core.Appender

        +ELEMENT_TYPE
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      LogMessageCallbackAppender​(java.lang.String name, + @NonNull org.apache.logging.log4j.core.Layout layout) +
      Creates a new instance with the given name and a filter that accepts ALL events
      +
      LogMessageCallbackAppender​(java.lang.String name, + @NonNull org.apache.logging.log4j.core.Layout layout, + java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction) +
      Creates a new instance with the given name and filter
      +
      LogMessageCallbackAppender​(java.lang.String name, + @NonNull org.apache.logging.log4j.core.Layout layout, + org.apache.logging.log4j.core.Filter filter) +
      Creates a new instance with the given name and filter
      +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidappend​(org.apache.logging.log4j.core.LogEvent event)
      java.util.function.Consumer<java.lang.String>getMessageConsumer() +
      Gets the Consumer that will be provided log event messages (based on provided layout)
      +
      voidsetMessageConsumer​(java.util.function.Consumer<java.lang.String> messageConsumer) +
      Sets the consumer that will be provided log event messages (based on provided layout)
      +
      +
        +
      • + + +

        Methods inherited from class org.apache.logging.log4j.core.appender.AbstractAppender

        +error, error, error, getHandler, getLayout, getName, ignoreExceptions, parseInt, requiresLocation, setHandler, toSerializable, toString
      • +
      +
        +
      • + + +

        Methods inherited from class org.apache.logging.log4j.core.filter.AbstractFilterable

        +addFilter, getFilter, getPropertyArray, hasFilter, isFiltered, removeFilter, start, stop, stop
      • +
      +
        +
      • + + +

        Methods inherited from class org.apache.logging.log4j.core.AbstractLifeCycle

        +equalsImpl, getState, getStatusLogger, hashCodeImpl, initialize, isInitialized, isStarted, isStarting, isStopped, isStopping, setStarted, setStarting, setState, setStopped, setStopping, stop, stop
      • +
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
      • +
      +
        +
      • + + +

        Methods inherited from interface org.apache.logging.log4j.core.LifeCycle

        +getState, initialize, isStarted, isStopped, start, stop
      • +
      +
    • +
    +
    +
  • +
+
+
+
    +
  • + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        LogMessageCallbackAppender

        +
        public LogMessageCallbackAppender​(java.lang.String name,
        +                                  @NonNull
        +                                  @NonNull org.apache.logging.log4j.core.Layout layout,
        +                                  org.apache.logging.log4j.core.Filter filter)
        +
        Creates a new instance with the given name and filter
        +
        +
        Parameters:
        +
        name - The name to assign
        +
        layout - The required layout which will be used to render LogEvent instances into Strings
        +
        filter - The filter to apply
        +
        +
      • +
      + + + +
        +
      • +

        LogMessageCallbackAppender

        +
        public LogMessageCallbackAppender​(java.lang.String name,
        +                                  @NonNull
        +                                  @NonNull org.apache.logging.log4j.core.Layout layout,
        +                                  java.util.function.Function<org.apache.logging.log4j.core.LogEvent,​java.lang.Boolean> filteringFunction)
        +
        Creates a new instance with the given name and filter
        +
        +
        Parameters:
        +
        name - The name to assign
        +
        layout - The required layout which will be used to render LogEvent instances into Strings
        +
        filteringFunction - A function which will be used to determine what events are filtered.
        +
        +
      • +
      + + + +
        +
      • +

        LogMessageCallbackAppender

        +
        public LogMessageCallbackAppender​(java.lang.String name,
        +                                  @NonNull
        +                                  @NonNull org.apache.logging.log4j.core.Layout layout)
        +
        Creates a new instance with the given name and a filter that accepts ALL events
        +
        +
        Parameters:
        +
        name - The name to assign
        +
        layout - The layout to use
        +
        +
      • +
      +
    • +
    +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        append

        +
        public void append​(org.apache.logging.log4j.core.LogEvent event)
        +
        +
        Parameters:
        +
        event -
        +
        +
      • +
      + + + +
        +
      • +

        getMessageConsumer

        +
        public java.util.function.Consumer<java.lang.String> getMessageConsumer()
        +
        Gets the Consumer that will be provided log event messages (based on provided layout)
        +
        +
        Returns:
        +
        The Consumer that will receive log event messages
        +
        +
      • +
      + + + +
        +
      • +

        setMessageConsumer

        +
        public void setMessageConsumer​(java.util.function.Consumer<java.lang.String> messageConsumer)
        +
        Sets the consumer that will be provided log event messages (based on provided layout)
        +
        +
        Parameters:
        +
        messageConsumer - The Consumer to receive log event messages
        +
        +
      • +
      +
    • +
    +
    +
  • +
+
+
+
+ + + + diff --git a/docs/com/nuix/logging/package-summary.html b/docs/com/nuix/logging/package-summary.html new file mode 100644 index 0000000..86732e8 --- /dev/null +++ b/docs/com/nuix/logging/package-summary.html @@ -0,0 +1,180 @@ + + + + + +com.nuix.logging (Nx 1.19.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Package com.nuix.logging

+
+
+
    +
  • + + + + + + + + + + + + + + + + + + + + +
    Class Summary 
    ClassDescription
    LogEventCallbackAppender +
    A custom log4j2 appender which forwards LogEvent objects to the provided consumer
    +
    LogHelper +
    Provides various convenience methods for log4j2 related tasks, since doing some operations programmatically in log4j2 + are not very straightforward.
    +
    LogMessageCallbackAppender +
    A custom log4j2 appender which forwards String rendered LogEvent objects to the provided consumer, using the + provded layout to first render the LogEvent.
    +
    +
  • +
+
+
+
+ +
+ + diff --git a/docs/com/nuix/logging/package-tree.html b/docs/com/nuix/logging/package-tree.html new file mode 100644 index 0000000..0e5e2ec --- /dev/null +++ b/docs/com/nuix/logging/package-tree.html @@ -0,0 +1,175 @@ + + + + + +com.nuix.logging Class Hierarchy (Nx 1.19.0 API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package com.nuix.logging

+Package Hierarchies: + +
+
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • org.apache.logging.log4j.core.AbstractLifeCycle (implements org.apache.logging.log4j.core.LifeCycle2) +
        +
      • org.apache.logging.log4j.core.filter.AbstractFilterable (implements org.apache.logging.log4j.core.filter.Filterable) +
          +
        • org.apache.logging.log4j.core.appender.AbstractAppender (implements org.apache.logging.log4j.core.Appender, org.apache.logging.log4j.core.impl.LocationAware) + +
        • +
        +
      • +
      +
    • +
    • com.nuix.logging.LogHelper
    • +
    +
  • +
+
+
+
+ + + diff --git a/docs/com/nuix/nx/DialogTester.html b/docs/com/nuix/nx/DialogTester.html deleted file mode 100644 index 67ccadf..0000000 --- a/docs/com/nuix/nx/DialogTester.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - -DialogTester - - - - - - - - - - - - - - - -
- -
-
- -
-
Package com.nuix.nx
-

Class DialogTester

-
-
-
java.lang.Object -
com.nuix.nx.DialogTester
-
-
-
-
public class DialogTester
-extends java.lang.Object
-
-
-
    - -
  • -
    - - -

    Constructor Summary

    -
    - - - - - - - - - - - - - - -
    Constructors 
    ConstructorDescription
    DialogTester() 
    -
    -
    -
  • - -
  • -
    - - -

    Method Summary

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - -
    Modifier and TypeMethodDescription
    static voidmain​(java.lang.String[] arg) 
    voidrunCustomDialogTest() 
    -
    -
    -
    -

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    -
    -
  • -
-
-
-
    - -
  • -
    - - -

    Constructor Details

    - -
    -
  • - -
  • -
    - - -

    Method Details

    -
      -
    • -
      -

      runCustomDialogTest

      -
      public void runCustomDialogTest()
      -
      -
    • -
    • -
      -

      main

      -
      public static void main​(java.lang.String[] arg) - throws java.lang.Exception
      -
      -
      Throws:
      -
      java.lang.Exception
      -
      -
      -
    • -
    -
    -
  • -
-
-
- -
- -
-
- - diff --git a/docs/com/nuix/nx/LookAndFeelHelper.html b/docs/com/nuix/nx/LookAndFeelHelper.html index b335ce5..7c34b55 100644 --- a/docs/com/nuix/nx/LookAndFeelHelper.html +++ b/docs/com/nuix/nx/LookAndFeelHelper.html @@ -3,36 +3,45 @@ -LookAndFeelHelper +LookAndFeelHelper (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
-
- + - - diff --git a/docs/com/nuix/nx/NuixConnection.html b/docs/com/nuix/nx/NuixConnection.html index aa47a09..23edb36 100644 --- a/docs/com/nuix/nx/NuixConnection.html +++ b/docs/com/nuix/nx/NuixConnection.html @@ -3,36 +3,45 @@ -NuixConnection +NuixConnection (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
-
- + - - diff --git a/docs/com/nuix/nx/NuixVersion.html b/docs/com/nuix/nx/NuixVersion.html index b076b0e..64722b8 100644 --- a/docs/com/nuix/nx/NuixVersion.html +++ b/docs/com/nuix/nx/NuixVersion.html @@ -3,36 +3,45 @@ -NuixVersion +NuixVersion (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
-
-
-
Author:
-
Jason Wells
-
- -
+ + + +
    -
  • -
    + +
    +
      +
    • -

      Constructor Summary

      -
      - +

      Constructor Summary

      +
      - - - + int minorVersion) + int minorVersion, + int bugfixVersion) + int minorVersion, + int bugfixVersion, + int buildVersion) -
      Constructors 
      Constructor Description
      NuixVersion() @@ -148,250 +183,259 @@

      Constructor Summary

      NuixVersion​(int majorVersion, -int minorVersion)
      Creates a new instance using the provided major and minor versions: major.minor.0.0
      NuixVersion​(int majorVersion, -int minorVersion, -int bugfixVersion)
      Creates a new instance using the provided major, minor and bugfix versions: major.minor.bugfix.0
      NuixVersion​(int majorVersion, -int minorVersion, -int bugfixVersion, -int buildVersion)
      Creates a new instance using the provided major, minor, bugfix and build versions: major.minor.bugfix.build
      -
      -
  • +
+
-
  • -
    +
    +
      +
    • -

      Method Summary

      -
      -
      -
      - - +

      Method Summary

      +
      + - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + -
      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      int compareTo​(NuixVersion other)
      Provides comparison logic when comparing two instances.
      int getBugfix()
      Gets the determined bugfix portion of this version instance (0.0.x.0)
      int getBuild()
      Gets the determined build portion of this version instance (0.0.0.x)
      static NuixVersion getCurrent()
      Attempts to determine current Nuix version by inspecting Nuix packages.
      int getMajor()
      Gets the determined major portion of this version instance (X.0.0.0)
      int getMinor()
      Gets the determined minor portion of this version instance (0.X.0.0)
      boolean isAtLeast​(NuixVersion other)
      Determines whether another instance's version is greater than or equal to this instance
      boolean isAtLeast​(java.lang.String other)
      Determines whether another instance's version is greater than or equal to this instance
      boolean isEqualTo​(NuixVersion other)
      Determines whether another instance's version is equal to this instance
      boolean isEqualTo​(java.lang.String other)
      Determines whether another instance's version is equal to this instance
      boolean isGreaterThan​(NuixVersion other)
      Determines whether another instance's version is greater than this instance
      boolean isGreaterThan​(java.lang.String other)
      Determines whether another instance's version is greater than this instance
      boolean isLessThan​(NuixVersion other)
      Determines whether another instance's version is less than this instance
      boolean isLessThan​(java.lang.String other)
      Determines whether another instance's version is less than this instance
      static NuixVersion parse​(java.lang.String versionString)
      Parses a version string into a NuixVersion instance.
      void setBugfix​(int bugfix)
      Sets the determined bugfix portion of this version instance (0.0.x.0)
      void setBuild​(int build)
      Sets the build portion of this version instance (0.0.0.x)
      void setMajor​(int major)
      Sets the major portion of this version instance (X.0.0.0)
      void setMinor​(int minor)
      Sets the minor portion of this version instance (0.X.0.0)
      java.lang.String toString()
      Converts this instance back to a version string from its components, such as: "7.8.0.10"
      -
      -
      -
      -

      Methods inherited from class java.lang.Object

      - +
        +
      • -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
      -
    + +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • + -
    + + + +
      -
    • -
      + +
      +
        +
      • + + +

        Constructor Detail

        + -

        Constructor Details

        • -
          -

          NuixVersion

          -
          public NuixVersion()
          +

          NuixVersion

          +
          public NuixVersion()
          Creates a new instance defaulting to version 0.0.0
          -
        • +
        + + + +
        • -
          -

          NuixVersion

          -
          public NuixVersion​(int majorVersion)
          +

          NuixVersion

          +
          public NuixVersion​(int majorVersion)
          Creates a new instance using the provided major version: major.0.0.0
          Parameters:
          majorVersion - The major version number
          -
        • +
        + + + +
        • -
          -

          NuixVersion

          -
          public NuixVersion​(int majorVersion, -int minorVersion)
          +

          NuixVersion

          +
          public NuixVersion​(int majorVersion,
          +                   int minorVersion)
          Creates a new instance using the provided major and minor versions: major.minor.0.0
          Parameters:
          majorVersion - The major version number
          minorVersion - The minor version number
          -
        • +
        + + + +
        • -
          -

          NuixVersion

          -
          public NuixVersion​(int majorVersion, -int minorVersion, -int bugfixVersion)
          +

          NuixVersion

          +
          public NuixVersion​(int majorVersion,
          +                   int minorVersion,
          +                   int bugfixVersion)
          Creates a new instance using the provided major, minor and bugfix versions: major.minor.bugfix.0
          Parameters:
          @@ -399,15 +443,18 @@

          NuixVersion

          minorVersion - The minor version number
          bugfixVersion - The bugfix version number
          -
        • +
        + + + +
        • -
          -

          NuixVersion

          -
          public NuixVersion​(int majorVersion, -int minorVersion, -int bugfixVersion, -int buildVersion)
          +

          NuixVersion

          +
          public NuixVersion​(int majorVersion,
          +                   int minorVersion,
          +                   int bugfixVersion,
          +                   int buildVersion)
          Creates a new instance using the provided major, minor, bugfix and build versions: major.minor.bugfix.build
          Parameters:
          @@ -416,22 +463,25 @@

          NuixVersion

          bugfixVersion - The bugfix version number
          buildVersion - The build version number
          -
        -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        parse

        -
        public static NuixVersion parse​(java.lang.String versionString)
        +

        parse

        +
        public static NuixVersion parse​(java.lang.String versionString)
        Parses a version string into a NuixVersion instance. Supports values such as: 6, 6.2, 6.2.0, 6.2.1-preview6, 7.8.0.10
        When providing a version string such as "6.2.1-preview6", "-preview6" will be trimmed off before parsing.
        @@ -441,112 +491,142 @@

        parse

        A NuixVersion instance representing the supplied version string, if there is an error parsing the provided value will return an instance representing 100.0.0
        -
      • +
      + + + +
      • -
        -

        getMajor

        -
        public int getMajor()
        +

        getMajor

        +
        public int getMajor()
        Gets the determined major portion of this version instance (X.0.0.0)
        Returns:
        The determined major portion of version
        -
      • +
      + + + +
      • -
        -

        setMajor

        -
        public void setMajor​(int major)
        +

        setMajor

        +
        public void setMajor​(int major)
        Sets the major portion of this version instance (X.0.0.0)
        Parameters:
        major - The major version value
        -
      • +
      + + + +
      • -
        -

        getMinor

        -
        public int getMinor()
        +

        getMinor

        +
        public int getMinor()
        Gets the determined minor portion of this version instance (0.X.0.0)
        Returns:
        The determined minor portion of version
        -
      • +
      + + + +
      • -
        -

        setMinor

        -
        public void setMinor​(int minor)
        +

        setMinor

        +
        public void setMinor​(int minor)
        Sets the minor portion of this version instance (0.X.0.0)
        Parameters:
        minor - The minor version value
        -
      • +
      + + + +
      • -
        -

        getBugfix

        -
        public int getBugfix()
        +

        getBugfix

        +
        public int getBugfix()
        Gets the determined bugfix portion of this version instance (0.0.x.0)
        Returns:
        The determined bugfix portion of version
        -
      • +
      + + + +
      • -
        -

        setBugfix

        -
        public void setBugfix​(int bugfix)
        +

        setBugfix

        +
        public void setBugfix​(int bugfix)
        Sets the determined bugfix portion of this version instance (0.0.x.0)
        Parameters:
        bugfix - The determined bugfix portion of version
        -
      • +
      + + + +
      • -
        -

        getBuild

        -
        public int getBuild()
        +

        getBuild

        +
        public int getBuild()
        Gets the determined build portion of this version instance (0.0.0.x)
        Returns:
        The determined build portion of version
        -
      • +
      + + + +
      • -
        -

        setBuild

        -
        public void setBuild​(int build)
        +

        setBuild

        +
        public void setBuild​(int build)
        Sets the build portion of this version instance (0.0.0.x)
        Parameters:
        build - The build version value
        -
      • +
      + + + +
      • -
        -

        getCurrent

        -
        public static NuixVersion getCurrent()
        +

        getCurrent

        +
        public static NuixVersion getCurrent()
        Attempts to determine current Nuix version by inspecting Nuix packages. It is preffered to instead use parse(String) when version string is available, such as in Ruby using constant NUIX_VERSION.
        Returns:
        Best guess at current Nuix version based on package inspection.
        -
      • +
      + + + +
      • -
        -

        isLessThan

        -
        public boolean isLessThan​(NuixVersion other)
        +

        isLessThan

        +
        public boolean isLessThan​(NuixVersion other)
        Determines whether another instance's version is less than this instance
        Parameters:
        @@ -554,12 +634,15 @@

        isLessThan

        Returns:
        True if the other instance is a lower version, false otherwise
        -
      • +
      + + + +
      • -
        -

        isAtLeast

        -
        public boolean isAtLeast​(NuixVersion other)
        +

        isAtLeast

        +
        public boolean isAtLeast​(NuixVersion other)
        Determines whether another instance's version is greater than or equal to this instance
        Parameters:
        @@ -567,12 +650,15 @@

        isAtLeast

        Returns:
        True if the other instance is greater than or equal to this instance, false otherwise
        -
      • +
      + + + +
      • -
        -

        isGreaterThan

        -
        public boolean isGreaterThan​(NuixVersion other)
        +

        isGreaterThan

        +
        public boolean isGreaterThan​(NuixVersion other)
        Determines whether another instance's version is greater than this instance
        Parameters:
        @@ -580,12 +666,15 @@

        isGreaterThan

        Returns:
        True if the other instance is greater than this instance, false otherwise
        -
      • +
      + + + +
      • -
        -

        isGreaterThan

        -
        public boolean isGreaterThan​(java.lang.String other)
        +

        isGreaterThan

        +
        public boolean isGreaterThan​(java.lang.String other)
        Determines whether another instance's version is greater than this instance
        Parameters:
        @@ -593,12 +682,15 @@

        isGreaterThan

        Returns:
        True if the other instance is greater than this instance, false otherwise
        -
      • +
      + + + +
      • -
        -

        isEqualTo

        -
        public boolean isEqualTo​(NuixVersion other)
        +

        isEqualTo

        +
        public boolean isEqualTo​(NuixVersion other)
        Determines whether another instance's version is equal to this instance
        Parameters:
        @@ -606,12 +698,15 @@

        isEqualTo

        Returns:
        True if the other instance is greater than this instance, false otherwise
        -
      • +
      + + + +
      • -
        -

        isEqualTo

        -
        public boolean isEqualTo​(java.lang.String other)
        +

        isEqualTo

        +
        public boolean isEqualTo​(java.lang.String other)
        Determines whether another instance's version is equal to this instance
        Parameters:
        @@ -619,12 +714,15 @@

        isEqualTo

        Returns:
        True if the other instance is equal to this instance (major, minor and release are the same), false otherwise
        -
      • +
      + + + +
      • -
        -

        isLessThan

        -
        public boolean isLessThan​(java.lang.String other)
        +

        isLessThan

        +
        public boolean isLessThan​(java.lang.String other)
        Determines whether another instance's version is less than this instance
        Parameters:
        @@ -632,12 +730,15 @@

        isLessThan

        Returns:
        True if the other instance is a lower version, false otherwise
        -
      • +
      + + + +
      • -
        -

        isAtLeast

        -
        public boolean isAtLeast​(java.lang.String other)
        +

        isAtLeast

        +
        public boolean isAtLeast​(java.lang.String other)
        Determines whether another instance's version is greater than or equal to this instance
        Parameters:
        @@ -645,38 +746,45 @@

        isAtLeast

        Returns:
        True if the other instance is greater than or equal to this instance, false otherwise
        -
      • +
      + + + +
      • -
        -

        compareTo

        -
        public int compareTo​(NuixVersion other)
        +

        compareTo

        +
        public int compareTo​(NuixVersion other)
        Provides comparison logic when comparing two instances.
        Specified by:
        compareTo in interface java.lang.Comparable<NuixVersion>
        -
      • +
      + + + +
      • -
        -

        toString

        -
        public java.lang.String toString()
        +

        toString

        +
        public java.lang.String toString()
        Converts this instance back to a version string from its components, such as: "7.8.0.10"
        Overrides:
        toString in class java.lang.Object
        -
      -
  • + + + - +
    - - diff --git a/docs/com/nuix/nx/callbacks/SimpleProgressCallback.html b/docs/com/nuix/nx/callbacks/SimpleProgressCallback.html index 12bfcc9..49b0e21 100644 --- a/docs/com/nuix/nx/callbacks/SimpleProgressCallback.html +++ b/docs/com/nuix/nx/callbacks/SimpleProgressCallback.html @@ -3,36 +3,45 @@ -SimpleProgressCallback +SimpleProgressCallback (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/callbacks/class-use/SimpleProgressCallback.html b/docs/com/nuix/nx/callbacks/class-use/SimpleProgressCallback.html deleted file mode 100644 index 73c4784..0000000 --- a/docs/com/nuix/nx/callbacks/class-use/SimpleProgressCallback.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.callbacks.SimpleProgressCallback - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.callbacks.SimpleProgressCallback

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use SimpleProgressCallback 
    PackageDescription
    com.nuix.nx.collections 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/callbacks/package-frame.html b/docs/com/nuix/nx/callbacks/package-frame.html deleted file mode 100644 index 0d7f507..0000000 --- a/docs/com/nuix/nx/callbacks/package-frame.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -com.nuix.nx.callbacks - - - - -

    com.nuix.nx.callbacks

    -
    -

    Interfaces

    - -
    - - diff --git a/docs/com/nuix/nx/callbacks/package-summary.html b/docs/com/nuix/nx/callbacks/package-summary.html index d85de97..8efcb2e 100644 --- a/docs/com/nuix/nx/callbacks/package-summary.html +++ b/docs/com/nuix/nx/callbacks/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.callbacks +com.nuix.nx.callbacks (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/callbacks/package-tree.html b/docs/com/nuix/nx/callbacks/package-tree.html index 4a67ac1..ad9346a 100644 --- a/docs/com/nuix/nx/callbacks/package-tree.html +++ b/docs/com/nuix/nx/callbacks/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.callbacks Class Hierarchy +com.nuix.nx.callbacks Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/callbacks/package-use.html b/docs/com/nuix/nx/callbacks/package-use.html deleted file mode 100644 index a74c7b7..0000000 --- a/docs/com/nuix/nx/callbacks/package-use.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.callbacks - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.callbacks

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.callbacks 
    PackageDescription
    com.nuix.nx.collections 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/class-use/DialogTester.html b/docs/com/nuix/nx/class-use/DialogTester.html deleted file mode 100644 index e965bf7..0000000 --- a/docs/com/nuix/nx/class-use/DialogTester.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.DialogTester - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.DialogTester

    -
    -
    No usage of com.nuix.nx.DialogTester
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/class-use/LookAndFeelHelper.html b/docs/com/nuix/nx/class-use/LookAndFeelHelper.html deleted file mode 100644 index 26c648a..0000000 --- a/docs/com/nuix/nx/class-use/LookAndFeelHelper.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.LookAndFeelHelper - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.LookAndFeelHelper

    -
    -
    No usage of com.nuix.nx.LookAndFeelHelper
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/class-use/NuixConnection.html b/docs/com/nuix/nx/class-use/NuixConnection.html deleted file mode 100644 index e8e3783..0000000 --- a/docs/com/nuix/nx/class-use/NuixConnection.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.NuixConnection - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.NuixConnection

    -
    -
    No usage of com.nuix.nx.NuixConnection
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/class-use/NuixVersion.html b/docs/com/nuix/nx/class-use/NuixVersion.html deleted file mode 100644 index d1d3cdb..0000000 --- a/docs/com/nuix/nx/class-use/NuixVersion.html +++ /dev/null @@ -1,212 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.NuixVersion - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.NuixVersion

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use NuixVersion 
    PackageDescription
    com.nuix.nx 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/AddressStatistics.html b/docs/com/nuix/nx/collections/AddressStatistics.html deleted file mode 100644 index dac275a..0000000 --- a/docs/com/nuix/nx/collections/AddressStatistics.html +++ /dev/null @@ -1,551 +0,0 @@ - - - - - -AddressStatistics - - - - - - - - - - - - - - - -
    - -
    -
    - -
    - -

    Class AddressStatistics

    -
    -
    -
    java.lang.Object -
    com.nuix.nx.collections.AddressStatistics
    -
    -
    -
    -
    public class AddressStatistics
    -extends java.lang.Object
    -
    Helper class which provides some convenience methods for working with Nuix Address collections.
    -
    -
    Author:
    -
    Jason Wells
    -
    -
    -
    -
      - -
    • -
      - - -

      Method Summary

      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Modifier and TypeMethodDescription
      static AddressStatisticsforItem​(nuix.Item item) -
      Constructs an instance representing the given item.
      -
      static AddressStatisticsforItems​(java.util.Collection<nuix.Item> items) -
      Constructs an instance representing the given items.
      -
      static AddressStatisticsforItems​(java.util.Collection<nuix.Item> items, -SimpleProgressCallback progressCallback) -
      Constructs an instance representing the given items and allows you to provide a progress callback.
      -
      booleanfromAnyAddressIn​(java.util.Collection<java.lang.String> addresses) -
      Tests whether any of the provided addresses appears in the list of From fields tracked - by this instance
      -
      booleanfromAnyAddressOutside​(java.util.Collection<java.lang.String> addresses) -
      Tests whether any of the provided addresses are NOT in the list of From fields tracked - by this instance
      -
      java.util.Set<java.lang.String>getDistinctBccAddresses() -
      Returns a Set of distinct BCC addresses
      -
      java.util.Set<java.lang.String>getDistinctBccDomains() -
      Returns a Set of distinct email domains found in the BCC field
      -
      java.util.Set<java.lang.String>getDistinctCcAddresses() -
      Returns a Set of distinct CC addresses
      -
      java.util.Set<java.lang.String>getDistinctCcDomains() -
      Returns a Set of distinct email domains found in the CC field
      -
      java.util.Set<java.lang.String>getDistinctFromAddresses() -
      Returns a Set of distinct from addresses
      -
      java.util.Set<java.lang.String>getDistinctFromDomains() -
      Returns a Set of distinct email domains found in the From field
      -
      java.util.Set<java.lang.String>getDistinctRecipientAddresses() -
      Returns a Set of distinct recipient addresses (To, CC, BCC)
      -
      java.util.Set<java.lang.String>getDistinctRecipientDomains() -
      Returns a Set of distinct email domains found in the recipient fields (To, CC, BCC)
      -
      java.util.Set<java.lang.String>getDistinctToAddresses() -
      Returns a Set of distinct To addresses
      -
      java.util.Set<java.lang.String>getDistinctToDomains() -
      Returns a Set of distinct email domains found in the To field
      -
      static java.lang.StringgetEmailDomain​(java.lang.String emailAddress) -
      Get the domain name from a standard email address
      -
      booleanreceivedByAnyAddressIn​(java.util.Collection<java.lang.String> addresses) -
      Tests whether any of the provided addresses was found to be a recipient (TO, CC, BCC) - tracked by this instance
      -
      booleanreceivedByAnyAddressOutside​(java.util.Collection<java.lang.String> addresses) -
      Tests whether any of the provided addresses was NOT found to be a recipient (TO, CC, BCC) - tracked by this instance
      -
      -
      -
      -
      -

      Methods inherited from class java.lang.Object

      - - -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      -
      -
    • -
    -
    -
    -
      - -
    • -
      - - -

      Method Details

      -
        -
      • -
        -

        getEmailDomain

        -
        public static java.lang.String getEmailDomain​(java.lang.String emailAddress)
        -
        Get the domain name from a standard email address
        -
        -
        Parameters:
        -
        emailAddress - The email address to parse
        -
        Returns:
        -
        The domain portion of the address is one was able to be parsed
        -
        -
        -
      • -
      • -
        -

        forItem

        -
        public static AddressStatistics forItem​(nuix.Item item)
        -
        Constructs an instance representing the given item.
        -
        -
        Parameters:
        -
        item - The item to build the address statistics for
        -
        Returns:
        -
        An instance representing the provided item
        -
        -
        -
      • -
      • -
        -

        forItems

        -
        public static AddressStatistics forItems​(java.util.Collection<nuix.Item> items)
        -
        Constructs an instance representing the given items.
        -
        -
        Parameters:
        -
        items - The items to build the address statistics for
        -
        Returns:
        -
        An instance representing the provided items
        -
        -
        -
      • -
      • -
        -

        forItems

        -
        public static AddressStatistics forItems​(java.util.Collection<nuix.Item> items, -SimpleProgressCallback progressCallback)
        -
        Constructs an instance representing the given items and allows you to provide a progress callback.
        -
        -
        Parameters:
        -
        items - The items to build the address statistics for
        -
        progressCallback - The progress callback
        -
        Returns:
        -
        An instance representing the provided items
        -
        -
        -
      • -
      • -
        -

        getDistinctFromAddresses

        -
        public java.util.Set<java.lang.String> getDistinctFromAddresses()
        -
        Returns a Set of distinct from addresses
        -
        -
        Returns:
        -
        A set of distinct from address strings
        -
        -
        -
      • -
      • -
        -

        getDistinctToAddresses

        -
        public java.util.Set<java.lang.String> getDistinctToAddresses()
        -
        Returns a Set of distinct To addresses
        -
        -
        Returns:
        -
        A set of distinct To address strings
        -
        -
        -
      • -
      • -
        -

        getDistinctCcAddresses

        -
        public java.util.Set<java.lang.String> getDistinctCcAddresses()
        -
        Returns a Set of distinct CC addresses
        -
        -
        Returns:
        -
        A set of distinct CC address strings
        -
        -
        -
      • -
      • -
        -

        getDistinctBccAddresses

        -
        public java.util.Set<java.lang.String> getDistinctBccAddresses()
        -
        Returns a Set of distinct BCC addresses
        -
        -
        Returns:
        -
        A set of distinct BCC address strings
        -
        -
        -
      • -
      • -
        -

        getDistinctRecipientAddresses

        -
        public java.util.Set<java.lang.String> getDistinctRecipientAddresses()
        -
        Returns a Set of distinct recipient addresses (To, CC, BCC)
        -
        -
        Returns:
        -
        A set of distinct recipient address strings (To, CC, BCC)
        -
        -
        -
      • -
      • -
        -

        getDistinctFromDomains

        -
        public java.util.Set<java.lang.String> getDistinctFromDomains()
        -
        Returns a Set of distinct email domains found in the From field
        -
        -
        Returns:
        -
        A distinct Set of email domains found in the From field
        -
        -
        -
      • -
      • -
        -

        getDistinctToDomains

        -
        public java.util.Set<java.lang.String> getDistinctToDomains()
        -
        Returns a Set of distinct email domains found in the To field
        -
        -
        Returns:
        -
        A distinct Set of email domains found in the To field
        -
        -
        -
      • -
      • -
        -

        getDistinctCcDomains

        -
        public java.util.Set<java.lang.String> getDistinctCcDomains()
        -
        Returns a Set of distinct email domains found in the CC field
        -
        -
        Returns:
        -
        A distinct Set of email domains found in the CC field
        -
        -
        -
      • -
      • -
        -

        getDistinctBccDomains

        -
        public java.util.Set<java.lang.String> getDistinctBccDomains()
        -
        Returns a Set of distinct email domains found in the BCC field
        -
        -
        Returns:
        -
        A distinct Set of email domains found in the BCC field
        -
        -
        -
      • -
      • -
        -

        getDistinctRecipientDomains

        -
        public java.util.Set<java.lang.String> getDistinctRecipientDomains()
        -
        Returns a Set of distinct email domains found in the recipient fields (To, CC, BCC)
        -
        -
        Returns:
        -
        A distinct Set of email domains found in the recipient fields (To, CC, BCC)
        -
        -
        -
      • -
      • -
        -

        fromAnyAddressIn

        -
        public boolean fromAnyAddressIn​(java.util.Collection<java.lang.String> addresses)
        -
        Tests whether any of the provided addresses appears in the list of From fields tracked - by this instance
        -
        -
        Parameters:
        -
        addresses - The list of addresses to compare
        -
        Returns:
        -
        True if at least one address in the provided addresses is present in the tracked From fields
        -
        -
        -
      • -
      • -
        -

        fromAnyAddressOutside

        -
        public boolean fromAnyAddressOutside​(java.util.Collection<java.lang.String> addresses)
        -
        Tests whether any of the provided addresses are NOT in the list of From fields tracked - by this instance
        -
        -
        Parameters:
        -
        addresses - The list of addresses to compare
        -
        Returns:
        -
        True if at least one address in the provided addresses is NOT present in the tracked From fields
        -
        -
        -
      • -
      • -
        -

        receivedByAnyAddressIn

        -
        public boolean receivedByAnyAddressIn​(java.util.Collection<java.lang.String> addresses)
        -
        Tests whether any of the provided addresses was found to be a recipient (TO, CC, BCC) - tracked by this instance
        -
        -
        Parameters:
        -
        addresses - The list of addresses to compare
        -
        Returns:
        -
        True if at least one of the provided addresses is found to be a recipient (TO, CC, BCC)
        -
        -
        -
      • -
      • -
        -

        receivedByAnyAddressOutside

        -
        public boolean receivedByAnyAddressOutside​(java.util.Collection<java.lang.String> addresses)
        -
        Tests whether any of the provided addresses was NOT found to be a recipient (TO, CC, BCC) - tracked by this instance
        -
        -
        Parameters:
        -
        addresses - The list of addresses to compare
        -
        Returns:
        -
        True if at least one of the provided addresses is found to NOT be a recipient (TO, CC, BCC)
        -
        -
        -
      • -
      -
      -
    • -
    -
    -
    - -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/NxItemUtility.html b/docs/com/nuix/nx/collections/NxItemUtility.html deleted file mode 100644 index 6c75bce..0000000 --- a/docs/com/nuix/nx/collections/NxItemUtility.html +++ /dev/null @@ -1,565 +0,0 @@ - - - - - -NxItemUtility - - - - - - - - - - - - - - - -
    - -
    -
    - -
    - -

    Class NxItemUtility

    -
    -
    -
    java.lang.Object -
    com.nuix.nx.collections.NxItemUtility
    -
    -
    -
    -
    public class NxItemUtility
    -extends java.lang.Object
    -
    Convenience methods for some common operations that are not offered currently - in the Nuix API
    -
    -
    Author:
    -
    Jason Wells
    -
    -
    -
    -
      - -
    • -
      - - -

      Constructor Summary

      -
      - - - - - - - - - - - - - - -
      Constructors 
      ConstructorDescription
      NxItemUtility() 
      -
      -
      -
    • - -
    • -
      - - -

      Method Summary

      -
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Modifier and TypeMethodDescription
      static longcalculateTotalAuditedSize​(java.util.Collection<nuix.Item> items) -
      Convenience method to calculate to the total audited size (in bytes) of a provided collection of items.
      -
      static nuix.ItemfindContainerAncestor​(nuix.Item item) -
      Resolves an item to its kind:container ancestor if it has one or null if one could not be found.
      -
      static java.util.Set<nuix.Item>findContainerAncestors​(java.util.Collection<nuix.Item> items) -
      Resolves provided items to kind container ancestor items.
      -
      static java.util.Set<nuix.Item>findContainerFamilies​(java.util.Collection<nuix.Item> items) -
      Similar to ItemUtility.findFamilies, but rather than finding the descendants of top level items - this examines the ancestors of provided items looking for an ancestor which is kind container - (Item.isKind("container") returns true).
      -
      static nuix.ItemfindPhysicalFileAncestor​(nuix.Item item) -
      Resolves an item to its physical file ancestor if it has one or null if one could not be found.
      -
      static java.util.Set<nuix.Item>findPhysicalFileAncestors​(java.util.Collection<nuix.Item> items) -
      Resolves provided items to their physical file ancestor items.
      -
      static java.util.Set<nuix.Item>findPhysicalFileFamilies​(java.util.Collection<nuix.Item> items) -
      Similar to ItemUtility.findFamilies, but rather than finding the descendants of top level items - this examines the ancestors of provided items looking for an ancestor which is a physical file - (Item.isPhysicalFile returns true).
      -
      static java.lang.StringgenerateFamiliesQuery​(java.util.Collection<nuix.Item> items) -
      Generates a GUID query to find the families of a collection of provided items.
      -
      static java.lang.StringgenerateGuidQuery​(java.util.Collection<java.lang.String> guids) -
      Generates a GUID query from the provided list of GUIDs.
      -
      static java.lang.StringgenerateGuidQueryFromItems​(java.util.Collection<nuix.Item> items) -
      Generates a GUID query from the provided list of Items.
      -
      static java.util.List<nuix.Item>itemsFromGuids​(nuix.Case nuixCase, -java.util.List<java.lang.String> guids) -
      Fetches the items associated with the provided list of GUID strings by searching for them in - batches, which helps mitigate performance issues which can arise from searching for especially - large GUID queries.
      -
      static java.util.List<nuix.Item>itemsFromGuids​(nuix.Case nuixCase, -java.util.List<java.lang.String> guids, -int batchSize) -
      Fetches the items associated with the provided list of GUID strings by searching for them in - batches, which helps mitigate performance issues which can arise from searching for especially - large GUID queries.
      -
      static java.util.List<nuix.Item>removeExcluded​(java.util.Collection<nuix.Item> items) -
      This is a convenience method for obtaining a list of items by removing all excluded items from the - provided collection.
      -
      static java.util.List<nuix.Item>removeImmaterial​(java.util.Collection<nuix.Item> items) -
      This is a convenience method for obtaining a list of items by removing all immaterial items - from the provided collection.
      -
      -
      -
      -
      -

      Methods inherited from class java.lang.Object

      - - -equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      -
      -
    • -
    -
    -
    -
      - -
    • -
      - - -

      Constructor Details

      - -
      -
    • - -
    • -
      - - -

      Method Details

      -
        -
      • -
        -

        itemsFromGuids

        -
        public static java.util.List<nuix.Item> itemsFromGuids​(nuix.Case nuixCase, -java.util.List<java.lang.String> guids, -int batchSize) - throws java.io.IOException
        -
        Fetches the items associated with the provided list of GUID strings by searching for them in - batches, which helps mitigate performance issues which can arise from searching for especially - large GUID queries.
        -
        -
        Parameters:
        -
        nuixCase - The case object that will be searched against to resolve the GUIDs to their items.
        -
        guids - The list of GUIDs to resolve into a list of items.
        -
        batchSize - How many GUIDs will be searched for at once.
        -
        Returns:
        -
        All the items which matched the GUIDs provided.
        -
        Throws:
        -
        java.io.IOException - Likely thrown if there is an error while searching.
        -
        -
        -
      • -
      • -
        -

        itemsFromGuids

        -
        public static java.util.List<nuix.Item> itemsFromGuids​(nuix.Case nuixCase, -java.util.List<java.lang.String> guids) - throws java.io.IOException
        -
        Fetches the items associated with the provided list of GUID strings by searching for them in - batches, which helps mitigate performance issues which can arise from searching for especially - large GUID queries. Uses a default batch size of 2000 GUIDs per search.
        -
        -
        Parameters:
        -
        nuixCase - The case object that will be searched against to resolve the GUIDs to their items.
        -
        guids - The list of GUIDs to resolve into a list of items.
        -
        Returns:
        -
        All the items which matched the GUIDs provided.
        -
        Throws:
        -
        java.io.IOException - Likely thrown if there is an error while searching.
        -
        -
        -
      • -
      • -
        -

        generateGuidQuery

        -
        public static java.lang.String generateGuidQuery​(java.util.Collection<java.lang.String> guids)
        -
        Generates a GUID query from the provided list of GUIDs. For example if the provided list contained - A, B and C then the resulting query would be guid:("A" OR "B" or "C")
        -
        -
        Parameters:
        -
        guids - The collection of GUIDs to include in the query
        -
        Returns:
        -
        A Nuix query suitable for searching for multiple GUIDs
        -
        -
        -
      • -
      • -
        -

        generateGuidQueryFromItems

        -
        public static java.lang.String generateGuidQueryFromItems​(java.util.Collection<nuix.Item> items)
        -
        Generates a GUID query from the provided list of Items. For example if the provided list contained - A, B and C then the resulting query would be guid:("A" OR "B" or "C")
        -
        -
        Parameters:
        -
        items - The list of items to include in the query
        -
        Returns:
        -
        A Nuix query suitable for searching for multiple GUIDs
        -
        -
        -
      • -
      • -
        -

        generateFamiliesQuery

        -
        public static java.lang.String generateFamiliesQuery​(java.util.Collection<nuix.Item> items)
        -
        Generates a GUID query to find the families of a collection of provided items.
        -
        -
        Parameters:
        -
        items - The items for which you wish to build the family query for.
        -
        Returns:
        -
        The query String.
        -
        -
        -
      • -
      • -
        -

        removeExcluded

        -
        public static java.util.List<nuix.Item> removeExcluded​(java.util.Collection<nuix.Item> items)
        -
        This is a convenience method for obtaining a list of items by removing all excluded items from the - provided collection.
        -
        -
        Parameters:
        -
        items - The collection of items from which you want all non-excluded items only.
        -
        Returns:
        -
        A list of items, based on the provided collection of items, with excluded items removed.
        -
        -
        -
      • -
      • -
        -

        removeImmaterial

        -
        public static java.util.List<nuix.Item> removeImmaterial​(java.util.Collection<nuix.Item> items)
        -
        This is a convenience method for obtaining a list of items by removing all immaterial items - from the provided collection.
        -
        -
        Parameters:
        -
        items - The collection of items from which you want all audited items only.
        -
        Returns:
        -
        A list of items, based on the provided collection of items, with excluded items removed.
        -
        -
        -
      • -
      • -
        -

        findPhysicalFileAncestor

        -
        public static nuix.Item findPhysicalFileAncestor​(nuix.Item item)
        -
        Resolves an item to its physical file ancestor if it has one or null if one could not be found.
        -
        -
        Parameters:
        -
        item - The item you wish to resolve the physical file ancestor for
        -
        Returns:
        -
        The physical file ancestor item if there is one, or null if one could not be found
        -
        -
        -
      • -
      • -
        -

        findPhysicalFileAncestors

        -
        public static java.util.Set<nuix.Item> findPhysicalFileAncestors​(java.util.Collection<nuix.Item> items)
        -
        Resolves provided items to their physical file ancestor items. Items which do not have a - physical file ancestor will yield nothing in the result.
        -
        -
        Parameters:
        -
        items - Items to resolve to physical file ancestors
        -
        Returns:
        -
        Any physical file ancestors located for the provided items
        -
        -
        -
      • -
      • -
        -

        findPhysicalFileFamilies

        -
        public static java.util.Set<nuix.Item> findPhysicalFileFamilies​(java.util.Collection<nuix.Item> items)
        -
        Similar to ItemUtility.findFamilies, but rather than finding the descendants of top level items - this examines the ancestors of provided items looking for an ancestor which is a physical file - (Item.isPhysicalFile returns true). If a given item is not found to have a physical file ancestor - then it will yield no "family" and not be included in the result.
        -
        -
        Parameters:
        -
        items - The items to resolve to physical file "families"
        -
        Returns:
        -
        Physical file items and their descendants based on provided items. It is possible a provided - item is not present in the result if it does not have a physical file ancestor.
        -
        -
        -
      • -
      • -
        -

        findContainerAncestor

        -
        public static nuix.Item findContainerAncestor​(nuix.Item item)
        -
        Resolves an item to its kind:container ancestor if it has one or null if one could not be found.
        -
        -
        Parameters:
        -
        item - The item you wish to resolve the kind container ancestor for
        -
        Returns:
        -
        The kind container item if there is one, or null if one could not be found
        -
        -
        -
      • -
      • -
        -

        findContainerAncestors

        -
        public static java.util.Set<nuix.Item> findContainerAncestors​(java.util.Collection<nuix.Item> items)
        -
        Resolves provided items to kind container ancestor items. Items which do not have a - physical file ancestor will yield nothing in the result.
        -
        -
        Parameters:
        -
        items - Items to resolve to kind container ancestors
        -
        Returns:
        -
        Any kind container ancestors located for the provided items
        -
        -
        -
      • -
      • -
        -

        findContainerFamilies

        -
        public static java.util.Set<nuix.Item> findContainerFamilies​(java.util.Collection<nuix.Item> items)
        -
        Similar to ItemUtility.findFamilies, but rather than finding the descendants of top level items - this examines the ancestors of provided items looking for an ancestor which is kind container - (Item.isKind("container") returns true). If a given item is not found to have a kind container ancestor - then it will yield no "family" and not be included in the result.
        -
        -
        Parameters:
        -
        items - The items to resolve to container "families"
        -
        Returns:
        -
        Kind container items and their descendants based on provided items. It is possible a provided - item is not present in the result if it does not have a kind container ancestor.
        -
        -
        -
      • -
      • -
        -

        calculateTotalAuditedSize

        -
        public static long calculateTotalAuditedSize​(java.util.Collection<nuix.Item> items)
        -
        Convenience method to calculate to the total audited size (in bytes) of a provided collection of items.
        -
        -
        Parameters:
        -
        items - The items which you wish to sum the total audited size of.
        -
        Returns:
        -
        The total audited size of the items in bytes.
        -
        -
        -
      • -
      -
      -
    • -
    -
    -
    - -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/class-use/AddressStatistics.html b/docs/com/nuix/nx/collections/class-use/AddressStatistics.html deleted file mode 100644 index fa85d31..0000000 --- a/docs/com/nuix/nx/collections/class-use/AddressStatistics.html +++ /dev/null @@ -1,163 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.collections.AddressStatistics - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.collections.AddressStatistics

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use AddressStatistics 
    PackageDescription
    com.nuix.nx.collections 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/class-use/NxItemUtility.html b/docs/com/nuix/nx/collections/class-use/NxItemUtility.html deleted file mode 100644 index be32514..0000000 --- a/docs/com/nuix/nx/collections/class-use/NxItemUtility.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.collections.NxItemUtility - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.collections.NxItemUtility

    -
    -
    No usage of com.nuix.nx.collections.NxItemUtility
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/package-frame.html b/docs/com/nuix/nx/collections/package-frame.html deleted file mode 100644 index d160b7b..0000000 --- a/docs/com/nuix/nx/collections/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -com.nuix.nx.collections - - - - -

    com.nuix.nx.collections

    - - - diff --git a/docs/com/nuix/nx/collections/package-summary.html b/docs/com/nuix/nx/collections/package-summary.html deleted file mode 100644 index 626246b..0000000 --- a/docs/com/nuix/nx/collections/package-summary.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - -com.nuix.nx.collections - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Package com.nuix.nx.collections

    -
    -
    -
    -
      -
    • -
      - - - - - - - - - - - - - - - - - - -
      Class Summary 
      ClassDescription
      AddressStatistics -
      Helper class which provides some convenience methods for working with Nuix Address collections.
      -
      NxItemUtility -
      Convenience methods for some common operations that are not offered currently - in the Nuix API
      -
      -
      -
    • -
    -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/package-tree.html b/docs/com/nuix/nx/collections/package-tree.html deleted file mode 100644 index 5665267..0000000 --- a/docs/com/nuix/nx/collections/package-tree.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - -com.nuix.nx.collections Class Hierarchy - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Hierarchy For Package com.nuix.nx.collections

    -Package Hierarchies: - -
    -
    -
    -

    Class Hierarchy

    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/collections/package-use.html b/docs/com/nuix/nx/collections/package-use.html deleted file mode 100644 index 52c65c9..0000000 --- a/docs/com/nuix/nx/collections/package-use.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.collections - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.collections

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.collections 
    PackageDescription
    com.nuix.nx.collections 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/BatchExporterLoadFileSettings.html b/docs/com/nuix/nx/controls/BatchExporterLoadFileSettings.html index ee6a0c7..a64374a 100644 --- a/docs/com/nuix/nx/controls/BatchExporterLoadFileSettings.html +++ b/docs/com/nuix/nx/controls/BatchExporterLoadFileSettings.html @@ -3,36 +3,45 @@ -BatchExporterLoadFileSettings +BatchExporterLoadFileSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            BatchExporterLoadFileSettings

            -
            public BatchExporterLoadFileSettings()
            -
            +

            BatchExporterLoadFileSettings

            +
            public BatchExporterLoadFileSettings()
          -
    • +
    +
    -
  • -
    +
    +
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/BatchExporterNativeSettings.html b/docs/com/nuix/nx/controls/BatchExporterNativeSettings.html index d722ff5..031c427 100644 --- a/docs/com/nuix/nx/controls/BatchExporterNativeSettings.html +++ b/docs/com/nuix/nx/controls/BatchExporterNativeSettings.html @@ -3,36 +3,45 @@ -BatchExporterNativeSettings +BatchExporterNativeSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            BatchExporterNativeSettings

            -
            public BatchExporterNativeSettings()
            -
            +

            BatchExporterNativeSettings

            +
            public BatchExporterNativeSettings()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + + + + + +
      • -
        -

        getTxtPath

        -
        public javax.swing.JTextField getTxtPath()
        -
        +

        getTxtPath

        +
        public javax.swing.JTextField getTxtPath()
      • +
      + + + +
      • -
        -

        getTxtSuffix

        -
        public javax.swing.JTextField getTxtSuffix()
        -
        +

        getTxtSuffix

        +
        public javax.swing.JTextField getTxtSuffix()
      • +
      + + + + + + + +
      • -
        -

        getChckbxIncludeAttachments

        -
        public javax.swing.JCheckBox getChckbxIncludeAttachments()
        -
        +

        getChckbxIncludeAttachments

        +
        public javax.swing.JCheckBox getChckbxIncludeAttachments()
      • +
      + + + +
      • -
        -

        getChckbxRegenerateStored

        -
        public javax.swing.JCheckBox getChckbxRegenerateStored()
        -
        +

        getChckbxRegenerateStored

        +
        public javax.swing.JCheckBox getChckbxRegenerateStored()
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/BatchExporterPdfSettings.html b/docs/com/nuix/nx/controls/BatchExporterPdfSettings.html index df0f7b7..496e7c8 100644 --- a/docs/com/nuix/nx/controls/BatchExporterPdfSettings.html +++ b/docs/com/nuix/nx/controls/BatchExporterPdfSettings.html @@ -3,36 +3,45 @@ -BatchExporterPdfSettings +BatchExporterPdfSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            BatchExporterPdfSettings

            -
            public BatchExporterPdfSettings()
            -
            +

            BatchExporterPdfSettings

            +
            public BatchExporterPdfSettings()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + + + + + +
      • -
        -

        getTxtPath

        -
        public javax.swing.JTextField getTxtPath()
        -
        +

        getTxtPath

        +
        public javax.swing.JTextField getTxtPath()
      • +
      + + + +
      • -
        -

        getTxtSuffix

        -
        public javax.swing.JTextField getTxtSuffix()
        -
        +

        getTxtSuffix

        +
        public javax.swing.JTextField getTxtSuffix()
      • +
      + + + +
      • -
        -

        getChckbxRegenerateStored

        -
        public javax.swing.JCheckBox getChckbxRegenerateStored()
        -
        +

        getChckbxRegenerateStored

        +
        public javax.swing.JCheckBox getChckbxRegenerateStored()
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/BatchExporterTextSettings.html b/docs/com/nuix/nx/controls/BatchExporterTextSettings.html index 8c6a7e7..359957b 100644 --- a/docs/com/nuix/nx/controls/BatchExporterTextSettings.html +++ b/docs/com/nuix/nx/controls/BatchExporterTextSettings.html @@ -3,36 +3,45 @@ -BatchExporterTextSettings +BatchExporterTextSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            BatchExporterTextSettings

            -
            public BatchExporterTextSettings()
            -
            +

            BatchExporterTextSettings

            +
            public BatchExporterTextSettings()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + +
      • -
        -

        getChckbxWrapLines

        -
        public javax.swing.JCheckBox getChckbxWrapLines()
        -
        +

        getChckbxWrapLines

        +
        public javax.swing.JCheckBox getChckbxWrapLines()
      • +
      + + + +
      • -
        -

        getSpinnerWrapLength

        -
        public javax.swing.JSpinner getSpinnerWrapLength()
        -
        +

        getSpinnerWrapLength

        +
        public javax.swing.JSpinner getSpinnerWrapLength()
      • +
      + + + +
      • -
        -

        getChckbxPerPage

        -
        public javax.swing.JCheckBox getChckbxPerPage()
        -
        +

        getChckbxPerPage

        +
        public javax.swing.JCheckBox getChckbxPerPage()
      • +
      + + + + + + + + + + + + + + + +
      • -
        -

        getTxtPath

        -
        public javax.swing.JTextField getTxtPath()
        -
        +

        getTxtPath

        +
        public javax.swing.JTextField getTxtPath()
      • +
      + + + +
      • -
        -

        getTxtSuffix

        -
        public javax.swing.JTextField getTxtSuffix()
        -
        +

        getTxtSuffix

        +
        public javax.swing.JTextField getTxtSuffix()
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/BatchExporterTraversalSettings.html b/docs/com/nuix/nx/controls/BatchExporterTraversalSettings.html index 896b1d2..f2d4372 100644 --- a/docs/com/nuix/nx/controls/BatchExporterTraversalSettings.html +++ b/docs/com/nuix/nx/controls/BatchExporterTraversalSettings.html @@ -3,36 +3,45 @@ -BatchExporterTraversalSettings +BatchExporterTraversalSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            BatchExporterTraversalSettings

            -
            public BatchExporterTraversalSettings()
            -
            +

            BatchExporterTraversalSettings

            +
            public BatchExporterTraversalSettings()
          -
    • +
    +
    -
  • -
    +
    +
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/ButtonRow.html b/docs/com/nuix/nx/controls/ButtonRow.html index 529a800..976b60d 100644 --- a/docs/com/nuix/nx/controls/ButtonRow.html +++ b/docs/com/nuix/nx/controls/ButtonRow.html @@ -3,36 +3,45 @@ -ButtonRow +ButtonRow (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
    +
    -
  • -
    +
    +
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/ChoiceTableControl.html b/docs/com/nuix/nx/controls/ChoiceTableControl.html index eec30fc..b734101 100644 --- a/docs/com/nuix/nx/controls/ChoiceTableControl.html +++ b/docs/com/nuix/nx/controls/ChoiceTableControl.html @@ -3,36 +3,45 @@ -ChoiceTableControl +ChoiceTableControl (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • + + +

        Constructor Detail

        + -

        Constructor Details

        • -
          -

          ChoiceTableControl

          -
          public ChoiceTableControl()
          -
          +

          ChoiceTableControl

          +
          public ChoiceTableControl()
        • +
        + + + +
        • -
          -

          ChoiceTableControl

          -
          public ChoiceTableControl​(java.lang.String choiceTypeName)
          -
          +

          ChoiceTableControl

          +
          public ChoiceTableControl​(java.lang.String choiceTypeName)
        -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        constrainFirstColumn

        -
        public void constrainFirstColumn()
        -
        +

        constrainFirstColumn

        +
        public void constrainFirstColumn()
      • +
      + + + + + + + + + + + +
      • -
        -

        setChoices

        -
        public void setChoices​(java.util.List<Choice<T>> choices)
        -
        +

        setChoices

        +
        public void setChoices​(java.util.List<Choice<T>> choices)
      • +
      + + + +
      • -
        -

        setValues

        -
        public void setValues​(java.util.List<T> values)
        -
        +

        setValues

        +
        public void setValues​(java.util.List<T> values)
      • +
      + + + +
      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + +
      • -
        -

        setFilter

        -
        public void setFilter​(java.lang.String filterString)
        -
        +

        setFilter

        +
        public void setFilter​(java.lang.String filterString)
      • +
      + + + +
      • -
        -

        fitColumns

        -
        public void fitColumns()
        -
        +

        fitColumns

        +
        public void fitColumns()
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/ComboItem.html b/docs/com/nuix/nx/controls/ComboItem.html index f5a5e6a..861520a 100644 --- a/docs/com/nuix/nx/controls/ComboItem.html +++ b/docs/com/nuix/nx/controls/ComboItem.html @@ -3,36 +3,45 @@ -ComboItem +ComboItem (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/ComboItemBox.html b/docs/com/nuix/nx/controls/ComboItemBox.html index fbfea3d..044985b 100644 --- a/docs/com/nuix/nx/controls/ComboItemBox.html +++ b/docs/com/nuix/nx/controls/ComboItemBox.html @@ -3,36 +3,45 @@ -ComboItemBox +ComboItemBox (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            ComboItemBox

            -
            public ComboItemBox()
            -
            +

            ComboItemBox

            +
            public ComboItemBox()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        setValues

        -
        public void setValues​(java.util.List<ComboItem> values)
        +

        setValues

        +
        public void setValues​(java.util.List<ComboItem> values)
        Sets the values displayed in the combo box, then selects the first value
        Parameters:
        values - List of ComboItem representing choices in the combo box
        -
      • +
      + + + +
      • -
        -

        addValue

        -
        public void addValue​(ComboItem value)
        +

        addValue

        +
        public void addValue​(ComboItem value)
        Adds a single ComboItem item as a value to the combo box
        Parameters:
        value - A single ComboItem value to add to the combo box
        -
      • +
      + + + +
      • -
        -

        addValue

        -
        public void addValue​(java.lang.String label, -java.lang.String value)
        +

        addValue

        +
        public void addValue​(java.lang.String label,
        +                     java.lang.String value)
        Convenience method for adding an entry to the combo box.
        Parameters:
        label - The label (value seen by user)
        value - The value that is returned when selected
        -
      • +
      + + + + + + + +
      • -
        -

        getSelectedLabel

        -
        public java.lang.String getSelectedLabel()
        -
        +

        getSelectedLabel

        +
        public java.lang.String getSelectedLabel()
      • +
      + + + +
      • -
        -

        getSelectedValue

        -
        public java.lang.String getSelectedValue()
        -
        +

        getSelectedValue

        +
        public java.lang.String getSelectedValue()
      • +
      + + + + + + + +
      • -
        -

        setSelectedLabel

        -
        public void setSelectedLabel​(java.lang.String label)
        -
        +

        setSelectedLabel

        +
        public void setSelectedLabel​(java.lang.String label)
      • +
      + + + +
      • -
        -

        setSelectedValue

        -
        public void setSelectedValue​(java.lang.String value)
        -
        +

        setSelectedValue

        +
        public void setSelectedValue​(java.lang.String value)
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/CsvTable.html b/docs/com/nuix/nx/controls/CsvTable.html index fc20a6e..63ca91a 100644 --- a/docs/com/nuix/nx/controls/CsvTable.html +++ b/docs/com/nuix/nx/controls/CsvTable.html @@ -3,36 +3,45 @@ -CsvTable +CsvTable (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            CsvTable

            -
            public CsvTable​(java.util.List<java.lang.String> headers)
            -
            +

            CsvTable

            +
            public CsvTable​(java.util.List<java.lang.String> headers)
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        getHeaders

        -
        public java.util.List<java.lang.String> getHeaders()
        -
        +

        getHeaders

        +
        public java.util.List<java.lang.String> getHeaders()
      • +
      + + + +
      • -
        -

        getRecords

        -
        public java.util.List<java.util.Map<java.lang.String,​java.lang.String>> getRecords()
        -
        +

        getRecords

        +
        public java.util.List<java.util.Map<java.lang.String,​java.lang.String>> getRecords()
      • +
      + + + +
      • -
        -

        addRecord

        -
        public void addRecord​(java.util.Map<java.lang.String,​java.lang.String> record)
        -
        +

        addRecord

        +
        public void addRecord​(java.util.Map<java.lang.String,​java.lang.String> record)
      • +
      + + + +
      • -
        -

        getTable

        -
        public javax.swing.JTable getTable()
        -
        +

        getTable

        +
        public javax.swing.JTable getTable()
      • +
      + + + +
      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + +
      • -
        -

        getDefaultImportDirectory

        -
        public java.lang.String getDefaultImportDirectory()
        -
        +

        getDefaultImportDirectory

        +
        public java.lang.String getDefaultImportDirectory()
      • +
      + + + +
      • -
        -

        setDefaultImportDirectory

        -
        public void setDefaultImportDirectory​(java.lang.String defaultImportDirectory)
        -
        +

        setDefaultImportDirectory

        +
        public void setDefaultImportDirectory​(java.lang.String defaultImportDirectory)
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/DataProcessingSettingsControl.html b/docs/com/nuix/nx/controls/DataProcessingSettingsControl.html index 7199c07..5b43990 100644 --- a/docs/com/nuix/nx/controls/DataProcessingSettingsControl.html +++ b/docs/com/nuix/nx/controls/DataProcessingSettingsControl.html @@ -3,36 +3,45 @@ -DataProcessingSettingsControl +DataProcessingSettingsControl (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            DataProcessingSettingsControl

            -
            public DataProcessingSettingsControl()
            -
            +

            DataProcessingSettingsControl

            +
            public DataProcessingSettingsControl()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        getSettings

        -
        public java.util.Map<java.lang.String,​java.lang.Object> getSettings()
        +

        getSettings

        +
        public java.util.Map<java.lang.String,​java.lang.Object> getSettings()
        Gets the settings represented by this control as a Map which could be passed directly to Nuix via Processing.setProcessingSettings
        Returns:
        A Map of processing settings compatible with Processing.setProcessingSettings
        -
      • +
      + + + +
      • -
        -

        loadSettings

        -
        public void loadSettings​(java.util.Map<java.lang.String,​java.lang.Object> settings)
        +

        loadSettings

        +
        public void loadSettings​(java.util.Map<java.lang.String,​java.lang.Object> settings)
        Loads settings Map into the control. Map format should be compatible with Processor.setProcessingSettings
        Parameters:
        settings - A Map of processing settings compatible with Processor.setProcessingSettings
        -
      • +
      + + + +
      • -
        -

        getSettingsJSON

        -
        public java.lang.String getSettingsJSON()
        +

        getSettingsJSON

        +
        public java.lang.String getSettingsJSON()
        Gets the settings represented by this control as a JSON string
        Returns:
        The settings as a JSON string
        -
      • +
      + + + +
      • -
        -

        saveJSONFile

        -
        public void saveJSONFile​(java.io.File filePath) - throws java.lang.Exception
        +

        saveJSONFile

        +
        public void saveJSONFile​(java.io.File filePath)
        +                  throws java.lang.Exception
        Saves the settings represented by this control as a JSON file
        Parameters:
        @@ -404,13 +506,16 @@

        saveJSONFile

        Throws:
        java.lang.Exception - Thrown if something goes wrong
        -
      • +
      + + + +
      • -
        -

        saveJSONFile

        -
        public void saveJSONFile​(java.lang.String filePath) - throws java.lang.Exception
        +

        saveJSONFile

        +
        public void saveJSONFile​(java.lang.String filePath)
        +                  throws java.lang.Exception
        Saves the settings represented by this control as a JSON file
        Parameters:
        @@ -418,24 +523,30 @@

        saveJSONFile

        Throws:
        java.lang.Exception - Thrown if something goes wrong
        -
      • +
      + + + +
      • -
        -

        loadSettingsJSON

        -
        public void loadSettingsJSON​(java.lang.String json)
        +

        loadSettingsJSON

        +
        public void loadSettingsJSON​(java.lang.String json)
        Loads settings into the control from a JSON string
        Parameters:
        json - The JSON string of settings to load
        -
      • +
      + + + +
      • -
        -

        loadSettingsJSONFile

        -
        public void loadSettingsJSONFile​(java.lang.String filePath) - throws java.lang.Exception
        +

        loadSettingsJSONFile

        +
        public void loadSettingsJSONFile​(java.lang.String filePath)
        +                          throws java.lang.Exception
        Loads settings into the control from a JSON file
        Parameters:
        @@ -443,13 +554,16 @@

        loadSettingsJSONFile

        Throws:
        java.lang.Exception - Thrown if something goes wrong
        -
      • +
      + + + +
      • -
        -

        loadSettingsJSONFile

        -
        public void loadSettingsJSONFile​(java.io.File filePath) - throws java.lang.Exception
        +

        loadSettingsJSONFile

        +
        public void loadSettingsJSONFile​(java.io.File filePath)
        +                          throws java.lang.Exception
        Loads settings into the control from a JSON file
        Parameters:
        @@ -457,76 +571,110 @@

        loadSettingsJSONFile

        Throws:
        java.lang.Exception - Thrown if something goes wrong
        -
      • +
      + + + +
      • -
        -

        clearSettings

        -
        public void clearSettings()
        +

        clearSettings

        +
        public void clearSettings()
        Clears the settings of this control. All check boxes are unchecked, max binary size is set to 1000MB, max digest size is set to 250MB,
        -
      • +
      + + + +
      • -
        -

        loadDefaultSettings

        -
        public void loadDefaultSettings()
        -
        +

        loadDefaultSettings

        +
        public void loadDefaultSettings()
      • +
      + + + +
      • -
        -

        getDefaultSettings

        -
        public java.util.Map<java.lang.String,​java.lang.Object> getDefaultSettings()
        -
        +

        getDefaultSettings

        +
        public java.util.Map<java.lang.String,​java.lang.Object> getDefaultSettings()
      • +
      + + + +
      • -
        -

        setDefaultSettings

        -
        public void setDefaultSettings​(java.util.Map<java.lang.String,​java.lang.Object> defaultSettings)
        -
        +

        setDefaultSettings

        +
        public void setDefaultSettings​(java.util.Map<java.lang.String,​java.lang.Object> defaultSettings)
      • +
      + + + +
      • -
        -

        setDefaultSettingsFromJSON

        -
        public void setDefaultSettingsFromJSON​(java.lang.String json)
        -
        +

        setDefaultSettingsFromJSON

        +
        public void setDefaultSettingsFromJSON​(java.lang.String json)
      • +
      + + + +
      • -
        -

        setDefaultSettingsFromJSONFile

        -
        public void setDefaultSettingsFromJSONFile​(java.lang.String filePath) - throws java.lang.Exception
        +

        setDefaultSettingsFromJSONFile

        +
        public void setDefaultSettingsFromJSONFile​(java.lang.String filePath)
        +                                    throws java.lang.Exception
        Throws:
        java.lang.Exception
        -
      • +
      + + + +
      • -
        -

        setDefaultSettingsFromJSONFile

        -
        public void setDefaultSettingsFromJSONFile​(java.io.File filePath) - throws java.lang.Exception
        +

        setDefaultSettingsFromJSONFile

        +
        public void setDefaultSettingsFromJSONFile​(java.io.File filePath)
        +                                    throws java.lang.Exception
        Throws:
        java.lang.Exception
        -
      • +
      + + + +
      • -
        -

        hideSaveLoadResetButtons

        -
        public void hideSaveLoadResetButtons()
        -
        +

        initDataBindings

        +
        protected void initDataBindings()
        +
      • +
      + + + +
        +
      • +

        hideSaveLoadResetButtons

        +
        public void hideSaveLoadResetButtons()
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/DisablingGlassPaneWrapper.html b/docs/com/nuix/nx/controls/DisablingGlassPaneWrapper.html index 304100e..00209cc 100644 --- a/docs/com/nuix/nx/controls/DisablingGlassPaneWrapper.html +++ b/docs/com/nuix/nx/controls/DisablingGlassPaneWrapper.html @@ -3,36 +3,45 @@ -DisablingGlassPaneWrapper +DisablingGlassPaneWrapper (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            DisablingGlassPaneWrapper

            -
            public DisablingGlassPaneWrapper​(javax.swing.JComponent myPanel)
            -
            +

            DisablingGlassPaneWrapper

            +
            public DisablingGlassPaneWrapper​(javax.swing.JComponent myPanel)
          -
    • +
    +
    -
  • -
    +
    +
      +
    • -

      Method Details

      -
        +

        Method Detail

        + + + +
        • -
          -

          activateGlassPane

          -
          public void activateGlassPane​(boolean activate)
          -
          +

          activateGlassPane

          +
          public void activateGlassPane​(boolean activate)
        -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/DynamicTableControl.html b/docs/com/nuix/nx/controls/DynamicTableControl.html index b8762ac..f306354 100644 --- a/docs/com/nuix/nx/controls/DynamicTableControl.html +++ b/docs/com/nuix/nx/controls/DynamicTableControl.html @@ -3,36 +3,45 @@ -DynamicTableControl +DynamicTableControl (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            DynamicTableControl

            -
            public DynamicTableControl​(java.util.List<java.lang.String> headers, -java.util.List<java.lang.Object> records, -DynamicTableValueCallback valueCallback)
            -
            +

            DynamicTableControl

            +
            public DynamicTableControl​(java.util.List<java.lang.String> headers,
            +                           java.util.List<java.lang.Object> records,
            +                           DynamicTableValueCallback valueCallback)
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      + + + + + + + +
      • -
        -

        setTableCellRenderer

        -
        public void setTableCellRenderer​(@NotNull -java.lang.Class<?> type, -@NotNull -javax.swing.table.TableCellRenderer renderer)
        +

        setTableCellRenderer

        +
        public void setTableCellRenderer​(@NotNull
        +                                 @NotNull java.lang.Class<?> type,
        +                                 @NotNull
        +                                 @NotNull javax.swing.table.TableCellRenderer renderer)
        Set the TableCellRenderer to be used to render data of the provided type.
        Parameters:
        @@ -379,88 +473,122 @@

        + + +
        • -
          -

          setEnabled

          -
          public void setEnabled​(boolean value)
          +

          setEnabled

          +
          public void setEnabled​(boolean value)
          Overrides:
          setEnabled in class javax.swing.JComponent
          -
        • +
        + + + +
        • -
          -

          setFilter

          -
          public void setFilter​(java.lang.String filterString)
          -
          +

          setFilter

          +
          public void setFilter​(java.lang.String filterString)
        • +
        + + + +
        • -
          -

          setCheckedAtIndex

          -
          public void setCheckedAtIndex​(int index, -boolean value)
          -
          +

          setCheckedAtIndex

          +
          public void setCheckedAtIndex​(int index,
          +                              boolean value)
        • +
        + + + +
        • -
          -

          getCheckedRecords

          -
          public java.util.List<java.lang.Object> getCheckedRecords()
          -
          +

          getCheckedRecords

          +
          public java.util.List<java.lang.Object> getCheckedRecords()
        • +
        + + + +
        • -
          -

          getRecords

          -
          public java.util.List<java.lang.Object> getRecords()
          -
          +

          getRecords

          +
          public java.util.List<java.lang.Object> getRecords()
        • +
        + + + +
        • -
          -

          setRecords

          -
          public void setRecords​(java.util.List<java.lang.Object> records)
          -
          +

          setRecords

          +
          public void setRecords​(java.util.List<java.lang.Object> records)
        • +
        + + + + + + + +
        • -
          -

          getTable

          -
          public org.jdesktop.swingx.JXTable getTable()
          -
          +

          getTable

          +
          public org.jdesktop.swingx.JXTable getTable()
        • +
        + + + +
        • -
          -

          setUserCanAddRecords

          -
          public void setUserCanAddRecords​(boolean value, -java.util.function.Supplier<java.lang.Object> callback)
          -
          +

          setUserCanAddRecords

          +
          public void setUserCanAddRecords​(boolean value,
          +                                 java.util.function.Supplier<java.lang.Object> callback)
        • +
        + + + +
        • -
          -

          setDefaultCheckState

          -
          public void setDefaultCheckState​(boolean defaultCheckState)
          -
          +

          setDefaultCheckState

          +
          public void setDefaultCheckState​(boolean defaultCheckState)
        • +
        + + + +
        • -
          -

          getBtnAddRecord

          -
          public javax.swing.JButton getBtnAddRecord()
          -
          +

          getBtnAddRecord

          +
          public javax.swing.JButton getBtnAddRecord()
        -

    +
  • + + - + - - diff --git a/docs/com/nuix/nx/controls/LocalWorkerSettings.html b/docs/com/nuix/nx/controls/LocalWorkerSettings.html index 4ee32f8..1777676 100644 --- a/docs/com/nuix/nx/controls/LocalWorkerSettings.html +++ b/docs/com/nuix/nx/controls/LocalWorkerSettings.html @@ -3,36 +3,45 @@ -LocalWorkerSettings +LocalWorkerSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            LocalWorkerSettings

            -
            public LocalWorkerSettings()
            -
            +

            LocalWorkerSettings

            +
            public LocalWorkerSettings()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + +
      • -
        -

        getWorkerCount

        -
        public int getWorkerCount()
        -
        +

        getWorkerCount

        +
        public int getWorkerCount()
      • +
      + + + +
      • -
        -

        setWorkerCount

        -
        public void setWorkerCount​(int value)
        -
        +

        setWorkerCount

        +
        public void setWorkerCount​(int value)
      • +
      + + + +
      • -
        -

        getMemoryPerWorker

        -
        public int getMemoryPerWorker()
        -
        +

        getMemoryPerWorker

        +
        public int getMemoryPerWorker()
      • +
      + + + +
      • -
        -

        setMemoryPerWorker

        -
        public void setMemoryPerWorker​(int value)
        -
        +

        setMemoryPerWorker

        +
        public void setMemoryPerWorker​(int value)
      • +
      + + + +
      • -
        -

        setWorkerTempDirectory

        -
        public void setWorkerTempDirectory​(java.lang.String value)
        -
        +

        setWorkerTempDirectory

        +
        public void setWorkerTempDirectory​(java.lang.String value)
      • +
      + + + +
      • -
        -

        getWorkerTempDirectory

        -
        public java.lang.String getWorkerTempDirectory()
        -
        +

        getWorkerTempDirectory

        +
        public java.lang.String getWorkerTempDirectory()
      • +
      + + + +
      • -
        -

        getWorkerTempDirectoryFile

        -
        public java.io.File getWorkerTempDirectoryFile()
        -
        +

        getWorkerTempDirectoryFile

        +
        public java.io.File getWorkerTempDirectoryFile()
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/MultipleChoiceComboBox.html b/docs/com/nuix/nx/controls/MultipleChoiceComboBox.html index cc081bd..92d89a8 100644 --- a/docs/com/nuix/nx/controls/MultipleChoiceComboBox.html +++ b/docs/com/nuix/nx/controls/MultipleChoiceComboBox.html @@ -3,36 +3,45 @@ -MultipleChoiceComboBox +MultipleChoiceComboBox (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            MultipleChoiceComboBox

            -
            public MultipleChoiceComboBox()
            -
            +

            MultipleChoiceComboBox

            +
            public MultipleChoiceComboBox()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        setChoices

        -
        public void setChoices​(java.util.List<java.lang.String> choices)
        +

        setChoices

        +
        public void setChoices​(java.util.List<java.lang.String> choices)
        Sets the list of choices offered to the user.
        Parameters:
        choices - List of string choices.
        -
      • +
      + + + +
      • -
        -

        setCheckedChoices

        -
        public void setCheckedChoices​(java.util.List<java.lang.String> checkedChoices)
        +

        setCheckedChoices

        +
        public void setCheckedChoices​(java.util.List<java.lang.String> checkedChoices)
        Sets which of the possible choices are currently checked.
        Parameters:
        checkedChoices - List of string choices to be checked, choices not in this list will be unchecked.
        -
      • +
      + + + +
      • -
        -

        getCheckedChoices

        -
        public java.util.List<java.lang.String> getCheckedChoices()
        +

        getCheckedChoices

        +
        public java.util.List<java.lang.String> getCheckedChoices()
        Gets a list of which choices are currently checked.
        Returns:
        List of choices currently checked.
        -
      • +
      + + + +
      • -
        -

        checkAll

        -
        public void checkAll()
        +

        checkAll

        +
        public void checkAll()
        Checks all available choices.
        -
      • +
      + + + +
      • -
        -

        uncheckAll

        -
        public void uncheckAll()
        +

        uncheckAll

        +
        public void uncheckAll()
        Unchecks all available choices.
        -
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/OcrSettings.html b/docs/com/nuix/nx/controls/OcrSettings.html index bc3f46e..5c6bb93 100644 --- a/docs/com/nuix/nx/controls/OcrSettings.html +++ b/docs/com/nuix/nx/controls/OcrSettings.html @@ -3,36 +3,45 @@ -OcrSettings +OcrSettings (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            OcrSettings

            -
            public OcrSettings()
            -
            +

            OcrSettings

            +
            public OcrSettings()
          -
    • +
    +
    -
  • -
    +
    +
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/PathList.html b/docs/com/nuix/nx/controls/PathList.html index 274809b..b53f46d 100644 --- a/docs/com/nuix/nx/controls/PathList.html +++ b/docs/com/nuix/nx/controls/PathList.html @@ -3,36 +3,45 @@ -PathList +PathList (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            PathList

            -
            public PathList()
            -
            +

            PathList

            +
            public PathList()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        getPaths

        -
        public java.util.List<java.lang.String> getPaths()
        -
        +

        getPaths

        +
        public java.util.List<java.lang.String> getPaths()
      • +
      + + + +
      • -
        -

        getPathFiles

        -
        public java.util.List<java.io.File> getPathFiles()
        -
        +

        getPathFiles

        +
        public java.util.List<java.io.File> getPathFiles()
      • +
      + + + +
      • -
        -

        setPaths

        -
        public void setPaths​(java.util.List<java.lang.String> paths)
        -
        +

        setPaths

        +
        public void setPaths​(java.util.List<java.lang.String> paths)
      • +
      + + + +
      • -
        -

        addPath

        -
        public void addPath​(java.lang.String path)
        -
        +

        addPath

        +
        public void addPath​(java.lang.String path)
      • +
      + + + +
      • -
        -

        setFilesButtonVisible

        -
        public void setFilesButtonVisible​(boolean value)
        -
        +

        setFilesButtonVisible

        +
        public void setFilesButtonVisible​(boolean value)
      • +
      + + + +
      • -
        -

        setDirectoriesButtonVisible

        -
        public void setDirectoriesButtonVisible​(boolean value)
        -
        +

        setDirectoriesButtonVisible

        +
        public void setDirectoriesButtonVisible​(boolean value)
      • +
      + + + +
      • -
        -

        getBtnImportTextFile

        -
        public javax.swing.JButton getBtnImportTextFile()
        -
        +

        getBtnImportTextFile

        +
        public javax.swing.JButton getBtnImportTextFile()
      • +
      + + + +
      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/PathSelectedCallback.html b/docs/com/nuix/nx/controls/PathSelectedCallback.html index e1b896b..46352ab 100644 --- a/docs/com/nuix/nx/controls/PathSelectedCallback.html +++ b/docs/com/nuix/nx/controls/PathSelectedCallback.html @@ -3,36 +3,45 @@ -PathSelectedCallback +PathSelectedCallback (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/PathSelectionControl.ChooserType.html b/docs/com/nuix/nx/controls/PathSelectionControl.ChooserType.html index c99a733..a110de6 100644 --- a/docs/com/nuix/nx/controls/PathSelectionControl.ChooserType.html +++ b/docs/com/nuix/nx/controls/PathSelectionControl.ChooserType.html @@ -3,36 +3,45 @@ -PathSelectionControl.ChooserType +PathSelectionControl.ChooserType (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/PathSelectionControl.html b/docs/com/nuix/nx/controls/PathSelectionControl.html index 1fcabb1..e89ee21 100644 --- a/docs/com/nuix/nx/controls/PathSelectionControl.html +++ b/docs/com/nuix/nx/controls/PathSelectionControl.html @@ -3,36 +3,45 @@ -PathSelectionControl +PathSelectionControl (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
    +
    +
    +
      +
    • + + +

      Method Detail

      + + + + + -

      Method Details

      + + + +
      • -
        -

        setPath

        -
        public void setPath​(java.lang.String path)
        -
        +

        setPath

        +
        public void setPath​(java.lang.String path)
      • +
      + + + +
      • -
        -

        getPath

        -
        public java.lang.String getPath()
        -
        +

        getPath

        +
        public java.lang.String getPath()
      • +
      + + + +
      • -
        -

        getPathFile

        -
        public java.io.File getPathFile()
        -
        +

        getPathFile

        +
        public java.io.File getPathFile()
      • +
      + + + +
      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean value)
        +

        setEnabled

        +
        public void setEnabled​(boolean value)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + +
      • -
        -

        setPathFieldEditable

        -
        public void setPathFieldEditable​(boolean value)
        -
        +

        setPathFieldEditable

        +
        public void setPathFieldEditable​(boolean value)
      • +
      + + + +
      • -
        -

        getInitialDirectory

        -
        public java.lang.String getInitialDirectory()
        -
        +

        getInitialDirectory

        +
        public java.lang.String getInitialDirectory()
      • +
      + + + +
      • -
        -

        setInitialDirectory

        -
        public void setInitialDirectory​(java.lang.String initialDirectory)
        -
        +

        setInitialDirectory

        +
        public void setInitialDirectory​(java.lang.String initialDirectory)
      -
    + + + - + - - diff --git a/docs/com/nuix/nx/controls/ProcessingFinishedListener.html b/docs/com/nuix/nx/controls/ProcessingFinishedListener.html index fc38410..3f6a0cc 100644 --- a/docs/com/nuix/nx/controls/ProcessingFinishedListener.html +++ b/docs/com/nuix/nx/controls/ProcessingFinishedListener.html @@ -3,36 +3,45 @@ -ProcessingFinishedListener +ProcessingFinishedListener (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/ProcessingStatusControl.html b/docs/com/nuix/nx/controls/ProcessingStatusControl.html index acaa504..653d3cf 100644 --- a/docs/com/nuix/nx/controls/ProcessingStatusControl.html +++ b/docs/com/nuix/nx/controls/ProcessingStatusControl.html @@ -3,36 +3,45 @@ -ProcessingStatusControl +ProcessingStatusControl (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            ProcessingStatusControl

            -
            public ProcessingStatusControl()
            -
            +

            ProcessingStatusControl

            +
            public ProcessingStatusControl()
          -
    • +
    +
    -
  • -
    +
    +
  • + + + - +
    - - diff --git a/docs/com/nuix/nx/controls/ReportDisplayPanel.ReportDataChangeListener.html b/docs/com/nuix/nx/controls/ReportDisplayPanel.ReportDataChangeListener.html index b4ea16a..893f509 100644 --- a/docs/com/nuix/nx/controls/ReportDisplayPanel.ReportDataChangeListener.html +++ b/docs/com/nuix/nx/controls/ReportDisplayPanel.ReportDataChangeListener.html @@ -3,36 +3,45 @@ -ReportDisplayPanel.ReportDataChangeListener +ReportDisplayPanel.ReportDataChangeListener (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/ReportDisplayPanel.html b/docs/com/nuix/nx/controls/ReportDisplayPanel.html index 4745845..10aed6a 100644 --- a/docs/com/nuix/nx/controls/ReportDisplayPanel.html +++ b/docs/com/nuix/nx/controls/ReportDisplayPanel.html @@ -3,36 +3,45 @@ -ReportDisplayPanel +ReportDisplayPanel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
    +
    -
  • -
    +
    +
      +
    • -

      Method Details

      -
        +

        Method Detail

        + + + + -
  • + + + - +
    - - diff --git a/docs/com/nuix/nx/controls/StringList.html b/docs/com/nuix/nx/controls/StringList.html index 9062a1c..1f5cf28 100644 --- a/docs/com/nuix/nx/controls/StringList.html +++ b/docs/com/nuix/nx/controls/StringList.html @@ -3,36 +3,45 @@ -StringList +StringList (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            StringList

            -
            public StringList()
            -
            +

            StringList

            +
            public StringList()
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        getValues

        -
        public java.util.List<java.lang.String> getValues()
        +

        getValues

        +
        public java.util.List<java.lang.String> getValues()
        Gets the current values of the list.
        Returns:
        The current values of the list.
        -
      • +
      + + + +
      • -
        -

        setValues

        -
        public void setValues​(java.util.List<java.lang.String> values)
        +

        setValues

        +
        public void setValues​(java.util.List<java.lang.String> values)
        Sets the values of the list.
        Parameters:
        values - The new values of the list.
        -
      • +
      + + + +
      • -
        -

        addValue

        -
        public void addValue​(java.lang.String value)
        +

        addValue

        +
        public void addValue​(java.lang.String value)
        Adds a value to the list.
        Parameters:
        value - The value to add.
        -
      • +
      + + + +
      • -
        -

        getBtnImportFile

        -
        public javax.swing.JButton getBtnImportFile()
        -
        +

        getBtnImportFile

        +
        public javax.swing.JButton getBtnImportFile()
      • +
      + + + +
      • -
        -

        setEnabled

        -
        public void setEnabled​(boolean enabled)
        +

        setEnabled

        +
        public void setEnabled​(boolean enabled)
        Overrides:
        setEnabled in class javax.swing.JComponent
        -
      • +
      + + + +
      • -
        -

        setEditable

        -
        public void setEditable​(boolean editable)
        +

        setEditable

        +
        public void setEditable​(boolean editable)
        Sets whether the user is allowed to edit entries.
        Parameters:
        editable - True if the user should be allowed to edit entries, False if not.
        -
      -
  • + + + - + - - diff --git a/docs/com/nuix/nx/controls/class-use/BatchExporterLoadFileSettings.html b/docs/com/nuix/nx/controls/class-use/BatchExporterLoadFileSettings.html deleted file mode 100644 index 9413645..0000000 --- a/docs/com/nuix/nx/controls/class-use/BatchExporterLoadFileSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.BatchExporterLoadFileSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.BatchExporterLoadFileSettings

    -
    -
    No usage of com.nuix.nx.controls.BatchExporterLoadFileSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/BatchExporterNativeSettings.html b/docs/com/nuix/nx/controls/class-use/BatchExporterNativeSettings.html deleted file mode 100644 index f3dcc4f..0000000 --- a/docs/com/nuix/nx/controls/class-use/BatchExporterNativeSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.BatchExporterNativeSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.BatchExporterNativeSettings

    -
    -
    No usage of com.nuix.nx.controls.BatchExporterNativeSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/BatchExporterPdfSettings.html b/docs/com/nuix/nx/controls/class-use/BatchExporterPdfSettings.html deleted file mode 100644 index 007a6f6..0000000 --- a/docs/com/nuix/nx/controls/class-use/BatchExporterPdfSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.BatchExporterPdfSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.BatchExporterPdfSettings

    -
    -
    No usage of com.nuix.nx.controls.BatchExporterPdfSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/BatchExporterTextSettings.html b/docs/com/nuix/nx/controls/class-use/BatchExporterTextSettings.html deleted file mode 100644 index 2023382..0000000 --- a/docs/com/nuix/nx/controls/class-use/BatchExporterTextSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.BatchExporterTextSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.BatchExporterTextSettings

    -
    -
    No usage of com.nuix.nx.controls.BatchExporterTextSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/BatchExporterTraversalSettings.html b/docs/com/nuix/nx/controls/class-use/BatchExporterTraversalSettings.html deleted file mode 100644 index c01a7d9..0000000 --- a/docs/com/nuix/nx/controls/class-use/BatchExporterTraversalSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.BatchExporterTraversalSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.BatchExporterTraversalSettings

    -
    -
    No usage of com.nuix.nx.controls.BatchExporterTraversalSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ButtonRow.html b/docs/com/nuix/nx/controls/class-use/ButtonRow.html deleted file mode 100644 index bc33aff..0000000 --- a/docs/com/nuix/nx/controls/class-use/ButtonRow.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ButtonRow - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ButtonRow

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use ButtonRow 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ChoiceTableControl.html b/docs/com/nuix/nx/controls/class-use/ChoiceTableControl.html deleted file mode 100644 index f2ccea8..0000000 --- a/docs/com/nuix/nx/controls/class-use/ChoiceTableControl.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ChoiceTableControl - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ChoiceTableControl

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ChoiceTableControl 
    PackageDescription
    com.nuix.nx.controls 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ComboItem.html b/docs/com/nuix/nx/controls/class-use/ComboItem.html deleted file mode 100644 index bc7a57a..0000000 --- a/docs/com/nuix/nx/controls/class-use/ComboItem.html +++ /dev/null @@ -1,229 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ComboItem - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ComboItem

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use ComboItem 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ComboItemBox.html b/docs/com/nuix/nx/controls/class-use/ComboItemBox.html deleted file mode 100644 index 775a7e1..0000000 --- a/docs/com/nuix/nx/controls/class-use/ComboItemBox.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ComboItemBox - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ComboItemBox

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ComboItemBox 
    PackageDescription
    com.nuix.nx.controls 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/CsvTable.html b/docs/com/nuix/nx/controls/class-use/CsvTable.html deleted file mode 100644 index 0ef0c52..0000000 --- a/docs/com/nuix/nx/controls/class-use/CsvTable.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.CsvTable - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.CsvTable

    -
    -
    No usage of com.nuix.nx.controls.CsvTable
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/DataProcessingSettingsControl.html b/docs/com/nuix/nx/controls/class-use/DataProcessingSettingsControl.html deleted file mode 100644 index 8de4ca7..0000000 --- a/docs/com/nuix/nx/controls/class-use/DataProcessingSettingsControl.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.DataProcessingSettingsControl - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.DataProcessingSettingsControl

    -
    -
    No usage of com.nuix.nx.controls.DataProcessingSettingsControl
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/DisablingGlassPaneWrapper.html b/docs/com/nuix/nx/controls/class-use/DisablingGlassPaneWrapper.html deleted file mode 100644 index 55bd867..0000000 --- a/docs/com/nuix/nx/controls/class-use/DisablingGlassPaneWrapper.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.DisablingGlassPaneWrapper - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.DisablingGlassPaneWrapper

    -
    -
    No usage of com.nuix.nx.controls.DisablingGlassPaneWrapper
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/DynamicTableControl.html b/docs/com/nuix/nx/controls/class-use/DynamicTableControl.html deleted file mode 100644 index e70a6a3..0000000 --- a/docs/com/nuix/nx/controls/class-use/DynamicTableControl.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.DynamicTableControl - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.DynamicTableControl

    -
    -
    No usage of com.nuix.nx.controls.DynamicTableControl
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/LocalWorkerSettings.html b/docs/com/nuix/nx/controls/class-use/LocalWorkerSettings.html deleted file mode 100644 index 4a1d156..0000000 --- a/docs/com/nuix/nx/controls/class-use/LocalWorkerSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.LocalWorkerSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.LocalWorkerSettings

    -
    -
    No usage of com.nuix.nx.controls.LocalWorkerSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/MultipleChoiceComboBox.html b/docs/com/nuix/nx/controls/class-use/MultipleChoiceComboBox.html deleted file mode 100644 index 1588aa3..0000000 --- a/docs/com/nuix/nx/controls/class-use/MultipleChoiceComboBox.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.MultipleChoiceComboBox - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.MultipleChoiceComboBox

    -
    -
    No usage of com.nuix.nx.controls.MultipleChoiceComboBox
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/OcrSettings.html b/docs/com/nuix/nx/controls/class-use/OcrSettings.html deleted file mode 100644 index f3e2a8b..0000000 --- a/docs/com/nuix/nx/controls/class-use/OcrSettings.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.OcrSettings - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.OcrSettings

    -
    -
    No usage of com.nuix.nx.controls.OcrSettings
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/PathList.html b/docs/com/nuix/nx/controls/class-use/PathList.html deleted file mode 100644 index 8f1476f..0000000 --- a/docs/com/nuix/nx/controls/class-use/PathList.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.PathList - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.PathList

    -
    -
    No usage of com.nuix.nx.controls.PathList
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/PathSelectedCallback.html b/docs/com/nuix/nx/controls/class-use/PathSelectedCallback.html deleted file mode 100644 index c0beda9..0000000 --- a/docs/com/nuix/nx/controls/class-use/PathSelectedCallback.html +++ /dev/null @@ -1,213 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.controls.PathSelectedCallback - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.controls.PathSelectedCallback

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use PathSelectedCallback 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/PathSelectionControl.ChooserType.html b/docs/com/nuix/nx/controls/class-use/PathSelectionControl.ChooserType.html deleted file mode 100644 index 256fb9f..0000000 --- a/docs/com/nuix/nx/controls/class-use/PathSelectionControl.ChooserType.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.PathSelectionControl.ChooserType - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.PathSelectionControl.ChooserType

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use PathSelectionControl.ChooserType 
    PackageDescription
    com.nuix.nx.controls 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/PathSelectionControl.html b/docs/com/nuix/nx/controls/class-use/PathSelectionControl.html deleted file mode 100644 index 9fc98c1..0000000 --- a/docs/com/nuix/nx/controls/class-use/PathSelectionControl.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.PathSelectionControl - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.PathSelectionControl

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use PathSelectionControl 
    PackageDescription
    com.nuix.nx.controls 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ProcessingFinishedListener.html b/docs/com/nuix/nx/controls/class-use/ProcessingFinishedListener.html deleted file mode 100644 index 8b2eb82..0000000 --- a/docs/com/nuix/nx/controls/class-use/ProcessingFinishedListener.html +++ /dev/null @@ -1,190 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.controls.ProcessingFinishedListener - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.controls.ProcessingFinishedListener

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use ProcessingFinishedListener 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ProcessingStatusControl.html b/docs/com/nuix/nx/controls/class-use/ProcessingStatusControl.html deleted file mode 100644 index 3238958..0000000 --- a/docs/com/nuix/nx/controls/class-use/ProcessingStatusControl.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ProcessingStatusControl - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ProcessingStatusControl

    -
    -
    No usage of com.nuix.nx.controls.ProcessingStatusControl
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.ReportDataChangeListener.html b/docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.ReportDataChangeListener.html deleted file mode 100644 index 45ac5f5..0000000 --- a/docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.ReportDataChangeListener.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ReportDisplayPanel.ReportDataChangeListener - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ReportDisplayPanel.ReportDataChangeListener

    -
    -
    No usage of com.nuix.nx.controls.ReportDisplayPanel.ReportDataChangeListener
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.html b/docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.html deleted file mode 100644 index e92ee50..0000000 --- a/docs/com/nuix/nx/controls/class-use/ReportDisplayPanel.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.ReportDisplayPanel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.ReportDisplayPanel

    -
    -
    No usage of com.nuix.nx.controls.ReportDisplayPanel
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/class-use/StringList.html b/docs/com/nuix/nx/controls/class-use/StringList.html deleted file mode 100644 index 8b9aeff..0000000 --- a/docs/com/nuix/nx/controls/class-use/StringList.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.StringList - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.StringList

    -
    -
    No usage of com.nuix.nx.controls.StringList
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.html b/docs/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.html index 4798a99..733e61c 100644 --- a/docs/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.html +++ b/docs/com/nuix/nx/controls/filters/DynamicTableAllRecordsFilter.html @@ -3,36 +3,45 @@ -DynamicTableAllRecordsFilter +DynamicTableAllRecordsFilter (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.html b/docs/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.html index 53ca11d..dee820d 100644 --- a/docs/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.html +++ b/docs/com/nuix/nx/controls/filters/DynamicTableCheckedRecordsFilter.html @@ -3,36 +3,45 @@ -DynamicTableCheckedRecordsFilter +DynamicTableCheckedRecordsFilter (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/filters/DynamicTableContainsFilter.html b/docs/com/nuix/nx/controls/filters/DynamicTableContainsFilter.html index f7c248a..5eba41c 100644 --- a/docs/com/nuix/nx/controls/filters/DynamicTableContainsFilter.html +++ b/docs/com/nuix/nx/controls/filters/DynamicTableContainsFilter.html @@ -3,36 +3,45 @@ -DynamicTableContainsFilter +DynamicTableContainsFilter (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/filters/DynamicTableFilterProvider.html b/docs/com/nuix/nx/controls/filters/DynamicTableFilterProvider.html index 01948c1..8a96e15 100644 --- a/docs/com/nuix/nx/controls/filters/DynamicTableFilterProvider.html +++ b/docs/com/nuix/nx/controls/filters/DynamicTableFilterProvider.html @@ -3,36 +3,45 @@ -DynamicTableFilterProvider +DynamicTableFilterProvider (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/filters/DynamicTableRegexFilter.html b/docs/com/nuix/nx/controls/filters/DynamicTableRegexFilter.html index c7f64be..c3a64ce 100644 --- a/docs/com/nuix/nx/controls/filters/DynamicTableRegexFilter.html +++ b/docs/com/nuix/nx/controls/filters/DynamicTableRegexFilter.html @@ -3,36 +3,45 @@ -DynamicTableRegexFilter +DynamicTableRegexFilter (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.html b/docs/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.html index d66d41b..a7adba5 100644 --- a/docs/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.html +++ b/docs/com/nuix/nx/controls/filters/DynamicTableUncheckedRecordsFilter.html @@ -3,36 +3,45 @@ -DynamicTableUncheckedRecordsFilter +DynamicTableUncheckedRecordsFilter (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableAllRecordsFilter.html b/docs/com/nuix/nx/controls/filters/class-use/DynamicTableAllRecordsFilter.html deleted file mode 100644 index 41400b0..0000000 --- a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableAllRecordsFilter.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.filters.DynamicTableAllRecordsFilter - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.filters.DynamicTableAllRecordsFilter

    -
    -
    No usage of com.nuix.nx.controls.filters.DynamicTableAllRecordsFilter
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableCheckedRecordsFilter.html b/docs/com/nuix/nx/controls/filters/class-use/DynamicTableCheckedRecordsFilter.html deleted file mode 100644 index fb750dd..0000000 --- a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableCheckedRecordsFilter.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.filters.DynamicTableCheckedRecordsFilter - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.filters.DynamicTableCheckedRecordsFilter

    -
    -
    No usage of com.nuix.nx.controls.filters.DynamicTableCheckedRecordsFilter
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableContainsFilter.html b/docs/com/nuix/nx/controls/filters/class-use/DynamicTableContainsFilter.html deleted file mode 100644 index 3052876..0000000 --- a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableContainsFilter.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.filters.DynamicTableContainsFilter - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.filters.DynamicTableContainsFilter

    -
    -
    No usage of com.nuix.nx.controls.filters.DynamicTableContainsFilter
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableFilterProvider.html b/docs/com/nuix/nx/controls/filters/class-use/DynamicTableFilterProvider.html deleted file mode 100644 index 5718699..0000000 --- a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableFilterProvider.html +++ /dev/null @@ -1,220 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.filters.DynamicTableFilterProvider - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.filters.DynamicTableFilterProvider

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use DynamicTableFilterProvider 
    PackageDescription
    com.nuix.nx.controls.filters 
    com.nuix.nx.controls.models 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableRegexFilter.html b/docs/com/nuix/nx/controls/filters/class-use/DynamicTableRegexFilter.html deleted file mode 100644 index f6b6333..0000000 --- a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableRegexFilter.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.filters.DynamicTableRegexFilter - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.filters.DynamicTableRegexFilter

    -
    -
    No usage of com.nuix.nx.controls.filters.DynamicTableRegexFilter
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableUncheckedRecordsFilter.html b/docs/com/nuix/nx/controls/filters/class-use/DynamicTableUncheckedRecordsFilter.html deleted file mode 100644 index 3d9e5f6..0000000 --- a/docs/com/nuix/nx/controls/filters/class-use/DynamicTableUncheckedRecordsFilter.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.filters.DynamicTableUncheckedRecordsFilter - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.filters.DynamicTableUncheckedRecordsFilter

    -
    -
    No usage of com.nuix.nx.controls.filters.DynamicTableUncheckedRecordsFilter
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/filters/package-summary.html b/docs/com/nuix/nx/controls/filters/package-summary.html index 071ac47..198210b 100644 --- a/docs/com/nuix/nx/controls/filters/package-summary.html +++ b/docs/com/nuix/nx/controls/filters/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.controls.filters +com.nuix.nx.controls.filters (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/controls/filters/package-tree.html b/docs/com/nuix/nx/controls/filters/package-tree.html index 3aeefc5..570831d 100644 --- a/docs/com/nuix/nx/controls/filters/package-tree.html +++ b/docs/com/nuix/nx/controls/filters/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.controls.filters Class Hierarchy +com.nuix.nx.controls.filters Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/controls/filters/package-use.html b/docs/com/nuix/nx/controls/filters/package-use.html deleted file mode 100644 index cf76cc1..0000000 --- a/docs/com/nuix/nx/controls/filters/package-use.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.controls.filters - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.controls.filters

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.controls.filters 
    PackageDescription
    com.nuix.nx.controls.filters 
    com.nuix.nx.controls.models 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/ArrangeableListModel.html b/docs/com/nuix/nx/controls/models/ArrangeableListModel.html index f32fe62..43e8075 100644 --- a/docs/com/nuix/nx/controls/models/ArrangeableListModel.html +++ b/docs/com/nuix/nx/controls/models/ArrangeableListModel.html @@ -3,36 +3,45 @@ -ArrangeableListModel +ArrangeableListModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/Choice.html b/docs/com/nuix/nx/controls/models/Choice.html index 40124ad..d7f8910 100644 --- a/docs/com/nuix/nx/controls/models/Choice.html +++ b/docs/com/nuix/nx/controls/models/Choice.html @@ -3,36 +3,45 @@ -Choice +Choice (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/ChoiceTableModel.html b/docs/com/nuix/nx/controls/models/ChoiceTableModel.html index 3876849..5698648 100644 --- a/docs/com/nuix/nx/controls/models/ChoiceTableModel.html +++ b/docs/com/nuix/nx/controls/models/ChoiceTableModel.html @@ -3,36 +3,45 @@ -ChoiceTableModel +ChoiceTableModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.html b/docs/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.html index def0b9e..93d84e4 100644 --- a/docs/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.html +++ b/docs/com/nuix/nx/controls/models/ChoiceTableModelChangeListener.html @@ -3,36 +3,45 @@ -ChoiceTableModelChangeListener +ChoiceTableModelChangeListener (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/ControlDeserializationHandler.html b/docs/com/nuix/nx/controls/models/ControlDeserializationHandler.html index a932b0a..1e338bc 100644 --- a/docs/com/nuix/nx/controls/models/ControlDeserializationHandler.html +++ b/docs/com/nuix/nx/controls/models/ControlDeserializationHandler.html @@ -3,36 +3,45 @@ -ControlDeserializationHandler +ControlDeserializationHandler (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/ControlSerializationHandler.html b/docs/com/nuix/nx/controls/models/ControlSerializationHandler.html index debc663..4ae8f94 100644 --- a/docs/com/nuix/nx/controls/models/ControlSerializationHandler.html +++ b/docs/com/nuix/nx/controls/models/ControlSerializationHandler.html @@ -3,36 +3,45 @@ -ControlSerializationHandler +ControlSerializationHandler (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/CsvTableModel.html b/docs/com/nuix/nx/controls/models/CsvTableModel.html index 7de19ff..84f2405 100644 --- a/docs/com/nuix/nx/controls/models/CsvTableModel.html +++ b/docs/com/nuix/nx/controls/models/CsvTableModel.html @@ -3,36 +3,45 @@ -CsvTableModel +CsvTableModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/DoubleBoundedRangeModel.html b/docs/com/nuix/nx/controls/models/DoubleBoundedRangeModel.html index c6eb95e..9024c27 100644 --- a/docs/com/nuix/nx/controls/models/DoubleBoundedRangeModel.html +++ b/docs/com/nuix/nx/controls/models/DoubleBoundedRangeModel.html @@ -3,36 +3,45 @@ -DoubleBoundedRangeModel +DoubleBoundedRangeModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/DynamicTableModel.html b/docs/com/nuix/nx/controls/models/DynamicTableModel.html index a1c3cb9..2e734ce 100644 --- a/docs/com/nuix/nx/controls/models/DynamicTableModel.html +++ b/docs/com/nuix/nx/controls/models/DynamicTableModel.html @@ -3,36 +3,45 @@ -DynamicTableModel +DynamicTableModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/DynamicTableValueCallback.html b/docs/com/nuix/nx/controls/models/DynamicTableValueCallback.html index ab975a4..f0abade 100644 --- a/docs/com/nuix/nx/controls/models/DynamicTableValueCallback.html +++ b/docs/com/nuix/nx/controls/models/DynamicTableValueCallback.html @@ -3,36 +3,45 @@ -DynamicTableValueCallback +DynamicTableValueCallback (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/ItemStatisticsTableModel.html b/docs/com/nuix/nx/controls/models/ItemStatisticsTableModel.html index e7f0736..7437225 100644 --- a/docs/com/nuix/nx/controls/models/ItemStatisticsTableModel.html +++ b/docs/com/nuix/nx/controls/models/ItemStatisticsTableModel.html @@ -3,36 +3,45 @@ -ItemStatisticsTableModel +ItemStatisticsTableModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/ReportDataModel.html b/docs/com/nuix/nx/controls/models/ReportDataModel.html index 32f1580..80e0fb7 100644 --- a/docs/com/nuix/nx/controls/models/ReportDataModel.html +++ b/docs/com/nuix/nx/controls/models/ReportDataModel.html @@ -3,36 +3,45 @@ -ReportDataModel +ReportDataModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/StringListTableModel.html b/docs/com/nuix/nx/controls/models/StringListTableModel.html index 775c086..0a21dd6 100644 --- a/docs/com/nuix/nx/controls/models/StringListTableModel.html +++ b/docs/com/nuix/nx/controls/models/StringListTableModel.html @@ -3,36 +3,45 @@ -StringListTableModel +StringListTableModel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ArrangeableListModel.html b/docs/com/nuix/nx/controls/models/class-use/ArrangeableListModel.html deleted file mode 100644 index 0eac51e..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ArrangeableListModel.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.ArrangeableListModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.ArrangeableListModel

    -
    -
    No usage of com.nuix.nx.controls.models.ArrangeableListModel
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/Choice.html b/docs/com/nuix/nx/controls/models/class-use/Choice.html deleted file mode 100644 index e0342cd..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/Choice.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.Choice - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.Choice

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Packages that use Choice 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.controls.models 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ChoiceTableModel.html b/docs/com/nuix/nx/controls/models/class-use/ChoiceTableModel.html deleted file mode 100644 index b2052ed..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ChoiceTableModel.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.ChoiceTableModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.ChoiceTableModel

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use ChoiceTableModel 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ChoiceTableModelChangeListener.html b/docs/com/nuix/nx/controls/models/class-use/ChoiceTableModelChangeListener.html deleted file mode 100644 index 1877134..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ChoiceTableModelChangeListener.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.controls.models.ChoiceTableModelChangeListener - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.controls.models.ChoiceTableModelChangeListener

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ChoiceTableModelChangeListener 
    PackageDescription
    com.nuix.nx.controls.models 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ControlDeserializationHandler.html b/docs/com/nuix/nx/controls/models/class-use/ControlDeserializationHandler.html deleted file mode 100644 index 91b845a..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ControlDeserializationHandler.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.controls.models.ControlDeserializationHandler - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.controls.models.ControlDeserializationHandler

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ControlDeserializationHandler 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ControlSerializationHandler.html b/docs/com/nuix/nx/controls/models/class-use/ControlSerializationHandler.html deleted file mode 100644 index 53d9b44..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ControlSerializationHandler.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.controls.models.ControlSerializationHandler - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.controls.models.ControlSerializationHandler

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ControlSerializationHandler 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/CsvTableModel.html b/docs/com/nuix/nx/controls/models/class-use/CsvTableModel.html deleted file mode 100644 index fd6ba65..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/CsvTableModel.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.CsvTableModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.CsvTableModel

    -
    -
    No usage of com.nuix.nx.controls.models.CsvTableModel
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/DoubleBoundedRangeModel.html b/docs/com/nuix/nx/controls/models/class-use/DoubleBoundedRangeModel.html deleted file mode 100644 index b4b1568..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/DoubleBoundedRangeModel.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.DoubleBoundedRangeModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.DoubleBoundedRangeModel

    -
    -
    No usage of com.nuix.nx.controls.models.DoubleBoundedRangeModel
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/DynamicTableModel.html b/docs/com/nuix/nx/controls/models/class-use/DynamicTableModel.html deleted file mode 100644 index d8b1868..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/DynamicTableModel.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.DynamicTableModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.DynamicTableModel

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use DynamicTableModel 
    PackageDescription
    com.nuix.nx.controls 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/DynamicTableValueCallback.html b/docs/com/nuix/nx/controls/models/class-use/DynamicTableValueCallback.html deleted file mode 100644 index a61b491..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/DynamicTableValueCallback.html +++ /dev/null @@ -1,236 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.controls.models.DynamicTableValueCallback - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.controls.models.DynamicTableValueCallback

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Packages that use DynamicTableValueCallback 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.controls.models 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ItemStatisticsTableModel.html b/docs/com/nuix/nx/controls/models/class-use/ItemStatisticsTableModel.html deleted file mode 100644 index 7a2c50c..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ItemStatisticsTableModel.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.ItemStatisticsTableModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.ItemStatisticsTableModel

    -
    -
    No usage of com.nuix.nx.controls.models.ItemStatisticsTableModel
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/ReportDataModel.html b/docs/com/nuix/nx/controls/models/class-use/ReportDataModel.html deleted file mode 100644 index a1a61ea..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/ReportDataModel.html +++ /dev/null @@ -1,199 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.ReportDataModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.ReportDataModel

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use ReportDataModel 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/class-use/StringListTableModel.html b/docs/com/nuix/nx/controls/models/class-use/StringListTableModel.html deleted file mode 100644 index 200404e..0000000 --- a/docs/com/nuix/nx/controls/models/class-use/StringListTableModel.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.controls.models.StringListTableModel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.controls.models.StringListTableModel

    -
    -
    No usage of com.nuix.nx.controls.models.StringListTableModel
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/models/package-frame.html b/docs/com/nuix/nx/controls/models/package-frame.html deleted file mode 100644 index 038f4de..0000000 --- a/docs/com/nuix/nx/controls/models/package-frame.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - -com.nuix.nx.controls.models - - - - -

    com.nuix.nx.controls.models

    - - - diff --git a/docs/com/nuix/nx/controls/models/package-summary.html b/docs/com/nuix/nx/controls/models/package-summary.html index 76c39cc..ad4f5f6 100644 --- a/docs/com/nuix/nx/controls/models/package-summary.html +++ b/docs/com/nuix/nx/controls/models/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.controls.models +com.nuix.nx.controls.models (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/controls/models/package-tree.html b/docs/com/nuix/nx/controls/models/package-tree.html index 9d5b9ef..09d9661 100644 --- a/docs/com/nuix/nx/controls/models/package-tree.html +++ b/docs/com/nuix/nx/controls/models/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.controls.models Class Hierarchy +com.nuix.nx.controls.models Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/controls/models/package-use.html b/docs/com/nuix/nx/controls/models/package-use.html deleted file mode 100644 index a9a369a..0000000 --- a/docs/com/nuix/nx/controls/models/package-use.html +++ /dev/null @@ -1,272 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.controls.models - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.controls.models

    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.controls.models 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.controls.models 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/controls/package-frame.html b/docs/com/nuix/nx/controls/package-frame.html deleted file mode 100644 index e6de337..0000000 --- a/docs/com/nuix/nx/controls/package-frame.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - - -com.nuix.nx.controls - - - - -

    com.nuix.nx.controls

    - - - diff --git a/docs/com/nuix/nx/controls/package-summary.html b/docs/com/nuix/nx/controls/package-summary.html index d583af8..775d896 100644 --- a/docs/com/nuix/nx/controls/package-summary.html +++ b/docs/com/nuix/nx/controls/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.controls +com.nuix.nx.controls (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/controls/package-tree.html b/docs/com/nuix/nx/controls/package-tree.html index 99cf3d2..7415d3e 100644 --- a/docs/com/nuix/nx/controls/package-tree.html +++ b/docs/com/nuix/nx/controls/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.controls Class Hierarchy +com.nuix.nx.controls Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/controls/package-use.html b/docs/com/nuix/nx/controls/package-use.html deleted file mode 100644 index 1fbf769..0000000 --- a/docs/com/nuix/nx/controls/package-use.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.controls - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.controls

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.controls 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/ChoiceDialog.html b/docs/com/nuix/nx/dialogs/ChoiceDialog.html index 89c5421..83c6a0e 100644 --- a/docs/com/nuix/nx/dialogs/ChoiceDialog.html +++ b/docs/com/nuix/nx/dialogs/ChoiceDialog.html @@ -3,36 +3,45 @@ -ChoiceDialog +ChoiceDialog (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Window

    - +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, toFront + +
      +
    • -addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, toFront
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, dispatchEvent, enable, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            ChoiceDialog

            -
            public ChoiceDialog​(java.lang.String valueTypeName)
            +

            ChoiceDialog

            +
            public ChoiceDialog​(java.lang.String valueTypeName)
            Create a new instance
            Parameters:
            valueTypeName - Determines what the label of the value column will be.
            -
          -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        getDialogResult

        -
        public boolean getDialogResult()
        +

        getDialogResult

        +
        public boolean getDialogResult()
        Provides a value signifying whether the dialog was cancelled/closed or user hit ok.
        Returns:
        True if user selected ok button, cancel otherwise.
        -
      • +
      + + + + + + + + + + + + + + + + + + + + + + + +
      • -
        -

        forTags

        -
        public static java.util.List<java.lang.String> forTags​(nuix.Case nuixCase) - throws java.io.IOException
        +

        forTags

        +
        public static java.util.List<java.lang.String> forTags​(nuix.Case nuixCase)
        +                                                throws java.io.IOException
        Presents the user with a dialog where they can select tag names.
        Parameters:
        @@ -469,13 +591,16 @@

        forTags

        Throws:
        java.io.IOException - May throw exception caused by call into Nuix API
        -
      • +
      + + + +
      • -
        -

        forCustodians

        -
        public static java.util.List<java.lang.String> forCustodians​(nuix.Case nuixCase) - throws java.io.IOException
        +

        forCustodians

        +
        public static java.util.List<java.lang.String> forCustodians​(nuix.Case nuixCase)
        +                                                      throws java.io.IOException
        Presents the user with a dialog where they can select custodian names.
        Parameters:
        @@ -485,13 +610,16 @@

        forCustodians

        Throws:
        java.io.IOException - May throw exception caused by call into Nuix API
        -
      • +
      + + + +
      • -
        -

        forProductionSets

        -
        public static java.util.List<nuix.ProductionSet> forProductionSets​(nuix.Case nuixCase) - throws java.io.IOException
        +

        forProductionSets

        +
        public static java.util.List<nuix.ProductionSet> forProductionSets​(nuix.Case nuixCase)
        +                                                            throws java.io.IOException
        Presents the user with a dialog where they can select productions sets.
        Parameters:
        @@ -501,13 +629,16 @@

        forProductionSets

        Throws:
        java.io.IOException - May throw exception caused by call into Nuix API
        -
      • +
      + + + +
      • -
        -

        forItemSets

        -
        public static java.util.List<nuix.ItemSet> forItemSets​(nuix.Case nuixCase) - throws java.io.IOException
        +

        forItemSets

        +
        public static java.util.List<nuix.ItemSet> forItemSets​(nuix.Case nuixCase)
        +                                                throws java.io.IOException
        Presents the user with a dialog where they can select item sets.
        Parameters:
        @@ -517,13 +648,16 @@

        forItemSets

        Throws:
        java.io.IOException - May throw exception caused by call into Nuix API
        -
      • +
      + + + +
      • -
        -

        forEvidenceItems

        -
        public static java.util.List<nuix.Item> forEvidenceItems​(nuix.Case nuixCase) - throws java.io.IOException
        +

        forEvidenceItems

        +
        public static java.util.List<nuix.Item> forEvidenceItems​(nuix.Case nuixCase)
        +                                                  throws java.io.IOException
        Presents the user with a dialog where they can select evidence items.
        Parameters:
        @@ -533,27 +667,31 @@

        forEvidenceItems

        Throws:
        java.io.IOException - May throw exception caused by call into Nuix API
        -
      • +
      + + + +
      • -
        -

        forKinds

        -
        public static java.util.List<nuix.ItemKind> forKinds()
        +

        forKinds

        +
        public static java.util.List<nuix.ItemKind> forKinds()
        Presents the user with a dialog where they can select item kinds.
        Returns:
        A list of selected item kinds, or null if the user cancelled or closed the dialog.
        -
      -
  • + + + - +
    - - diff --git a/docs/com/nuix/nx/dialogs/CommonDialogs.html b/docs/com/nuix/nx/dialogs/CommonDialogs.html index 3a33c55..f91057f 100644 --- a/docs/com/nuix/nx/dialogs/CommonDialogs.html +++ b/docs/com/nuix/nx/dialogs/CommonDialogs.html @@ -3,36 +3,45 @@ -CommonDialogs +CommonDialogs (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/dialogs/CustomTabPanel.html b/docs/com/nuix/nx/dialogs/CustomTabPanel.html index af4ac35..ecee542 100644 --- a/docs/com/nuix/nx/dialogs/CustomTabPanel.html +++ b/docs/com/nuix/nx/dialogs/CustomTabPanel.html @@ -3,36 +3,45 @@ -CustomTabPanel +CustomTabPanel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
      + + + + + + + + + -

      Method Details

      • -
        -

        trackComponent

        -
        public void trackComponent​(java.lang.String identifier, -java.awt.Component component) - throws java.lang.Exception
        -
        Registers control to be tracked which is important to ensuring that control values are able to be - passed back to script and eligible for being saved to or loaded from JSON.
        -
        -
        Parameters:
        -
        identifier - Unique identifier associated with this control
        -
        component - The actual control
        -
        Throws:
        -
        java.lang.Exception - Thrown is something goes wrong
        -
        -
        +

        LABEL_COLUMN_WIDTH

        +
        protected int LABEL_COLUMN_WIDTH
      • +
      + + + +
      • -
        -

        appendCheckBox

        -
        public CustomTabPanel appendCheckBox​(java.lang.String identifier, -java.lang.String controlLabel, -boolean isChecked) - throws java.lang.Exception
        -
        Appends a check box control to the tab. - Calls to getControl(String) should cast result to JCheckBox.
        -
        -
        Parameters:
        -
        identifier - The unique identifier for this control.
        -
        controlLabel - The label for this control.
        -
        isChecked - Whether this is checked initially.
        -
        Returns:
        -
        Returns this CustomTabPanel instance to allow for method chaining.
        -
        Throws:
        -
        java.lang.Exception - May throw an exception if the provided identifier has already been used.
        -
        +

        CONTROL_COLUMN_WIDTH

        +
        protected int CONTROL_COLUMN_WIDTH
        +
      • +
      +
    • +
    + +
    +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        CustomTabPanel

        +
        protected CustomTabPanel()
      • +
      + + + +
      • -
        -

        appendCheckBoxes

        -
        public CustomTabPanel appendCheckBoxes​(java.lang.String identifierA, -java.lang.String controlLabelA, -boolean isCheckedA, -java.lang.String identifierB, -java.lang.String controlLabelB, -boolean isCheckedB) - throws java.lang.Exception
        -
        Appends 2 check boxes, in a single row, to the tab.
        -
        -
        Parameters:
        -
        identifierA - The unique identifier for the first check box.
        -
        controlLabelA - The label for the first checkbox.
        -
        isCheckedA - Whether the first check box is checked by default.
        -
        identifierB - The unique identifier of the second check box.
        -
        controlLabelB - The label for the second checkbox.
        -
        isCheckedB - Whether the second check box is checked by default.
        -
        Returns:
        -
        Returns this CustomTabPanel instance to allow for method chaining.
        -
        Throws:
        -
        java.lang.Exception - May throw an exception if a provided identifier has already been used.
        -
        +

        CustomTabPanel

        +
        public CustomTabPanel​(java.lang.String label,
        +                      TabbedCustomDialog owner)
        +
      • +
      +
    • +
    + +
    +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        addBasicLabelledComponent

        +
        protected void addBasicLabelledComponent​(java.lang.String label,
        +                                         java.awt.Component component)
      • +
      + + + +
      • -
        -

        appendRadioButton

        -
        public CustomTabPanel appendRadioButton​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String radioButtonGroupName, -boolean isChecked) - throws java.lang.Exception
        -
        Appends a radio button control to the dialog. - Calls to getControl(String) should cast result to JRadioButton.
        -
        -
        Parameters:
        +

        addBasicLabelledComponent

        +
        protected void addBasicLabelledComponent​(java.lang.String label,
        +                                         java.awt.Component component,
        +                                         boolean fillVertical)
        +
      • +
      + + + +
        +
      • +

        makeLabelConstraintsForNextRow

        +
        protected java.awt.GridBagConstraints makeLabelConstraintsForNextRow()
        +
      • +
      + + + +
        +
      • +

        makeComponentLabel

        +
        protected javax.swing.JLabel makeComponentLabel​(java.lang.String text)
        +
      • +
      + + + +
        +
      • +

        addBasicLabelledComponent

        +
        protected void addBasicLabelledComponent​(java.lang.String label,
        +                                         java.awt.Component component,
        +                                         boolean fillVertical,
        +                                         boolean fillHorizontal)
        +
      • +
      + + + +
        +
      • +

        addComponent

        +
        protected void addComponent​(java.awt.Component component,
        +                            int col)
        +
      • +
      + + + +
        +
      • +

        addComponents

        +
        protected void addComponents​(java.awt.Component leftComponent,
        +                             java.awt.Component rightComponent)
        +
      • +
      + + + +
        +
      • +

        addComponent

        +
        protected void addComponent​(java.awt.Component component,
        +                            int row,
        +                            int col,
        +                            int width,
        +                            int height)
        +
      • +
      + + + +
        +
      • +

        addComponent

        +
        protected void addComponent​(java.awt.Component component,
        +                            int row,
        +                            int col,
        +                            int width,
        +                            int height,
        +                            boolean fillVertical)
        +
      • +
      + + + +
        +
      • +

        addComponent

        +
        protected void addComponent​(java.awt.Component component,
        +                            int row,
        +                            int col,
        +                            int width,
        +                            int height,
        +                            double weightx,
        +                            double weighty)
        +
      • +
      + + + +
        +
      • +

        addComponent

        +
        protected void addComponent​(java.awt.Component component,
        +                            java.awt.GridBagConstraints c)
        +
      • +
      + + + +
        +
      • +

        trackComponent

        +
        public void trackComponent​(java.lang.String identifier,
        +                           java.awt.Component component)
        +                    throws java.lang.Exception
        +
        Registers control to be tracked which is important to ensuring that control values are able to be + passed back to script and eligible for being saved to or loaded from JSON.
        +
        +
        Parameters:
        +
        identifier - Unique identifier associated with this control
        +
        component - The actual control
        +
        Throws:
        +
        java.lang.Exception - Thrown is something goes wrong
        +
        +
      • +
      + + + +
        +
      • +

        appendCheckBox

        +
        public CustomTabPanel appendCheckBox​(java.lang.String identifier,
        +                                     java.lang.String controlLabel,
        +                                     boolean isChecked)
        +                              throws java.lang.Exception
        +
        Appends a check box control to the tab. + Calls to getControl(String) should cast result to JCheckBox.
        +
        +
        Parameters:
        +
        identifier - The unique identifier for this control.
        +
        controlLabel - The label for this control.
        +
        isChecked - Whether this is checked initially.
        +
        Returns:
        +
        Returns this CustomTabPanel instance to allow for method chaining.
        +
        Throws:
        +
        java.lang.Exception - May throw an exception if the provided identifier has already been used.
        +
        +
      • +
      + + + +
        +
      • +

        appendCheckBoxes

        +
        public CustomTabPanel appendCheckBoxes​(java.lang.String identifierA,
        +                                       java.lang.String controlLabelA,
        +                                       boolean isCheckedA,
        +                                       java.lang.String identifierB,
        +                                       java.lang.String controlLabelB,
        +                                       boolean isCheckedB)
        +                                throws java.lang.Exception
        +
        Appends 2 check boxes, in a single row, to the tab.
        +
        +
        Parameters:
        +
        identifierA - The unique identifier for the first check box.
        +
        controlLabelA - The label for the first checkbox.
        +
        isCheckedA - Whether the first check box is checked by default.
        +
        identifierB - The unique identifier of the second check box.
        +
        controlLabelB - The label for the second checkbox.
        +
        isCheckedB - Whether the second check box is checked by default.
        +
        Returns:
        +
        Returns this CustomTabPanel instance to allow for method chaining.
        +
        Throws:
        +
        java.lang.Exception - May throw an exception if a provided identifier has already been used.
        +
        +
      • +
      + + + +
        +
      • +

        appendRadioButton

        +
        public CustomTabPanel appendRadioButton​(java.lang.String identifier,
        +                                        java.lang.String controlLabel,
        +                                        java.lang.String radioButtonGroupName,
        +                                        boolean isChecked)
        +                                 throws java.lang.Exception
        +
        Appends a radio button control to the dialog. + Calls to getControl(String) should cast result to JRadioButton.
        +
        +
        Parameters:
        identifier - The unique identifier for this control.
        controlLabel - The label for this control.
        radioButtonGroupName - The name of the radio button group to assign this to. The group determines what other radio buttons are @@ -1063,39 +1503,48 @@

        Throws:
        java.lang.Exception - May throw an exception if the provided identifier has already been used.

        -
    + + + + +
    • -
      -

      appendRadioButtonLeft

      -
      public CustomTabPanel appendRadioButtonLeft​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String radioButtonGroupName, -boolean isChecked) - throws java.lang.Exception
      +

      appendRadioButtonLeft

      +
      public CustomTabPanel appendRadioButtonLeft​(java.lang.String identifier,
      +                                            java.lang.String controlLabel,
      +                                            java.lang.String radioButtonGroupName,
      +                                            boolean isChecked)
      +                                     throws java.lang.Exception
      Throws:
      java.lang.Exception
      -
    • +
    + + + +
    • -
      -

      appendRadioButtonGroup

      -
      public CustomTabPanel appendRadioButtonGroup​(java.lang.String groupLabel, -java.lang.String radioButtonGroupName, -java.util.Map<java.lang.String,​java.lang.String> radioButtonChoices) - throws java.lang.Exception
      +

      appendRadioButtonGroup

      +
      public CustomTabPanel appendRadioButtonGroup​(java.lang.String groupLabel,
      +                                             java.lang.String radioButtonGroupName,
      +                                             java.util.Map<java.lang.String,​java.lang.String> radioButtonChoices)
      +                                      throws java.lang.Exception
      Throws:
      java.lang.Exception
      -
    • +
    + + + +
    • -
      -

      appendHeader

      -
      public CustomTabPanel appendHeader​(java.lang.String text)
      +

      appendHeader

      +
      public CustomTabPanel appendHeader​(java.lang.String text)
      Appends a header label that spans 2 columns.
      Parameters:
      @@ -1103,14 +1552,17 @@

      appendHeader

      Returns:
      Returns this CustomTabPanel instance to allow for method chaining.
      -
    • +
    + + + +
    • -
      -

      appendLabel

      -
      public CustomTabPanel appendLabel​(java.lang.String identifier, -java.lang.String text) - throws java.lang.Exception
      +

      appendLabel

      +
      public CustomTabPanel appendLabel​(java.lang.String identifier,
      +                                  java.lang.String text)
      +                           throws java.lang.Exception
      Appends a label that spans 2 columns.
      Parameters:
      @@ -1121,12 +1573,15 @@

      appendLabel

      Throws:
      java.lang.Exception - May throw an exception if this identifier has already been used
      -
    • +
    + + + +
    • -
      -

      appendImage

      -
      public CustomTabPanel appendImage​(java.io.File imageFile)
      +

      appendImage

      +
      public CustomTabPanel appendImage​(java.io.File imageFile)
      Appends an image to the tab
      Parameters:
      @@ -1134,12 +1589,15 @@

      appendImage

      Returns:
      Returns this CustomTabPanel instance to allow for method chaining.
      -
    • +
    + + + +
    • -
      -

      appendImage

      -
      public CustomTabPanel appendImage​(java.lang.String imageFile)
      +

      appendImage

      +
      public CustomTabPanel appendImage​(java.lang.String imageFile)
      Appends an image to the tab
      Parameters:
      @@ -1147,12 +1605,15 @@

      appendImage

      Returns:
      Returns this CustomTabPanel instance to allow for method chaining.
      -
    • +
    + + + +
    • -
      -

      appendSeparator

      -
      public CustomTabPanel appendSeparator​(java.lang.String label)
      +

      appendSeparator

      +
      public CustomTabPanel appendSeparator​(java.lang.String label)
      Appends a separator that spans 2 columns.
      Parameters:
      @@ -1160,15 +1621,18 @@

      appendSeparator

      Returns:
      Returns this CustomTabPanel instance to allow for method chaining.
      -
    • +
    + + + + + + + + + + + + + + + +
    • -
      -

      appendButtonRow

      -
      public ButtonRow appendButtonRow​(java.lang.String identifier)
      -
      +

      appendButtonRow

      +
      public ButtonRow appendButtonRow​(java.lang.String identifier)
      +
    • +
    + + + +
      +
    • +

      buildGenericSlider

      +
      protected CustomTabPanel buildGenericSlider​(java.lang.String identifier,
      +                                            java.lang.String controlLabel,
      +                                            javax.swing.BoundedRangeModel model,
      +                                            java.util.function.Consumer<javax.swing.JLabel> displayAdapter)
      +                                     throws java.lang.Exception
      +
      Put together the UI for a Slider control +

      + This method doesn't know about the underlying data or its type. But given the name, label, the data model + which does know this information, and a callback that can translate into a JLabel text, this method can + construct the visual UI. +

      +
      +
      Parameters:
      +
      identifier - The unique identifier for this control, used to modify the control or get its result value
      +
      controlLabel - String to display in the UI to label this control
      +
      model - The BoundedRangeModel which controls and stores the value and its range limits
      +
      displayAdapter - A Consumer which can take a JLabel and display the model's current value in it. + The consumer will need its own reference to the model, as it will not get the model from + this callback.
      +
      Returns:
      +
      this CustomTabPanel instance to allow method chaining
      +
      Throws:
      +
      java.lang.Exception - if the identifier has already been used
      +
    • +
    + + + +
    • -
      -

      appendSlider

      -
      public CustomTabPanel appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -double initialValue, -double min, -double max) - throws java.lang.Exception
      +

      appendSlider

      +
      public CustomTabPanel appendSlider​(java.lang.String identifier,
      +                                   java.lang.String controlLabel,
      +                                   double initialValue,
      +                                   double min,
      +                                   double max)
      +                            throws java.lang.Exception
      Creates a new slider control that lets the user specify a value within a range using doubles.

      A slider is best used for setting a value over a long, continuous range where precision may not be most @@ -1272,15 +1780,18 @@

      Throws:
      java.lang.Exception - if the identifier has already been used
      -

    • +
    + + + +
    • -
      -

      appendSlider

      -
      public CustomTabPanel appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -double initialValue) - throws java.lang.Exception
      +

      appendSlider

      +
      public CustomTabPanel appendSlider​(java.lang.String identifier,
      +                                   java.lang.String controlLabel,
      +                                   double initialValue)
      +                            throws java.lang.Exception
      Creates a new slider control that lets the user specify a value within the range of 0.0 to 1.0.

      A slider is best used for setting a value over a long, continuous range where precision may not be most @@ -1307,17 +1818,20 @@

      appendSlider<
      Throws:
      java.lang.Exception - if the identifier has already been used
      -

    • +
    + + + +
    • -
      -

      appendSlider

      -
      public CustomTabPanel appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue, -int min, -int max) - throws java.lang.Exception
      +

      appendSlider

      +
      public CustomTabPanel appendSlider​(java.lang.String identifier,
      +                                   java.lang.String controlLabel,
      +                                   int initialValue,
      +                                   int min,
      +                                   int max)
      +                            throws java.lang.Exception
      Creates a new slider control that lets the user specify a value within a range using integers.

      A slider is best used for setting a value over a long, continuous range where precision may not be most @@ -1345,15 +1859,18 @@

      appendSl
      Throws:
      java.lang.Exception - if the identifier has already been used
      -

    • +
    + + + +
    • -
      -

      appendSlider

      -
      public CustomTabPanel appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue) - throws java.lang.Exception
      +

      appendSlider

      +
      public CustomTabPanel appendSlider​(java.lang.String identifier,
      +                                   java.lang.String controlLabel,
      +                                   int initialValue)
      +                            throws java.lang.Exception
      Creates a new slider control that lets the user specify a value in the range 0 to 100.

      A slider is best used for setting a value over a long, continuous range where precision may not be most @@ -1379,14 +1896,17 @@

      appendSlider
      Throws:
      java.lang.Exception - if the identifier has already been used
      -

    • +
    + + + +
    • -
      -

      appendSlider

      -
      public CustomTabPanel appendSlider​(java.lang.String identifier, -java.lang.String controlLabel) - throws java.lang.Exception
      +

      appendSlider

      +
      public CustomTabPanel appendSlider​(java.lang.String identifier,
      +                                   java.lang.String controlLabel)
      +                            throws java.lang.Exception
      Creates a new slider control that lets the user specify a value in the range 0 to 100 with an initial value of 50.

      @@ -1412,18 +1932,21 @@

      appendSlider

      Throws:
      java.lang.Exception - if the identifier has already been used
      -
    • +
    + + + + + + + + + + + + + + + +
    • -
      -

      appendSpinner

      -
      public CustomTabPanel appendSpinner​(java.lang.String identifier, -java.lang.String controlLabel) - throws java.lang.Exception
      +

      appendSpinner

      +
      public CustomTabPanel appendSpinner​(java.lang.String identifier,
      +                                    java.lang.String controlLabel)
      +                             throws java.lang.Exception
      Creates a up/down number picker control (known in Java as a Spinner). Uses a default step of 1, a minimum of 0 , a maximum of Integer.MAX_VALUE and an initial value of 0.
      @@ -1502,15 +2034,18 @@

      appendSpinnerThrows:
      java.lang.Exception - May throw an exception if the provided identifier has already been used.

      -
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • -
      -

      appendOcrSettings

      -
      public CustomTabPanel appendOcrSettings​(java.lang.String identifier) - throws java.lang.Exception
      +

      appendOcrSettings

      +
      public CustomTabPanel appendOcrSettings​(java.lang.String identifier)
      +                                 throws java.lang.Exception
      Appends a control with controls used to provide OCR settings, as passed to OcrProcessor.
      Parameters:
      @@ -1717,15 +2285,18 @@

      appendOcrSettings

      Throws:
      java.lang.Exception - May throw an exception if the provided identifier has already been used.
      -
    • +
    + + + + + + + + + + + +
    • -
      -

      appendCsvTable

      -
      public CustomTabPanel appendCsvTable​(java.lang.String identifier, -java.util.List<java.lang.String> headers) - throws java.lang.Exception
      +

      appendCsvTable

      +
      public CustomTabPanel appendCsvTable​(java.lang.String identifier,
      +                                     java.util.List<java.lang.String> headers)
      +                              throws java.lang.Exception
      Appends a table control with the specified headers, which is capable of importing a CSV with the same headers.
      Parameters:
      @@ -1779,15 +2356,18 @@

      appendCsvTableThrows:
      java.lang.Exception - May throw an exception if the provided identifier has already been used.

      -
    • +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    • -
      -

      appendPathList

      -
      public CustomTabPanel appendPathList​(java.lang.String identifier, -java.util.List<java.lang.String> initialPaths) - throws java.lang.Exception
      +

      appendPathList

      +
      public CustomTabPanel appendPathList​(java.lang.String identifier,
      +                                     java.util.List<java.lang.String> initialPaths)
      +                              throws java.lang.Exception
      Appends a list box allowing the user to specify multiple file and directory paths.
      Parameters:
      @@ -2286,13 +2923,16 @@

      appendPathListThrows:
      java.lang.Exception - Exception May throw an exception if the provided identifier has already been used.

      -
    • +
    + + + +
    • -
      -

      appendPathList

      -
      public CustomTabPanel appendPathList​(java.lang.String identifier) - throws java.lang.Exception
      +

      appendPathList

      +
      public CustomTabPanel appendPathList​(java.lang.String identifier)
      +                              throws java.lang.Exception
      Appends a list box allowing the user to specify multiple file and directory paths.
      Parameters:
      @@ -2302,14 +2942,17 @@

      appendPathList

      Throws:
      java.lang.Exception - Exception May throw an exception if the provided identifier has already been used.
      -
    • +
    + + + + + + + + + + + +
    • -
      -

      appendStringList

      -
      public CustomTabPanel appendStringList​(java.lang.String identifier) - throws java.lang.Exception
      +

      appendStringList

      +
      public CustomTabPanel appendStringList​(java.lang.String identifier)
      +                                throws java.lang.Exception
      Appends a list box allowing the user to specify string values.
      Parameters:
      @@ -2356,14 +3005,17 @@

      appendStringList

      Throws:
      java.lang.Exception - Exception May throw an exception if the provided identifier has already been used.
      -
    • +
    + + + +
    • -
      -

      appendStringList

      -
      public CustomTabPanel appendStringList​(java.lang.String identifier, -boolean editable) - throws java.lang.Exception
      +

      appendStringList

      +
      public CustomTabPanel appendStringList​(java.lang.String identifier,
      +                                       boolean editable)
      +                                throws java.lang.Exception
      Appends a list box allowing the user to specify string values.
      Parameters:
      @@ -2374,14 +3026,17 @@

      appendStringList

      Throws:
      java.lang.Exception - Exception May throw an exception if the provided identifier has already been used.
      -
    • +
    + + + + + + + +
      +
    • +

      enabledOnlyWhenAllChecked

      +
      public void enabledOnlyWhenAllChecked​(java.lang.String dependentControlIdentifier,
      +                                      java.lang.String... targetCheckableIdentifiers)
      +                               throws java.lang.Exception
      +
      Similar to enabledOnlyWhenChecked(String, String), this method registers event handlers on one or more checkable controls + such that a given dependent control is only enabled when all of the specified target checkable controls are checked.
      +
      +
      Parameters:
      +
      dependentControlIdentifier - The identifier of the already added control for which the enabled state depends on another checkable control.
      +
      targetCheckableIdentifiers - The identifier of the one or more already added checkable controls which will determine the enabled state + of the dependent control.
      +
      Throws:
      +
      java.lang.Exception - This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier + does not point to a checkable control (CheckBox or RadioButton).
      +
      +
    • +
    + + + +
      +
    • +

      enabledOnlyWhenNoneChecked

      +
      public void enabledOnlyWhenNoneChecked​(java.lang.String dependentControlIdentifier,
      +                                       java.lang.String... targetCheckableIdentifiers)
      +                                throws java.lang.Exception
      +
      Similar to enabledOnlyWhenChecked(String, String), this method registers event handlers on one or more checkable controls + such that a given dependent control is only enabled when none of the specified target checkable controls are checked.
      +
      +
      Parameters:
      +
      dependentControlIdentifier - The identifier of the already added control for which the enabled state depends on another checkable control.
      +
      targetCheckableIdentifiers - The identifier of the one or more already added checkable controls which will determine the enabled state + of the dependent control.
      +
      Throws:
      +
      java.lang.Exception - This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier + does not point to a checkable control (CheckBox or RadioButton).
      +
      +
    • +
    + + + +
      +
    • +

      enabledIfAnyChecked

      +
      public void enabledIfAnyChecked​(java.lang.String dependentControlIdentifier,
      +                                java.lang.String... targetCheckableIdentifiers)
      +                         throws java.lang.Exception
      +
      Similar to enabledOnlyWhenChecked(String, String), this method registers event handlers on one or more checkable controls + such that a given dependent control is only enabled when at least one of the specified target checkable controls are checked.
      +
      +
      Parameters:
      +
      dependentControlIdentifier - The identifier of the already added control for which the enabled state depends on another checkable control.
      +
      targetCheckableIdentifiers - The identifier of the one or more already added checkable controls which will determine the enabled state + of the dependent control.
      +
      Throws:
      +
      java.lang.Exception - This could be caused by various things such as invalid identifiers or the identifier provided in targetCheckableIdentifier + does not point to a checkable control (CheckBox or RadioButton).
      +
      +
    • +
    + + + + + + + +
    • -
      -

      isChecked

      -
      public boolean isChecked​(java.lang.String identifier) - throws java.lang.Exception
      +

      isChecked

      +
      public boolean isChecked​(java.lang.String identifier)
      +                  throws java.lang.Exception
      Gets whether a particular Checkbox or RadioButton is checked.
      Parameters:
      @@ -2424,14 +3151,17 @@

      isChecked

      Throws:
      java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
      -
    • +
    + + + +
    • -
      -

      setChecked

      -
      public void setChecked​(java.lang.String identifier, -boolean isChecked) - throws java.lang.Exception
      +

      setChecked

      +
      public void setChecked​(java.lang.String identifier,
      +                       boolean isChecked)
      +                throws java.lang.Exception
      Sets whether a particular Checkbox or RadioButton is checked.
      Parameters:
      @@ -2440,13 +3170,16 @@

      setChecked

      Throws:
      java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
      -
    • +
    + + + +
    • -
      -

      getText

      -
      public java.lang.String getText​(java.lang.String identifier) - throws java.lang.Exception
      +

      getText

      +
      public java.lang.String getText​(java.lang.String identifier)
      +                         throws java.lang.Exception
      Gets the text present in a TextField or PasswordField.
      Parameters:
      @@ -2456,14 +3189,17 @@

      getText

      Throws:
      java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
      -
    • +
    + + + +
    • -
      -

      setText

      -
      public void setText​(java.lang.String identifier, -java.lang.String text) - throws java.lang.Exception
      +

      setText

      +
      public void setText​(java.lang.String identifier,
      +                    java.lang.String text)
      +             throws java.lang.Exception
      Sets the text present in a TextField or PasswordField.
      Parameters:
      @@ -2472,14 +3208,17 @@

      setText

      Throws:
      java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
      -
    • +
    + + + +
    • -
      -

      setDate

      -
      public void setDate​(java.lang.String identifier, -java.lang.Object value) - throws java.lang.Exception
      +

      setDate

      +
      public void setDate​(java.lang.String identifier,
      +                    java.lang.Object value)
      +             throws java.lang.Exception
      Sets the date contained in a date picker control previously added through a call to appendDatePicker(String, String) or appendDatePicker(String, String, Object).
      @@ -2490,12 +3229,15 @@

      setDate

      Throws:
      java.lang.Exception - May be thrown if identifier does not point to a valid/existing control or date format string is invalid.
      -
    • +
    + + + +
    • -
      -

      getControl

      -
      public java.awt.Component getControl​(java.lang.String identifier)
      +

      getControl

      +
      public java.awt.Component getControl​(java.lang.String identifier)
      Allows you to get the actual Java Swing control. You will likely need to cast it to the appropriate type before use.
      Parameters:
      @@ -2503,23 +3245,29 @@

      getControl

      Returns:
      The control as base class Component. See documentation for various append methods for control types.
      -
    • +
    + + + +
    • -
      -

      toMap

      -
      public java.util.Map<java.lang.String,​java.lang.Object> toMap()
      +

      toMap

      +
      public java.util.Map<java.lang.String,​java.lang.Object> toMap()
      Returns a Map of the control values.
      Returns:
      Map where the assigned identifier is the key and the control's value is the value.
      -
    • +
    + + + +
    • -
      -

      toMap

      -
      public java.util.Map<java.lang.String,​java.lang.Object> toMap​(boolean forJsonCreation)
      +

      toMap

      +
      public java.util.Map<java.lang.String,​java.lang.Object> toMap​(boolean forJsonCreation)
      Returns a Map of the control values.
      Parameters:
      @@ -2529,115 +3277,145 @@

      toMap

      Returns:
      Map where the assigned identifier is the key and the control's value is the value.
      -
    • +
    + + + +
    • -
      -

      toJson

      -
      public java.lang.String toJson()
      +

      toJson

      +
      public java.lang.String toJson()
      Gets a JSON String equivalent of the dialog's values. This is a convenience method for calling toMap() and then converting that Map to a JSON string.
      Returns:
      A JSON string representation of the dialogs values (based on the Map returned by toMap()).
      -
    • +
    + + + +
    • -
      -

      getChoiceTableHeight

      -
      public int getChoiceTableHeight()
      +

      getChoiceTableHeight

      +
      public int getChoiceTableHeight()
      Returns:
      The height of choice table controls
      -
    • +
    + + + +
    • -
      -

      setChoiceTableHeight

      -
      public void setChoiceTableHeight​(int choiceTableHeight)
      +

      setChoiceTableHeight

      +
      public void setChoiceTableHeight​(int choiceTableHeight)
      Parameters:
      choiceTableHeight - The choiceTableHeight to set
      -
    • +
    + + + +
    • -
      -

      getLabel

      -
      public java.lang.String getLabel()
      +

      getLabel

      +
      public java.lang.String getLabel()
      Gets the label of this tab.
      Returns:
      The label of this tab.
      -
    • +
    + + + +
    • -
      -

      setLabel

      -
      public void setLabel​(java.lang.String label)
      +

      setLabel

      +
      public void setLabel​(java.lang.String label)
      Sets the label of this tab.
      Parameters:
      label - The label to set.
      -
    • +
    + + + +
    • -
      -

      whenSerializing

      -
      public void whenSerializing​(java.lang.String identifier, -ControlSerializationHandler handler)
      +

      whenSerializing

      +
      public void whenSerializing​(java.lang.String identifier,
      +                            ControlSerializationHandler handler)
      Allows you to specify code which customizes how a particular control's value is serialized.
      Parameters:
      identifier - The unique identifier of the control to which you are providing custom serialization logic for.
      handler - Provides logic regarding how to serialize the control's value.
      -
    • +
    + + + +
    • -
      -

      whenDeserializing

      -
      public void whenDeserializing​(java.lang.String identifier, -ControlDeserializationHandler handler)
      +

      whenDeserializing

      +
      public void whenDeserializing​(java.lang.String identifier,
      +                              ControlDeserializationHandler handler)
      Allows you to specify code which customizes how a particular control's value is deserialized.
      Parameters:
      identifier - The unique identifier of the control to which you are providing custom deserialization logic for.
      handler - Provides logic regarding how to deserialize the control's value.
      -
    • +
    + + + +
    • -
      -

      setEnabled

      -
      public void setEnabled​(boolean value)
      +

      setEnabled

      +
      public void setEnabled​(boolean value)
      Overrides:
      setEnabled in class javax.swing.JComponent
      -
    • +
    + + + +
    • -
      -

      doNotSerialize

      -
      public void doNotSerialize​(java.lang.String identifier)
      +

      doNotSerialize

      +
      public void doNotSerialize​(java.lang.String identifier)
      Allows you to specify that a particular control's value should not be serialized in calls to toMap(boolean) with a value of true (meaning it is generating map of setting for generating JSON).
      Parameters:
      identifier - The unique identified of the control to be skipped.
      -
    • +
    + + + + - + + + - + - - diff --git a/docs/com/nuix/nx/dialogs/ProcessingStatusDialog.html b/docs/com/nuix/nx/dialogs/ProcessingStatusDialog.html index 746a7b9..2a2e1e0 100644 --- a/docs/com/nuix/nx/dialogs/ProcessingStatusDialog.html +++ b/docs/com/nuix/nx/dialogs/ProcessingStatusDialog.html @@ -3,36 +3,45 @@ -ProcessingStatusDialog +ProcessingStatusDialog (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    +
      -
    • -
      + +
      +
        +
      • -

        Constructor Details

        -
          +

          Constructor Detail

          + + + +
          • -
            -

            ProcessingStatusDialog

            -
            public ProcessingStatusDialog()
            -
            +

            ProcessingStatusDialog

            +
            public ProcessingStatusDialog()
          -
    • +
    + -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        log

        -
        public void log​(java.lang.String message)
        +

        log

        +
        public void log​(java.lang.String message)
        Logs a message to the log text area and the Nuix logs
        Parameters:
        message - The message to log
        -
      • +
      + + + +
      • -
        -

        displayAndBeginProcessing

        -
        public void displayAndBeginProcessing​(nuix.Processor processor)
        +

        displayAndBeginProcessing

        +
        public void displayAndBeginProcessing​(nuix.Processor processor)
        Displays the dialog and begins processing, showing status while processing is occurring.
        Parameters:
        processor - The processor to start and monitor
        -
      • +
      + + + + + + + + -
  • + + +
    - +
    - - diff --git a/docs/com/nuix/nx/dialogs/ProgressDialog.html b/docs/com/nuix/nx/dialogs/ProgressDialog.html index 2944017..07c207e 100644 --- a/docs/com/nuix/nx/dialogs/ProgressDialog.html +++ b/docs/com/nuix/nx/dialogs/ProgressDialog.html @@ -3,36 +3,45 @@ -ProgressDialog +ProgressDialog (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Window

    - +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, toFront + +
      +
    • -addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, toFront
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, dispatchEvent, enable, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      +
    • +
      +
        +
      • + + +

        Method Detail

        + + + + + -

        Method Details

        • -
          -

          abortWasRequested

          -
          public boolean abortWasRequested()
          +

          abortWasRequested

          +
          public boolean abortWasRequested()
          Used to determine if the user requested to abort.
          Returns:
          True if the user clicked abort and clicked yes on the confirmation dialog.
          -
        • +
        + + + +
        • -
          -

          onAbort

          -
          public void onAbort​(java.lang.Runnable callback)
          +

          onAbort

          +
          public void onAbort​(java.lang.Runnable callback)
          Allows you to supply a callback which will be called when the user aborts by clicking and confirming the abort button or closing the dialog.
          Parameters:
          callback - The callback to invoke on abort.
          -
        • +
        + + + +
        • -
          -

          setMainStatus

          -
          public void setMainStatus​(java.lang.String status)
          +

          setMainStatus

          +
          public void setMainStatus​(java.lang.String status)
          Set the main status label text.
          Parameters:
          status - The value set it to.
          -
        • +
        + + + +
        • -
          -

          setMainStatusAndLogIt

          -
          public void setMainStatusAndLogIt​(java.lang.String status)
          +

          setMainStatusAndLogIt

          +
          public void setMainStatusAndLogIt​(java.lang.String status)
          Set the main status label and writes it as a log message.
          Parameters:
          status - The value set it to.
          -
        • +
        + + + +
        • -
          -

          setSubStatus

          -
          public void setSubStatus​(java.lang.String status)
          +

          setSubStatus

          +
          public void setSubStatus​(java.lang.String status)
          Set the sub status label text.
          Parameters:
          status - The value to set it to.
          -
        • +
        + + + +
        • -
          -

          setSubStatusAndLogIt

          -
          public void setSubStatusAndLogIt​(java.lang.String status)
          +

          setSubStatusAndLogIt

          +
          public void setSubStatusAndLogIt​(java.lang.String status)
          Set the sub status label and writes it as a log message.
          Parameters:
          status - The value to set it to.
          -
        • +
        + + + +
        • -
          -

          setMainProgress

          -
          public void setMainProgress​(int value, -int max)
          +

          setMainProgress

          +
          public void setMainProgress​(int value,
          +                            int max)
          Sets the value and maximum value for the main progress bar.
          Parameters:
          value - The current value to set it to.
          max - The maximum value to set it to.
          -
        • +
        + + + +
        • -
          -

          setMainProgress

          -
          public void setMainProgress​(int value)
          +

          setMainProgress

          +
          public void setMainProgress​(int value)
          Sets the current value for the main progress bar without changing the maximum value.
          Parameters:
          value - The current value to set it to.
          -
        • +
        + + + +
        • -
          -

          incrementMainProgress

          -
          public void incrementMainProgress()
          +

          incrementMainProgress

          +
          public void incrementMainProgress()
          Increases the current value of the main progress bar by 1.
          -
        • +
        + + + +
        • -
          -

          setMainProgressVisible

          -
          public void setMainProgressVisible​(boolean value)
          +

          setMainProgressVisible

          +
          public void setMainProgressVisible​(boolean value)
          Sets whether the main progress bar is visible.
          Parameters:
          value - True for visible, false for hidden.
          -
        • +
        + + + +
        • -
          -

          setSubProgress

          -
          public void setSubProgress​(int value, -int max)
          +

          setSubProgress

          +
          public void setSubProgress​(int value,
          +                           int max)
          Sets the value and maximum value for the sub progress bar.
          Parameters:
          value - The current value to set it to.
          max - The maximum value to set it to.
          -
        • +
        + + + +
        • -
          -

          setSubProgress

          -
          public void setSubProgress​(int value)
          +

          setSubProgress

          +
          public void setSubProgress​(int value)
          Sets the current value for the sub progress bar without changing the maximum value.
          Parameters:
          value - The current value to set it to.
          -
        • +
        + + + +
        • -
          -

          incrememntSubProgress

          -
          public void incrememntSubProgress()
          +

          incrememntSubProgress

          +
          public void incrememntSubProgress()
          Increases the current value of the sub progress bar by 1.
          -
        • +
        + + + +
        • -
          -

          setSubProgressVisible

          -
          public void setSubProgressVisible​(boolean value)
          +

          setSubProgressVisible

          +
          public void setSubProgressVisible​(boolean value)
          Sets whether the sub progress bar is visible.
          Parameters:
          value - True for visible, false for hidden.
          -
        • +
        + + + +
        • -
          -

          setAbortButtonVisible

          -
          public void setAbortButtonVisible​(boolean value)
          +

          setAbortButtonVisible

          +
          public void setAbortButtonVisible​(boolean value)
          Sets whether the abort button should be visible. Useful to hide the abort button if you do not plan on supporting responding to it.
          Parameters:
          value - True if you wish the button to be visible, false if you don't.
          -
        • +
        + + + +
        • -
          -

          getAbortButtonVisible

          -
          public boolean getAbortButtonVisible()
          +

          getAbortButtonVisible

          +
          public boolean getAbortButtonVisible()
          Gets whether the abort button is currently visible.
          Returns:
          True if the button is currently visible.
          -
        • +
        + + + +
        • -
          -

          setLogVisible

          -
          public void setLogVisible​(boolean value)
          +

          setLogVisible

          +
          public void setLogVisible​(boolean value)
          Sets whether the log text area should be visible. Useful if you will not be logging any messages while the progress dialog is up.
          Parameters:
          value - True to make the log text area visible, false to hide it.
          -
        • +
        + + + +
        • -
          -

          logMessage

          -
          public void logMessage​(java.lang.String message)
          +

          logMessage

          +
          public void logMessage​(java.lang.String message)
          Logs a message to the log text area.
          Parameters:
          message - The message to write. A newline is automatically appended.
          -
        • +
        + + + +
        • -
          -

          setTextWrapping

          -
          public void setTextWrapping​(boolean wrapText)
          +

          setTextWrapping

          +
          public void setTextWrapping​(boolean wrapText)
          Sets whether text in the message area show be line/word wrapped.
          Parameters:
          wrapText - True enables wrapping, false (default) disables it.
          -
        • +
        + + + +
        • -
          -

          clearLog

          -
          public void clearLog()
          +

          clearLog

          +
          public void clearLog()
          Clears the log text area of all message.
          -
        • +
        + + + +
        • -
          -

          getLogText

          -
          public java.lang.String getLogText()
          +

          getLogText

          +
          public java.lang.String getLogText()
          Gets the current text in the log text area.
          Returns:
          The log text area's current contents.
          -
        • +
        + + + +
        • -
          -

          getLogAllStatusUpdates

          -
          public boolean getLogAllStatusUpdates()
          +

          getLogAllStatusUpdates

          +
          public boolean getLogAllStatusUpdates()
          Gets a value indicating whether all status message updates will be logged.
          Returns:
          True if all status messages will be logged
          -
        • +
        + + + +
        • -
          -

          setLogAllStatusUpdates

          -
          public void setLogAllStatusUpdates​(boolean logAllStatusUpdates)
          +

          setLogAllStatusUpdates

          +
          public void setLogAllStatusUpdates​(boolean logAllStatusUpdates)
          Sets a value indicating whether all status message updates will be logged.
          Parameters:
          logAllStatusUpdates - True if all status messages should be logged
          -
        • +
        + + + + + + + + + + + +
        • -
          -

          embiggen

          -
          public void embiggen​(int margin)
          +

          embiggen

          +
          public void embiggen​(int margin)
          Enlarges the progress dialog to match the screen size less some margin on all sides.
          Parameters:
          margin - The amount in pixels of "margin" to consider when enlarging this progress dialog.
          -
        • +
        + + + +
        • -
          -

          setCompleted

          -
          public void setCompleted()
          +

          setCompleted

          +
          public void setCompleted()
          This is a convenience method for setting the progress dialog into a "script completed" state. Main status is set to "Completed" and this is logged. Sub status if cleared. Main progress is set to 100%. Sub progress is set to 100%.
          -
        • +
        + + + +
        • -
          -

          getTimestampLoggedMessages

          -
          public boolean getTimestampLoggedMessages()
          +

          getTimestampLoggedMessages

          +
          public boolean getTimestampLoggedMessages()
          Sets the value determining whether messages logged will lead with a time stamp.
          Returns:
          boolean True if you time stamps will be logged before each message.
          -
        • +
        + + + +
        • -
          -

          setTimestampLoggedMessages

          -
          public void setTimestampLoggedMessages​(boolean timestampLoggedMessages)
          +

          setTimestampLoggedMessages

          +
          public void setTimestampLoggedMessages​(boolean timestampLoggedMessages)
          Sets the value determining whether messages logged will lead with a time stamp.
          Parameters:
          timestampLoggedMessages - True if you want time stamps logged before each message.
          -
        • +
        + + + + + + + +
        • -
          -

          setReportDisplayVisible

          -
          public void setReportDisplayVisible​(boolean value)
          +

          setReportDisplayVisible

          +
          public void setReportDisplayVisible​(boolean value)
          Sets whether the report section is visible. If the section is made visible with no ReportDataModel provided via the addReport(ReportDataModel) method, then the report will take no space and not be visible.
          @@ -801,16 +1010,17 @@

          setReportDisplayVisible

          Parameters:
          value - True for visible, false for hidden.
          -
        -
    + + + - + - - diff --git a/docs/com/nuix/nx/dialogs/ProgressDialogBlockInterface.html b/docs/com/nuix/nx/dialogs/ProgressDialogBlockInterface.html index 509d3a4..edc89e5 100644 --- a/docs/com/nuix/nx/dialogs/ProgressDialogBlockInterface.html +++ b/docs/com/nuix/nx/dialogs/ProgressDialogBlockInterface.html @@ -3,36 +3,45 @@ -ProgressDialogBlockInterface +ProgressDialogBlockInterface (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.html b/docs/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.html index 1a357a3..a6b8587 100644 --- a/docs/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.html +++ b/docs/com/nuix/nx/dialogs/ProgressDialogLoggingCallback.html @@ -3,36 +3,45 @@ -ProgressDialogLoggingCallback +ProgressDialogLoggingCallback (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/dialogs/ScrollableCustomTabPanel.html b/docs/com/nuix/nx/dialogs/ScrollableCustomTabPanel.html index 6d08778..b7c980c 100644 --- a/docs/com/nuix/nx/dialogs/ScrollableCustomTabPanel.html +++ b/docs/com/nuix/nx/dialogs/ScrollableCustomTabPanel.html @@ -3,36 +3,45 @@ -ScrollableCustomTabPanel +ScrollableCustomTabPanel (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class javax.swing.JComponent

    - +addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update + +
      +
    • -addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintImmediately, paintImmediately, print, printAll, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, createImage, createImage, createVolatileImage, createVolatileImage, dispatchEvent, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
    +
    -
  • -
    +
    +
      +
    • -

      Method Details

      -
        +

        Method Detail

        + + + +
        • -
          -

          add

          -
          public java.awt.Component add​(java.awt.Component comp)
          +

          add

          +
          public java.awt.Component add​(java.awt.Component comp)
          Overrides:
          add in class java.awt.Container
          -
        -
  • + + + - +
    - - diff --git a/docs/com/nuix/nx/dialogs/TabbedCustomDialog.html b/docs/com/nuix/nx/dialogs/TabbedCustomDialog.html index 6d2704e..ec02ab0 100644 --- a/docs/com/nuix/nx/dialogs/TabbedCustomDialog.html +++ b/docs/com/nuix/nx/dialogs/TabbedCustomDialog.html @@ -3,36 +3,45 @@ -TabbedCustomDialog +TabbedCustomDialog (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    -
    +

    Methods inherited from class java.awt.Window

    - +addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, toFront + +
      +
    • -addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBackground, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOpacity, getOwnedWindows, getOwner, getOwnerlessWindows, getShape, getToolkit, getType, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isAutoRequestFocus, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isOpaque, isShowing, isValidateRoot, pack, paint, postEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setAutoRequestFocus, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocation, setLocation, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, setType, toFront
    -
    +

    Methods inherited from class java.awt.Container

    - +add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate, validateTree + +
      +
    • -add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusDownCycle, validate
    -
    +

    Methods inherited from class java.awt.Component

    - +action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle + +
      +
    • -action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, dispatchEvent, enable, enable, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getGraphicsConfiguration, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resize, resize, revalidate, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setMaximumSize, setMixingCutoutShape, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
    -
    +

    Methods inherited from class java.lang.Object

    - - -equals, getClass, hashCode, notify, notifyAll, wait, wait, wait
    - +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait + -
    + + + +
      -
    • -
      + +
      +
        +
      • + + +

        Constructor Detail

        + -

        Constructor Details

        • -
          -

          TabbedCustomDialog

          -
          public TabbedCustomDialog()
          +

          TabbedCustomDialog

          +
          public TabbedCustomDialog()
          Create a new instance.
          -
        • +
        + + + +
        • -
          -

          TabbedCustomDialog

          -
          public TabbedCustomDialog​(java.lang.String title)
          +

          TabbedCustomDialog

          +
          public TabbedCustomDialog​(java.lang.String title)
          Create a new instance with the specified title.
          Parameters:
          title - The inital title of the dialog.
          -
        -
    • +
    +
    -
  • -
    +
    +
      +
    • + + +

      Method Detail

      + -

      Method Details

      • -
        -

        display

        -
        public void display()
        +

        display

        +
        public void display()
        Displays this custom dialog. Dialog is modal so this call will block caller until dialog is closed. To determine whether user clicked "Ok", "Cancel" or closed the dialog, call getDialogResult() afterwards.
        -
      • +
      + + + +
      • -
        -

        displayNonModal

        -
        public void displayNonModal​(java.util.function.Consumer<java.lang.Boolean> callback)
        +

        displayNonModal

        +
        public void displayNonModal​(java.util.function.Consumer<java.lang.Boolean> callback)
        Similar to display() except that the dialog will be displayed non-modal and will invoke the provided callback when the dialog is closed and the result of getDialogResult() returns true. Note that invoking this from a script essentially behaves as asynchronous call from the script's perspective!
        @@ -646,23 +756,29 @@

        displayNonModal

        Parameters:
        callback - The callback to invoke when the dialog is closed.
        -
      • +
      + + + +
      • -
        -

        fillScreen

        -
        public void fillScreen​(int margins)
        +

        fillScreen

        +
        public void fillScreen​(int margins)
        Resizes the dialog to fill the screen, less the specified margin on all sides.
        Parameters:
        margins - The margin size on all sides
        -
      • +
      + + + +
      • -
        -

        getTab

        -
        public CustomTabPanel getTab​(java.lang.String id)
        +

        getTab

        +
        public CustomTabPanel getTab​(java.lang.String id)
        Gets the tab with the specified ID
        Parameters:
        @@ -670,13 +786,16 @@

        getTab

        Returns:
        The tab associated with the specified ID
        -
      • +
      + + + +
      • -
        -

        addTab

        -
        public CustomTabPanel addTab​(java.lang.String id, -java.lang.String label)
        +

        addTab

        +
        public CustomTabPanel addTab​(java.lang.String id,
        +                             java.lang.String label)
        Adds a new tab to the dialog.
        Parameters:
        @@ -685,73 +804,94 @@

        addTab

        Returns:
        A newly created tab associated to this dialog
        -
      • +
      + + + + + + + +
      • -
        -

        setTabLabel

        -
        public void setTabLabel​(java.lang.String tabId, -java.lang.String label)
        +

        setTabLabel

        +
        public void setTabLabel​(java.lang.String tabId,
        +                        java.lang.String label)
        Updates the label for given tab to a new value
        Parameters:
        tabId - Id assigned to the tab when it was added
        label - The new label value for the tab
        -
      • +
      + + + +
      • -
        -

        setTabPlacement

        -
        public void setTabPlacement​(int tabPlacement)
        +

        setTabPlacement

        +
        public void setTabPlacement​(int tabPlacement)
        Allows you to change the orientation of the tabs in the dialog by providing one of the JTabbedPane alignment constants
        Parameters:
        tabPlacement - A JTabbedPane alignment constant, such as JTabbedPane.LEFT
        -
      • +
      + + + +
      • -
        -

        setTabPlacementLeft

        -
        public void setTabPlacementLeft()
        +

        setTabPlacementLeft

        +
        public void setTabPlacementLeft()
        Changes the orientation of the dialogs tabs to be along the left side of the dialog
        -
      • +
      + + + +
      • -
        -

        getDialogResult

        -
        public boolean getDialogResult()
        +

        getDialogResult

        +
        public boolean getDialogResult()
        Gets the result of showing the dialog.
        Returns:
        True if the user clicked the 'Ok' button. False if otherwise ('Cancel' button or closed the dialog).
        -
      • +
      + + + +
      • -
        -

        toMap

        -
        public java.util.Map<java.lang.String,​java.lang.Object> toMap()
        +

        toMap

        +
        public java.util.Map<java.lang.String,​java.lang.Object> toMap()
        Returns a Map of the control values.
        Returns:
        Map where the assigned identifier is the key and the control's value is the value.
        -
      • +
      + + + +
      • -
        -

        toMap

        -
        public java.util.Map<java.lang.String,​java.lang.Object> toMap​(boolean forJsonCreation)
        +

        toMap

        +
        public java.util.Map<java.lang.String,​java.lang.Object> toMap​(boolean forJsonCreation)
        Returns a Map of the control values.
        Parameters:
        @@ -761,14 +901,17 @@

        toMap

        Returns:
        Map where the assigned identifier is the key and the control's value is the value.
        -
      • +
      + + + + + + + + + + + + + + + + + + + + + + + +
      • -
        -

        isChecked

        -
        public boolean isChecked​(java.lang.String identifier) - throws java.lang.Exception
        +

        isChecked

        +
        public boolean isChecked​(java.lang.String identifier)
        +                  throws java.lang.Exception
        Gets whether a particular Checkbox or RadioButton is checked.
        Parameters:
        @@ -868,47 +1026,59 @@

        isChecked

        Throws:
        java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
        -
      • +
      + + + +
      • -
        -

        allAreChecked

        -
        public boolean allAreChecked​(java.lang.String... identifiers) - throws java.lang.Exception
        +

        allAreChecked

        +
        public boolean allAreChecked​(java.lang.String... identifiers)
        +                      throws java.lang.Exception
        Throws:
        java.lang.Exception
        -
      • +
      + + + +
      • -
        -

        noneAreChecked

        -
        public boolean noneAreChecked​(java.lang.String... identifiers) - throws java.lang.Exception
        +

        noneAreChecked

        +
        public boolean noneAreChecked​(java.lang.String... identifiers)
        +                       throws java.lang.Exception
        Throws:
        java.lang.Exception
        -
      • +
      + + + +
      • -
        -

        anyAreChecked

        -
        public boolean anyAreChecked​(java.lang.String... identifiers) - throws java.lang.Exception
        +

        anyAreChecked

        +
        public boolean anyAreChecked​(java.lang.String... identifiers)
        +                      throws java.lang.Exception
        Throws:
        java.lang.Exception
        -
      • +
      + + + +
      • -
        -

        setChecked

        -
        public void setChecked​(java.lang.String identifier, -boolean isChecked) - throws java.lang.Exception
        +

        setChecked

        +
        public void setChecked​(java.lang.String identifier,
        +                       boolean isChecked)
        +                throws java.lang.Exception
        Sets whether a particular Checkbox or RadioButton is checked.
        Parameters:
        @@ -917,13 +1087,16 @@

        setChecked

        Throws:
        java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a Checkbox or RadioButton.
        -
      • +
      + + + +
      • -
        -

        getText

        -
        public java.lang.String getText​(java.lang.String identifier) - throws java.lang.Exception
        +

        getText

        +
        public java.lang.String getText​(java.lang.String identifier)
        +                         throws java.lang.Exception
        Gets the text present in a TextField or PasswordField.
        Parameters:
        @@ -933,14 +1106,17 @@

        getText

        Throws:
        java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
        -
      • +
      + + + +
      • -
        -

        setText

        -
        public void setText​(java.lang.String identifier, -java.lang.String text) - throws java.lang.Exception
        +

        setText

        +
        public void setText​(java.lang.String identifier,
        +                    java.lang.String text)
        +             throws java.lang.Exception
        Sets the text present in a TextField or PasswordField.
        Parameters:
        @@ -949,12 +1125,15 @@

        setText

        Throws:
        java.lang.Exception - Thrown if identifier is invalid or identifier does not refer to a TextField or PasswordField.
        -
      • +
      + + + +
      • -
        -

        getControl

        -
        public java.awt.Component getControl​(java.lang.String identifier)
        +

        getControl

        +
        public java.awt.Component getControl​(java.lang.String identifier)
        Allows you to get the actual Java Swing control. You will likely need to cast it to the appropriate type before use.
        Parameters:
        @@ -962,12 +1141,15 @@

        getControl

        Returns:
        The control as base class Component. See documentation for various append methods for control types.
        -
      • +
      + + + +
      • -
        -

        enableStickySettings

        -
        public void enableStickySettings​(java.lang.String filePath)
        +

        enableStickySettings

        +
        public void enableStickySettings​(java.lang.String filePath)
        This enables "sticky settings" where the dialog will save a JSON file of settings when 'Okay' is clicked and will attempt to load previously saved settings when the dialog is displayed. This currently only works with controls added to the dialog which support setText(java.lang.String,java.lang.String) and setChecked(java.lang.String,boolean). See toJson() and loadJson(java.lang.String).
        @@ -975,74 +1157,92 @@

        enableStickySettings

        Parameters:
        filePath - The full file path where you expect the settings JSON file to be located. Likely you will generate a path relative to your script at runtime.
        -
      • +
      + + + +
      • -
        -

        validateBeforeClosing

        -
        public void validateBeforeClosing​(ValidationCallback callback)
        +

        validateBeforeClosing

        +
        public void validateBeforeClosing​(ValidationCallback callback)
        Allows code to implement and provide a callback which can validate whether things are okay.
        Parameters:
        callback - Callback should return false if things are not satisfactory, true otherwise.
        -
      • +
      + + + +
      • -
        -

        toJson

        -
        public java.lang.String toJson()
        +

        toJson

        +
        public java.lang.String toJson()
        Gets a JSON String equivalent of the dialog values. This is a convenience method for calling toMap() and then converting that Map to a JSON string.
        Returns:
        A JSON string representation of the dialogs values (based on the Map returned by toMap()).
        -
      • +
      + + + +
      • -
        -

        loadJson

        -
        public void loadJson​(java.lang.String json)
        +

        loadJson

        +
        public void loadJson​(java.lang.String json)
        Attempts to set control values based on entries in JSON file. Entries which are unknown or cause errors are ignored. Loads JSON onto any controls in any tabs contained by this TabbedCustomDialog instance.
        Parameters:
        json - A JSON string to attempt to load.
        -
      • +
      + + + +
      • -
        -

        loadJson

        -
        public void loadJson​(java.lang.String json, -java.lang.String tabIdentifier)
        +

        loadJson

        +
        public void loadJson​(java.lang.String json,
        +                     java.lang.String tabIdentifier)
        Loads JSON but only to the controls contained within the specified tab.
        Parameters:
        json - A JSON string to attempt to load
        tabIdentifier - Identifier of existing tab to which you would like to load the JSON into.
        -
      • +
      + + + +
      • -
        -

        loadJson

        -
        public void loadJson​(java.lang.String json, -java.util.Map<java.lang.String,​java.awt.Component> controlMap)
        +

        loadJson

        +
        public void loadJson​(java.lang.String json,
        +                     java.util.Map<java.lang.String,​java.awt.Component> controlMap)
        Attempts to set control values based on entries in JSON file. Entries which are unknown or cause errors are ignored.
        Parameters:
        json - A JSON string to attempt to load.
        controlMap - A map of components to load the JSON onto.
        -
      • +
      + + + +
      • -
        -

        saveJsonFile

        -
        public void saveJsonFile​(java.lang.String filePath) - throws java.lang.Exception
        +

        saveJsonFile

        +
        public void saveJsonFile​(java.lang.String filePath)
        +                  throws java.lang.Exception
        Saves the settings of this dialog to a JSON file
        Parameters:
        @@ -1050,13 +1250,16 @@

        saveJsonFile

        Throws:
        java.lang.Exception - Thrown if there are exceptions while saving the file
        -
      • +
      + + + +
      • -
        -

        loadJsonFile

        -
        public void loadJsonFile​(java.lang.String filePath) - throws java.io.IOException
        +

        loadJsonFile

        +
        public void loadJsonFile​(java.lang.String filePath)
        +                  throws java.io.IOException
        Loads the settings of this dialog from a JSON file
        Parameters:
        @@ -1064,76 +1267,97 @@

        loadJsonFile

        Throws:
        java.io.IOException - Thrown if there are exceptions while loading the file
        -
      • +
      + + + +
      • -
        -

        getHelpFile

        -
        public java.io.File getHelpFile()
        +

        getHelpFile

        +
        public java.io.File getHelpFile()
        The File currently associated to the "Help" menu "View Documentation" entry
        Returns:
        The currently associated help file
        -
      • +
      + + + +
      • -
        -

        setHelpFile

        -
        public void setHelpFile​(java.io.File helpFile)
        +

        setHelpFile

        +
        public void setHelpFile​(java.io.File helpFile)
        Sets the path to a help file which will be associated to the "Help" menu "View Documentation" entry
        Parameters:
        helpFile - Path to a help file (set null to hide help menu, default is null)
        -
      • +
      + + + +
      • -
        -

        setHelpFile

        -
        public void setHelpFile​(java.lang.String helpFile)
        +

        setHelpFile

        +
        public void setHelpFile​(java.lang.String helpFile)
        Sets the path to a help file which will be associated to the "Help" menu "View Help" entry
        Parameters:
        helpFile - Path to a help file (set null to hide help menu, default is null)
        -
      • +
      + + + +
      • -
        -

        setHelpUrl

        -
        public void setHelpUrl​(java.lang.String helpUrl)
        +

        setHelpUrl

        +
        public void setHelpUrl​(java.lang.String helpUrl)
        Sets the URL which will be associated to the "Help" menu "View Online Help" entry.
        Parameters:
        helpUrl - URL to a web site
        -
      • +
      + + + +
      • -
        -

        hideFileMenu

        -
        public void hideFileMenu()
        +

        hideFileMenu

        +
        public void hideFileMenu()
        Hides the file menu from the user (effectively disabling save and load). Mostly included for situations where settings cannot be reasonably saved to JSON so you wish to hide those choices from the user.
        -
      • +
      + + + +
      • -
        -

        whenJsonFileLoaded

        -
        public void whenJsonFileLoaded​(java.lang.Runnable callback)
        +

        whenJsonFileLoaded

        +
        public void whenJsonFileLoaded​(java.lang.Runnable callback)
        Allows you to provide a callback to run when a JSON file is loaded.
        Parameters:
        callback - The callback to run
        -
      • +
      + + + +
      • -
        -

        whenSerializing

        -
        public void whenSerializing​(java.lang.String identifier, -ControlSerializationHandler handler)
        +

        whenSerializing

        +
        public void whenSerializing​(java.lang.String identifier,
        +                            ControlSerializationHandler handler)
        Advanced! Allows you to define a callback which will handle serialization of a particular control to JSON.
        @@ -1141,13 +1365,16 @@

        + + +
        • -
          -

          whenDeserializing

          -
          public void whenDeserializing​(java.lang.String identifier, -ControlDeserializationHandler handler)
          +

          whenDeserializing

          +
          public void whenDeserializing​(java.lang.String identifier,
          +                              ControlDeserializationHandler handler)
          Advanced! Allows you to define a callback which will handle deserialization of a particular control from JSON.
          @@ -1155,12 +1382,15 @@

          + + + + + + + + + + +
          • -
            -

            addMenu

            -
            public void addMenu​(java.lang.String parentMenuLabel, -java.lang.String menuItemLabel, -java.lang.Runnable action)
            +

            addMenu

            +
            public void addMenu​(java.lang.String parentMenuLabel,
            +                    java.lang.String menuItemLabel,
            +                    java.lang.Runnable action)
            Adds a menu entry to the menu bar and then a menu item to that menu.
            Parameters:
            @@ -1209,27 +1445,31 @@

            addMen end

            -
          • +
          + + + +
          • -
            -

            setSelectedTabIndex

            -
            public void setSelectedTabIndex​(int index)
            +

            setSelectedTabIndex

            +
            public void setSelectedTabIndex​(int index)
            Sets which tab is currently selected.
            Parameters:
            index - The index of the tab to make selected (index starts at 0).
            -
          -

        +
      • +
      + - +
    - + - - diff --git a/docs/com/nuix/nx/dialogs/Toast.html b/docs/com/nuix/nx/dialogs/Toast.html new file mode 100644 index 0000000..e8d75fd --- /dev/null +++ b/docs/com/nuix/nx/dialogs/Toast.html @@ -0,0 +1,426 @@ + + + + + +Toast (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class Toast

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.nuix.nx.dialogs.Toast
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public class Toast
      +extends java.lang.Object
      +
      A Toast is a short-lived informational message displayed in the UI. +

      + Generally, Toasts are displayed in the bottom right corner of the UI - either the screen or the window. They + are meant for non-critical information display not required by the current user workflow. For example if a + licenses was about to expire, a Toast might be used to display the time left until expiration. +

      +

      + This Toast class represents a reusable container that can display text in a user-defined position on the screen. + Although the only limits to the position are that they must be fully on-screen, it will be generally useful to + ensure it is positions towards the bottom of the display as the Toast will animate on screen from below. This + Toast will have an in-animation that moves the message into view from off the bottom of the screen and an out- + animation that fades the screen out. Animations are handled in a thread to avoid blocking the UI or scripting + thread context +

      +

      + Use the showToast(String, Rectangle) method to display the message in the location of interest: +

      +
      +         Toast toast = new Toast();
      +
      +         String message = "Title\nThis is a brief message about something, but no worries, won't kill the application.";
      +         Rectangle position = new Rectangle(1400, 1000, 500, 80);
      +         toast.showToast(message, position);
      + 
      +

      + TODO: I have found the threading can cause slower than expected motion when the computer is under heavy load. +

      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + +
        Constructors 
        ConstructorDescription
        Toast() 
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        java.lang.StringgetLastMessage() 
        intgetToastTimeInSeconds() 
        voidsetToastTimeInSeconds​(int seconds) 
        voidshowLastToast() +
        Reshow the last message that was displayed, in the same location it was displayed in.
        +
        voidshowToast​(java.lang.String message, + java.awt.Rectangle targetPosition) +
        Display the provided message at the position specified.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Toast

          +
          public Toast()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setToastTimeInSeconds

          +
          public void setToastTimeInSeconds​(int seconds)
          +
          +
          Parameters:
          +
          seconds - The period of time, in seconds, the Toast should remain on screen after the in-animation + completes and before the out-animation starts. The full time on screen will be longer than this + as the animation runs. Defaults to 5 seconds if not set.
          +
          +
        • +
        + + + +
          +
        • +

          getToastTimeInSeconds

          +
          public int getToastTimeInSeconds()
          +
          +
          Returns:
          +
          The period of time, in seconds, the Toast will be displayed on screen after it reaches its destination + and before it begins to fade out. The actual time on screen will be longer than this as the animations run.
          +
          +
        • +
        + + + +
          +
        • +

          getLastMessage

          +
          public java.lang.String getLastMessage()
          +
          +
          Returns:
          +
          The string contents of the last message sent to the Toast
          +
          +
        • +
        + + + +
          +
        • +

          showToast

          +
          public void showToast​(java.lang.String message,
          +                      java.awt.Rectangle targetPosition)
          +
          Display the provided message at the position specified. +

          + When this method is called, the Toast will be created and animate in by sliding up to the desired position + from off the bottom of the screen. Once in position it holds for several seconds then fades away. + This tool does not manage the display of multiple toasts at one time. +

          +
          +
          Parameters:
          +
          message - A message to display. The message can be multi-line, can include line breaks (\n) and will word + wrap.
          +
          targetPosition - A Rectangle defining the location and size of the box to display the message in. + The location is relative to the top left of the screen (not window). The width will be + fixed at the defined size, and the height will be maximized at the defined size (but + could be smaller if the message wouldn't fill the area).
          +
          Throws:
          +
          java.lang.RuntimeException - if the target position is illegal, such as fully or partially off-screen.
          +
          +
        • +
        + + + +
          +
        • +

          showLastToast

          +
          public void showLastToast()
          +
          Reshow the last message that was displayed, in the same location it was displayed in.
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/dialogs/ValidationCallback.html b/docs/com/nuix/nx/dialogs/ValidationCallback.html index d6f09d6..02aec48 100644 --- a/docs/com/nuix/nx/dialogs/ValidationCallback.html +++ b/docs/com/nuix/nx/dialogs/ValidationCallback.html @@ -3,36 +3,45 @@ -ValidationCallback +ValidationCallback (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
  • + + +
      -
    • -
      + +
      +
        +
      • -

        Method Summary

        -
        -
        -
        - - +

        Method Summary

        +
        + - - - + -
        All Methods Instance Methods Abstract Methods 
        Modifier and Type Method Description
        boolean validate​(java.util.Map<java.lang.String,​java.lang.Object> currentValues)
        A method used to validate.
        -
        -
        -
    -
    + + +
    +
      -
    • -
      + +
      +
        +
      • -

        Method Details

        -
          +

          Method Detail

          + + + +
          • -
            -

            validate

            -
            boolean validate​(java.util.Map<java.lang.String,​java.lang.Object> currentValues)
            +

            validate

            +
            boolean validate​(java.util.Map<java.lang.String,​java.lang.Object> currentValues)
            A method used to validate.
            Parameters:
            @@ -152,16 +184,17 @@

            validate

            Returns:
            Return false if something is not acceptable, otherwise true.
            -
          -
    + + +
    - +
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ChoiceDialog.html b/docs/com/nuix/nx/dialogs/class-use/ChoiceDialog.html deleted file mode 100644 index 7c2a3ae..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ChoiceDialog.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.ChoiceDialog - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.ChoiceDialog

    -
    -
    No usage of com.nuix.nx.dialogs.ChoiceDialog
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/CommonDialogs.html b/docs/com/nuix/nx/dialogs/class-use/CommonDialogs.html deleted file mode 100644 index 9860f66..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/CommonDialogs.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.CommonDialogs - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.CommonDialogs

    -
    -
    No usage of com.nuix.nx.dialogs.CommonDialogs
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/CustomTabPanel.html b/docs/com/nuix/nx/dialogs/class-use/CustomTabPanel.html deleted file mode 100644 index 9b290da..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/CustomTabPanel.html +++ /dev/null @@ -1,758 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.CustomTabPanel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.CustomTabPanel

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use CustomTabPanel 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    -
      -
    • -
      - - -

      Uses of CustomTabPanel in com.nuix.nx.controls

      -
      - - - - - - - - - - - - - - -
      Constructors in com.nuix.nx.controls with parameters of type CustomTabPanel 
      ConstructorDescription
      ButtonRow​(CustomTabPanel owningTab) 
      -
      -
      -
    • -
    • -
      - - -

      Uses of CustomTabPanel in com.nuix.nx.dialogs

      -
      - - - - - - - - - - - - - - - - -
      Subclasses of CustomTabPanel in com.nuix.nx.dialogs 
      Modifier and TypeClassDescription
      class ScrollableCustomTabPanel 
      -
      -
      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      Methods in com.nuix.nx.dialogs that return CustomTabPanel 
      Modifier and TypeMethodDescription
      CustomTabPanelTabbedCustomDialog.addTab​(java.lang.String id, -java.lang.String label) -
      Adds a new tab to the dialog.
      -
      CustomTabPanelCustomTabPanel.appendBatchExporterLoadFileSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide loadfile export settings, as passed to BatchExporter.addLoadFile(String, Map).
      -
      CustomTabPanelCustomTabPanel.appendBatchExporterNativeSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide native export settings, as passed to BatchExporter.addProduct(String, Map) for the "native" product.
      -
      CustomTabPanelCustomTabPanel.appendBatchExporterPdfSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide PDF export settings, as passed to BatchExporter.addProduct(String, Map) for the "pdf" product.
      -
      CustomTabPanelCustomTabPanel.appendBatchExporterTextSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide text export settings, as passed to BatchExporter.addProduct(String, Map) for the "text" product.
      -
      CustomTabPanelCustomTabPanel.appendBatchExporterTraversalSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide traversal settings, as passed to BatchExporter.setTraversalOptions(Map).
      -
      CustomTabPanelCustomTabPanel.appendButton​(java.lang.String identifier, -java.lang.String controlLabel, -java.awt.event.ActionListener actionListener) -
      Appends a JButton control with the specified label and attaches the provided action listener to the - button.
      -
      CustomTabPanelCustomTabPanel.appendCheckableTextField​(java.lang.String checkBoxId, -boolean isChecked, -java.lang.String textFieldId, -java.lang.String textFieldDefault, -java.lang.String controlLabel) -
      Appends a text field with an associated check box.
      -
      CustomTabPanelCustomTabPanel.appendCheckBox​(java.lang.String identifier, -java.lang.String controlLabel, -boolean isChecked) -
      Appends a check box control to the tab.
      -
      CustomTabPanelCustomTabPanel.appendCheckBoxes​(java.lang.String identifierA, -java.lang.String controlLabelA, -boolean isCheckedA, -java.lang.String identifierB, -java.lang.String controlLabelB, -boolean isCheckedB) -
      Appends 2 check boxes, in a single row, to the tab.
      -
      <T> CustomTabPanelCustomTabPanel.appendChoiceTable​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.List<Choice<T>> choices) -
      Appends a control which allows the user to select multiple choices.
      -
      CustomTabPanelCustomTabPanel.appendComboBox​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.Collection<java.lang.String> choices) -
      Appends a combo box control allowing a user to select one of many choices.
      -
      CustomTabPanelCustomTabPanel.appendComboBox​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.Collection<java.lang.String> choices, -java.lang.Runnable callback) -
      Appends a combo box control allowing a user to select one of many choices.
      -
      CustomTabPanelCustomTabPanel.appendComboItemBox​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.List<ComboItem> choices, -java.lang.Runnable callback) -
      Appends a combo box control which takes a list of ComboItem instances, allowing you to have each entry represent a specific value - while having a separate value as the labeled choice displayed in the combo box.
      -
      CustomTabPanelCustomTabPanel.appendCsvTable​(java.lang.String identifier, -java.util.List<java.lang.String> headers) -
      Appends a table control with the specified headers, which is capable of importing a CSV with the same headers.
      -
      CustomTabPanelCustomTabPanel.appendCsvTable​(java.lang.String identifier, -java.util.List<java.lang.String> headers, -java.lang.String defaultImportDirectory) -
      Appends a table control with the specified headers, which is capable of importing a CSV with the same headers.
      -
      CustomTabPanelCustomTabPanel.appendDatePicker​(java.lang.String identifier, -java.lang.String controlLabel) -
      Appends a date picker field control to the dialog with the default date being today's date.
      -
      CustomTabPanelCustomTabPanel.appendDatePicker​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.Object defaultDate) -
      Appends a date picker field control to the dialog
      -
      CustomTabPanelCustomTabPanel.appendDirectoryChooser​(java.lang.String identifier, -java.lang.String controlLabel) -
      Appends a control which allows a user to select a directory.
      -
      CustomTabPanelCustomTabPanel.appendDirectoryChooser​(java.lang.String identifier, -java.lang.String controlLabel, -PathSelectedCallback callback) -
      Appends a control which allows a user to select a directory.
      -
      CustomTabPanelCustomTabPanel.appendDirectoryChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String initialDirectory) -
      Appends a control which allows a user to select a directory.
      -
      CustomTabPanelCustomTabPanel.appendDirectoryChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String initialDirectory, -PathSelectedCallback callback) -
      Appends a control which allows a user to select a directory.
      -
      CustomTabPanelCustomTabPanel.appendDynamicTable​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.List<java.lang.String> headers, -java.util.List<java.lang.Object> records, -DynamicTableValueCallback callback) -
      Appends a fairly flexible table control to the tab.
      -
      CustomTabPanelCustomTabPanel.appendFormattedInformation​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String text) -
      Appends a read only text area control for you to place some user information similar to appendInformation(String, String, String).
      -
      CustomTabPanelCustomTabPanel.appendHeader​(java.lang.String text) -
      Appends a header label that spans 2 columns.
      -
      CustomTabPanelCustomTabPanel.appendImage​(java.io.File imageFile) -
      Appends an image to the tab
      -
      CustomTabPanelCustomTabPanel.appendImage​(java.lang.String imageFile) -
      Appends an image to the tab
      -
      CustomTabPanelCustomTabPanel.appendInformation​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String text) -
      Appends a read only text area control for you to place some user information.
      -
      CustomTabPanelCustomTabPanel.appendLabel​(java.lang.String identifier, -java.lang.String text) -
      Appends a label that spans 2 columns.
      -
      CustomTabPanelCustomTabPanel.appendLocalWorkerSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide worker settings, as passed to ParallelProcessingConfigurable.setParallelProcessingSettings(Map).
      -
      CustomTabPanelCustomTabPanel.appendMultipleChoiceComboBox​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.List<java.lang.String> choices) -
      Appends a combo box which allows you to select multiple choices from its drop down list by checking them.
      -
      CustomTabPanelCustomTabPanel.appendMultipleChoiceComboBox​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.List<java.lang.String> choices, -java.util.List<java.lang.String> defaultCheckedChoices) -
      Appends a combo box which allows you to select multiple choices from its drop down list by checking them.
      -
      CustomTabPanelCustomTabPanel.appendOcrSettings​(java.lang.String identifier) -
      Appends a control with controls used to provide OCR settings, as passed to OcrProcessor.
      -
      CustomTabPanelCustomTabPanel.appendOpenFileChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String fileTypeName, -java.lang.String fileExtension) -
      Appends a control which allows a user to select a file to open.
      -
      CustomTabPanelCustomTabPanel.appendOpenFileChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String fileTypeName, -java.lang.String fileExtension, -PathSelectedCallback callback) -
      Appends a control which allows a user to select a file to open.
      -
      CustomTabPanelCustomTabPanel.appendOpenFileChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String fileTypeName, -java.lang.String fileExtension, -java.lang.String initialDirectory) -
      Appends a control which allows a user to select a file to open.
      -
      CustomTabPanelCustomTabPanel.appendOpenFileChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String fileTypeName, -java.lang.String fileExtension, -java.lang.String initialDirectory, -PathSelectedCallback callback) -
      Appends a control which allows a user to select a file to open.
      -
      CustomTabPanelCustomTabPanel.appendPasswordField​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String text) -
      Appends a password text field control to the dialog.
      -
      CustomTabPanelCustomTabPanel.appendPathList​(java.lang.String identifier) -
      Appends a list box allowing the user to specify multiple file and directory paths.
      -
      CustomTabPanelCustomTabPanel.appendPathList​(java.lang.String identifier, -java.util.List<java.lang.String> initialPaths) -
      Appends a list box allowing the user to specify multiple file and directory paths.
      -
      CustomTabPanelCustomTabPanel.appendRadioButton​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String radioButtonGroupName, -boolean isChecked) -
      Appends a radio button control to the dialog.
      -
      CustomTabPanelCustomTabPanel.appendRadioButtonGroup​(java.lang.String groupLabel, -java.lang.String radioButtonGroupName, -java.util.Map<java.lang.String,​java.lang.String> radioButtonChoices) 
      CustomTabPanelCustomTabPanel.appendRadioButtonLeft​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String radioButtonGroupName, -boolean isChecked) 
      CustomTabPanelCustomTabPanel.appendSaveFileChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String fileTypeName, -java.lang.String fileExtension) -
      Appends a control which allows a user to select a file to save.
      -
      CustomTabPanelCustomTabPanel.appendSaveFileChooser​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String fileTypeName, -java.lang.String fileExtension, -java.lang.String initialDirectory) -
      Appends a control which allows a user to select a file to save.
      -
      CustomTabPanelCustomTabPanel.appendSearchableComboBox​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.Collection<java.lang.String> choices) -
      Appends a combo box control allowing a user to select one of many choices and allows for filtering choices by typing in a value.
      -
      CustomTabPanelCustomTabPanel.appendSeparator​(java.lang.String label) -
      Appends a separator that spans 2 columns.
      -
      CustomTabPanelCustomTabPanel.appendSlider​(java.lang.String identifier, -java.lang.String controlLabel) -
      Creates a new slider control that lets the user specify a value in the range 0 to 100 with an initial value of - 50.
      -
      CustomTabPanelCustomTabPanel.appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -double initialValue) -
      Creates a new slider control that lets the user specify a value within the range of 0.0 to 1.0.
      -
      CustomTabPanelCustomTabPanel.appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -double initialValue, -double min, -double max) -
      Creates a new slider control that lets the user specify a value within a range using doubles.
      -
      CustomTabPanelCustomTabPanel.appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue) -
      Creates a new slider control that lets the user specify a value in the range 0 to 100.
      -
      CustomTabPanelCustomTabPanel.appendSlider​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue, -int min, -int max) -
      Creates a new slider control that lets the user specify a value within a range using integers.
      -
      CustomTabPanelCustomTabPanel.appendSpinner​(java.lang.String identifier, -java.lang.String controlLabel) -
      Creates a up/down number picker control (known in Java as a Spinner).
      -
      CustomTabPanelCustomTabPanel.appendSpinner​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue) -
      Creates a up/down number picker control (known in Java as a Spinner).
      -
      CustomTabPanelCustomTabPanel.appendSpinner​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue, -int min, -int max) -
      Creates a up/down number picker control (known in Java as a Spinner).
      -
      CustomTabPanelCustomTabPanel.appendSpinner​(java.lang.String identifier, -java.lang.String controlLabel, -int initialValue, -int min, -int max, -int step) -
      Creates a up/down number picker control (known in Java as a Spinner).
      -
      CustomTabPanelCustomTabPanel.appendStringChoiceTable​(java.lang.String identifier, -java.lang.String controlLabel, -java.util.Collection<java.lang.String> choices) -
      Appends a control which allows the user to select multiple choices.
      -
      CustomTabPanelCustomTabPanel.appendStringList​(java.lang.String identifier) -
      Appends a list box allowing the user to specify string values.
      -
      CustomTabPanelCustomTabPanel.appendStringList​(java.lang.String identifier, -boolean editable) -
      Appends a list box allowing the user to specify string values.
      -
      CustomTabPanelCustomTabPanel.appendStringList​(java.lang.String identifier, -java.util.List<java.lang.String> initialValues) -
      Appends a list box allowing the user to specify string values.
      -
      CustomTabPanelCustomTabPanel.appendStringList​(java.lang.String identifier, -java.util.List<java.lang.String> initialValues, -boolean editable) -
      Appends a list box allowing the user to specify string values.
      -
      CustomTabPanelCustomTabPanel.appendTextArea​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String text) -
      Appends a text area control to the dialog.
      -
      CustomTabPanelCustomTabPanel.appendTextField​(java.lang.String identifier, -java.lang.String controlLabel, -java.lang.String text) -
      Appends a text field control to the dialog.
      -
      CustomTabPanelTabbedCustomDialog.getTab​(java.lang.String id) -
      Gets the tab with the specified ID
      -
      -
      -
      -
    • -
    -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ProcessingStatusDialog.html b/docs/com/nuix/nx/dialogs/class-use/ProcessingStatusDialog.html deleted file mode 100644 index 9b20103..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ProcessingStatusDialog.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.ProcessingStatusDialog - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.ProcessingStatusDialog

    -
    -
    No usage of com.nuix.nx.dialogs.ProcessingStatusDialog
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ProgressDialog.html b/docs/com/nuix/nx/dialogs/class-use/ProgressDialog.html deleted file mode 100644 index 71ad02b..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ProgressDialog.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.ProgressDialog - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.ProgressDialog

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ProgressDialog 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ProgressDialogBlockInterface.html b/docs/com/nuix/nx/dialogs/class-use/ProgressDialogBlockInterface.html deleted file mode 100644 index 65b35ee..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ProgressDialogBlockInterface.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.dialogs.ProgressDialogBlockInterface - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.dialogs.ProgressDialogBlockInterface

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ProgressDialogBlockInterface 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ProgressDialogLoggingCallback.html b/docs/com/nuix/nx/dialogs/class-use/ProgressDialogLoggingCallback.html deleted file mode 100644 index 32126eb..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ProgressDialogLoggingCallback.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.dialogs.ProgressDialogLoggingCallback - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.dialogs.ProgressDialogLoggingCallback

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ProgressDialogLoggingCallback 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ScrollableCustomTabPanel.html b/docs/com/nuix/nx/dialogs/class-use/ScrollableCustomTabPanel.html deleted file mode 100644 index 9a76882..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ScrollableCustomTabPanel.html +++ /dev/null @@ -1,147 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.ScrollableCustomTabPanel - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.ScrollableCustomTabPanel

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ScrollableCustomTabPanel 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/TabbedCustomDialog.html b/docs/com/nuix/nx/dialogs/class-use/TabbedCustomDialog.html deleted file mode 100644 index 52982fb..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/TabbedCustomDialog.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.dialogs.TabbedCustomDialog - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.dialogs.TabbedCustomDialog

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use TabbedCustomDialog 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/class-use/ValidationCallback.html b/docs/com/nuix/nx/dialogs/class-use/ValidationCallback.html deleted file mode 100644 index 97cce2d..0000000 --- a/docs/com/nuix/nx/dialogs/class-use/ValidationCallback.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.dialogs.ValidationCallback - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.dialogs.ValidationCallback

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use ValidationCallback 
    PackageDescription
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/dialogs/package-frame.html b/docs/com/nuix/nx/dialogs/package-frame.html deleted file mode 100644 index 8d121f8..0000000 --- a/docs/com/nuix/nx/dialogs/package-frame.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -com.nuix.nx.dialogs - - - - -

    com.nuix.nx.dialogs

    - - - diff --git a/docs/com/nuix/nx/dialogs/package-summary.html b/docs/com/nuix/nx/dialogs/package-summary.html index 004b2d6..e3f08e2 100644 --- a/docs/com/nuix/nx/dialogs/package-summary.html +++ b/docs/com/nuix/nx/dialogs/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.dialogs +com.nuix.nx.dialogs (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/dialogs/package-tree.html b/docs/com/nuix/nx/dialogs/package-tree.html index 95d2b23..3ad75f1 100644 --- a/docs/com/nuix/nx/dialogs/package-tree.html +++ b/docs/com/nuix/nx/dialogs/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.dialogs Class Hierarchy +com.nuix.nx.dialogs Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/dialogs/package-use.html b/docs/com/nuix/nx/dialogs/package-use.html deleted file mode 100644 index 72adc06..0000000 --- a/docs/com/nuix/nx/dialogs/package-use.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.dialogs - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.dialogs

    -
    -
    -
    - - - - - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.dialogs 
    PackageDescription
    com.nuix.nx.controls 
    com.nuix.nx.dialogs 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/digest/DigestHelper.html b/docs/com/nuix/nx/digest/DigestHelper.html index 665f644..681b8ab 100644 --- a/docs/com/nuix/nx/digest/DigestHelper.html +++ b/docs/com/nuix/nx/digest/DigestHelper.html @@ -3,36 +3,45 @@ -DigestHelper +DigestHelper (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/digest/class-use/DigestHelper.html b/docs/com/nuix/nx/digest/class-use/DigestHelper.html deleted file mode 100644 index 7cbfc00..0000000 --- a/docs/com/nuix/nx/digest/class-use/DigestHelper.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.digest.DigestHelper - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.digest.DigestHelper

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use DigestHelper 
    PackageDescription
    com.nuix.nx.digest 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/digest/package-frame.html b/docs/com/nuix/nx/digest/package-frame.html deleted file mode 100644 index 5a3d393..0000000 --- a/docs/com/nuix/nx/digest/package-frame.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -com.nuix.nx.digest - - - - -

    com.nuix.nx.digest

    -
    -

    Classes

    - -
    - - diff --git a/docs/com/nuix/nx/digest/package-summary.html b/docs/com/nuix/nx/digest/package-summary.html index 5dcc0e5..85e21b4 100644 --- a/docs/com/nuix/nx/digest/package-summary.html +++ b/docs/com/nuix/nx/digest/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.digest +com.nuix.nx.digest (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/digest/package-tree.html b/docs/com/nuix/nx/digest/package-tree.html index 8bf2191..b1508a4 100644 --- a/docs/com/nuix/nx/digest/package-tree.html +++ b/docs/com/nuix/nx/digest/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.digest Class Hierarchy +com.nuix.nx.digest Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/digest/package-use.html b/docs/com/nuix/nx/digest/package-use.html deleted file mode 100644 index 070b57f..0000000 --- a/docs/com/nuix/nx/digest/package-use.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.digest - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.digest

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.digest 
    PackageDescription
    com.nuix.nx.digest 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/export/CombinedPdfExporter.html b/docs/com/nuix/nx/export/CombinedPdfExporter.html index fe9f8a8..d881047 100644 --- a/docs/com/nuix/nx/export/CombinedPdfExporter.html +++ b/docs/com/nuix/nx/export/CombinedPdfExporter.html @@ -3,36 +3,45 @@ -CombinedPdfExporter +CombinedPdfExporter (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/export/class-use/CombinedPdfExporter.html b/docs/com/nuix/nx/export/class-use/CombinedPdfExporter.html deleted file mode 100644 index 88b0cef..0000000 --- a/docs/com/nuix/nx/export/class-use/CombinedPdfExporter.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.export.CombinedPdfExporter - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.export.CombinedPdfExporter

    -
    -
    No usage of com.nuix.nx.export.CombinedPdfExporter
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/export/package-frame.html b/docs/com/nuix/nx/export/package-frame.html deleted file mode 100644 index dcaf12f..0000000 --- a/docs/com/nuix/nx/export/package-frame.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -com.nuix.nx.export - - - - -

    com.nuix.nx.export

    -
    -

    Classes

    - -
    - - diff --git a/docs/com/nuix/nx/export/package-summary.html b/docs/com/nuix/nx/export/package-summary.html index b5ab250..99a5d74 100644 --- a/docs/com/nuix/nx/export/package-summary.html +++ b/docs/com/nuix/nx/export/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.export +com.nuix.nx.export (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/export/package-tree.html b/docs/com/nuix/nx/export/package-tree.html index d0ba657..e4ac7ba 100644 --- a/docs/com/nuix/nx/export/package-tree.html +++ b/docs/com/nuix/nx/export/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.export Class Hierarchy +com.nuix.nx.export Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/export/package-use.html b/docs/com/nuix/nx/export/package-use.html deleted file mode 100644 index bf6738a..0000000 --- a/docs/com/nuix/nx/export/package-use.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.export - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.export

    -
    -
    No usage of com.nuix.nx.export
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/filters/DynamicTableAllRecordsFilter.html b/docs/com/nuix/nx/filters/DynamicTableAllRecordsFilter.html new file mode 100644 index 0000000..8920db7 --- /dev/null +++ b/docs/com/nuix/nx/filters/DynamicTableAllRecordsFilter.html @@ -0,0 +1,370 @@ + + + + + +DynamicTableAllRecordsFilter (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableAllRecordsFilter

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableAllRecordsFilter

          +
          public DynamicTableAllRecordsFilter()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handlesExpression

          +
          public boolean handlesExpression​(java.lang.String filterExpression)
          +
          Description copied from class: DynamicTableFilterProvider
          +
          Whether this filter provider handles the given filter expression. If true is returned, DynamicTableFilterProvider.keepRecord(int, boolean, String, Object, Map) + will be called for each record to determine whether the given record is filtered out or not. If false is returned then + the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + string since DynamicTableModel has built in logic to handle that before asking filters.
          +
          +
          Specified by:
          +
          handlesExpression in class DynamicTableFilterProvider
          +
          Parameters:
          +
          filterExpression - The expression the user has provided.
          +
          Returns:
          +
          True if this filter should handle this expression. False otherwise.
          +
          +
        • +
        + + + +
          +
        • +

          keepRecord

          +
          public boolean keepRecord​(int sourceIndex,
          +                          boolean isChecked,
          +                          java.lang.String filterExpression,
          +                          java.lang.Object record,
          +                          java.util.Map<java.lang.String,​java.lang.Object> rowValues)
          +
          Description copied from class: DynamicTableFilterProvider
          +
          If DynamicTableFilterProvider.handlesExpression(String) returns true, this method will be invoked for each record. It should return + true for records that should make it into the final collection and false for records that should be filtered out.
          +
          +
          Specified by:
          +
          keepRecord in class DynamicTableFilterProvider
          +
          Parameters:
          +
          sourceIndex - The index of the record in the full un-filtered source collection.
          +
          isChecked - Whether the given record is currently checked
          +
          filterExpression - The filter expression provided by the user. This value should never be null, only whitespace or empty.
          +
          record - The record to inspect and make a decision about.
          +
          rowValues - A map of the values actual represented as columns in the table. Relies on table model's DynamicTableValueCallback.
          +
          Returns:
          +
          True to keep the record, false to filter it out.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.html b/docs/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.html new file mode 100644 index 0000000..d7c0ae3 --- /dev/null +++ b/docs/com/nuix/nx/filters/DynamicTableCheckedRecordsFilter.html @@ -0,0 +1,370 @@ + + + + + +DynamicTableCheckedRecordsFilter (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableCheckedRecordsFilter

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableCheckedRecordsFilter

          +
          public DynamicTableCheckedRecordsFilter()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handlesExpression

          +
          public boolean handlesExpression​(java.lang.String filterExpression)
          +
          Whether this filter provider handles the given filter expression. If true is returned, DynamicTableFilterProvider.keepRecord(int, boolean, String, Object, Map) + will be called for each record to determine whether the given record is filtered out or not. If false is returned then + the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + string since DynamicTableModel has built in logic to handle that before asking filters.
          + This implementation returns true if provided expression is ":checked:" (case-insensitive).
          +
          +
          Specified by:
          +
          handlesExpression in class DynamicTableFilterProvider
          +
          Parameters:
          +
          filterExpression - The expression the user has provided.
          +
          Returns:
          +
          True if this filter should handle this expression. False otherwise.
          +
          +
        • +
        + + + +
          +
        • +

          keepRecord

          +
          public boolean keepRecord​(int sourceIndex,
          +                          boolean isChecked,
          +                          java.lang.String filterExpression,
          +                          java.lang.Object record,
          +                          java.util.Map<java.lang.String,​java.lang.Object> rowValues)
          +
          If DynamicTableFilterProvider.handlesExpression(String) returns true, this method will be invoked for each record. It should return + true for records that should make it into the final collection and false for records that should be filtered out.
          + This implementation returns true if isChecked is true.
          +
          +
          Specified by:
          +
          keepRecord in class DynamicTableFilterProvider
          +
          Parameters:
          +
          sourceIndex - The index of the record in the full un-filtered source collection.
          +
          isChecked - Whether the given record is currently checked
          +
          filterExpression - The filter expression provided by the user. This value should never be null, only whitespace or empty.
          +
          record - The record to inspect and make a decision about.
          +
          rowValues - A map of the values actual represented as columns in the table. Relies on table model's DynamicTableValueCallback.
          +
          Returns:
          +
          True to keep the record, false to filter it out.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/filters/DynamicTableContainsFilter.html b/docs/com/nuix/nx/filters/DynamicTableContainsFilter.html new file mode 100644 index 0000000..2b26ba0 --- /dev/null +++ b/docs/com/nuix/nx/filters/DynamicTableContainsFilter.html @@ -0,0 +1,370 @@ + + + + + +DynamicTableContainsFilter (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableContainsFilter

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableContainsFilter

          +
          public DynamicTableContainsFilter()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handlesExpression

          +
          public boolean handlesExpression​(java.lang.String filterExpression)
          +
          Description copied from class: DynamicTableFilterProvider
          +
          Whether this filter provider handles the given filter expression. If true is returned, DynamicTableFilterProvider.keepRecord(int, boolean, String, Object, Map) + will be called for each record to determine whether the given record is filtered out or not. If false is returned then + the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + string since DynamicTableModel has built in logic to handle that before asking filters.
          +
          +
          Specified by:
          +
          handlesExpression in class DynamicTableFilterProvider
          +
          Parameters:
          +
          filterExpression - The expression the user has provided.
          +
          Returns:
          +
          True if this filter should handle this expression. False otherwise.
          +
          +
        • +
        + + + +
          +
        • +

          keepRecord

          +
          public boolean keepRecord​(int sourceIndex,
          +                          boolean isChecked,
          +                          java.lang.String filterExpression,
          +                          java.lang.Object record,
          +                          java.util.Map<java.lang.String,​java.lang.Object> rowValues)
          +
          Description copied from class: DynamicTableFilterProvider
          +
          If DynamicTableFilterProvider.handlesExpression(String) returns true, this method will be invoked for each record. It should return + true for records that should make it into the final collection and false for records that should be filtered out.
          +
          +
          Specified by:
          +
          keepRecord in class DynamicTableFilterProvider
          +
          Parameters:
          +
          sourceIndex - The index of the record in the full un-filtered source collection.
          +
          isChecked - Whether the given record is currently checked
          +
          filterExpression - The filter expression provided by the user. This value should never be null, only whitespace or empty.
          +
          record - The record to inspect and make a decision about.
          +
          rowValues - A map of the values actual represented as columns in the table. Relies on table model's DynamicTableValueCallback.
          +
          Returns:
          +
          True to keep the record, false to filter it out.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/filters/DynamicTableFilterProvider.html b/docs/com/nuix/nx/filters/DynamicTableFilterProvider.html new file mode 100644 index 0000000..6084984 --- /dev/null +++ b/docs/com/nuix/nx/filters/DynamicTableFilterProvider.html @@ -0,0 +1,397 @@ + + + + + +DynamicTableFilterProvider (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableFilterProvider

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.nuix.nx.filters.DynamicTableFilterProvider
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public abstract class DynamicTableFilterProvider
      +extends java.lang.Object
      +
    • +
    +
    +
    +
      +
    • + +
      + +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidafterFiltering() +
        Called once after filtering.
        +
        voidbeforeFiltering​(java.lang.String filterExpression, + java.util.List<java.lang.Object> allRecords) +
        Invoked once before filtering begins, allowing for up front work to be performed that might + then be leveraged in subsequent calls to keepRecord(int, boolean, String, Object, Map).
        +
        abstract booleanhandlesExpression​(java.lang.String filterExpression) +
        Whether this filter provider handles the given filter expression.
        +
        abstract booleankeepRecord​(int sourceIndex, + boolean isChecked, + java.lang.String filterExpression, + java.lang.Object record, + java.util.Map<java.lang.String,​java.lang.Object> rowValues) +
        If handlesExpression(String) returns true, this method will be invoked for each record.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableFilterProvider

          +
          public DynamicTableFilterProvider()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handlesExpression

          +
          public abstract boolean handlesExpression​(java.lang.String filterExpression)
          +
          Whether this filter provider handles the given filter expression. If true is returned, keepRecord(int, boolean, String, Object, Map) + will be called for each record to determine whether the given record is filtered out or not. If false is returned then + the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + string since DynamicTableModel has built in logic to handle that before asking filters.
          +
          +
          Parameters:
          +
          filterExpression - The expression the user has provided.
          +
          Returns:
          +
          True if this filter should handle this expression. False otherwise.
          +
          +
        • +
        + + + +
          +
        • +

          keepRecord

          +
          public abstract boolean keepRecord​(int sourceIndex,
          +                                   boolean isChecked,
          +                                   java.lang.String filterExpression,
          +                                   java.lang.Object record,
          +                                   java.util.Map<java.lang.String,​java.lang.Object> rowValues)
          +
          If handlesExpression(String) returns true, this method will be invoked for each record. It should return + true for records that should make it into the final collection and false for records that should be filtered out.
          +
          +
          Parameters:
          +
          sourceIndex - The index of the record in the full un-filtered source collection.
          +
          isChecked - Whether the given record is currently checked
          +
          filterExpression - The filter expression provided by the user. This value should never be null, only whitespace or empty.
          +
          record - The record to inspect and make a decision about.
          +
          rowValues - A map of the values actual represented as columns in the table. Relies on table model's DynamicTableValueCallback.
          +
          Returns:
          +
          True to keep the record, false to filter it out.
          +
          +
        • +
        + + + +
          +
        • +

          beforeFiltering

          +
          public void beforeFiltering​(java.lang.String filterExpression,
          +                            java.util.List<java.lang.Object> allRecords)
          +
          Invoked once before filtering begins, allowing for up front work to be performed that might + then be leveraged in subsequent calls to keepRecord(int, boolean, String, Object, Map). + Override in derived implementation, default implementation does nothing.
          +
          +
          Parameters:
          +
          filterExpression - The filter expression that was provided
          +
          allRecords - All the of records pre-filtering
          +
          +
        • +
        + + + + +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/filters/DynamicTableRegexFilter.html b/docs/com/nuix/nx/filters/DynamicTableRegexFilter.html new file mode 100644 index 0000000..f8640d2 --- /dev/null +++ b/docs/com/nuix/nx/filters/DynamicTableRegexFilter.html @@ -0,0 +1,417 @@ + + + + + +DynamicTableRegexFilter (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableRegexFilter

    +
    +
    + +
    + +
    +
    +
      +
    • + +
      + +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidafterFiltering() +
        Called once after filtering.
        +
        voidbeforeFiltering​(java.lang.String filterExpression, + java.util.List<java.lang.Object> allRecords) +
        Invoked once before filtering begins, allowing for up front work to be performed that might + then be leveraged in subsequent calls to DynamicTableFilterProvider.keepRecord(int, boolean, String, Object, Map).
        +
        booleanhandlesExpression​(java.lang.String filterExpression) +
        Whether this filter provider handles the given filter expression.
        +
        booleankeepRecord​(int sourceIndex, + boolean isChecked, + java.lang.String filterExpression, + java.lang.Object record, + java.util.Map<java.lang.String,​java.lang.Object> rowValues) +
        If DynamicTableFilterProvider.handlesExpression(String) returns true, this method will be invoked for each record.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableRegexFilter

          +
          public DynamicTableRegexFilter()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handlesExpression

          +
          public boolean handlesExpression​(java.lang.String filterExpression)
          +
          Whether this filter provider handles the given filter expression. If true is returned, DynamicTableFilterProvider.keepRecord(int, boolean, String, Object, Map) + will be called for each record to determine whether the given record is filtered out or not. If false is returned then + the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + string since DynamicTableModel has built in logic to handle that before asking filters.
          + This is meant to be a fallback filter so it will happily accept any filter expression except when + given value does not correctly compile to a regular expression.
          +
          +
          Specified by:
          +
          handlesExpression in class DynamicTableFilterProvider
          +
          Parameters:
          +
          filterExpression - The expression the user has provided.
          +
          Returns:
          +
          True if this filter should handle this expression. False otherwise.
          +
          +
        • +
        + + + +
          +
        • +

          keepRecord

          +
          public boolean keepRecord​(int sourceIndex,
          +                          boolean isChecked,
          +                          java.lang.String filterExpression,
          +                          java.lang.Object record,
          +                          java.util.Map<java.lang.String,​java.lang.Object> rowValues)
          +
          Description copied from class: DynamicTableFilterProvider
          +
          If DynamicTableFilterProvider.handlesExpression(String) returns true, this method will be invoked for each record. It should return + true for records that should make it into the final collection and false for records that should be filtered out.
          +
          +
          Specified by:
          +
          keepRecord in class DynamicTableFilterProvider
          +
          Parameters:
          +
          sourceIndex - The index of the record in the full un-filtered source collection.
          +
          isChecked - Whether the given record is currently checked
          +
          filterExpression - The filter expression provided by the user. This value should never be null, only whitespace or empty.
          +
          record - The record to inspect and make a decision about.
          +
          rowValues - A map of the values actual represented as columns in the table. Relies on table model's DynamicTableValueCallback.
          +
          Returns:
          +
          True to keep the record, false to filter it out.
          +
          +
        • +
        + + + + + + + + +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.html b/docs/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.html new file mode 100644 index 0000000..dbe772d --- /dev/null +++ b/docs/com/nuix/nx/filters/DynamicTableUncheckedRecordsFilter.html @@ -0,0 +1,370 @@ + + + + + +DynamicTableUncheckedRecordsFilter (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableUncheckedRecordsFilter

    +
    +
    + +
    + +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableUncheckedRecordsFilter

          +
          public DynamicTableUncheckedRecordsFilter()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          handlesExpression

          +
          public boolean handlesExpression​(java.lang.String filterExpression)
          +
          Whether this filter provider handles the given filter expression. If true is returned, DynamicTableFilterProvider.keepRecord(int, boolean, String, Object, Map) + will be called for each record to determine whether the given record is filtered out or not. If false is returned then + the dynamic table model will continue looking for a filter handler. Filter expression should never be null or an all whitespace or empty + string since DynamicTableModel has built in logic to handle that before asking filters.
          + This implementation returns true if provided expression is ":unchecked:" (case-insensitive).
          +
          +
          Specified by:
          +
          handlesExpression in class DynamicTableFilterProvider
          +
          Parameters:
          +
          filterExpression - The expression the user has provided.
          +
          Returns:
          +
          True if this filter should handle this expression. False otherwise.
          +
          +
        • +
        + + + +
          +
        • +

          keepRecord

          +
          public boolean keepRecord​(int sourceIndex,
          +                          boolean isChecked,
          +                          java.lang.String filterExpression,
          +                          java.lang.Object record,
          +                          java.util.Map<java.lang.String,​java.lang.Object> rowValues)
          +
          If DynamicTableFilterProvider.handlesExpression(String) returns true, this method will be invoked for each record. It should return + true for records that should make it into the final collection and false for records that should be filtered out.
          + This implementation returns true if isChecked is false.
          +
          +
          Specified by:
          +
          keepRecord in class DynamicTableFilterProvider
          +
          Parameters:
          +
          sourceIndex - The index of the record in the full un-filtered source collection.
          +
          isChecked - Whether the given record is currently checked
          +
          filterExpression - The filter expression provided by the user. This value should never be null, only whitespace or empty.
          +
          record - The record to inspect and make a decision about.
          +
          rowValues - A map of the values actual represented as columns in the table. Relies on table model's DynamicTableValueCallback.
          +
          Returns:
          +
          True to keep the record, false to filter it out.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/filters/package-summary.html b/docs/com/nuix/nx/filters/package-summary.html new file mode 100644 index 0000000..9a42671 --- /dev/null +++ b/docs/com/nuix/nx/filters/package-summary.html @@ -0,0 +1,184 @@ + + + + + +com.nuix.nx.filters (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Package com.nuix.nx.filters

    +
    +
    + +
    +
    +
    + +
    + + diff --git a/docs/com/nuix/nx/filters/package-tree.html b/docs/com/nuix/nx/filters/package-tree.html new file mode 100644 index 0000000..17986eb --- /dev/null +++ b/docs/com/nuix/nx/filters/package-tree.html @@ -0,0 +1,170 @@ + + + + + +com.nuix.nx.filters Class Hierarchy (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Hierarchy For Package com.nuix.nx.filters

    +Package Hierarchies: + +
    +
    +
    +

    Class Hierarchy

    + +
    +
    +
    + + + diff --git a/docs/com/nuix/nx/helpers/FormatHelpers.html b/docs/com/nuix/nx/helpers/FormatHelpers.html index 9f9ec08..a4ef7c0 100644 --- a/docs/com/nuix/nx/helpers/FormatHelpers.html +++ b/docs/com/nuix/nx/helpers/FormatHelpers.html @@ -3,36 +3,45 @@ -FormatHelpers +FormatHelpers (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/helpers/MetadataProfileHelper.html b/docs/com/nuix/nx/helpers/MetadataProfileHelper.html index 93a0036..adf6f00 100644 --- a/docs/com/nuix/nx/helpers/MetadataProfileHelper.html +++ b/docs/com/nuix/nx/helpers/MetadataProfileHelper.html @@ -3,36 +3,45 @@ -MetadataProfileHelper +MetadataProfileHelper (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/helpers/class-use/FormatHelpers.html b/docs/com/nuix/nx/helpers/class-use/FormatHelpers.html deleted file mode 100644 index c301417..0000000 --- a/docs/com/nuix/nx/helpers/class-use/FormatHelpers.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.helpers.FormatHelpers - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.helpers.FormatHelpers

    -
    -
    No usage of com.nuix.nx.helpers.FormatHelpers
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/helpers/class-use/MetadataProfileHelper.html b/docs/com/nuix/nx/helpers/class-use/MetadataProfileHelper.html deleted file mode 100644 index 656ba42..0000000 --- a/docs/com/nuix/nx/helpers/class-use/MetadataProfileHelper.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.helpers.MetadataProfileHelper - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.helpers.MetadataProfileHelper

    -
    -
    No usage of com.nuix.nx.helpers.MetadataProfileHelper
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/helpers/package-frame.html b/docs/com/nuix/nx/helpers/package-frame.html deleted file mode 100644 index b0c7a00..0000000 --- a/docs/com/nuix/nx/helpers/package-frame.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - -com.nuix.nx.helpers - - - - -

    com.nuix.nx.helpers

    - - - diff --git a/docs/com/nuix/nx/helpers/package-summary.html b/docs/com/nuix/nx/helpers/package-summary.html index 144e568..ac1b590 100644 --- a/docs/com/nuix/nx/helpers/package-summary.html +++ b/docs/com/nuix/nx/helpers/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.helpers +com.nuix.nx.helpers (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/helpers/package-tree.html b/docs/com/nuix/nx/helpers/package-tree.html index 92f7631..00edf63 100644 --- a/docs/com/nuix/nx/helpers/package-tree.html +++ b/docs/com/nuix/nx/helpers/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.helpers Class Hierarchy +com.nuix.nx.helpers Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/helpers/package-use.html b/docs/com/nuix/nx/helpers/package-use.html deleted file mode 100644 index 464aa65..0000000 --- a/docs/com/nuix/nx/helpers/package-use.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.helpers - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.helpers

    -
    -
    No usage of com.nuix.nx.helpers
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/misc/PlaceholderResolver.html b/docs/com/nuix/nx/misc/PlaceholderResolver.html index 6d997e5..31cc7cd 100644 --- a/docs/com/nuix/nx/misc/PlaceholderResolver.html +++ b/docs/com/nuix/nx/misc/PlaceholderResolver.html @@ -3,36 +3,45 @@ -PlaceholderResolver +PlaceholderResolver (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/misc/class-use/PlaceholderResolver.html b/docs/com/nuix/nx/misc/class-use/PlaceholderResolver.html deleted file mode 100644 index 26f6ea4..0000000 --- a/docs/com/nuix/nx/misc/class-use/PlaceholderResolver.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.misc.PlaceholderResolver - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.misc.PlaceholderResolver

    -
    -
    No usage of com.nuix.nx.misc.PlaceholderResolver
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/misc/package-frame.html b/docs/com/nuix/nx/misc/package-frame.html deleted file mode 100644 index 04afbae..0000000 --- a/docs/com/nuix/nx/misc/package-frame.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - -com.nuix.nx.misc - - - - -

    com.nuix.nx.misc

    -
    -

    Classes

    - -
    - - diff --git a/docs/com/nuix/nx/misc/package-summary.html b/docs/com/nuix/nx/misc/package-summary.html index db16289..f5bd37b 100644 --- a/docs/com/nuix/nx/misc/package-summary.html +++ b/docs/com/nuix/nx/misc/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.misc +com.nuix.nx.misc (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/misc/package-tree.html b/docs/com/nuix/nx/misc/package-tree.html index e4390fb..1625304 100644 --- a/docs/com/nuix/nx/misc/package-tree.html +++ b/docs/com/nuix/nx/misc/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.misc Class Hierarchy +com.nuix.nx.misc Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/misc/package-use.html b/docs/com/nuix/nx/misc/package-use.html deleted file mode 100644 index bbd43db..0000000 --- a/docs/com/nuix/nx/misc/package-use.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.misc - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.misc

    -
    -
    No usage of com.nuix.nx.misc
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/models/ArrangeableListModel.html b/docs/com/nuix/nx/models/ArrangeableListModel.html new file mode 100644 index 0000000..571796e --- /dev/null +++ b/docs/com/nuix/nx/models/ArrangeableListModel.html @@ -0,0 +1,451 @@ + + + + + +ArrangeableListModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ArrangeableListModel<E>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.AbstractListModel<E>
      • +
      • +
          +
        • com.nuix.nx.models.ArrangeableListModel<E>
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      E - Generic data type this list will contain.
      +
      +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.ListModel<E>
      +
      +
      +
      public class ArrangeableListModel<E>
      +extends javax.swing.AbstractListModel<E>
      +
      Custom ArrayList wrapper around an ArrayList which offers methods for shifting a contiguous range + of entries earlier or later in the list (for shifting rows).
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class javax.swing.AbstractListModel

          +listenerList
        • +
        +
      • +
      +
      + +
      + +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidaddElement​(E element) 
        voidclear() 
        EgetElementAt​(int index) 
        intgetSize() 
        voidremove​(int index) 
        booleanshiftRowsDown​(int firstRowIndex, + int lastRowIndex) 
        booleanshiftRowsUp​(int firstRowIndex, + int lastRowIndex) 
        intsize() 
        +
          +
        • + + +

          Methods inherited from class javax.swing.AbstractListModel

          +addListDataListener, fireContentsChanged, fireIntervalAdded, fireIntervalRemoved, getListDataListeners, getListeners, removeListDataListener
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ArrangeableListModel

          +
          public ArrangeableListModel()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getElementAt

          +
          public E getElementAt​(int index)
          +
        • +
        + + + +
          +
        • +

          getSize

          +
          public int getSize()
          +
        • +
        + + + +
          +
        • +

          size

          +
          public int size()
          +
        • +
        + + + +
          +
        • +

          shiftRowsUp

          +
          public boolean shiftRowsUp​(int firstRowIndex,
          +                           int lastRowIndex)
          +
        • +
        + + + +
          +
        • +

          shiftRowsDown

          +
          public boolean shiftRowsDown​(int firstRowIndex,
          +                             int lastRowIndex)
          +
        • +
        + + + + + +
          +
        • +

          addElement

          +
          public void addElement​(E element)
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public void remove​(int index)
          +
        • +
        + + + +
          +
        • +

          clear

          +
          public void clear()
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/Choice.html b/docs/com/nuix/nx/models/Choice.html new file mode 100644 index 0000000..3a9f7b2 --- /dev/null +++ b/docs/com/nuix/nx/models/Choice.html @@ -0,0 +1,571 @@ + + + + + +Choice (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class Choice<T>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.nuix.nx.models.Choice<T>
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - The data type of the value help by this instance
      +
      +
      +
      public class Choice<T>
      +extends java.lang.Object
      +
      This class represents a choice in some controls and has an associated label, tool tip, value and whether the choice is checked.
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + +
        Constructors 
        ConstructorDescription
        Choice() 
        Choice​(T value) +
        Creates a choice object.
        +
        Choice​(T value, + java.lang.String label) +
        Creates a choice object.
        +
        Choice​(T value, + java.lang.String label, + java.lang.String toolTip) +
        Creates a choice object.
        +
        Choice​(T value, + java.lang.String label, + java.lang.String toolTip, + boolean isSelected) +
        Creates a choice object.
        +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        java.lang.StringgetLabel() +
        Gets the label used to display this choice.
        +
        java.lang.StringgetToolTip() +
        The tool tip which will be associated to this choice.
        +
        TgetValue() +
        Gets the value associated to this choice.
        +
        booleanisSelected() +
        Whether this choice is currently selected
        +
        voidsetLabel​(java.lang.String label) +
        Sets the label used to display this choice.
        +
        voidsetSelected​(boolean isSelected) +
        Sets whether this choice is currently selected.
        +
        voidsetToolTip​(java.lang.String toolTip) +
        Sets the tool tip associated to this choice.
        +
        voidsetValue​(T value) +
        Sets the value associated to this choice.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          Choice

          +
          public Choice()
          +
        • +
        + + + + + +
          +
        • +

          Choice

          +
          public Choice​(T value)
          +
          Creates a choice object. Label and tool tip will be based on calling toString on the value provided.
          +
          +
          Parameters:
          +
          value - The value this choice object represents.
          +
          +
        • +
        + + + + + +
          +
        • +

          Choice

          +
          public Choice​(T value,
          +              java.lang.String label)
          +
          Creates a choice object. Tool tip will be based on the provided label string.
          +
          +
          Parameters:
          +
          value - The value this choice object represents.
          +
          label - The displayed string for this choice.
          +
          +
        • +
        + + + + + +
          +
        • +

          Choice

          +
          public Choice​(T value,
          +              java.lang.String label,
          +              java.lang.String toolTip)
          +
          Creates a choice object.
          +
          +
          Parameters:
          +
          value - The value this choice object represents.
          +
          label - The displayed string for this choice.
          +
          toolTip - The tool tip associated to this choice.
          +
          +
        • +
        + + + + + +
          +
        • +

          Choice

          +
          public Choice​(T value,
          +              java.lang.String label,
          +              java.lang.String toolTip,
          +              boolean isSelected)
          +
          Creates a choice object.
          +
          +
          Parameters:
          +
          value - The value this choice object represents.
          +
          label - The displayed string for this choice.
          +
          toolTip - The tool tip associated to this choice.
          +
          isSelected - Whether this choice is checked by default.
          +
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          isSelected

          +
          public boolean isSelected()
          +
          Whether this choice is currently selected
          +
          +
          Returns:
          +
          True if this choice is selected.
          +
          +
        • +
        + + + +
          +
        • +

          setSelected

          +
          public void setSelected​(boolean isSelected)
          +
          Sets whether this choice is currently selected.
          +
          +
          Parameters:
          +
          isSelected - Provide true to select this choice.
          +
          +
        • +
        + + + +
          +
        • +

          getToolTip

          +
          public java.lang.String getToolTip()
          +
          The tool tip which will be associated to this choice.
          +
          +
          Returns:
          +
          The tool tip.
          +
          +
        • +
        + + + +
          +
        • +

          setToolTip

          +
          public void setToolTip​(java.lang.String toolTip)
          +
          Sets the tool tip associated to this choice.
          +
          +
          Parameters:
          +
          toolTip - The tool tip.
          +
          +
        • +
        + + + +
          +
        • +

          getLabel

          +
          public java.lang.String getLabel()
          +
          Gets the label used to display this choice.
          +
          +
          Returns:
          +
          The label string.
          +
          +
        • +
        + + + +
          +
        • +

          setLabel

          +
          public void setLabel​(java.lang.String label)
          +
          Sets the label used to display this choice.
          +
          +
          Parameters:
          +
          label - The label string to use.
          +
          +
        • +
        + + + +
          +
        • +

          getValue

          +
          public T getValue()
          +
          Gets the value associated to this choice.
          +
          +
          Returns:
          +
          The value associated.
          +
          +
        • +
        + + + + + +
          +
        • +

          setValue

          +
          public void setValue​(T value)
          +
          Sets the value associated to this choice.
          +
          +
          Parameters:
          +
          value - The value to be associated.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/ChoiceTableModel.html b/docs/com/nuix/nx/models/ChoiceTableModel.html new file mode 100644 index 0000000..dc1bb0c --- /dev/null +++ b/docs/com/nuix/nx/models/ChoiceTableModel.html @@ -0,0 +1,948 @@ + + + + + +ChoiceTableModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ChoiceTableModel<T>

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.table.AbstractTableModel
      • +
      • +
          +
        • com.nuix.nx.models.ChoiceTableModel<T>
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      Type Parameters:
      +
      T - The data type of the of the Choice instances which will be held by this model.
      +
      +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.table.TableModel
      +
      +
      +
      public class ChoiceTableModel<T>
      +extends javax.swing.table.AbstractTableModel
      +
      Table model used by the ChoiceTableControl
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ChoiceTableModel

          +
          public ChoiceTableModel()
          +
          Create a new instance
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setChangeListener

          +
          public void setChangeListener​(ChoiceTableModelChangeListener listener)
          +
          Set a listener callback which will be notified of changes
          +
          +
          Parameters:
          +
          listener - The listener to be notified of changes
          +
          +
        • +
        + + + +
          +
        • +

          setCheckedByLabels

          +
          public java.util.List<Choice<T>> setCheckedByLabels​(java.util.Collection<java.lang.String> labels,
          +                                                    boolean setChecked)
          +
        • +
        + + + +
          +
        • +

          getFirstChoiceByLabel

          +
          public Choice<T> getFirstChoiceByLabel​(java.lang.String label)
          +
          Attempt to find a choice in the model with a matching label
          +
          +
          Parameters:
          +
          label - The label to look for
          +
          Returns:
          +
          A corresponding Choice object if a match was found
          +
          +
        • +
        + + + + + +
          +
        • +

          getFirstChoiceByValue

          +
          public Choice<T> getFirstChoiceByValue​(T value)
          +
          Attempt to find a choice in the model with a matching value
          +
          +
          Parameters:
          +
          value - The value to look for
          +
          Returns:
          +
          A corresponding Choice object if a match was found
          +
          +
        • +
        + + + +
          +
        • +

          getChoices

          +
          public java.util.List<Choice<T>> getChoices()
          +
          Gets the list of choices associated
          +
          +
          Returns:
          +
          The choices
          +
          +
        • +
        + + + +
          +
        • +

          setChoices

          +
          public void setChoices​(java.util.List<Choice<T>> choices)
          +
          Sets the list of choices associated
          +
          +
          Parameters:
          +
          choices - The choices to associate
          +
          +
        • +
        + + + +
          +
        • +

          getColumnCount

          +
          public int getColumnCount()
          +
        • +
        + + + +
          +
        • +

          getRowCount

          +
          public int getRowCount()
          +
        • +
        + + + +
          +
        • +

          getValueAt

          +
          public java.lang.Object getValueAt​(int rowIndex,
          +                                   int columnIndex)
          +
        • +
        + + + +
          +
        • +

          getColumnClass

          +
          public java.lang.Class<?> getColumnClass​(int columnIndex)
          +
          +
          Specified by:
          +
          getColumnClass in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnClass in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          getColumnName

          +
          public java.lang.String getColumnName​(int column)
          +
          +
          Specified by:
          +
          getColumnName in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnName in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          isCellEditable

          +
          public boolean isCellEditable​(int rowIndex,
          +                              int columnIndex)
          +
          +
          Specified by:
          +
          isCellEditable in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          isCellEditable in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          setValueAt

          +
          public void setValueAt​(java.lang.Object aValue,
          +                       int rowIndex,
          +                       int columnIndex)
          +
          +
          Specified by:
          +
          setValueAt in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          setValueAt in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          refreshTable

          +
          public void refreshTable()
          +
        • +
        + + + +
          +
        • +

          setFilter

          +
          public void setFilter​(java.lang.String filter)
          +
        • +
        + + + +
          +
        • +

          getChoice

          +
          public Choice<T> getChoice​(int rowIndex)
          +
        • +
        + + + +
          +
        • +

          getDisplayedChoice

          +
          public Choice<T> getDisplayedChoice​(int rowIndex)
          +
        • +
        + + + +
          +
        • +

          addChoice

          +
          public void addChoice​(Choice<T> choice)
          +
        • +
        + + + +
          +
        • +

          setChoiceSelection

          +
          public void setChoiceSelection​(Choice<T> choice,
          +                               boolean value)
          +
        • +
        + + + +
          +
        • +

          checkDisplayedChoices

          +
          public void checkDisplayedChoices()
          +
        • +
        + + + +
          +
        • +

          uncheckDisplayedChoices

          +
          public void uncheckDisplayedChoices()
          +
        • +
        + + + +
          +
        • +

          uncheckAllChoices

          +
          public void uncheckAllChoices()
          +
        • +
        + + + +
          +
        • +

          getCheckedChoices

          +
          public java.util.List<Choice<T>> getCheckedChoices()
          +
        • +
        + + + +
          +
        • +

          getUncheckedChoices

          +
          public java.util.List<Choice<T>> getUncheckedChoices()
          +
        • +
        + + + +
          +
        • +

          getCheckedValues

          +
          public java.util.List<T> getCheckedValues()
          +
        • +
        + + + +
          +
        • +

          getCheckedLabels

          +
          public java.util.List<java.lang.String> getCheckedLabels()
          +
        • +
        + + + +
          +
        • +

          getCheckedValueCount

          +
          public int getCheckedValueCount()
          +
        • +
        + + + +
          +
        • +

          getVisibleValueCount

          +
          public int getVisibleValueCount()
          +
        • +
        + + + +
          +
        • +

          getTotalValueCount

          +
          public int getTotalValueCount()
          +
        • +
        + + + +
          +
        • +

          setChoiceTypeName

          +
          public void setChoiceTypeName​(java.lang.String name)
          +
        • +
        + + + +
          +
        • +

          shiftRowsUp

          +
          public int[] shiftRowsUp​(int[] positions)
          +
        • +
        + + + +
          +
        • +

          shiftRowsDown

          +
          public int[] shiftRowsDown​(int[] positions)
          +
        • +
        + + + +
          +
        • +

          shiftRows

          +
          public int[] shiftRows​(int[] positions,
          +                       int offset)
          +
        • +
        + + + +
          +
        • +

          shiftRows

          +
          public int[] shiftRows​(java.util.List<Choice<T>> list,
          +                       int offset)
          +
        • +
        + + + +
          +
        • +

          sortCheckedToTop

          +
          public void sortCheckedToTop()
          +
        • +
        + + + +
          +
        • +

          sortChoicesToTop

          +
          public void sortChoicesToTop​(java.util.List<Choice> choicesToSort)
          +
        • +
        + + + +
          +
        • +

          isSingleSelectMode

          +
          public boolean isSingleSelectMode()
          +
        • +
        + + + +
          +
        • +

          setSingleSelectMode

          +
          public void setSingleSelectMode​(boolean singleSelectMode)
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/ChoiceTableModelChangeListener.html b/docs/com/nuix/nx/models/ChoiceTableModelChangeListener.html new file mode 100644 index 0000000..c1e9d07 --- /dev/null +++ b/docs/com/nuix/nx/models/ChoiceTableModelChangeListener.html @@ -0,0 +1,263 @@ + + + + + +ChoiceTableModelChangeListener (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Interface ChoiceTableModelChangeListener

    +
    +
    +
    +
      +
    • +
      +
      public interface ChoiceTableModelChangeListener
      +
      Used to notify listeners that a ChoiceTableControl has changed in some way.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          dataChanged

          +
          void dataChanged()
          +
        • +
        + + + +
          +
        • +

          structureChanged

          +
          void structureChanged()
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/com/nuix/nx/models/ControlDeserializationHandler.html b/docs/com/nuix/nx/models/ControlDeserializationHandler.html new file mode 100644 index 0000000..e5b1acd --- /dev/null +++ b/docs/com/nuix/nx/models/ControlDeserializationHandler.html @@ -0,0 +1,251 @@ + + + + + +ControlDeserializationHandler (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Interface ControlDeserializationHandler

    +
    +
    +
    +
      +
    • +
      +
      public interface ControlDeserializationHandler
      +
      Callback used to allow code to define a custom de-serialization for a particular control from JSON.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          deserializeControlData

          +
          void deserializeControlData​(java.lang.Object data,
          +                            java.awt.Component destinationControl)
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/com/nuix/nx/models/ControlSerializationHandler.html b/docs/com/nuix/nx/models/ControlSerializationHandler.html new file mode 100644 index 0000000..5eb93f3 --- /dev/null +++ b/docs/com/nuix/nx/models/ControlSerializationHandler.html @@ -0,0 +1,249 @@ + + + + + +ControlSerializationHandler (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Interface ControlSerializationHandler

    +
    +
    +
    +
      +
    • +
      +
      public interface ControlSerializationHandler
      +
      Callback used to allow code to define a custom serialization for a particular control to JSON.
      +
    • +
    +
    +
    + +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          serializeControlData

          +
          java.lang.Object serializeControlData​(java.awt.Component sourceControl)
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/com/nuix/nx/models/CsvTableModel.html b/docs/com/nuix/nx/models/CsvTableModel.html new file mode 100644 index 0000000..e3b5110 --- /dev/null +++ b/docs/com/nuix/nx/models/CsvTableModel.html @@ -0,0 +1,494 @@ + + + + + +CsvTableModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class CsvTableModel

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.table.AbstractTableModel
      • +
      • +
          +
        • com.nuix.nx.models.CsvTableModel
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.table.TableModel
      +
      +
      +
      public class CsvTableModel
      +extends javax.swing.table.AbstractTableModel
      +
      Table model for CsvTable.
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class javax.swing.table.AbstractTableModel

          +listenerList
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + +
        Constructors 
        ConstructorDescription
        CsvTableModel​(java.util.List<java.lang.String> headers) 
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidaddRecord​(java.util.Map<java.lang.String,​java.lang.String> record) 
        intgetColumnCount() 
        java.lang.StringgetColumnName​(int col) 
        java.util.List<java.lang.String>getHeaders() 
        java.util.List<java.util.Map<java.lang.String,​java.lang.String>>getRecords() 
        intgetRowCount() 
        java.lang.ObjectgetValueAt​(int row, + int col) 
        booleanisCellEditable​(int row, + int col) 
        voidremoveRecordAt​(int row) 
        voidsetValueAt​(java.lang.Object aValue, + int row, + int col) 
        +
          +
        • + + +

          Methods inherited from class javax.swing.table.AbstractTableModel

          +addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getColumnClass, getListeners, getTableModelListeners, removeTableModelListener
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          CsvTableModel

          +
          public CsvTableModel​(java.util.List<java.lang.String> headers)
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getColumnCount

          +
          public int getColumnCount()
          +
        • +
        + + + +
          +
        • +

          getRowCount

          +
          public int getRowCount()
          +
        • +
        + + + +
          +
        • +

          getValueAt

          +
          public java.lang.Object getValueAt​(int row,
          +                                   int col)
          +
        • +
        + + + +
          +
        • +

          setValueAt

          +
          public void setValueAt​(java.lang.Object aValue,
          +                       int row,
          +                       int col)
          +
          +
          Specified by:
          +
          setValueAt in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          setValueAt in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          getColumnName

          +
          public java.lang.String getColumnName​(int col)
          +
          +
          Specified by:
          +
          getColumnName in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnName in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          isCellEditable

          +
          public boolean isCellEditable​(int row,
          +                              int col)
          +
          +
          Specified by:
          +
          isCellEditable in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          isCellEditable in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          addRecord

          +
          public void addRecord​(java.util.Map<java.lang.String,​java.lang.String> record)
          +
        • +
        + + + +
          +
        • +

          removeRecordAt

          +
          public void removeRecordAt​(int row)
          +
        • +
        + + + +
          +
        • +

          getHeaders

          +
          public java.util.List<java.lang.String> getHeaders()
          +
        • +
        + + + +
          +
        • +

          getRecords

          +
          public java.util.List<java.util.Map<java.lang.String,​java.lang.String>> getRecords()
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/DoubleBoundedRangeModel.html b/docs/com/nuix/nx/models/DoubleBoundedRangeModel.html new file mode 100644 index 0000000..52d68a7 --- /dev/null +++ b/docs/com/nuix/nx/models/DoubleBoundedRangeModel.html @@ -0,0 +1,447 @@ + + + + + +DoubleBoundedRangeModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DoubleBoundedRangeModel

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.DefaultBoundedRangeModel
      • +
      • +
          +
        • com.nuix.nx.models.DoubleBoundedRangeModel
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.BoundedRangeModel
      +
      +
      +
      public class DoubleBoundedRangeModel
      +extends javax.swing.DefaultBoundedRangeModel
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class javax.swing.DefaultBoundedRangeModel

          +changeEvent, listenerList
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + +
        Constructors 
        ConstructorDescription
        DoubleBoundedRangeModel​(double value, + double extent, + double min, + double max, + int digitsToMaintain) 
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        doublegetExtentAsDouble() 
        doublegetMaximumAsDouble() 
        doublegetMinimumAsDouble() 
        doublegetValueAsDouble() 
        voidsetExtent​(double extent) 
        voidsetMaximum​(double max) 
        voidsetMinimum​(double min) 
        voidsetValue​(double value) 
        +
          +
        • + + +

          Methods inherited from class javax.swing.DefaultBoundedRangeModel

          +addChangeListener, fireStateChanged, getChangeListeners, getExtent, getListeners, getMaximum, getMinimum, getValue, getValueIsAdjusting, removeChangeListener, setExtent, setMaximum, setMinimum, setRangeProperties, setValue, setValueIsAdjusting, toString
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DoubleBoundedRangeModel

          +
          public DoubleBoundedRangeModel​(double value,
          +                               double extent,
          +                               double min,
          +                               double max,
          +                               int digitsToMaintain)
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setExtent

          +
          public void setExtent​(double extent)
          +
        • +
        + + + +
          +
        • +

          setMaximum

          +
          public void setMaximum​(double max)
          +
        • +
        + + + +
          +
        • +

          setMinimum

          +
          public void setMinimum​(double min)
          +
        • +
        + + + +
          +
        • +

          setValue

          +
          public void setValue​(double value)
          +
        • +
        + + + +
          +
        • +

          getExtentAsDouble

          +
          public double getExtentAsDouble()
          +
        • +
        + + + +
          +
        • +

          getMaximumAsDouble

          +
          public double getMaximumAsDouble()
          +
        • +
        + + + +
          +
        • +

          getMinimumAsDouble

          +
          public double getMinimumAsDouble()
          +
        • +
        + + + +
          +
        • +

          getValueAsDouble

          +
          public double getValueAsDouble()
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/DynamicTableModel.html b/docs/com/nuix/nx/models/DynamicTableModel.html new file mode 100644 index 0000000..092340d --- /dev/null +++ b/docs/com/nuix/nx/models/DynamicTableModel.html @@ -0,0 +1,1094 @@ + + + + + +DynamicTableModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class DynamicTableModel

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.table.AbstractTableModel
      • +
      • +
          +
        • com.nuix.nx.models.DynamicTableModel
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.table.TableModel
      +
      +
      +
      public class DynamicTableModel
      +extends javax.swing.table.AbstractTableModel
      +
      Table model used to store data for a DynamicTableControl
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class javax.swing.table.AbstractTableModel

          +listenerList
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + +
        Constructors 
        ConstructorDescription
        DynamicTableModel​(java.util.List<java.lang.String> headers, + java.util.List<java.lang.Object> records, + DynamicTableValueCallback valueCallback, + boolean defaultCheckState) +
        Create a new instance
        +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidaddRecord​(java.lang.Object record) +
        Adds a single record
        +
        voidcheckDisplayedRecords() +
        Sets the checked state of the currently displayed records to checked.
        +
        ChoiceTableModelChangeListenergetChangeListener() +
        Get the listener which will be notified whn changes are made.
        +
        java.util.Set<java.lang.String>getCheckedRecordHashes() +
        Gets the MD5 hashes for all the currently checked records using getRecordHashes(java.util.List<java.lang.Object>)
        +
        java.util.List<java.lang.Object>getCheckedRecords() +
        Gets a list of records which are checked, regardless of whether they are currently displayed
        +
        intgetCheckedValueCount() +
        Gets a count of how many records are currently checked
        +
        java.lang.Class<?>getColumnClass​(int columnIndex) 
        intgetColumnCount() 
        java.lang.StringgetColumnName​(int columnIndex) 
        java.util.List<DynamicTableFilterProvider>getCustomFilterProviders() +
        Gets the list of filter providers beyond those that are built in, allowing you to add or remove + custom filter providers.
        +
        protected java.util.Set<java.lang.String>getRecordHashes​(java.util.List<java.lang.Object> records) +
        Generates a series of hashes representing each record by calling hashRecord(Object) + on each record.
        +
        java.util.List<java.lang.Object>getRecords() +
        Gets the records associated
        +
        intgetRowCount() 
        intgetTotalValueCount() +
        Gets the total count of records, regardless of check state or display state
        +
        java.lang.ObjectgetValueAt​(int rowIndex, + int columnIndex) 
        DynamicTableValueCallbackgetValueCallback() +
        A reference to the callback used for retrieving values for display.
        +
        intgetVisibleValueCount() +
        Gets the count of records which are currently displayed.
        +
        protected java.lang.StringhashRecord​(java.lang.Object record) +
        Hashes a record by the values in its columns.
        +
        booleanisCellEditable​(int rowIndex, + int columnIndex) 
        booleanisSelected​(java.lang.Object record) +
        Used to determine whether a given record is checked in the table
        +
        voidremove​(int rowIndex) +
        Remove a record at a specified index
        +
        voidremoveChangeListener​(ChoiceTableModelChangeListener listener) 
        voidsetChangeListener​(ChoiceTableModelChangeListener listener) +
        Set a listener which will be notified when changes are made
        +
        voidsetCheckedAtIndex​(int index, + boolean value) +
        Set the checked state of a record at a given index
        +
        voidsetCheckedRecordsFromHashes​(java.util.List<java.lang.String> hashStrings) +
        Sets the checked state of loaded records to checked for records with MD5 hash values + matching those in the provided list.
        +
        voidsetColumnEditable​(int column) +
        Allows caller to define whether a given column is allowed to be editable.
        +
        voidsetColumnName​(int columnIndex, + java.lang.String updatedValue) 
        voidsetCustomFilterProviders​(java.util.List<DynamicTableFilterProvider> customFilterProviders) +
        Sets the list of filter providers beyond those that are built in.
        +
        voidsetDefaultCheckState​(boolean defaultCheckState) +
        Sets the default checked state of records
        +
        voidsetFilter​(java.lang.String filter) +
        Set the current filter string
        +
        voidsetRecords​(java.util.List<java.lang.Object> records) +
        Sets the records associated
        +
        voidsetValueAt​(java.lang.Object aValue, + int rowIndex, + int columnIndex) 
        int[]shiftRows​(int[] positions, + int offset) +
        Shifts a given set of rows (based on row index) a given offset.
        +
        int[]shiftRowsDown​(int[] positions) +
        Shift a series of rows down 1
        +
        int[]shiftRowsUp​(int[] positions) +
        Shift a series of rows up 1
        +
        voiduncheckDisplayedRecords() +
        Sets the checked state of the currently displayed records to unchecked.
        +
        +
          +
        • + + +

          Methods inherited from class javax.swing.table.AbstractTableModel

          +addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          DynamicTableModel

          +
          public DynamicTableModel​(java.util.List<java.lang.String> headers,
          +                         java.util.List<java.lang.Object> records,
          +                         DynamicTableValueCallback valueCallback,
          +                         boolean defaultCheckState)
          +
          Create a new instance
          +
          +
          Parameters:
          +
          headers - The headers for each column
          +
          records - A collection of records to be displayed
          +
          valueCallback - Callback that yields a value for a cell given a particular record and column number
          +
          defaultCheckState - Determines whether by default are records checked
          +
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          setChangeListener

          +
          public void setChangeListener​(ChoiceTableModelChangeListener listener)
          +
          Set a listener which will be notified when changes are made
          +
          +
          Parameters:
          +
          listener - The listener to be notified of changes
          +
          +
        • +
        + + + +
          +
        • +

          getChangeListener

          +
          public ChoiceTableModelChangeListener getChangeListener()
          +
          Get the listener which will be notified whn changes are made.
          +
          +
          Returns:
          +
          the listener that is notified of changes
          +
          +
        • +
        + + + + + + + + + + + +
          +
        • +

          getColumnCount

          +
          public int getColumnCount()
          +
        • +
        + + + +
          +
        • +

          getRowCount

          +
          public int getRowCount()
          +
        • +
        + + + +
          +
        • +

          getValueAt

          +
          public java.lang.Object getValueAt​(int rowIndex,
          +                                   int columnIndex)
          +
        • +
        + + + +
          +
        • +

          isCellEditable

          +
          public boolean isCellEditable​(int rowIndex,
          +                              int columnIndex)
          +
          +
          Specified by:
          +
          isCellEditable in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          isCellEditable in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          setValueAt

          +
          public void setValueAt​(java.lang.Object aValue,
          +                       int rowIndex,
          +                       int columnIndex)
          +
          +
          Specified by:
          +
          setValueAt in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          setValueAt in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          getColumnName

          +
          public java.lang.String getColumnName​(int columnIndex)
          +
          +
          Specified by:
          +
          getColumnName in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnName in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          setColumnName

          +
          public void setColumnName​(int columnIndex,
          +                          java.lang.String updatedValue)
          +
        • +
        + + + +
          +
        • +

          getColumnClass

          +
          public java.lang.Class<?> getColumnClass​(int columnIndex)
          +
          +
          Specified by:
          +
          getColumnClass in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnClass in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          setFilter

          +
          public void setFilter​(java.lang.String filter)
          +
          Set the current filter string
          +
          +
          Parameters:
          +
          filter - The filter string to use
          +
          +
        • +
        + + + +
          +
        • +

          isSelected

          +
          public boolean isSelected​(java.lang.Object record)
          +
          Used to determine whether a given record is checked in the table
          +
          +
          Parameters:
          +
          record - The record to check for
          +
          Returns:
          +
          True if the record is present and found to be checked
          +
          +
        • +
        + + + +
          +
        • +

          getRecords

          +
          public java.util.List<java.lang.Object> getRecords()
          +
          Gets the records associated
          +
          +
          Returns:
          +
          The current full set of records
          +
          +
        • +
        + + + +
          +
        • +

          setRecords

          +
          public void setRecords​(java.util.List<java.lang.Object> records)
          +
          Sets the records associated
          +
          +
          Parameters:
          +
          records - The records to associate
          +
          +
        • +
        + + + +
          +
        • +

          addRecord

          +
          public void addRecord​(java.lang.Object record)
          +
          Adds a single record
          +
          +
          Parameters:
          +
          record - The record to add
          +
          +
        • +
        + + + +
          +
        • +

          remove

          +
          public void remove​(int rowIndex)
          +
          Remove a record at a specified index
          +
          +
          Parameters:
          +
          rowIndex - The index of the row containing the record to remove
          +
          +
        • +
        + + + +
          +
        • +

          setCheckedAtIndex

          +
          public void setCheckedAtIndex​(int index,
          +                              boolean value)
          +
          Set the checked state of a record at a given index
          +
          +
          Parameters:
          +
          index - The index to set the checked state of
          +
          value - The checked state to set
          +
          +
        • +
        + + + +
          +
        • +

          checkDisplayedRecords

          +
          public void checkDisplayedRecords()
          +
          Sets the checked state of the currently displayed records to checked. If no filtering + is currently applied this is all records, otherwise it will be just the filtered subset.
          +
        • +
        + + + +
          +
        • +

          uncheckDisplayedRecords

          +
          public void uncheckDisplayedRecords()
          +
          Sets the checked state of the currently displayed records to unchecked. If no filtering + is currently applied this is all records, otherwise it will be just the filtered subset.
          +
        • +
        + + + +
          +
        • +

          getCheckedRecords

          +
          public java.util.List<java.lang.Object> getCheckedRecords()
          +
          Gets a list of records which are checked, regardless of whether they are currently displayed
          +
          +
          Returns:
          +
          A list of checked records
          +
          +
        • +
        + + + +
          +
        • +

          hashRecord

          +
          protected java.lang.String hashRecord​(java.lang.Object record)
          +
          Hashes a record by the values in its columns. Used to store settings to JSON
          +
          +
          Parameters:
          +
          record - The record to hash
          +
          Returns:
          +
          An MD5 string based on a concatenation of the column values
          +
          +
        • +
        + + + +
          +
        • +

          getRecordHashes

          +
          protected java.util.Set<java.lang.String> getRecordHashes​(java.util.List<java.lang.Object> records)
          +
          Generates a series of hashes representing each record by calling hashRecord(Object) + on each record.
          +
          +
          Parameters:
          +
          records - The record to generate hashes for.
          +
          Returns:
          +
          A Set of distinct MD5 hash strings
          +
          +
        • +
        + + + +
          +
        • +

          getCheckedRecordHashes

          +
          public java.util.Set<java.lang.String> getCheckedRecordHashes()
          +
          Gets the MD5 hashes for all the currently checked records using getRecordHashes(java.util.List<java.lang.Object>)
          +
          +
          Returns:
          +
          MD5 hashes for all the currently checked records
          +
          +
        • +
        + + + +
          +
        • +

          setCheckedRecordsFromHashes

          +
          public void setCheckedRecordsFromHashes​(java.util.List<java.lang.String> hashStrings)
          +
          Sets the checked state of loaded records to checked for records with MD5 hash values + matching those in the provided list. Used to restore a selection of items which has + previously been saved.
          +
          +
          Parameters:
          +
          hashStrings - The MD5 hashes to match to records to be checked
          +
          +
        • +
        + + + +
          +
        • +

          getCheckedValueCount

          +
          public int getCheckedValueCount()
          +
          Gets a count of how many records are currently checked
          +
          +
          Returns:
          +
          The checked record count
          +
          +
        • +
        + + + +
          +
        • +

          getVisibleValueCount

          +
          public int getVisibleValueCount()
          +
          Gets the count of records which are currently displayed. If no filtering is currently applied + this will be to total record count. If filtering is currently applied this will be the number + of displayed records.
          +
          +
          Returns:
          +
          A count of currently visible records
          +
          +
        • +
        + + + +
          +
        • +

          getTotalValueCount

          +
          public int getTotalValueCount()
          +
          Gets the total count of records, regardless of check state or display state
          +
          +
          Returns:
          +
          The total count of records
          +
          +
        • +
        + + + +
          +
        • +

          shiftRowsUp

          +
          public int[] shiftRowsUp​(int[] positions)
          +
          Shift a series of rows up 1
          +
          +
          Parameters:
          +
          positions - Position indices of the rows to be shifted
          +
          Returns:
          +
          The resulting new positions
          +
          +
        • +
        + + + +
          +
        • +

          shiftRowsDown

          +
          public int[] shiftRowsDown​(int[] positions)
          +
          Shift a series of rows down 1
          +
          +
          Parameters:
          +
          positions - Position indices of the rows to be shifted
          +
          Returns:
          +
          The resulting new positions
          +
          +
        • +
        + + + +
          +
        • +

          shiftRows

          +
          public int[] shiftRows​(int[] positions,
          +                       int offset)
          +
          Shifts a given set of rows (based on row index) a given offset. A value of -1 for the offset is up (earlier in the list) + while a value of 1 is down (later in the list).
          +
          +
          Parameters:
          +
          positions - Position indices of the rows to be shifted
          +
          offset - The offset to shift the rows.
          +
          Returns:
          +
          The resulting new positions
          +
          +
        • +
        + + + +
          +
        • +

          setColumnEditable

          +
          public void setColumnEditable​(int column)
          +
          Allows caller to define whether a given column is allowed to be editable. The column index + provided is relative to user data and therefore index 0 is the first record column.
          +
          +
          Parameters:
          +
          column - The column index to set as editable
          +
          +
        • +
        + + + +
          +
        • +

          setDefaultCheckState

          +
          public void setDefaultCheckState​(boolean defaultCheckState)
          +
          Sets the default checked state of records
          +
          +
          Parameters:
          +
          defaultCheckState - The default check state to use
          +
          +
        • +
        + + + +
          +
        • +

          getCustomFilterProviders

          +
          public java.util.List<DynamicTableFilterProvider> getCustomFilterProviders()
          +
          Gets the list of filter providers beyond those that are built in, allowing you to add or remove + custom filter providers.
          +
          +
          Returns:
          +
          The current list of custom filter providers
          +
          +
        • +
        + + + +
          +
        • +

          setCustomFilterProviders

          +
          public void setCustomFilterProviders​(java.util.List<DynamicTableFilterProvider> customFilterProviders)
          +
          Sets the list of filter providers beyond those that are built in.
          +
          +
          Parameters:
          +
          customFilterProviders - The new list of custom filter providers
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/DynamicTableValueCallback.html b/docs/com/nuix/nx/models/DynamicTableValueCallback.html new file mode 100644 index 0000000..510e1fb --- /dev/null +++ b/docs/com/nuix/nx/models/DynamicTableValueCallback.html @@ -0,0 +1,256 @@ + + + + + +DynamicTableValueCallback (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Interface DynamicTableValueCallback

    +
    +
    +
    +
      +
    • +
      +
      public interface DynamicTableValueCallback
      +
      Callback used by DynamicTableControl to allow calling code (likely a Ruby script) + to save changes a user has made to a record in the table.
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + +
        All Methods Instance Methods Abstract Methods 
        Modifier and TypeMethodDescription
        java.lang.Objectinteract​(java.lang.Object record, + int i, + boolean setValue, + java.lang.Object aValue) 
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          interact

          +
          java.lang.Object interact​(java.lang.Object record,
          +                          int i,
          +                          boolean setValue,
          +                          java.lang.Object aValue)
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + +
    + +
    + + diff --git a/docs/com/nuix/nx/models/ItemStatisticsTableModel.html b/docs/com/nuix/nx/models/ItemStatisticsTableModel.html new file mode 100644 index 0000000..d154008 --- /dev/null +++ b/docs/com/nuix/nx/models/ItemStatisticsTableModel.html @@ -0,0 +1,440 @@ + + + + + +ItemStatisticsTableModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ItemStatisticsTableModel

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.table.AbstractTableModel
      • +
      • +
          +
        • com.nuix.nx.models.ItemStatisticsTableModel
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.table.TableModel
      +
      +
      +
      public class ItemStatisticsTableModel
      +extends javax.swing.table.AbstractTableModel
      +
      Table model used by ProcessingStatusControl. Used in table to display processing numbers.
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class javax.swing.table.AbstractTableModel

          +listenerList
        • +
        +
      • +
      +
      + +
      + +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        java.lang.Class<?>getColumnClass​(int col) 
        intgetColumnCount() 
        java.lang.StringgetColumnName​(int column) 
        intgetRowCount() 
        java.lang.ObjectgetValueAt​(int row, + int col) 
        voidrecord​(nuix.ProcessedItem item) 
        voidrefresh() 
        +
          +
        • + + +

          Methods inherited from class javax.swing.table.AbstractTableModel

          +addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, isCellEditable, removeTableModelListener, setValueAt
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ItemStatisticsTableModel

          +
          public ItemStatisticsTableModel()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getColumnCount

          +
          public int getColumnCount()
          +
        • +
        + + + +
          +
        • +

          getRowCount

          +
          public int getRowCount()
          +
        • +
        + + + +
          +
        • +

          getValueAt

          +
          public java.lang.Object getValueAt​(int row,
          +                                   int col)
          +
        • +
        + + + +
          +
        • +

          getColumnName

          +
          public java.lang.String getColumnName​(int column)
          +
          +
          Specified by:
          +
          getColumnName in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnName in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          getColumnClass

          +
          public java.lang.Class<?> getColumnClass​(int col)
          +
          +
          Specified by:
          +
          getColumnClass in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnClass in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          record

          +
          public void record​(nuix.ProcessedItem item)
          +
        • +
        + + + +
          +
        • +

          refresh

          +
          public void refresh()
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/ReportDataModel.html b/docs/com/nuix/nx/models/ReportDataModel.html new file mode 100644 index 0000000..52eba6c --- /dev/null +++ b/docs/com/nuix/nx/models/ReportDataModel.html @@ -0,0 +1,600 @@ + + + + + +ReportDataModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class ReportDataModel

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • com.nuix.nx.models.ReportDataModel
      • +
      +
    • +
    +
    +
      +
    • +
      +
      public class ReportDataModel
      +extends java.lang.Object
      +
      Data model for use with the ReportDisplayPanel. +

      + The report is represented by a group of sections, each section being a group of data labels and their values. + A report might be displayed as: +

      +
      +  SECTION 1
      +  --------
      +  Data Field 1                  Value 1
      +  Data Field 2                  Value 2
      +
      +  SECTION 2
      +  --------
      +  Data Field 3                  Value 3
      +
      +  ...
      +
      +

      + The sections names should be strings, the data field names should be strings, and the data values can be any + object that has a reasonable toString() representation. +

      +

      + No effort is made by this class to make building the list of sections and data labels threadsafe. As such, the + sections and data should be built prior to displaying the data in any UI. Updating data values will be + run from the Swing thread so updating these values during display is safe. +

      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        + + + + + + + + + + + + +
        Fields 
        Modifier and TypeFieldDescription
        static java.lang.StringSECTION_FIELD_DELIM 
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Summary

        + + + + + + + + + + +
        Constructors 
        ConstructorDescription
        ReportDataModel() 
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidaddData​(java.lang.String sectionName, + java.lang.String dataField, + java.lang.Object value) +
        Add data to the given section.
        +
        voidaddPropertyChangeListener​(java.beans.PropertyChangeListener listener) +
        Add a PropertyChangeListener to this object.
        +
        voidaddSection​(java.lang.String sectionName) +
        Add a new, empty section to the report.
        +
        voidaddSection​(java.lang.String sectionName, + java.util.Map<java.lang.String,​java.lang.Object> dataInSection) +
        Add a section to the report, providing data as the section is created.
        +
        java.util.Set<java.lang.String>getDataFieldsInSection​(java.lang.String sectionName) +
        Get the list of data fields in the provided section.
        +
        java.lang.StringgetDataFieldValue​(java.lang.String sectionName, + java.lang.String dataField) +
        Get a String representation of the value of a data field.
        +
        java.util.Set<java.lang.String>getSections() +
        Get the list of sections in this report.
        +
        voidremovePropertyChangeListener​(java.beans.PropertyChangeListener listener) +
        Remove the provided listener from this object.
        +
        voidupdateData​(java.lang.String sectionName, + java.lang.String dataField, + java.lang.Object newValue) +
        Update an existing data field in the given section with a new value.
        +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Detail

        + + + +
          +
        • +

          SECTION_FIELD_DELIM

          +
          public static final java.lang.String SECTION_FIELD_DELIM
          +
          +
          See Also:
          +
          Constant Field Values
          +
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          ReportDataModel

          +
          public ReportDataModel()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          addPropertyChangeListener

          +
          public void addPropertyChangeListener​(java.beans.PropertyChangeListener listener)
          +
          Add a PropertyChangeListener to this object. The listener will be updated when new sections are added and when + data field values are updated. When a section is added, the Property Name will be the name of the section. When + a data field value is updated the property name will be a string containing the Section Name and the Data Field + Name connected with the SECTION_FIELD_DELIM (for example, "Section 1::Data Field 1".)
          +
          +
          Parameters:
          +
          listener - A property change listener to be informed when section and data changes are made.
          +
          +
        • +
        + + + +
          +
        • +

          removePropertyChangeListener

          +
          public void removePropertyChangeListener​(java.beans.PropertyChangeListener listener)
          +
          Remove the provided listener from this object.
          +
          +
          Parameters:
          +
          listener - The PropertyChangeListener to remove.
          +
          +
        • +
        + + + +
          +
        • +

          addSection

          +
          public void addSection​(java.lang.String sectionName,
          +                       java.util.Map<java.lang.String,​java.lang.Object> dataInSection)
          +
          Add a section to the report, providing data as the section is created. + + This method is not guaranteed to be threadsafe. It will inform listeners of the new section. + + If the section already exists it will be replaced with the provided data.
          +
          +
          Parameters:
          +
          sectionName - The name of the section. This is for both identification and display purposes so make it + meaningful for display and also unique.
          +
          dataInSection - The data to display in the form of a Map. The keys to the map are the data field names and + are used both for display and as ids, so make them meaningful and unique.
          +
          +
        • +
        + + + +
          +
        • +

          addSection

          +
          public void addSection​(java.lang.String sectionName)
          +
          Add a new, empty section to the report. + + This method is not guaranteed to be thread safe.
          +
          +
          Parameters:
          +
          sectionName - The name of the new section. The name is both an id and displayed, so make it meaningful and + unique. If the section already exists, it will be replaced and the data in it will be lost.
          +
          +
        • +
        + + + +
          +
        • +

          addData

          +
          public void addData​(java.lang.String sectionName,
          +                    java.lang.String dataField,
          +                    java.lang.Object value)
          +
          Add data to the given section. If the section doesn't already exist it will be added with the new data. If + the data field already exists in the section, it will be replaced with the new value. + + This method is not guaranteed to be thread safe. It will not notify the UI of a new data field, though if + it results in a new section, that section will be added to the UI with the new data field.
          +
          +
          Parameters:
          +
          sectionName - The name of the section to add the data to.
          +
          dataField - The name of the data to add - this will be used both for id and display so make it unique in the + section and also meaningful to the user.
          +
          value - The value of the data field - any object with a meaningful toString() method.
          +
          +
        • +
        + + + +
          +
        • +

          updateData

          +
          public void updateData​(java.lang.String sectionName,
          +                       java.lang.String dataField,
          +                       java.lang.Object newValue)
          +
          Update an existing data field in the given section with a new value. If the section doesn't exist an exception + will be thrown. If the data field doesn't exist in the section then an exception will be thrown. Otherwise, + the existing value for the data field will be replaced with the one provided here. + + This method will update listeners with new values and the changes should be reflected in the UI.
          +
          +
          Parameters:
          +
          sectionName - The name of the section with the data field to update. It must already exist in the report.
          +
          dataField - The name of the data field to update. It must exist in the section provided.
          +
          newValue - The value to replace any value currently in the data field. Any object with a meaningful + toString() method
          +
          +
        • +
        + + + +
          +
        • +

          getDataFieldValue

          +
          public java.lang.String getDataFieldValue​(java.lang.String sectionName,
          +                                          java.lang.String dataField)
          +
          Get a String representation of the value of a data field. + + If either the section doesn't exist in the report or the data field is not found in the section provided then + this will return an empty string.
          +
          +
          Parameters:
          +
          sectionName - The name of the section where the data can be found
          +
          dataField - The name of the field whose data is to be retrieved
          +
          Returns:
          +
          A string representation of the data field value, or an empty string if the data field can't be located.
          +
          +
        • +
        + + + +
          +
        • +

          getDataFieldsInSection

          +
          public java.util.Set<java.lang.String> getDataFieldsInSection​(java.lang.String sectionName)
          +
          Get the list of data fields in the provided section. + + If the section doesn't exist in this report an empty set will be provided.
          +
          +
          Parameters:
          +
          sectionName - The name of the section whose data fields are to be retrieved.
          +
          Returns:
          +
          A Set of strings with the data field names, or an empty Set if the section doesn't exist.
          +
          +
        • +
        + + + +
          +
        • +

          getSections

          +
          public java.util.Set<java.lang.String> getSections()
          +
          Get the list of sections in this report.
          +
          +
          Returns:
          +
          a Set of Strings with the names of all the sections in this report.
          +
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/StringListTableModel.html b/docs/com/nuix/nx/models/StringListTableModel.html new file mode 100644 index 0000000..5f3aed5 --- /dev/null +++ b/docs/com/nuix/nx/models/StringListTableModel.html @@ -0,0 +1,569 @@ + + + + + +StringListTableModel (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    + +
    +
    + +

    Class StringListTableModel

    +
    +
    +
      +
    • java.lang.Object
    • +
    • +
        +
      • javax.swing.table.AbstractTableModel
      • +
      • +
          +
        • com.nuix.nx.models.StringListTableModel
        • +
        +
      • +
      +
    • +
    +
    +
      +
    • +
      +
      All Implemented Interfaces:
      +
      java.io.Serializable, javax.swing.table.TableModel
      +
      +
      +
      public class StringListTableModel
      +extends javax.swing.table.AbstractTableModel
      +
      +
      See Also:
      +
      Serialized Form
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Field Summary

        +
          +
        • + + +

          Fields inherited from class javax.swing.table.AbstractTableModel

          +listenerList
        • +
        +
      • +
      +
      + +
      + +
      + +
      +
        +
      • + + +

        Method Summary

        + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
        All Methods Instance Methods Concrete Methods 
        Modifier and TypeMethodDescription
        voidaddValue​(java.lang.String value) 
        java.lang.Class<?>getColumnClass​(int columnIndex) 
        intgetColumnCount() 
        java.lang.StringgetColumnName​(int column) 
        intgetRowCount() 
        java.lang.StringgetValueAt​(int index) 
        java.lang.ObjectgetValueAt​(int rowIndex, + int columnIndex) 
        intgetValueCount() 
        java.util.List<java.lang.String>getValues() 
        booleanisCellEditable​(int rowIndex, + int columnIndex) 
        booleanisEditable() 
        voidremoveValueAt​(int rowIndex) 
        voidsetEditable​(boolean editable) 
        voidsetValueAt​(java.lang.Object aValue, + int rowIndex, + int columnIndex) 
        voidsetValues​(java.util.List<java.lang.String> values) 
        +
          +
        • + + +

          Methods inherited from class javax.swing.table.AbstractTableModel

          +addTableModelListener, findColumn, fireTableCellUpdated, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener
        • +
        +
          +
        • + + +

          Methods inherited from class java.lang.Object

          +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
      +
    • + +
      +
        +
      • + + +

        Constructor Detail

        + + + +
          +
        • +

          StringListTableModel

          +
          public StringListTableModel()
          +
        • +
        +
      • +
      +
      + +
      +
        +
      • + + +

        Method Detail

        + + + +
          +
        • +

          getRowCount

          +
          public int getRowCount()
          +
        • +
        + + + +
          +
        • +

          getColumnCount

          +
          public int getColumnCount()
          +
        • +
        + + + +
          +
        • +

          getValueAt

          +
          public java.lang.Object getValueAt​(int rowIndex,
          +                                   int columnIndex)
          +
        • +
        + + + +
          +
        • +

          getColumnName

          +
          public java.lang.String getColumnName​(int column)
          +
          +
          Specified by:
          +
          getColumnName in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnName in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          getColumnClass

          +
          public java.lang.Class<?> getColumnClass​(int columnIndex)
          +
          +
          Specified by:
          +
          getColumnClass in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          getColumnClass in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          isCellEditable

          +
          public boolean isCellEditable​(int rowIndex,
          +                              int columnIndex)
          +
          +
          Specified by:
          +
          isCellEditable in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          isCellEditable in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          setValueAt

          +
          public void setValueAt​(java.lang.Object aValue,
          +                       int rowIndex,
          +                       int columnIndex)
          +
          +
          Specified by:
          +
          setValueAt in interface javax.swing.table.TableModel
          +
          Overrides:
          +
          setValueAt in class javax.swing.table.AbstractTableModel
          +
          +
        • +
        + + + +
          +
        • +

          getValueCount

          +
          public int getValueCount()
          +
        • +
        + + + +
          +
        • +

          getValueAt

          +
          public java.lang.String getValueAt​(int index)
          +
        • +
        + + + +
          +
        • +

          getValues

          +
          public java.util.List<java.lang.String> getValues()
          +
        • +
        + + + +
          +
        • +

          setValues

          +
          public void setValues​(java.util.List<java.lang.String> values)
          +
        • +
        + + + +
          +
        • +

          addValue

          +
          public void addValue​(java.lang.String value)
          +
        • +
        + + + +
          +
        • +

          removeValueAt

          +
          public void removeValueAt​(int rowIndex)
          +
        • +
        + + + +
          +
        • +

          isEditable

          +
          public boolean isEditable()
          +
        • +
        + + + +
          +
        • +

          setEditable

          +
          public void setEditable​(boolean editable)
          +
        • +
        +
      • +
      +
      +
    • +
    +
    +
    +
    + + + + diff --git a/docs/com/nuix/nx/models/package-summary.html b/docs/com/nuix/nx/models/package-summary.html new file mode 100644 index 0000000..b3fc295 --- /dev/null +++ b/docs/com/nuix/nx/models/package-summary.html @@ -0,0 +1,247 @@ + + + + + +com.nuix.nx.models (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Package com.nuix.nx.models

    +
    +
    + +
    +
    +
    + +
    + + diff --git a/docs/com/nuix/nx/models/package-tree.html b/docs/com/nuix/nx/models/package-tree.html new file mode 100644 index 0000000..3dd53ed --- /dev/null +++ b/docs/com/nuix/nx/models/package-tree.html @@ -0,0 +1,190 @@ + + + + + +com.nuix.nx.models Class Hierarchy (Nx 1.19.0 API) + + + + + + + + + + + + + + +
    + +
    +
    +
    +

    Hierarchy For Package com.nuix.nx.models

    +Package Hierarchies: + +
    +
    +
    +

    Class Hierarchy

    + +
    +
    +

    Interface Hierarchy

    + +
    +
    +
    + + + diff --git a/docs/com/nuix/nx/package-frame.html b/docs/com/nuix/nx/package-frame.html deleted file mode 100644 index 0949850..0000000 --- a/docs/com/nuix/nx/package-frame.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - -com.nuix.nx - - - - -

    com.nuix.nx

    - - - diff --git a/docs/com/nuix/nx/package-summary.html b/docs/com/nuix/nx/package-summary.html index 3cabafc..1ff932d 100644 --- a/docs/com/nuix/nx/package-summary.html +++ b/docs/com/nuix/nx/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx +com.nuix.nx (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/package-tree.html b/docs/com/nuix/nx/package-tree.html index 0254396..96c910f 100644 --- a/docs/com/nuix/nx/package-tree.html +++ b/docs/com/nuix/nx/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx Class Hierarchy +com.nuix.nx Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/package-use.html b/docs/com/nuix/nx/package-use.html deleted file mode 100644 index c895ccb..0000000 --- a/docs/com/nuix/nx/package-use.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -Uses of Package com.nuix.nx - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx 
    PackageDescription
    com.nuix.nx 
    -
    -
    -
      -
    • -
      - - -
      - - - - - - - - - - - - - - -
      Classes in com.nuix.nx used by com.nuix.nx 
      ClassDescription
      NuixVersion -
      Assists in representing a Nuix version in object form to assist with comparing two versions.
      -
      -
      -
      -
    • -
    -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/sourceitem/SourceItemVisitCallback.html b/docs/com/nuix/nx/sourceitem/SourceItemVisitCallback.html index 4cd2444..eef82d5 100644 --- a/docs/com/nuix/nx/sourceitem/SourceItemVisitCallback.html +++ b/docs/com/nuix/nx/sourceitem/SourceItemVisitCallback.html @@ -3,36 +3,45 @@ -SourceItemVisitCallback +SourceItemVisitCallback (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/sourceitem/SourceItemVisitor.html b/docs/com/nuix/nx/sourceitem/SourceItemVisitor.html index 718cd57..61ccf1e 100644 --- a/docs/com/nuix/nx/sourceitem/SourceItemVisitor.html +++ b/docs/com/nuix/nx/sourceitem/SourceItemVisitor.html @@ -3,36 +3,45 @@ -SourceItemVisitor +SourceItemVisitor (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - + - - diff --git a/docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitCallback.html b/docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitCallback.html deleted file mode 100644 index 535f8ab..0000000 --- a/docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitCallback.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - -Uses of Interface com.nuix.nx.sourceitem.SourceItemVisitCallback - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Interface
    com.nuix.nx.sourceitem.SourceItemVisitCallback

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use SourceItemVisitCallback 
    PackageDescription
    com.nuix.nx.sourceitem 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitor.html b/docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitor.html deleted file mode 100644 index 885c45e..0000000 --- a/docs/com/nuix/nx/sourceitem/class-use/SourceItemVisitor.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Uses of Class com.nuix.nx.sourceitem.SourceItemVisitor - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Class
    com.nuix.nx.sourceitem.SourceItemVisitor

    -
    -
    No usage of com.nuix.nx.sourceitem.SourceItemVisitor
    -
    - -
    -
    - - diff --git a/docs/com/nuix/nx/sourceitem/package-frame.html b/docs/com/nuix/nx/sourceitem/package-frame.html deleted file mode 100644 index cc526fa..0000000 --- a/docs/com/nuix/nx/sourceitem/package-frame.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - -com.nuix.nx.sourceitem - - - - -

    com.nuix.nx.sourceitem

    -
    -

    Interfaces

    - -

    Classes

    - -
    - - diff --git a/docs/com/nuix/nx/sourceitem/package-summary.html b/docs/com/nuix/nx/sourceitem/package-summary.html index 4751ad4..24599b8 100644 --- a/docs/com/nuix/nx/sourceitem/package-summary.html +++ b/docs/com/nuix/nx/sourceitem/package-summary.html @@ -3,30 +3,39 @@ -com.nuix.nx.sourceitem +com.nuix.nx.sourceitem (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    - diff --git a/docs/com/nuix/nx/sourceitem/package-tree.html b/docs/com/nuix/nx/sourceitem/package-tree.html index 4f252ee..96b9602 100644 --- a/docs/com/nuix/nx/sourceitem/package-tree.html +++ b/docs/com/nuix/nx/sourceitem/package-tree.html @@ -3,30 +3,39 @@ -com.nuix.nx.sourceitem Class Hierarchy +com.nuix.nx.sourceitem Class Hierarchy (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/com/nuix/nx/sourceitem/package-use.html b/docs/com/nuix/nx/sourceitem/package-use.html deleted file mode 100644 index a349c8f..0000000 --- a/docs/com/nuix/nx/sourceitem/package-use.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -Uses of Package com.nuix.nx.sourceitem - - - - - - - - - - - - - - - -
    - -
    -
    -
    -

    Uses of Package
    com.nuix.nx.sourceitem

    -
    -
    -
    - - - - - - - - - - - - - - -
    Packages that use com.nuix.nx.sourceitem 
    PackageDescription
    com.nuix.nx.sourceitem 
    -
    -
    - -
    -
    -
    - -
    -
    - - diff --git a/docs/constant-values.html b/docs/constant-values.html index f604445..2caab0f 100644 --- a/docs/constant-values.html +++ b/docs/constant-values.html @@ -3,30 +3,39 @@ -Constant Field Values +Constant Field Values (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/copy.svg b/docs/copy.svg deleted file mode 100644 index 7c46ab1..0000000 --- a/docs/copy.svg +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - diff --git a/docs/deprecated-list.html b/docs/deprecated-list.html index 1bd303d..b9db4b0 100644 --- a/docs/deprecated-list.html +++ b/docs/deprecated-list.html @@ -3,30 +3,39 @@ -Deprecated List +Deprecated List (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/element-list b/docs/element-list index 96c9c7c..2ea8f1a 100644 --- a/docs/element-list +++ b/docs/element-list @@ -1,12 +1,14 @@ +com.nuix.logging com.nuix.nx com.nuix.nx.callbacks -com.nuix.nx.collections com.nuix.nx.controls com.nuix.nx.controls.filters com.nuix.nx.controls.models com.nuix.nx.dialogs com.nuix.nx.digest com.nuix.nx.export +com.nuix.nx.filters com.nuix.nx.helpers com.nuix.nx.misc +com.nuix.nx.models com.nuix.nx.sourceitem diff --git a/docs/help-doc.html b/docs/help-doc.html index 0f75d45..196d646 100644 --- a/docs/help-doc.html +++ b/docs/help-doc.html @@ -3,30 +3,39 @@ -API Help +API Help (Nx 1.19.0 API) - - - + + - - + + - - + + - - -
    -
    diff --git a/docs/jquery-ui.overrides.css b/docs/jquery-ui.overrides.css index f89acb6..facf852 100644 --- a/docs/jquery-ui.overrides.css +++ b/docs/jquery-ui.overrides.css @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020, 2022, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,4 +31,5 @@ a.ui-button:active, .ui-button.ui-state-active:hover { /* Overrides the color of selection used in jQuery UI */ background: #F8981D; + border: 1px solid #F8981D; } diff --git a/docs/script-dir/external/jquery/jquery.js b/docs/jquery/external/jquery/jquery.js similarity index 91% rename from docs/script-dir/external/jquery/jquery.js rename to docs/jquery/external/jquery/jquery.js index 5b16efa..5093733 100644 --- a/docs/script-dir/external/jquery/jquery.js +++ b/docs/jquery/external/jquery/jquery.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v3.4.1 + * jQuery JavaScript Library v3.5.1 * https://jquery.com/ * * Includes Sizzle.js @@ -9,7 +9,7 @@ * Released under the MIT license * https://jquery.org/license * - * Date: 2019-05-01T21:04Z + * Date: 2020-05-04T22:49Z */ ( function( global, factory ) { @@ -47,13 +47,16 @@ var arr = []; -var document = window.document; - var getProto = Object.getPrototypeOf; var slice = arr.slice; -var concat = arr.concat; +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + var push = arr.push; @@ -86,6 +89,8 @@ var isWindow = function isWindow( obj ) { }; +var document = window.document; + var preservedScriptAttributes = { @@ -142,7 +147,7 @@ function toType( obj ) { var - version = "3.4.1", + version = "3.5.1", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -150,11 +155,7 @@ var // The jQuery object is actually just the init constructor 'enhanced' // Need init if jQuery is called (just allow error to be thrown if not included) return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + }; jQuery.fn = jQuery.prototype = { @@ -220,6 +221,18 @@ jQuery.fn = jQuery.prototype = { return this.eq( -1 ); }, + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + eq: function( i ) { var len = this.length, j = +i + ( i < 0 ? len : 0 ); @@ -353,9 +366,10 @@ jQuery.extend( { return true; }, - // Evaluates a script in a global context - globalEval: function( code, options ) { - DOMEval( code, { nonce: options && options.nonce } ); + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); }, each: function( obj, callback ) { @@ -379,13 +393,6 @@ jQuery.extend( { return obj; }, - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - // results is for internal usage only makeArray: function( arr, results ) { var ret = results || []; @@ -472,7 +479,7 @@ jQuery.extend( { } // Flatten any nested arrays - return concat.apply( [], ret ); + return flat( ret ); }, // A global GUID counter for objects @@ -489,7 +496,7 @@ if ( typeof Symbol === "function" ) { // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { +function( _i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); @@ -511,17 +518,16 @@ function isArrayLike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v2.3.4 + * Sizzle CSS Selector Engine v2.3.5 * https://sizzlejs.com/ * * Copyright JS Foundation and other contributors * Released under the MIT license * https://js.foundation/ * - * Date: 2019-04-08 + * Date: 2020-03-14 */ -(function( window ) { - +( function( window ) { var i, support, Expr, @@ -561,59 +567,70 @@ var i, }, // Instance methods - hasOwn = ({}).hasOwnProperty, + hasOwn = ( {} ).hasOwnProperty, arr = [], pop = arr.pop, - push_native = arr.push, + pushNative = arr.push, push = arr.push, slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native // https://jsperf.com/thor-indexof-vs-for/5 indexOf = function( list, elem ) { var i = 0, len = list.length; for ( ; i < len; i++ ) { - if ( list[i] === elem ) { + if ( list[ i ] === elem ) { return i; } } return -1; }, - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + + "ismap|loop|multiple|open|readonly|required|scoped", // Regular expressions // http://www.w3.org/TR/css3-selectors/#whitespace whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", + + // "Attribute values must be CSS identifiers [capture 5] + // or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: // 1. quoted (capture 3; capture 4 or capture 5) "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) ".*" + ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + + "*" ), rdescend = new RegExp( whitespace + "|>" ), rpseudo = new RegExp( pseudos ), @@ -625,14 +642,16 @@ var i, "TAG": new RegExp( "^(" + identifier + "|[*])" ), "ATTR": new RegExp( "^" + attributes ), "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + "needsContext": new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) }, rhtml = /HTML$/i, @@ -648,18 +667,21 @@ var i, // CSS escapes // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + return nonHex ? + + // Strip the backslash prefix from a non-hex escape sequence + nonHex : + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair high < 0 ? - // BMP codepoint String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); }, @@ -675,7 +697,8 @@ var i, } // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + return ch.slice( 0, -1 ) + "\\" + + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; } // Other potentially-special ASCII characters get backslash-escaped @@ -700,18 +723,20 @@ var i, // Optimize for push.apply( _, NodeList ) try { push.apply( - (arr = slice.call( preferredDoc.childNodes )), + ( arr = slice.call( preferredDoc.childNodes ) ), preferredDoc.childNodes ); + // Support: Android<4.0 // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions arr[ preferredDoc.childNodes.length ].nodeType; } catch ( e ) { push = { apply: arr.length ? // Leverage slice if possible function( target, els ) { - push_native.apply( target, slice.call(els) ); + pushNative.apply( target, slice.call( els ) ); } : // Support: IE<9 @@ -719,8 +744,9 @@ try { function( target, els ) { var j = target.length, i = 0; + // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} + while ( ( target[ j++ ] = els[ i++ ] ) ) {} target.length = j - 1; } }; @@ -744,24 +770,21 @@ function Sizzle( selector, context, results, seed ) { // Try to shortcut find operations (as opposed to filters) in HTML documents if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } + setDocument( context ); context = context || document; if ( documentIsHTML ) { // If the selector is sufficiently simple, try using a "get*By*" DOM method // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { // ID selector - if ( (m = match[1]) ) { + if ( ( m = match[ 1 ] ) ) { // Document context if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { + if ( ( elem = context.getElementById( m ) ) ) { // Support: IE, Opera, Webkit // TODO: identify versions @@ -780,7 +803,7 @@ function Sizzle( selector, context, results, seed ) { // Support: IE, Opera, Webkit // TODO: identify versions // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && + if ( newContext && ( elem = newContext.getElementById( m ) ) && contains( context, elem ) && elem.id === m ) { @@ -790,12 +813,12 @@ function Sizzle( selector, context, results, seed ) { } // Type selector - } else if ( match[2] ) { + } else if ( match[ 2 ] ) { push.apply( results, context.getElementsByTagName( selector ) ); return results; // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && + } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && context.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); @@ -806,11 +829,11 @@ function Sizzle( selector, context, results, seed ) { // Take advantage of querySelectorAll if ( support.qsa && !nonnativeSelectorCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && // Support: IE 8 only // Exclude object elements - (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { + ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { newSelector = selector; newContext = context; @@ -819,27 +842,36 @@ function Sizzle( selector, context, results, seed ) { // descendant combinators, which is not what we want. // In such cases, we work around the behavior by prefixing every selector in the // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && rdescend.test( selector ) ) { + if ( nodeType === 1 && + ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + if ( newContext !== context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } } // Prefix every selector in the list groups = tokenize( selector ); i = groups.length; while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); } newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; } try { @@ -872,12 +904,14 @@ function createCache() { var keys = []; function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries delete cache[ keys.shift() ]; } - return (cache[ key + " " ] = value); + return ( cache[ key + " " ] = value ); } return cache; } @@ -896,17 +930,19 @@ function markFunction( fn ) { * @param {Function} fn Passed the created element and returns a boolean result */ function assert( fn ) { - var el = document.createElement("fieldset"); + var el = document.createElement( "fieldset" ); try { return !!fn( el ); - } catch (e) { + } catch ( e ) { return false; } finally { + // Remove from its parent by default if ( el.parentNode ) { el.parentNode.removeChild( el ); } + // release memory in IE el = null; } @@ -918,11 +954,11 @@ function assert( fn ) { * @param {Function} handler The method that will be applied */ function addHandle( attrs, handler ) { - var arr = attrs.split("|"), + var arr = attrs.split( "|" ), i = arr.length; while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; + Expr.attrHandle[ arr[ i ] ] = handler; } } @@ -944,7 +980,7 @@ function siblingCheck( a, b ) { // Check if b follows a if ( cur ) { - while ( (cur = cur.nextSibling) ) { + while ( ( cur = cur.nextSibling ) ) { if ( cur === b ) { return -1; } @@ -972,7 +1008,7 @@ function createInputPseudo( type ) { function createButtonPseudo( type ) { return function( elem ) { var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; + return ( name === "input" || name === "button" ) && elem.type === type; }; } @@ -1015,7 +1051,7 @@ function createDisabledPseudo( disabled ) { // Where there is no isDisabled, check manually /* jshint -W018 */ elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; + inDisabledFieldset( elem ) === disabled; } return elem.disabled === disabled; @@ -1037,21 +1073,21 @@ function createDisabledPseudo( disabled ) { * @param {Function} fn */ function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { + return markFunction( function( argument ) { argument = +argument; - return markFunction(function( seed, matches ) { + return markFunction( function( seed, matches ) { var j, matchIndexes = fn( [], seed.length, argument ), i = matchIndexes.length; // Match elements found at the specified indexes while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); } } - }); - }); + } ); + } ); } /** @@ -1073,7 +1109,7 @@ support = Sizzle.support = {}; */ isXML = Sizzle.isXML = function( elem ) { var namespace = elem.namespaceURI, - docElem = (elem.ownerDocument || elem).documentElement; + docElem = ( elem.ownerDocument || elem ).documentElement; // Support: IE <=8 // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes @@ -1091,7 +1127,11 @@ setDocument = Sizzle.setDocument = function( node ) { doc = node ? node.ownerDocument || node : preferredDoc; // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { return document; } @@ -1100,10 +1140,14 @@ setDocument = Sizzle.setDocument = function( node ) { docElem = document.documentElement; documentIsHTML = !isXML( document ); - // Support: IE 9-11, Edge + // Support: IE 9 - 11+, Edge 12 - 18+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { // Support: IE 11, Edge if ( subWindow.addEventListener ) { @@ -1115,25 +1159,36 @@ setDocument = Sizzle.setDocument = function( node ) { } } + // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, + // Safari 4 - 5 only, Opera <=11.6 - 12.x only + // IE/Edge & older browsers don't support the :scope pseudo-class. + // Support: Safari 6.0 only + // Safari 6.0 supports :scope but it's an alias of :root there. + support.scope = assert( function( el ) { + docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); + return typeof el.querySelectorAll !== "undefined" && + !el.querySelectorAll( ":scope fieldset div" ).length; + } ); + /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 // Verify that getAttribute really returns attributes and not properties // (excepting IE8 booleans) - support.attributes = assert(function( el ) { + support.attributes = assert( function( el ) { el.className = "i"; - return !el.getAttribute("className"); - }); + return !el.getAttribute( "className" ); + } ); /* getElement(s)By* ---------------------------------------------------------------------- */ // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); + support.getElementsByTagName = assert( function( el ) { + el.appendChild( document.createComment( "" ) ); + return !el.getElementsByTagName( "*" ).length; + } ); // Support: IE<9 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); @@ -1142,38 +1197,38 @@ setDocument = Sizzle.setDocument = function( node ) { // Check if getElementById returns elements by name // The broken getElementById methods don't pick up programmatically-set names, // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { + support.getById = assert( function( el ) { docElem.appendChild( el ).id = expando; return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); + } ); // ID filter and find if ( support.getById ) { - Expr.filter["ID"] = function( id ) { + Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { - return elem.getAttribute("id") === attrId; + return elem.getAttribute( "id" ) === attrId; }; }; - Expr.find["ID"] = function( id, context ) { + Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var elem = context.getElementById( id ); return elem ? [ elem ] : []; } }; } else { - Expr.filter["ID"] = function( id ) { + Expr.filter[ "ID" ] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); + elem.getAttributeNode( "id" ); return node && node.value === attrId; }; }; // Support: IE 6 - 7 only // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { + Expr.find[ "ID" ] = function( id, context ) { if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var node, i, elems, elem = context.getElementById( id ); @@ -1181,7 +1236,7 @@ setDocument = Sizzle.setDocument = function( node ) { if ( elem ) { // Verify the id attribute - node = elem.getAttributeNode("id"); + node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } @@ -1189,8 +1244,8 @@ setDocument = Sizzle.setDocument = function( node ) { // Fall back on getElementsByName elems = context.getElementsByName( id ); i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); if ( node && node.value === id ) { return [ elem ]; } @@ -1203,7 +1258,7 @@ setDocument = Sizzle.setDocument = function( node ) { } // Tag - Expr.find["TAG"] = support.getElementsByTagName ? + Expr.find[ "TAG" ] = support.getElementsByTagName ? function( tag, context ) { if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); @@ -1218,12 +1273,13 @@ setDocument = Sizzle.setDocument = function( node ) { var elem, tmp = [], i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments if ( tag === "*" ) { - while ( (elem = results[i++]) ) { + while ( ( elem = results[ i++ ] ) ) { if ( elem.nodeType === 1 ) { tmp.push( elem ); } @@ -1235,7 +1291,7 @@ setDocument = Sizzle.setDocument = function( node ) { }; // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { return context.getElementsByClassName( className ); } @@ -1256,10 +1312,14 @@ setDocument = Sizzle.setDocument = function( node ) { // See https://bugs.jquery.com/ticket/13378 rbuggyQSA = []; - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { + // Build QSA regex // Regex strategy adopted from Diego Perini - assert(function( el ) { + assert( function( el ) { + + var input; + // Select is set to empty string on purpose // This is to test IE's treatment of not explicitly // setting a boolean content attribute, @@ -1273,78 +1333,98 @@ setDocument = Sizzle.setDocument = function( node ) { // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { + if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } // Support: IE8 // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { + if ( !el.querySelectorAll( "[selected]" ).length ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); + rbuggyQSA.push( "~=" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); } // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); } // Support: Safari 8+, iOS 8+ // https://bugs.webkit.org/show_bug.cgi?id=136851 // In-page `selector#id sibling-combinator selector` fails if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); + rbuggyQSA.push( ".#.+[+~]" ); } - }); - assert(function( el ) { + // Support: Firefox <=3.6 - 5 only + // Old Firefox doesn't throw on a badly-escaped identifier. + el.querySelectorAll( "\\\f" ); + rbuggyQSA.push( "[\\r\\n\\f]" ); + } ); + + assert( function( el ) { el.innerHTML = "" + ""; // Support: Windows 8 Native Apps // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); + var input = document.createElement( "input" ); input.setAttribute( "type", "hidden" ); el.appendChild( input ).setAttribute( "name", "D" ); // Support: IE8 // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { + if ( el.querySelectorAll( "[name=d]" ).length ) { rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); } // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { + if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } // Support: IE9-11+ // IE's :disabled selector does not pick up the children of disabled fieldsets docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { rbuggyQSA.push( ":enabled", ":disabled" ); } + // Support: Opera 10 - 11 only // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); + el.querySelectorAll( "*,:x" ); + rbuggyQSA.push( ",.*:" ); + } ); } - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || docElem.webkitMatchesSelector || docElem.mozMatchesSelector || docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { + docElem.msMatchesSelector ) ) ) ) { + + assert( function( el ) { - assert(function( el ) { // Check to see if it's possible to do matchesSelector // on a disconnected node (IE 9) support.disconnectedMatch = matches.call( el, "*" ); @@ -1353,11 +1433,11 @@ setDocument = Sizzle.setDocument = function( node ) { // Gecko does not error, returns false instead matches.call( el, "[s!='']:x" ); rbuggyMatches.push( "!=", pseudos ); - }); + } ); } - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); /* Contains ---------------------------------------------------------------------- */ @@ -1374,11 +1454,11 @@ setDocument = Sizzle.setDocument = function( node ) { adown.contains ? adown.contains( bup ) : a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); + ) ); } : function( a, b ) { if ( b ) { - while ( (b = b.parentNode) ) { + while ( ( b = b.parentNode ) ) { if ( b === a ) { return true; } @@ -1407,7 +1487,11 @@ setDocument = Sizzle.setDocument = function( node ) { } // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? a.compareDocumentPosition( b ) : // Otherwise we know they are disconnected @@ -1415,13 +1499,24 @@ setDocument = Sizzle.setDocument = function( node ) { // Disconnected nodes if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a == document || a.ownerDocument == preferredDoc && + contains( preferredDoc, a ) ) { return -1; } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b == document || b.ownerDocument == preferredDoc && + contains( preferredDoc, b ) ) { return 1; } @@ -1434,6 +1529,7 @@ setDocument = Sizzle.setDocument = function( node ) { return compare & 4 ? -1 : 1; } : function( a, b ) { + // Exit early if the nodes are identical if ( a === b ) { hasDuplicate = true; @@ -1449,8 +1545,14 @@ setDocument = Sizzle.setDocument = function( node ) { // Parentless nodes are either documents or disconnected if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + return a == document ? -1 : + b == document ? 1 : + /* eslint-enable eqeqeq */ aup ? -1 : bup ? 1 : sortInput ? @@ -1464,26 +1566,32 @@ setDocument = Sizzle.setDocument = function( node ) { // Otherwise we need full lists of their ancestors for comparison cur = a; - while ( (cur = cur.parentNode) ) { + while ( ( cur = cur.parentNode ) ) { ap.unshift( cur ); } cur = b; - while ( (cur = cur.parentNode) ) { + while ( ( cur = cur.parentNode ) ) { bp.unshift( cur ); } // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { + while ( ap[ i ] === bp[ i ] ) { i++; } return i ? + // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : + siblingCheck( ap[ i ], bp[ i ] ) : // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + /* eslint-disable eqeqeq */ + ap[ i ] == preferredDoc ? -1 : + bp[ i ] == preferredDoc ? 1 : + /* eslint-enable eqeqeq */ 0; }; @@ -1495,10 +1603,7 @@ Sizzle.matches = function( expr, elements ) { }; Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } + setDocument( elem ); if ( support.matchesSelector && documentIsHTML && !nonnativeSelectorCache[ expr + " " ] && @@ -1510,12 +1615,13 @@ Sizzle.matchesSelector = function( elem, expr ) { // IE 9's matchesSelector returns false on disconnected nodes if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { return ret; } - } catch (e) { + } catch ( e ) { nonnativeSelectorCache( expr, true ); } } @@ -1524,20 +1630,31 @@ Sizzle.matchesSelector = function( elem, expr ) { }; Sizzle.contains = function( context, elem ) { + // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { setDocument( context ); } return contains( context, elem ); }; Sizzle.attr = function( elem, name ) { + // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { setDocument( elem ); } var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? fn( elem, name, !documentIsHTML ) : @@ -1547,13 +1664,13 @@ Sizzle.attr = function( elem, name ) { val : support.attributes || !documentIsHTML ? elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? + ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : null; }; Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); + return ( sel + "" ).replace( rcssescape, fcssescape ); }; Sizzle.error = function( msg ) { @@ -1576,7 +1693,7 @@ Sizzle.uniqueSort = function( results ) { results.sort( sortOrder ); if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { + while ( ( elem = results[ i++ ] ) ) { if ( elem === results[ i ] ) { j = duplicates.push( i ); } @@ -1604,17 +1721,21 @@ getText = Sizzle.getText = function( elem ) { nodeType = elem.nodeType; if ( !nodeType ) { + // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { + while ( ( node = elem[ i++ ] ) ) { + // Do not traverse comment nodes ret += getText( node ); } } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements // innerText usage removed for consistency of new lines (jQuery #11153) if ( typeof elem.textContent === "string" ) { return elem.textContent; } else { + // Traverse its children for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { ret += getText( elem ); @@ -1623,6 +1744,7 @@ getText = Sizzle.getText = function( elem ) { } else if ( nodeType === 3 || nodeType === 4 ) { return elem.nodeValue; } + // Do not include comment or processing instruction nodes return ret; @@ -1650,19 +1772,21 @@ Expr = Sizzle.selectors = { preFilter: { "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || + match[ 5 ] || "" ).replace( runescape, funescape ); - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; } return match.slice( 0, 4 ); }, "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] 1 type (only|nth|...) 2 what (child|of-type) @@ -1673,22 +1797,25 @@ Expr = Sizzle.selectors = { 7 sign of y-component 8 y of y-component */ - match[1] = match[1].toLowerCase(); + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - if ( match[1].slice( 0, 3 ) === "nth" ) { // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); + if ( !match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); } // numeric x and y parameters for Expr.filter.CHILD // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); + // other types prohibit arguments + } else if ( match[ 3 ] ) { + Sizzle.error( match[ 0 ] ); } return match; @@ -1696,26 +1823,28 @@ Expr = Sizzle.selectors = { "PSEUDO": function( match ) { var excess, - unquoted = !match[6] && match[2]; + unquoted = !match[ 6 ] && match[ 2 ]; - if ( matchExpr["CHILD"].test( match[0] ) ) { + if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { return null; } // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; // Strip excess characters from unquoted arguments } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && + ( excess = tokenize( unquoted, true ) ) && + // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); } // Return only captures needed by the pseudo filter method (type and argument) @@ -1728,7 +1857,9 @@ Expr = Sizzle.selectors = { "TAG": function( nodeNameSelector ) { var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); return nodeNameSelector === "*" ? - function() { return true; } : + function() { + return true; + } : function( elem ) { return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; }; @@ -1738,10 +1869,16 @@ Expr = Sizzle.selectors = { var pattern = classCache[ className + " " ]; return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); + ( pattern = new RegExp( "(^|" + whitespace + + ")" + className + "(" + whitespace + "|$)" ) ) && classCache( + className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); }, "ATTR": function( name, operator, check ) { @@ -1757,6 +1894,8 @@ Expr = Sizzle.selectors = { result += ""; + /* eslint-disable max-len */ + return operator === "=" ? result === check : operator === "!=" ? result !== check : operator === "^=" ? check && result.indexOf( check ) === 0 : @@ -1765,10 +1904,12 @@ Expr = Sizzle.selectors = { operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; + /* eslint-enable max-len */ + }; }, - "CHILD": function( type, what, argument, first, last ) { + "CHILD": function( type, what, _argument, first, last ) { var simple = type.slice( 0, 3 ) !== "nth", forward = type.slice( -4 ) !== "last", ofType = what === "of-type"; @@ -1780,7 +1921,7 @@ Expr = Sizzle.selectors = { return !!elem.parentNode; } : - function( elem, context, xml ) { + function( elem, _context, xml ) { var cache, uniqueCache, outerCache, node, nodeIndex, start, dir = simple !== forward ? "nextSibling" : "previousSibling", parent = elem.parentNode, @@ -1794,7 +1935,7 @@ Expr = Sizzle.selectors = { if ( simple ) { while ( dir ) { node = elem; - while ( (node = node[ dir ]) ) { + while ( ( node = node[ dir ] ) ) { if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { @@ -1802,6 +1943,7 @@ Expr = Sizzle.selectors = { return false; } } + // Reverse direction for :only-* (if we haven't yet done so) start = dir = type === "only" && !start && "nextSibling"; } @@ -1817,22 +1959,22 @@ Expr = Sizzle.selectors = { // ...in a gzip-friendly way node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); + outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); + ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; diff = nodeIndex && cache[ 2 ]; node = nodeIndex && parent.childNodes[ nodeIndex ]; - while ( (node = ++nodeIndex && node && node[ dir ] || + while ( ( node = ++nodeIndex && node && node[ dir ] || // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { + ( diff = nodeIndex = 0 ) || start.pop() ) ) { // When found, cache indexes on `parent` and break if ( node.nodeType === 1 && ++diff && node === elem ) { @@ -1842,16 +1984,18 @@ Expr = Sizzle.selectors = { } } else { + // Use previously-cached element index if available if ( useCache ) { + // ...in a gzip-friendly way node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); + outerCache = node[ expando ] || ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); + ( outerCache[ node.uniqueID ] = {} ); cache = uniqueCache[ type ] || []; nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; @@ -1861,9 +2005,10 @@ Expr = Sizzle.selectors = { // xml :nth-child(...) // or :nth-last-child(...) or :nth(-last)?-of-type(...) if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { if ( ( ofType ? node.nodeName.toLowerCase() === name : @@ -1872,12 +2017,13 @@ Expr = Sizzle.selectors = { // Cache the index of each encountered element if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); + outerCache = node[ expando ] || + ( node[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); + ( outerCache[ node.uniqueID ] = {} ); uniqueCache[ type ] = [ dirruns, diff ]; } @@ -1898,6 +2044,7 @@ Expr = Sizzle.selectors = { }, "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive // http://www.w3.org/TR/selectors/#pseudo-classes // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters @@ -1917,15 +2064,15 @@ Expr = Sizzle.selectors = { if ( fn.length > 1 ) { args = [ pseudo, pseudo, "", argument ]; return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { + markFunction( function( seed, matches ) { var idx, matched = fn( seed, argument ), i = matched.length; while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); + idx = indexOf( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); } - }) : + } ) : function( elem ) { return fn( elem, 0, args ); }; @@ -1936,8 +2083,10 @@ Expr = Sizzle.selectors = { }, pseudos: { + // Potentially complex pseudos - "not": markFunction(function( selector ) { + "not": markFunction( function( selector ) { + // Trim the selector passed to compile // to avoid treating leading and trailing // spaces as combinators @@ -1946,39 +2095,40 @@ Expr = Sizzle.selectors = { matcher = compile( selector.replace( rtrim, "$1" ) ); return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { + markFunction( function( seed, matches, _context, xml ) { var elem, unmatched = matcher( seed, null, xml, [] ), i = seed.length; // Match elements unmatched by `matcher` while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); } } - }) : - function( elem, context, xml ) { - input[0] = elem; + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; matcher( input, null, xml, results ); + // Don't keep the element (issue #299) - input[0] = null; + input[ 0 ] = null; return !results.pop(); }; - }), + } ), - "has": markFunction(function( selector ) { + "has": markFunction( function( selector ) { return function( elem ) { return Sizzle( selector, elem ).length > 0; }; - }), + } ), - "contains": markFunction(function( text ) { + "contains": markFunction( function( text ) { text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; }; - }), + } ), // "Whether an element is represented by a :lang() selector // is based solely on the element's language value @@ -1988,25 +2138,26 @@ Expr = Sizzle.selectors = { // The identifier C does not have to be a valid language name." // http://www.w3.org/TR/selectors/#lang-pseudo "lang": markFunction( function( lang ) { + // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { + if ( !ridentifier.test( lang || "" ) ) { Sizzle.error( "unsupported lang: " + lang ); } lang = lang.replace( runescape, funescape ).toLowerCase(); return function( elem ) { var elemLang; do { - if ( (elemLang = documentIsHTML ? + if ( ( elemLang = documentIsHTML ? elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { elemLang = elemLang.toLowerCase(); return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); return false; }; - }), + } ), // Miscellaneous "target": function( elem ) { @@ -2019,7 +2170,9 @@ Expr = Sizzle.selectors = { }, "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + return elem === document.activeElement && + ( !document.hasFocus || document.hasFocus() ) && + !!( elem.type || elem.href || ~elem.tabIndex ); }, // Boolean properties @@ -2027,16 +2180,20 @@ Expr = Sizzle.selectors = { "disabled": createDisabledPseudo( true ), "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + return ( nodeName === "input" && !!elem.checked ) || + ( nodeName === "option" && !!elem.selected ); }, "selected": function( elem ) { + // Accessing this property makes selected-by-default // options in Safari work properly if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions elem.parentNode.selectedIndex; } @@ -2045,6 +2202,7 @@ Expr = Sizzle.selectors = { // Contents "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), // but not by others (comment: 8; processing instruction: 7; etc.) @@ -2058,7 +2216,7 @@ Expr = Sizzle.selectors = { }, "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); + return !Expr.pseudos[ "empty" ]( elem ); }, // Element/input types @@ -2082,39 +2240,40 @@ Expr = Sizzle.selectors = { // Support: IE<8 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); }, // Position-in-collection - "first": createPositionalPseudo(function() { + "first": createPositionalPseudo( function() { return [ 0 ]; - }), + } ), - "last": createPositionalPseudo(function( matchIndexes, length ) { + "last": createPositionalPseudo( function( _matchIndexes, length ) { return [ length - 1 ]; - }), + } ), - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { return [ argument < 0 ? argument + length : argument ]; - }), + } ), - "even": createPositionalPseudo(function( matchIndexes, length ) { + "even": createPositionalPseudo( function( matchIndexes, length ) { var i = 0; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; - }), + } ), - "odd": createPositionalPseudo(function( matchIndexes, length ) { + "odd": createPositionalPseudo( function( matchIndexes, length ) { var i = 1; for ( ; i < length; i += 2 ) { matchIndexes.push( i ); } return matchIndexes; - }), + } ), - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument > length ? @@ -2124,19 +2283,19 @@ Expr = Sizzle.selectors = { matchIndexes.push( i ); } return matchIndexes; - }), + } ), - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { var i = argument < 0 ? argument + length : argument; for ( ; ++i < length; ) { matchIndexes.push( i ); } return matchIndexes; - }) + } ) } }; -Expr.pseudos["nth"] = Expr.pseudos["eq"]; +Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; // Add button/input type pseudos for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { @@ -2167,37 +2326,39 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { while ( soFar ) { // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { if ( match ) { + // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; + soFar = soFar.slice( match[ 0 ].length ) || soFar; } - groups.push( (tokens = []) ); + groups.push( ( tokens = [] ) ); } matched = false; // Combinators - if ( (match = rcombinators.exec( soFar )) ) { + if ( ( match = rcombinators.exec( soFar ) ) ) { matched = match.shift(); - tokens.push({ + tokens.push( { value: matched, + // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); + type: match[ 0 ].replace( rtrim, " " ) + } ); soFar = soFar.slice( matched.length ); } // Filters for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { matched = match.shift(); - tokens.push({ + tokens.push( { value: matched, type: type, matches: match - }); + } ); soFar = soFar.slice( matched.length ); } } @@ -2214,6 +2375,7 @@ tokenize = Sizzle.tokenize = function( selector, parseOnly ) { soFar.length : soFar ? Sizzle.error( selector ) : + // Cache the tokens tokenCache( selector, groups ).slice( 0 ); }; @@ -2223,7 +2385,7 @@ function toSelector( tokens ) { len = tokens.length, selector = ""; for ( ; i < len; i++ ) { - selector += tokens[i].value; + selector += tokens[ i ].value; } return selector; } @@ -2236,9 +2398,10 @@ function addCombinator( matcher, combinator, base ) { doneName = done++; return combinator.first ? + // Check against closest ancestor/preceding element function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { + while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { return matcher( elem, context, xml ); } @@ -2253,7 +2416,7 @@ function addCombinator( matcher, combinator, base ) { // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching if ( xml ) { - while ( (elem = elem[ dir ]) ) { + while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { if ( matcher( elem, context, xml ) ) { return true; @@ -2261,27 +2424,29 @@ function addCombinator( matcher, combinator, base ) { } } } else { - while ( (elem = elem[ dir ]) ) { + while ( ( elem = elem[ dir ] ) ) { if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); // Support: IE <9 only // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + uniqueCache = outerCache[ elem.uniqueID ] || + ( outerCache[ elem.uniqueID ] = {} ); if ( skip && skip === elem.nodeName.toLowerCase() ) { elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && + } else if ( ( oldCache = uniqueCache[ key ] ) && oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); + return ( newCache[ 2 ] = oldCache[ 2 ] ); } else { + // Reuse newcache so results back-propagate to previous elements uniqueCache[ key ] = newCache; // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { return true; } } @@ -2297,20 +2462,20 @@ function elementMatcher( matchers ) { function( elem, context, xml ) { var i = matchers.length; while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { + if ( !matchers[ i ]( elem, context, xml ) ) { return false; } } return true; } : - matchers[0]; + matchers[ 0 ]; } function multipleContexts( selector, contexts, results ) { var i = 0, len = contexts.length; for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); + Sizzle( selector, contexts[ i ], results ); } return results; } @@ -2323,7 +2488,7 @@ function condense( unmatched, map, filter, context, xml ) { mapped = map != null; for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { + if ( ( elem = unmatched[ i ] ) ) { if ( !filter || filter( elem, context, xml ) ) { newUnmatched.push( elem ); if ( mapped ) { @@ -2343,14 +2508,18 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS if ( postFinder && !postFinder[ expando ] ) { postFinder = setMatcher( postFinder, postSelector ); } - return markFunction(function( seed, results, context, xml ) { + return markFunction( function( seed, results, context, xml ) { var temp, i, elem, preMap = [], postMap = [], preexisting = results.length, // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + elems = seed || multipleContexts( + selector || "*", + context.nodeType ? [ context ] : context, + [] + ), // Prefilter to get matcher input, preserving a map for seed-results synchronization matcherIn = preFilter && ( seed || !selector ) ? @@ -2358,6 +2527,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS elems, matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, postFinder || ( seed ? preFilter : preexisting || postFilter ) ? @@ -2381,8 +2551,8 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS // Un-match failing elements by moving them back to matcherIn i = temp.length; while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); } } } @@ -2390,25 +2560,27 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS if ( seed ) { if ( postFinder || preFilter ) { if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts temp = []; i = matcherOut.length; while ( i-- ) { - if ( (elem = matcherOut[i]) ) { + if ( ( elem = matcherOut[ i ] ) ) { + // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); + temp.push( ( matcherIn[ i ] = elem ) ); } } - postFinder( null, (matcherOut = []), temp, xml ); + postFinder( null, ( matcherOut = [] ), temp, xml ); } // Move matched elements from seed to results to keep them synchronized i = matcherOut.length; while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - seed[temp] = !(results[temp] = elem); + seed[ temp ] = !( results[ temp ] = elem ); } } } @@ -2426,14 +2598,14 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS push.apply( results, matcherOut ); } } - }); + } ); } function matcherFromTokens( tokens ) { var checkContext, matcher, j, len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], i = leadingRelative ? 1 : 0, // The foundational matcher ensures that elements are reachable from top-level context(s) @@ -2445,38 +2617,43 @@ function matcherFromTokens( tokens ) { }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? + ( checkContext = context ).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) checkContext = null; return ret; } ]; for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); // Return special upon seeing a positional matcher if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling j = ++i; for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { + if ( Expr.relative[ tokens[ j ].type ] ) { break; } } return setMatcher( i > 1 && elementMatcher( matchers ), i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens + .slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) ).replace( rtrim, "$1" ), matcher, i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), j < len && toSelector( tokens ) ); } @@ -2497,28 +2674,40 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { unmatched = seed && [], setMatched = [], contextBackup = outermostContext, + // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), len = elems.length; if ( outermost ) { - outermostContext = context === document || context || outermost; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; } // Add elements passing elementMatchers directly to results // Support: IE<9, Safari // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { if ( byElement && elem ) { j = 0; - if ( !context && elem.ownerDocument !== document ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { setDocument( elem ); xml = !documentIsHTML; } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { results.push( elem ); break; } @@ -2530,8 +2719,9 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { // Track unmatched elements for set filters if ( bySet ) { + // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { + if ( ( elem = !matcher && elem ) ) { matchedCount--; } @@ -2555,16 +2745,17 @@ function matcherFromGroupMatchers( elementMatchers, setMatchers ) { // numerically zero. if ( bySet && i !== matchedCount ) { j = 0; - while ( (matcher = setMatchers[j++]) ) { + while ( ( matcher = setMatchers[ j++ ] ) ) { matcher( unmatched, setMatched, context, xml ); } if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting if ( matchedCount > 0 ) { while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); } } } @@ -2605,13 +2796,14 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { cached = compilerCache[ selector + " " ]; if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element if ( !match ) { match = tokenize( selector ); } i = match.length; while ( i-- ) { - cached = matcherFromTokens( match[i] ); + cached = matcherFromTokens( match[ i ] ); if ( cached[ expando ] ) { setMatchers.push( cached ); } else { @@ -2620,7 +2812,10 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { } // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + cached = compilerCache( + selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) + ); // Save selector and tokenization cached.selector = selector; @@ -2640,7 +2835,7 @@ compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { select = Sizzle.select = function( selector, context, results, seed ) { var i, tokens, token, type, find, compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); results = results || []; @@ -2649,11 +2844,12 @@ select = Sizzle.select = function( selector, context, results, seed ) { if ( match.length === 1 ) { // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + context = ( Expr.find[ "ID" ]( token.matches[ 0 ] + .replace( runescape, funescape ), context ) || [] )[ 0 ]; if ( !context ) { return results; @@ -2666,20 +2862,22 @@ select = Sizzle.select = function( selector, context, results, seed ) { } // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; while ( i-- ) { - token = tokens[i]; + token = tokens[ i ]; // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { + if ( Expr.relative[ ( type = token.type ) ] ) { break; } - if ( (find = Expr.find[ type ]) ) { + if ( ( find = Expr.find[ type ] ) ) { + // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || + context + ) ) ) { // If seed is empty or no tokens remain, we can return early tokens.splice( i, 1 ); @@ -2710,7 +2908,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { // One-time assignments // Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; // Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function @@ -2721,58 +2919,59 @@ setDocument(); // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) // Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { +support.sortDetached = assert( function( el ) { + // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); // Support: IE<8 // Prevent attribute/property "interpolation" // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { +if ( !assert( function( el ) { el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { + return el.firstChild.getAttribute( "href" ) === "#"; +} ) ) { addHandle( "type|href|height|width", function( elem, name, isXML ) { if ( !isXML ) { return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); } - }); + } ); } // Support: IE<9 // Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { +if ( !support.attributes || !assert( function( el ) { el.innerHTML = ""; el.firstChild.setAttribute( "value", "" ); return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { +} ) ) { + addHandle( "value", function( elem, _name, isXML ) { if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { return elem.defaultValue; } - }); + } ); } // Support: IE<9 // Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { +if ( !assert( function( el ) { + return el.getAttribute( "disabled" ) == null; +} ) ) { addHandle( booleans, function( elem, name, isXML ) { var val; if ( !isXML ) { return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? + ( val = elem.getAttributeNode( name ) ) && val.specified ? val.value : - null; + null; } - }); + } ); } return Sizzle; -})( window ); +} )( window ); @@ -3141,7 +3340,7 @@ jQuery.each( { parents: function( elem ) { return dir( elem, "parentNode" ); }, - parentsUntil: function( elem, i, until ) { + parentsUntil: function( elem, _i, until ) { return dir( elem, "parentNode", until ); }, next: function( elem ) { @@ -3156,10 +3355,10 @@ jQuery.each( { prevAll: function( elem ) { return dir( elem, "previousSibling" ); }, - nextUntil: function( elem, i, until ) { + nextUntil: function( elem, _i, until ) { return dir( elem, "nextSibling", until ); }, - prevUntil: function( elem, i, until ) { + prevUntil: function( elem, _i, until ) { return dir( elem, "previousSibling", until ); }, siblings: function( elem ) { @@ -3169,7 +3368,13 @@ jQuery.each( { return siblings( elem.firstChild ); }, contents: function( elem ) { - if ( typeof elem.contentDocument !== "undefined" ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + return elem.contentDocument; } @@ -3512,7 +3717,7 @@ jQuery.extend( { var fns = arguments; return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { + jQuery.each( tuples, function( _i, tuple ) { // Map tuples (progress, done, fail) to arguments (done, fail, progress) var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; @@ -3965,7 +4170,7 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { // ...except when executing function values } else { bulk = fn; - fn = function( elem, key, value ) { + fn = function( elem, _key, value ) { return bulk.call( jQuery( elem ), value ); }; } @@ -4000,7 +4205,7 @@ var rmsPrefix = /^-ms-/, rdashAlpha = /-([a-z])/g; // Used by camelCase as callback to replace() -function fcamelCase( all, letter ) { +function fcamelCase( _all, letter ) { return letter.toUpperCase(); } @@ -4528,27 +4733,6 @@ var isHiddenWithinTree = function( elem, el ) { jQuery.css( elem, "display" ) === "none"; }; -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - function adjustCSS( elem, prop, valueParts, tween ) { @@ -4719,11 +4903,40 @@ var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); -// We have to close these tags to support XHTML (#13200) -var wrapMap = { +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; // Support: IE <=9 only - option: [ 1, "" ], + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { // XHTML parsers do not magically insert elements in the // same way that tag soup parsers do. So we cannot shorten @@ -4736,12 +4949,14 @@ var wrapMap = { _default: [ 0, "", "" ] }; -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + function getAll( context, tag ) { @@ -4874,32 +5089,6 @@ function buildFragment( elems, context, scripts, selection, ignored ) { } -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); - - var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, @@ -5008,8 +5197,8 @@ jQuery.event = { special, handlers, type, namespaces, origType, elemData = dataPriv.get( elem ); - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { return; } @@ -5033,7 +5222,7 @@ jQuery.event = { // Init the element's event structure and main handler, if this is the first if ( !( events = elemData.events ) ) { - events = elemData.events = {}; + events = elemData.events = Object.create( null ); } if ( !( eventHandle = elemData.handle ) ) { eventHandle = elemData.handle = function( e ) { @@ -5191,12 +5380,15 @@ jQuery.event = { dispatch: function( nativeEvent ) { - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - var i, j, ret, matched, handleObj, handlerQueue, args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event @@ -5771,13 +5963,6 @@ jQuery.fn.extend( { var - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - // Support: IE <=10 - 11, Edge 12 - 13 only // In IE/Edge using regex groups here causes severe slowdowns. // See https://connect.microsoft.com/IE/feedback/details/1736512/ @@ -5814,7 +5999,7 @@ function restoreScript( elem ) { } function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + var i, l, type, pdataOld, udataOld, udataCur, events; if ( dest.nodeType !== 1 ) { return; @@ -5822,13 +6007,11 @@ function cloneCopyEvent( src, dest ) { // 1. Copy private data: events, handlers, etc. if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); + pdataOld = dataPriv.get( src ); events = pdataOld.events; if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; + dataPriv.remove( dest, "handle events" ); for ( type in events ) { for ( i = 0, l = events[ type ].length; i < l; i++ ) { @@ -5864,7 +6047,7 @@ function fixInput( src, dest ) { function domManip( collection, args, callback, ignored ) { // Flatten any nested arrays - args = concat.apply( [], args ); + args = flat( args ); var fragment, first, scripts, hasScripts, node, doc, i = 0, @@ -5939,7 +6122,7 @@ function domManip( collection, args, callback, ignored ) { if ( jQuery._evalUrl && !node.noModule ) { jQuery._evalUrl( node.src, { nonce: node.nonce || node.getAttribute( "nonce" ) - } ); + }, doc ); } } else { DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); @@ -5976,7 +6159,7 @@ function remove( elem, selector, keepData ) { jQuery.extend( { htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); + return html; }, clone: function( elem, dataAndEvents, deepDataAndEvents ) { @@ -6238,6 +6421,27 @@ var getStyles = function( elem ) { return view.getComputedStyle( elem ); }; +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); @@ -6295,7 +6499,7 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); } var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableMarginLeftVal, + reliableTrDimensionsVal, reliableMarginLeftVal, container = document.createElement( "div" ), div = document.createElement( "div" ); @@ -6330,6 +6534,35 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); scrollboxSize: function() { computeStyleTests(); return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px"; + tr.style.height = "1px"; + trChild.style.height = "9px"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; } } ); } )(); @@ -6454,7 +6687,7 @@ var fontWeight: "400" }; -function setPositiveNumber( elem, value, subtract ) { +function setPositiveNumber( _elem, value, subtract ) { // Any relative (+/-) values have already been // normalized at this point @@ -6559,17 +6792,26 @@ function getWidthOrHeight( elem, dimension, extra ) { } - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - // Support: IE 9-11 only - // Also use offsetWidth/offsetHeight for when box sizing is unreliable - // We use getClientRects() to check for hidden/disconnected. - // In those cases, the computed value can be trusted to be border-box + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected elem.getClientRects().length ) { isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; @@ -6764,7 +7006,7 @@ jQuery.extend( { } } ); -jQuery.each( [ "height", "width" ], function( i, dimension ) { +jQuery.each( [ "height", "width" ], function( _i, dimension ) { jQuery.cssHooks[ dimension ] = { get: function( elem, computed, extra ) { if ( computed ) { @@ -7537,7 +7779,7 @@ jQuery.fn.extend( { clearQueue = type; type = undefined; } - if ( clearQueue && type !== false ) { + if ( clearQueue ) { this.queue( type || "fx", [] ); } @@ -7620,7 +7862,7 @@ jQuery.fn.extend( { } } ); -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { var cssFn = jQuery.fn[ name ]; jQuery.fn[ name ] = function( speed, easing, callback ) { return speed == null || typeof speed === "boolean" ? @@ -7841,7 +8083,7 @@ boolHook = { } }; -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { var getter = attrHandle[ name ] || jQuery.find.attr; attrHandle[ name ] = function( elem, name, isXML ) { @@ -8465,7 +8707,9 @@ jQuery.extend( jQuery.event, { special.bindType || type; // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + handle = ( + dataPriv.get( cur, "events" ) || Object.create( null ) + )[ event.type ] && dataPriv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); @@ -8576,7 +8820,10 @@ if ( !support.focusin ) { jQuery.event.special[ fix ] = { setup: function() { - var doc = this.ownerDocument || this, + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ); if ( !attaches ) { @@ -8585,7 +8832,7 @@ if ( !support.focusin ) { dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { - var doc = this.ownerDocument || this, + var doc = this.ownerDocument || this.document || this, attaches = dataPriv.access( doc, fix ) - 1; if ( !attaches ) { @@ -8601,7 +8848,7 @@ if ( !support.focusin ) { } var location = window.location; -var nonce = Date.now(); +var nonce = { guid: Date.now() }; var rquery = ( /\?/ ); @@ -8733,7 +8980,7 @@ jQuery.fn.extend( { rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && ( this.checked || !rcheckableType.test( type ) ); } ) - .map( function( i, elem ) { + .map( function( _i, elem ) { var val = jQuery( this ).val(); if ( val == null ) { @@ -9346,7 +9593,8 @@ jQuery.extend( { // Add or update anti-cache param if needed if ( s.cache === false ) { cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; } // Put hash and anti-cache on the URL that will be requested (gh-1732) @@ -9479,6 +9727,11 @@ jQuery.extend( { response = ajaxHandleResponses( s, jqXHR, responses ); } + // Use a noop converter for missing script + if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { + s.converters[ "text script" ] = function() {}; + } + // Convert no matter what (that way responseXXX fields are always set) response = ajaxConvert( s, response, jqXHR, isSuccess ); @@ -9569,7 +9822,7 @@ jQuery.extend( { } } ); -jQuery.each( [ "get", "post" ], function( i, method ) { +jQuery.each( [ "get", "post" ], function( _i, method ) { jQuery[ method ] = function( url, data, callback, type ) { // Shift arguments if data argument was omitted @@ -9590,8 +9843,17 @@ jQuery.each( [ "get", "post" ], function( i, method ) { }; } ); +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + -jQuery._evalUrl = function( url, options ) { +jQuery._evalUrl = function( url, options, doc ) { return jQuery.ajax( { url: url, @@ -9609,7 +9871,7 @@ jQuery._evalUrl = function( url, options ) { "text script": function() {} }, dataFilter: function( response ) { - jQuery.globalEval( response, options ); + jQuery.globalEval( response, options, doc ); } } ); }; @@ -9931,7 +10193,7 @@ var oldCallbacks = [], jQuery.ajaxSetup( { jsonp: "callback", jsonpCallback: function() { - var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce.guid++ ) ); this[ callback ] = true; return callback; } @@ -10148,23 +10410,6 @@ jQuery.fn.load = function( url, params, callback ) { -// Attach a bunch of functions for handling common AJAX events -jQuery.each( [ - "ajaxStart", - "ajaxStop", - "ajaxComplete", - "ajaxError", - "ajaxSuccess", - "ajaxSend" -], function( i, type ) { - jQuery.fn[ type ] = function( fn ) { - return this.on( type, fn ); - }; -} ); - - - - jQuery.expr.pseudos.animated = function( elem ) { return jQuery.grep( jQuery.timers, function( fn ) { return elem === fn.elem; @@ -10221,6 +10466,12 @@ jQuery.offset = { options.using.call( elem, props ); } else { + if ( typeof props.top === "number" ) { + props.top += "px"; + } + if ( typeof props.left === "number" ) { + props.left += "px"; + } curElem.css( props ); } } @@ -10371,7 +10622,7 @@ jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 // getComputedStyle returns percent when specified for top/left/bottom/right; // rather than make the css module depend on the offset module, just check for it here -jQuery.each( [ "top", "left" ], function( i, prop ) { +jQuery.each( [ "top", "left" ], function( _i, prop ) { jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, function( elem, computed ) { if ( computed ) { @@ -10434,25 +10685,19 @@ jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { } ); -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); +jQuery.each( [ + "ajaxStart", + "ajaxStop", + "ajaxComplete", + "ajaxError", + "ajaxSuccess", + "ajaxSend" +], function( _i, type ) { + jQuery.fn[ type ] = function( fn ) { + return this.on( type, fn ); }; } ); -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - @@ -10474,9 +10719,33 @@ jQuery.fn.extend( { return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); } } ); +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( _i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + } ); + + + + +// Support: Android <=4.0 only +// Make sure we trim BOM and NBSP +var rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; + // Bind a function to a context, optionally partially applying any // arguments. // jQuery.proxy is deprecated to promote standards (specifically Function#bind) @@ -10539,6 +10808,11 @@ jQuery.isNumeric = function( obj ) { !isNaN( obj - parseFloat( obj ) ); }; +jQuery.trim = function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); +}; @@ -10587,7 +10861,7 @@ jQuery.noConflict = function( deep ) { // Expose jQuery and $ identifiers, even in AMD // (#7102#comment:10, https://github.com/jquery/jquery/pull/557) // and CommonJS for browser emulators (#13566) -if ( !noGlobal ) { +if ( typeof noGlobal === "undefined" ) { window.jQuery = window.$ = jQuery; } @@ -10595,4 +10869,4 @@ if ( !noGlobal ) { return jQuery; -} ); \ No newline at end of file +} ); diff --git a/docs/jquery/jquery-3.6.1.min.js b/docs/jquery/jquery-3.6.1.min.js new file mode 100644 index 0000000..2c69bc9 --- /dev/null +++ b/docs/jquery/jquery-3.6.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,y=n.hasOwnProperty,a=y.toString,l=a.call(Object),v={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&v(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!y||!y.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ve(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ye(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ve(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],y=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&y.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||y.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||y.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||y.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||y.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||y.push(".#.+[+~]"),e.querySelectorAll("\\\f"),y.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&y.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&y.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&y.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),y.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),y=y.length&&new RegExp(y.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),v=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&v(p,e)?-1:t==C||t.ownerDocument==p&&v(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!y||!y.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),v.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",v.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",v.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ye(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ve(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),v.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(v.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return B(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=_e(v.pixelPosition,function(e,t){if(t)return t=Be(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return B(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=x(e||this.defaultElement||this)[0],this.element=x(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=x(),this.hoverable=x(),this.focusable=x(),this.classesElementLookup={},e!==this&&(x.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=x(e.style?e.ownerDocument:e.document||e),this.window=x(this.document[0].defaultView||this.document[0].parentWindow)),this.options=x.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:x.noop,_create:x.noop,_init:x.noop,destroy:function(){var i=this;this._destroy(),x.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:x.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return x.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=x.widget.extend({},this.options[t]),n=0;n
    "),i=e.children()[0];return x("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthC(E(s),E(n))?o.important="horizontal":o.important="vertical",c.using.call(this,t,o)}),l.offset(x.extend(u,{using:t}))})},x.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,l=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.lastMousePosition={x:null,y:null},this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault(),this._activateItem(t)},"click .ui-menu-item":function(t){var e=x(t.target),i=x(x.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&e.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),e.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&i.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":"_activateItem","mousemove .ui-menu-item":"_activateItem",mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this._menuItems().first();e||this.focus(t,i)},blur:function(t){this._delay(function(){x.contains(this.element[0],x.ui.safeActiveElement(this.document[0]))||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t,!0),this.mouseHandled=!1}})},_activateItem:function(t){var e,i;this.previousFilter||t.clientX===this.lastMousePosition.x&&t.clientY===this.lastMousePosition.y||(this.lastMousePosition={x:t.clientX,y:t.clientY},e=x(t.target).closest(".ui-menu-item"),i=x(t.currentTarget),e[0]===i[0]&&(i.is(".ui-state-active")||(this._removeClass(i.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(t,i))))},_destroy:function(){var t=this.element.find(".ui-menu-item").removeAttr("role aria-disabled").children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),t.children().each(function(){var t=x(this);t.data("ui-menu-submenu-caret")&&t.remove()})},_keydown:function(t){var e,i,s,n=!0;switch(t.keyCode){case x.ui.keyCode.PAGE_UP:this.previousPage(t);break;case x.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case x.ui.keyCode.HOME:this._move("first","first",t);break;case x.ui.keyCode.END:this._move("last","last",t);break;case x.ui.keyCode.UP:this.previous(t);break;case x.ui.keyCode.DOWN:this.next(t);break;case x.ui.keyCode.LEFT:this.collapse(t);break;case x.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case x.ui.keyCode.ENTER:case x.ui.keyCode.SPACE:this._activate(t);break;case x.ui.keyCode.ESCAPE:this.collapse(t);break;default:e=this.previousFilter||"",s=n=!1,i=96<=t.keyCode&&t.keyCode<=105?(t.keyCode-96).toString():String.fromCharCode(t.keyCode),clearTimeout(this.filterTimer),i===e?s=!0:i=e+i,e=this._filterMenuItems(i),(e=s&&-1!==e.index(this.active.next())?this.active.nextAll(".ui-menu-item"):e).length||(i=String.fromCharCode(t.keyCode),e=this._filterMenuItems(i)),e.length?(this.focus(t,e),this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}n&&t.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var t,e,s=this,n=this.options.icons.submenu,i=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),e=i.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=x(this),e=t.prev(),i=x("").data("ui-menu-submenu-caret",!0);s._addClass(i,"ui-menu-icon","ui-icon "+n),e.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",e.attr("id"))}),this._addClass(e,"ui-menu","ui-widget ui-widget-content ui-front"),(t=i.add(this.element).find(this.options.items)).not(".ui-menu-item").each(function(){var t=x(this);s._isDivider(t)&&s._addClass(t,"ui-menu-divider","ui-widget-content")}),i=(e=t.not(".ui-menu-item, .ui-menu-divider")).children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(e,"ui-menu-item")._addClass(i,"ui-menu-item-wrapper"),t.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!x.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){var i;"icons"===t&&(i=this.element.find(".ui-menu-icon"),this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)),this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",String(t)),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),i=this.active.children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",i.attr("id")),i=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(i,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),(i=e.children(".ui-menu")).length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(t){var e,i,s;this._hasScroll()&&(i=parseFloat(x.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(x.css(this.activeMenu[0],"paddingTop"))||0,e=t.offset().top-this.activeMenu.offset().top-i-s,i=this.activeMenu.scrollTop(),s=this.activeMenu.height(),t=t.outerHeight(),e<0?this.activeMenu.scrollTop(i+e):s",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,liveRegionTimer:null,_create:function(){var i,s,n,t=this.element[0].nodeName.toLowerCase(),e="textarea"===t,t="input"===t;this.isMultiLine=e||!t&&this._isContentEditable(this.element),this.valueMethod=this.element[e||t?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(t){if(this.element.prop("readOnly"))s=n=i=!0;else{s=n=i=!1;var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:i=!0,this._move("previousPage",t);break;case e.PAGE_DOWN:i=!0,this._move("nextPage",t);break;case e.UP:i=!0,this._keyEvent("previous",t);break;case e.DOWN:i=!0,this._keyEvent("next",t);break;case e.ENTER:this.menu.active&&(i=!0,t.preventDefault(),this.menu.select(t));break;case e.TAB:this.menu.active&&this.menu.select(t);break;case e.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(t),t.preventDefault());break;default:s=!0,this._searchTimeout(t)}}},keypress:function(t){if(i)return i=!1,void(this.isMultiLine&&!this.menu.element.is(":visible")||t.preventDefault());if(!s){var e=x.ui.keyCode;switch(t.keyCode){case e.PAGE_UP:this._move("previousPage",t);break;case e.PAGE_DOWN:this._move("nextPage",t);break;case e.UP:this._keyEvent("previous",t);break;case e.DOWN:this._keyEvent("next",t)}}},input:function(t){if(n)return n=!1,void t.preventDefault();this._searchTimeout(t)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){clearTimeout(this.searching),this.close(t),this._change(t)}}),this._initSource(),this.menu=x("
      ").appendTo(this._appendTo()).menu({role:null}).hide().attr({unselectable:"on"}).menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault()},menufocus:function(t,e){var i,s;if(this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type)))return this.menu.blur(),void this.document.one("mousemove",function(){x(t.target).trigger(t.originalEvent)});s=e.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:s})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(s.value),(i=e.item.attr("aria-label")||s.value)&&String.prototype.trim.call(i).length&&(clearTimeout(this.liveRegionTimer),this.liveRegionTimer=this._delay(function(){this.liveRegion.html(x("
      ").text(i))},100))},menuselect:function(t,e){var i=e.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==x.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",t,{item:i})&&this._value(i.value),this.term=this._value(),this.close(t),this.selectedItem=i}}),this.liveRegion=x("
      ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(t){var e=this.menu.element[0];return t.target===this.element[0]||t.target===e||x.contains(e,t.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var t=this.options.appendTo;return t=!(t=!(t=t&&(t.jquery||t.nodeType?x(t):this.document.find(t).eq(0)))||!t[0]?this.element.closest(".ui-front, dialog"):t).length?this.document[0].body:t},_initSource:function(){var i,s,n=this;Array.isArray(this.options.source)?(i=this.options.source,this.source=function(t,e){e(x.ui.autocomplete.filter(i,t.term))}):"string"==typeof this.options.source?(s=this.options.source,this.source=function(t,e){n.xhr&&n.xhr.abort(),n.xhr=x.ajax({url:s,data:t,dataType:"json",success:function(t){e(t)},error:function(){e([])}})}):this.source=this.options.source},_searchTimeout:function(s){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),e=this.menu.element.is(":visible"),i=s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;t&&(e||i)||(this.selectedItem=null,this.search(null,s))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(x("
      ").text(e.label)).appendTo(t)},_move:function(t,e){if(this.menu.element.is(":visible"))return this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),void this.menu.blur()):void this.menu[t](e);this.search(null,e)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){this.isMultiLine&&!this.menu.element.is(":visible")||(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),x.extend(x.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,e){var i=new RegExp(x.ui.autocomplete.escapeRegex(e),"i");return x.grep(t,function(t){return i.test(t.label||t.value||t)})}}),x.widget("ui.autocomplete",x.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(1").text(e))},100))}});x.ui.autocomplete}); \ No newline at end of file diff --git a/docs/script-dir/jszip-utils/dist/jszip-utils-ie.js b/docs/jquery/jszip-utils/dist/jszip-utils-ie.js similarity index 100% rename from docs/script-dir/jszip-utils/dist/jszip-utils-ie.js rename to docs/jquery/jszip-utils/dist/jszip-utils-ie.js diff --git a/docs/script-dir/jszip-utils/dist/jszip-utils-ie.min.js b/docs/jquery/jszip-utils/dist/jszip-utils-ie.min.js similarity index 100% rename from docs/script-dir/jszip-utils/dist/jszip-utils-ie.min.js rename to docs/jquery/jszip-utils/dist/jszip-utils-ie.min.js diff --git a/docs/script-dir/jszip-utils/dist/jszip-utils.js b/docs/jquery/jszip-utils/dist/jszip-utils.js similarity index 100% rename from docs/script-dir/jszip-utils/dist/jszip-utils.js rename to docs/jquery/jszip-utils/dist/jszip-utils.js diff --git a/docs/script-dir/jszip-utils/dist/jszip-utils.min.js b/docs/jquery/jszip-utils/dist/jszip-utils.min.js similarity index 100% rename from docs/script-dir/jszip-utils/dist/jszip-utils.min.js rename to docs/jquery/jszip-utils/dist/jszip-utils.min.js diff --git a/docs/script-dir/jszip/dist/jszip.js b/docs/jquery/jszip/dist/jszip.js similarity index 95% rename from docs/script-dir/jszip/dist/jszip.js rename to docs/jquery/jszip/dist/jszip.js index f44b705..9f0ffc1 100644 --- a/docs/script-dir/jszip/dist/jszip.js +++ b/docs/jquery/jszip/dist/jszip.js @@ -1,6 +1,6 @@ /*! -JSZip v3.1.5 - A JavaScript class for generating and reading zip files +JSZip v3.7.1 - A JavaScript class for generating and reading zip files (c) 2009-2016 Stuart Knightley @@ -123,7 +123,6 @@ exports.decode = function(input) { var external = require("./external"); var DataWorker = require('./stream/DataWorker'); -var DataLengthProbe = require('./stream/DataLengthProbe'); var Crc32Probe = require('./stream/Crc32Probe'); var DataLengthProbe = require('./stream/DataLengthProbe'); @@ -149,14 +148,14 @@ CompressedObject.prototype = { * Create a worker to get the uncompressed content. * @return {GenericWorker} the worker. */ - getContentWorker : function () { + getContentWorker: function () { var worker = new DataWorker(external.Promise.resolve(this.compressedContent)) - .pipe(this.compression.uncompressWorker()) - .pipe(new DataLengthProbe("data_length")); + .pipe(this.compression.uncompressWorker()) + .pipe(new DataLengthProbe("data_length")); var that = this; worker.on("end", function () { - if(this.streamInfo['data_length'] !== that.uncompressedSize) { + if (this.streamInfo['data_length'] !== that.uncompressedSize) { throw new Error("Bug : uncompressed data size mismatch"); } }); @@ -166,19 +165,19 @@ CompressedObject.prototype = { * Create a worker to get the compressed content. * @return {GenericWorker} the worker. */ - getCompressedWorker : function () { + getCompressedWorker: function () { return new DataWorker(external.Promise.resolve(this.compressedContent)) - .withStreamInfo("compressedSize", this.compressedSize) - .withStreamInfo("uncompressedSize", this.uncompressedSize) - .withStreamInfo("crc32", this.crc32) - .withStreamInfo("compression", this.compression) - ; + .withStreamInfo("compressedSize", this.compressedSize) + .withStreamInfo("uncompressedSize", this.uncompressedSize) + .withStreamInfo("crc32", this.crc32) + .withStreamInfo("compression", this.compression) + ; } }; /** * Chain the given worker with other workers to compress the content with the - * given compresion. + * given compression. * @param {GenericWorker} uncompressedWorker the worker to pipe. * @param {Object} compression the compression object. * @param {Object} compressionOptions the options to use when compressing. @@ -186,11 +185,11 @@ CompressedObject.prototype = { */ CompressedObject.createWorkerFrom = function (uncompressedWorker, compression, compressionOptions) { return uncompressedWorker - .pipe(new Crc32Probe()) - .pipe(new DataLengthProbe("uncompressedSize")) - .pipe(compression.compressWorker(compressionOptions)) - .pipe(new DataLengthProbe("compressedSize")) - .withStreamInfo("compression", compression); + .pipe(new Crc32Probe()) + .pipe(new DataLengthProbe("uncompressedSize")) + .pipe(compression.compressWorker(compressionOptions)) + .pipe(new DataLengthProbe("compressedSize")) + .withStreamInfo("compression", compression); }; module.exports = CompressedObject; @@ -324,7 +323,7 @@ module.exports = { Promise: ES6Promise }; -},{"lie":58}],7:[function(require,module,exports){ +},{"lie":37}],7:[function(require,module,exports){ 'use strict'; var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined'); @@ -411,7 +410,7 @@ exports.uncompressWorker = function () { return new FlateWorker("Inflate", {}); }; -},{"./stream/GenericWorker":28,"./utils":32,"pako":59}],8:[function(require,module,exports){ +},{"./stream/GenericWorker":28,"./utils":32,"pako":38}],8:[function(require,module,exports){ 'use strict'; var utils = require('../utils'); @@ -484,7 +483,7 @@ var generateDosExternalFileAttr = function (dosPermissions, isDir) { /** * Generate the various parts used in the construction of the final zip file. - * @param {Object} streamInfo the hash with informations about the compressed file. + * @param {Object} streamInfo the hash with information about the compressed file. * @param {Boolean} streamedContent is the content streamed ? * @param {Boolean} streamingEnded is the stream finished ? * @param {number} offset the current offset from the start of the zip file. @@ -707,7 +706,7 @@ var generateCentralDirectoryEnd = function (entriesCount, centralDirLength, loca /** * Generate data descriptors for a file entry. - * @param {Object} streamInfo the hash generated by a worker, containing informations + * @param {Object} streamInfo the hash generated by a worker, containing information * on the file entry. * @return {String} the data descriptors. */ @@ -759,7 +758,7 @@ function ZipFileWorker(streamFiles, comment, platform, encodeFileName) { // The total number of entries in this zip file. this.entriesCount = 0; // the name of the file currently being added, null when handling the end of the zip file. - // Used for the emited metadata. + // Used for the emitted metadata. this.currentFile = null; @@ -1034,7 +1033,10 @@ function JSZip() { // "folder/" : {...}, // "folder/data.txt" : {...} // } - this.files = {}; + // NOTE: we use a null prototype because we do not + // want filenames like "toString" coming from a zip file + // to overwrite methods and attributes in a normal Object. + this.files = Object.create(null); this.comment = null; @@ -1057,7 +1059,7 @@ JSZip.defaults = require('./defaults'); // TODO find a better way to handle this version, // a require('package.json').version doesn't work with webpack, see #327 -JSZip.version = "3.1.5"; +JSZip.version = "3.7.1"; JSZip.loadAsync = function (content, options) { return new JSZip().loadAsync(content, options); @@ -1071,7 +1073,6 @@ module.exports = JSZip; var utils = require('./utils'); var external = require("./external"); var utf8 = require('./utf8'); -var utils = require('./utils'); var ZipEntries = require('./zipEntries'); var Crc32Probe = require('./stream/Crc32Probe'); var nodejsUtils = require("./nodejsUtils"); @@ -1087,18 +1088,18 @@ function checkEntryCRC32(zipEntry) { worker.on("error", function (e) { reject(e); }) - .on("end", function () { - if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) { - reject(new Error("Corrupted zip : CRC32 mismatch")); - } else { - resolve(); - } - }) - .resume(); + .on("end", function () { + if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) { + reject(new Error("Corrupted zip : CRC32 mismatch")); + } else { + resolve(); + } + }) + .resume(); }); } -module.exports = function(data, options) { +module.exports = function (data, options) { var zip = this; options = utils.extend(options || {}, { base64: false, @@ -1113,41 +1114,41 @@ module.exports = function(data, options) { } return utils.prepareContent("the loaded zip file", data, true, options.optimizedBinaryString, options.base64) - .then(function(data) { - var zipEntries = new ZipEntries(options); - zipEntries.load(data); - return zipEntries; - }).then(function checkCRC32(zipEntries) { - var promises = [external.Promise.resolve(zipEntries)]; - var files = zipEntries.files; - if (options.checkCRC32) { + .then(function (data) { + var zipEntries = new ZipEntries(options); + zipEntries.load(data); + return zipEntries; + }).then(function checkCRC32(zipEntries) { + var promises = [external.Promise.resolve(zipEntries)]; + var files = zipEntries.files; + if (options.checkCRC32) { + for (var i = 0; i < files.length; i++) { + promises.push(checkEntryCRC32(files[i])); + } + } + return external.Promise.all(promises); + }).then(function addFiles(results) { + var zipEntries = results.shift(); + var files = zipEntries.files; for (var i = 0; i < files.length; i++) { - promises.push(checkEntryCRC32(files[i])); + var input = files[i]; + zip.file(input.fileNameStr, input.decompressed, { + binary: true, + optimizedBinaryString: true, + date: input.date, + dir: input.dir, + comment: input.fileCommentStr.length ? input.fileCommentStr : null, + unixPermissions: input.unixPermissions, + dosPermissions: input.dosPermissions, + createFolders: options.createFolders + }); + } + if (zipEntries.zipComment.length) { + zip.comment = zipEntries.zipComment; } - } - return external.Promise.all(promises); - }).then(function addFiles(results) { - var zipEntries = results.shift(); - var files = zipEntries.files; - for (var i = 0; i < files.length; i++) { - var input = files[i]; - zip.file(input.fileNameStr, input.decompressed, { - binary: true, - optimizedBinaryString: true, - date: input.date, - dir: input.dir, - comment : input.fileCommentStr.length ? input.fileCommentStr : null, - unixPermissions : input.unixPermissions, - dosPermissions : input.dosPermissions, - createFolders: options.createFolders - }); - } - if (zipEntries.zipComment.length) { - zip.comment = zipEntries.zipComment; - } - return zip; - }); + return zip; + }); }; },{"./external":6,"./nodejsUtils":14,"./stream/Crc32Probe":25,"./utf8":31,"./utils":32,"./zipEntries":33}],12:[function(require,module,exports){ @@ -1287,13 +1288,16 @@ module.exports = { * @return {Buffer} a new Buffer. */ newBufferFrom: function(data, encoding) { - // XXX We can't use `Buffer.from` which comes from `Uint8Array.from` - // in nodejs v4 (< v.4.5). It's not the expected implementation (and - // has a different signature). - // see https://github.com/nodejs/node/issues/8053 - // A condition on nodejs' version won't solve the issue as we don't - // control the Buffer polyfills that may or may not be used. - return new Buffer(data, encoding); + if (Buffer.from && Buffer.from !== Uint8Array.from) { + return Buffer.from(data, encoding); + } else { + if (typeof data === "number") { + // Safeguard for old Node.js versions. On newer versions, + // Buffer.from(number) / Buffer(number, encoding) already throw. + throw new Error("The \"data\" argument must not be a number"); + } + return new Buffer(data, encoding); + } }, /** * Create a new nodejs Buffer with the specified size. @@ -1304,7 +1308,9 @@ module.exports = { if (Buffer.alloc) { return Buffer.alloc(size); } else { - return new Buffer(size); + var buf = new Buffer(size); + buf.fill(0); + return buf; } }, /** @@ -1506,16 +1512,16 @@ var out = { */ forEach: function(cb) { var filename, relativePath, file; + /* jshint ignore:start */ + // ignore warning about unwanted properties because this.files is a null prototype object for (filename in this.files) { - if (!this.files.hasOwnProperty(filename)) { - continue; - } file = this.files[filename]; relativePath = filename.slice(this.root.length, filename.length); if (relativePath && filename.slice(0, this.root.length) === this.root) { // the file is in the current root cb(relativePath, file); // TODO reverse the parameters ? need to be clean AND consistent with the filter search fn... } } + /* jshint ignore:end */ }, /** @@ -1662,7 +1668,7 @@ var out = { opts.type = opts.type.toLowerCase(); opts.compression = opts.compression.toUpperCase(); - // "binarystring" is prefered but the internals use "string". + // "binarystring" is preferred but the internals use "string". if(opts.type === "binarystring") { opts.type = "string"; } @@ -1871,9 +1877,9 @@ DataReader.prototype = { // see implementations }, /** - * Find the last occurence of a zip signature (4 bytes). + * Find the last occurrence of a zip signature (4 bytes). * @param {string} sig the signature to find. - * @return {number} the index of the last occurence, -1 if not found. + * @return {number} the index of the last occurrence, -1 if not found. */ lastIndexOfSignature: function(sig) { // see implementations @@ -3032,7 +3038,7 @@ exports.Utf8EncodeWorker = Utf8EncodeWorker; var support = require('./support'); var base64 = require('./base64'); var nodejsUtils = require('./nodejsUtils'); -var setImmediate = require('core-js/library/fn/set-immediate'); +var setImmediate = require('set-immediate-shim'); var external = require("./external"); @@ -3117,7 +3123,7 @@ function stringToArrayLike(str, array) { /** * An helper for the function arrayLikeToString. - * This contains static informations and functions that + * This contains static information and functions that * can be optimized by the browser JIT compiler. */ var arrayToStringHelper = { @@ -3504,7 +3510,7 @@ exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinarySt }); }; -},{"./base64":1,"./external":6,"./nodejsUtils":14,"./support":30,"core-js/library/fn/set-immediate":36}],33:[function(require,module,exports){ +},{"./base64":1,"./external":6,"./nodejsUtils":14,"./support":30,"set-immediate-shim":54}],33:[function(require,module,exports){ 'use strict'; var readerFor = require('./reader/readerFor'); var utils = require('./utils'); @@ -3857,7 +3863,7 @@ ZipEntry.prototype = { reader.skip(localExtraFieldsLength); if (this.compressedSize === -1 || this.uncompressedSize === -1) { - throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory " + "(compressedSize === -1 || uncompressedSize === -1)"); + throw new Error("Bug or corrupted zip : didn't get enough information from the central directory " + "(compressedSize === -1 || uncompressedSize === -1)"); } compression = findCompression(this.compressionMethod); @@ -3971,7 +3977,7 @@ ZipEntry.prototype = { this.extraFields = {}; } - while (reader.index < end) { + while (reader.index + 4 < end) { extraFieldId = reader.readInt(2); extraFieldLength = reader.readInt(2); extraFieldValue = reader.readData(extraFieldLength); @@ -3982,6 +3988,8 @@ ZipEntry.prototype = { value: extraFieldValue }; } + + reader.setIndex(end); }, /** * Apply an UTF8 transformation if needed. @@ -4198,296 +4206,6 @@ for(var i = 0; i < removedMethods.length; i++) { module.exports = ZipObject; },{"./compressedObject":2,"./stream/DataWorker":27,"./stream/GenericWorker":28,"./stream/StreamHelper":29,"./utf8":31}],36:[function(require,module,exports){ -require('../modules/web.immediate'); -module.exports = require('../modules/_core').setImmediate; -},{"../modules/_core":40,"../modules/web.immediate":56}],37:[function(require,module,exports){ -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; -},{}],38:[function(require,module,exports){ -var isObject = require('./_is-object'); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; -},{"./_is-object":51}],39:[function(require,module,exports){ -var toString = {}.toString; - -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; -},{}],40:[function(require,module,exports){ -var core = module.exports = {version: '2.3.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef -},{}],41:[function(require,module,exports){ -// optional / simple context binding -var aFunction = require('./_a-function'); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; -},{"./_a-function":37}],42:[function(require,module,exports){ -// Thank's IE8 for his funny defineProperty -module.exports = !require('./_fails')(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_fails":45}],43:[function(require,module,exports){ -var isObject = require('./_is-object') - , document = require('./_global').document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; -},{"./_global":46,"./_is-object":51}],44:[function(require,module,exports){ -var global = require('./_global') - , core = require('./_core') - , ctx = require('./_ctx') - , hide = require('./_hide') - , PROTOTYPE = 'prototype'; - -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , IS_WRAP = type & $export.W - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE] - , key, own, out; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - if(own && key in exports)continue; - // export native or passed - out = own ? target[key] : source[key]; - // prevent global pollution for namespaces - exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key] - // bind timers to global for call from export context - : IS_BIND && own ? ctx(out, global) - // wrap global constructors for prevent change them in library - : IS_WRAP && target[key] == out ? (function(C){ - var F = function(a, b, c){ - if(this instanceof C){ - switch(arguments.length){ - case 0: return new C; - case 1: return new C(a); - case 2: return new C(a, b); - } return new C(a, b, c); - } return C.apply(this, arguments); - }; - F[PROTOTYPE] = C[PROTOTYPE]; - return F; - // make static versions for prototype methods - })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // export proto methods to core.%CONSTRUCTOR%.methods.%NAME% - if(IS_PROTO){ - (exports.virtual || (exports.virtual = {}))[key] = out; - // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME% - if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out); - } - } -}; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; -},{"./_core":40,"./_ctx":41,"./_global":46,"./_hide":47}],45:[function(require,module,exports){ -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; -},{}],46:[function(require,module,exports){ -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef -},{}],47:[function(require,module,exports){ -var dP = require('./_object-dp') - , createDesc = require('./_property-desc'); -module.exports = require('./_descriptors') ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; -},{"./_descriptors":42,"./_object-dp":52,"./_property-desc":53}],48:[function(require,module,exports){ -module.exports = require('./_global').document && document.documentElement; -},{"./_global":46}],49:[function(require,module,exports){ -module.exports = !require('./_descriptors') && !require('./_fails')(function(){ - return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_descriptors":42,"./_dom-create":43,"./_fails":45}],50:[function(require,module,exports){ -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -module.exports = function(fn, args, that){ - var un = that === undefined; - switch(args.length){ - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; -},{}],51:[function(require,module,exports){ -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; -},{}],52:[function(require,module,exports){ -var anObject = require('./_an-object') - , IE8_DOM_DEFINE = require('./_ie8-dom-define') - , toPrimitive = require('./_to-primitive') - , dP = Object.defineProperty; - -exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; -},{"./_an-object":38,"./_descriptors":42,"./_ie8-dom-define":49,"./_to-primitive":55}],53:[function(require,module,exports){ -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; -},{}],54:[function(require,module,exports){ -var ctx = require('./_ctx') - , invoke = require('./_invoke') - , html = require('./_html') - , cel = require('./_dom-create') - , global = require('./_global') - , process = global.process - , setTask = global.setImmediate - , clearTask = global.clearImmediate - , MessageChannel = global.MessageChannel - , counter = 0 - , queue = {} - , ONREADYSTATECHANGE = 'onreadystatechange' - , defer, channel, port; -var run = function(){ - var id = +this; - if(queue.hasOwnProperty(id)){ - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function(event){ - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if(!setTask || !clearTask){ - setTask = function setImmediate(fn){ - var args = [], i = 1; - while(arguments.length > i)args.push(arguments[i++]); - queue[++counter] = function(){ - invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id){ - delete queue[id]; - }; - // Node.js 0.8- - if(require('./_cof')(process) == 'process'){ - defer = function(id){ - process.nextTick(ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if(MessageChannel){ - channel = new MessageChannel; - port = channel.port2; - channel.port1.onmessage = listener; - defer = ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ - defer = function(id){ - global.postMessage(id + '', '*'); - }; - global.addEventListener('message', listener, false); - // IE8- - } else if(ONREADYSTATECHANGE in cel('script')){ - defer = function(id){ - html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ - html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function(id){ - setTimeout(ctx(run, id, 1), 0); - }; - } -} -module.exports = { - set: setTask, - clear: clearTask -}; -},{"./_cof":39,"./_ctx":41,"./_dom-create":43,"./_global":46,"./_html":48,"./_invoke":50}],55:[function(require,module,exports){ -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = require('./_is-object'); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; -},{"./_is-object":51}],56:[function(require,module,exports){ -var $export = require('./_export') - , $task = require('./_task'); -$export($export.G + $export.B, { - setImmediate: $task.set, - clearImmediate: $task.clear -}); -},{"./_export":44,"./_task":54}],57:[function(require,module,exports){ (function (global){ 'use strict'; var Mutation = global.MutationObserver || global.WebKitMutationObserver; @@ -4560,7 +4278,7 @@ function immediate(task) { } }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],58:[function(require,module,exports){ +},{}],37:[function(require,module,exports){ 'use strict'; var immediate = require('immediate'); @@ -4587,6 +4305,26 @@ function Promise(resolver) { } } +Promise.prototype["finally"] = function (callback) { + if (typeof callback !== 'function') { + return this; + } + var p = this.constructor; + return this.then(resolve, reject); + + function resolve(value) { + function yes () { + return value; + } + return p.resolve(callback()).then(yes); + } + function reject(reason) { + function no () { + throw reason; + } + return p.resolve(callback()).then(no); + } +}; Promise.prototype["catch"] = function (onRejected) { return this.then(null, onRejected); }; @@ -4815,7 +4553,7 @@ function race(iterable) { } } -},{"immediate":57}],59:[function(require,module,exports){ +},{"immediate":36}],38:[function(require,module,exports){ // Top level file is just a mixin of submodules & constants 'use strict'; @@ -4831,7 +4569,7 @@ assign(pako, deflate, inflate, constants); module.exports = pako; -},{"./lib/deflate":60,"./lib/inflate":61,"./lib/utils/common":62,"./lib/zlib/constants":65}],60:[function(require,module,exports){ +},{"./lib/deflate":39,"./lib/inflate":40,"./lib/utils/common":41,"./lib/zlib/constants":44}],39:[function(require,module,exports){ 'use strict'; @@ -5233,7 +4971,7 @@ exports.deflate = deflate; exports.deflateRaw = deflateRaw; exports.gzip = gzip; -},{"./utils/common":62,"./utils/strings":63,"./zlib/deflate":67,"./zlib/messages":72,"./zlib/zstream":74}],61:[function(require,module,exports){ +},{"./utils/common":41,"./utils/strings":42,"./zlib/deflate":46,"./zlib/messages":51,"./zlib/zstream":53}],40:[function(require,module,exports){ 'use strict'; @@ -5653,7 +5391,7 @@ exports.inflate = inflate; exports.inflateRaw = inflateRaw; exports.ungzip = inflate; -},{"./utils/common":62,"./utils/strings":63,"./zlib/constants":65,"./zlib/gzheader":68,"./zlib/inflate":70,"./zlib/messages":72,"./zlib/zstream":74}],62:[function(require,module,exports){ +},{"./utils/common":41,"./utils/strings":42,"./zlib/constants":44,"./zlib/gzheader":47,"./zlib/inflate":49,"./zlib/messages":51,"./zlib/zstream":53}],41:[function(require,module,exports){ 'use strict'; @@ -5757,7 +5495,7 @@ exports.setTyped = function (on) { exports.setTyped(TYPED_OK); -},{}],63:[function(require,module,exports){ +},{}],42:[function(require,module,exports){ // String encode/decode helpers 'use strict'; @@ -5944,7 +5682,7 @@ exports.utf8border = function (buf, max) { return (pos + _utf8len[buf[pos]] > max) ? pos : max; }; -},{"./common":62}],64:[function(require,module,exports){ +},{"./common":41}],43:[function(require,module,exports){ 'use strict'; // Note: adler32 takes 12% for level 0 and 2% for level 6. @@ -5997,7 +5735,7 @@ function adler32(adler, buf, len, pos) { module.exports = adler32; -},{}],65:[function(require,module,exports){ +},{}],44:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -6067,7 +5805,7 @@ module.exports = { //Z_NULL: null // Use -1 or null inline, depending on var type }; -},{}],66:[function(require,module,exports){ +},{}],45:[function(require,module,exports){ 'use strict'; // Note: we can't get significant speed boost here. @@ -6128,7 +5866,7 @@ function crc32(crc, buf, len, pos) { module.exports = crc32; -},{}],67:[function(require,module,exports){ +},{}],46:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -8004,7 +7742,7 @@ exports.deflatePrime = deflatePrime; exports.deflateTune = deflateTune; */ -},{"../utils/common":62,"./adler32":64,"./crc32":66,"./messages":72,"./trees":73}],68:[function(require,module,exports){ +},{"../utils/common":41,"./adler32":43,"./crc32":45,"./messages":51,"./trees":52}],47:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -8064,7 +7802,7 @@ function GZheader() { module.exports = GZheader; -},{}],69:[function(require,module,exports){ +},{}],48:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -8411,7 +8149,7 @@ module.exports = function inflate_fast(strm, start) { return; }; -},{}],70:[function(require,module,exports){ +},{}],49:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -9969,7 +9707,7 @@ exports.inflateSyncPoint = inflateSyncPoint; exports.inflateUndermine = inflateUndermine; */ -},{"../utils/common":62,"./adler32":64,"./crc32":66,"./inffast":69,"./inftrees":71}],71:[function(require,module,exports){ +},{"../utils/common":41,"./adler32":43,"./crc32":45,"./inffast":48,"./inftrees":50}],50:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -10314,7 +10052,7 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta return 0; }; -},{"../utils/common":62}],72:[function(require,module,exports){ +},{"../utils/common":41}],51:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -10348,7 +10086,7 @@ module.exports = { '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ }; -},{}],73:[function(require,module,exports){ +},{}],52:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -11570,7 +11308,7 @@ exports._tr_flush_block = _tr_flush_block; exports._tr_tally = _tr_tally; exports._tr_align = _tr_align; -},{"../utils/common":62}],74:[function(require,module,exports){ +},{"../utils/common":41}],53:[function(require,module,exports){ 'use strict'; // (C) 1995-2013 Jean-loup Gailly and Mark Adler @@ -11619,5 +11357,14 @@ function ZStream() { module.exports = ZStream; +},{}],54:[function(require,module,exports){ +'use strict'; +module.exports = typeof setImmediate === 'function' ? setImmediate : + function setImmediate() { + var args = [].slice.apply(arguments); + args.splice(1, 0, 0); + setTimeout.apply(null, args); + }; + },{}]},{},[10])(10) }); \ No newline at end of file diff --git a/docs/jquery/jszip/dist/jszip.min.js b/docs/jquery/jszip/dist/jszip.min.js new file mode 100644 index 0000000..6c4645c --- /dev/null +++ b/docs/jquery/jszip/dist/jszip.min.js @@ -0,0 +1,13 @@ +/*! + +JSZip v3.7.1 - A JavaScript class for generating and reading zip files + + +(c) 2009-2016 Stuart Knightley +Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. + +JSZip uses the library pako released under the MIT license : +https://github.com/nodeca/pako/blob/master/LICENSE +*/ + +!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).JSZip=t()}}(function(){return function s(a,o,h){function u(r,t){if(!o[r]){if(!a[r]){var e="function"==typeof require&&require;if(!t&&e)return e(r,!0);if(l)return l(r,!0);var i=new Error("Cannot find module '"+r+"'");throw i.code="MODULE_NOT_FOUND",i}var n=o[r]={exports:{}};a[r][0].call(n.exports,function(t){var e=a[r][1][t];return u(e||t)},n,n.exports,s,a,o,h)}return o[r].exports}for(var l="function"==typeof require&&require,t=0;t>2,s=(3&e)<<4|r>>4,a=1>6:64,o=2>4,r=(15&n)<<4|(s=p.indexOf(t.charAt(o++)))>>2,i=(3&s)<<6|(a=p.indexOf(t.charAt(o++))),l[h++]=e,64!==s&&(l[h++]=r),64!==a&&(l[h++]=i);return l}},{"./support":30,"./utils":32}],2:[function(t,e,r){"use strict";var i=t("./external"),n=t("./stream/DataWorker"),s=t("./stream/Crc32Probe"),a=t("./stream/DataLengthProbe");function o(t,e,r,i,n){this.compressedSize=t,this.uncompressedSize=e,this.crc32=r,this.compression=i,this.compressedContent=n}o.prototype={getContentWorker:function(){var t=new n(i.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new a("data_length")),e=this;return t.on("end",function(){if(this.streamInfo.data_length!==e.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),t},getCompressedWorker:function(){return new n(i.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},o.createWorkerFrom=function(t,e,r){return t.pipe(new s).pipe(new a("uncompressedSize")).pipe(e.compressWorker(r)).pipe(new a("compressedSize")).withStreamInfo("compression",e)},e.exports=o},{"./external":6,"./stream/Crc32Probe":25,"./stream/DataLengthProbe":26,"./stream/DataWorker":27}],3:[function(t,e,r){"use strict";var i=t("./stream/GenericWorker");r.STORE={magic:"\0\0",compressWorker:function(t){return new i("STORE compression")},uncompressWorker:function(){return new i("STORE decompression")}},r.DEFLATE=t("./flate")},{"./flate":7,"./stream/GenericWorker":28}],4:[function(t,e,r){"use strict";var i=t("./utils");var o=function(){for(var t,e=[],r=0;r<256;r++){t=r;for(var i=0;i<8;i++)t=1&t?3988292384^t>>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e){return void 0!==t&&t.length?"string"!==i.getTypeOf(t)?function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e[a])];return-1^t}(0|e,t,t.length,0):function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e.charCodeAt(a))];return-1^t}(0|e,t,t.length,0):0}},{"./utils":32}],5:[function(t,e,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],6:[function(t,e,r){"use strict";var i=null;i="undefined"!=typeof Promise?Promise:t("lie"),e.exports={Promise:i}},{lie:37}],7:[function(t,e,r){"use strict";var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,n=t("pako"),s=t("./utils"),a=t("./stream/GenericWorker"),o=i?"uint8array":"array";function h(t,e){a.call(this,"FlateWorker/"+t),this._pako=null,this._pakoAction=t,this._pakoOptions=e,this.meta={}}r.magic="\b\0",s.inherits(h,a),h.prototype.processChunk=function(t){this.meta=t.meta,null===this._pako&&this._createPako(),this._pako.push(s.transformTo(o,t.data),!1)},h.prototype.flush=function(){a.prototype.flush.call(this),null===this._pako&&this._createPako(),this._pako.push([],!0)},h.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},h.prototype._createPako=function(){this._pako=new n[this._pakoAction]({raw:!0,level:this._pakoOptions.level||-1});var e=this;this._pako.onData=function(t){e.push({data:t,meta:e.meta})}},r.compressWorker=function(t){return new h("Deflate",t)},r.uncompressWorker=function(){return new h("Inflate",{})}},{"./stream/GenericWorker":28,"./utils":32,pako:38}],8:[function(t,e,r){"use strict";function A(t,e){var r,i="";for(r=0;r>>=8;return i}function i(t,e,r,i,n,s){var a,o,h=t.file,u=t.compression,l=s!==O.utf8encode,f=I.transformTo("string",s(h.name)),d=I.transformTo("string",O.utf8encode(h.name)),c=h.comment,p=I.transformTo("string",s(c)),m=I.transformTo("string",O.utf8encode(c)),_=d.length!==h.name.length,g=m.length!==c.length,b="",v="",y="",w=h.dir,k=h.date,x={crc32:0,compressedSize:0,uncompressedSize:0};e&&!r||(x.crc32=t.crc32,x.compressedSize=t.compressedSize,x.uncompressedSize=t.uncompressedSize);var S=0;e&&(S|=8),l||!_&&!g||(S|=2048);var z=0,C=0;w&&(z|=16),"UNIX"===n?(C=798,z|=function(t,e){var r=t;return t||(r=e?16893:33204),(65535&r)<<16}(h.unixPermissions,w)):(C=20,z|=function(t){return 63&(t||0)}(h.dosPermissions)),a=k.getUTCHours(),a<<=6,a|=k.getUTCMinutes(),a<<=5,a|=k.getUTCSeconds()/2,o=k.getUTCFullYear()-1980,o<<=4,o|=k.getUTCMonth()+1,o<<=5,o|=k.getUTCDate(),_&&(v=A(1,1)+A(B(f),4)+d,b+="up"+A(v.length,2)+v),g&&(y=A(1,1)+A(B(p),4)+m,b+="uc"+A(y.length,2)+y);var E="";return E+="\n\0",E+=A(S,2),E+=u.magic,E+=A(a,2),E+=A(o,2),E+=A(x.crc32,4),E+=A(x.compressedSize,4),E+=A(x.uncompressedSize,4),E+=A(f.length,2),E+=A(b.length,2),{fileRecord:R.LOCAL_FILE_HEADER+E+f+b,dirRecord:R.CENTRAL_FILE_HEADER+A(C,2)+E+A(p.length,2)+"\0\0\0\0"+A(z,4)+A(i,4)+f+b+p}}var I=t("../utils"),n=t("../stream/GenericWorker"),O=t("../utf8"),B=t("../crc32"),R=t("../signature");function s(t,e,r,i){n.call(this,"ZipFileWorker"),this.bytesWritten=0,this.zipComment=e,this.zipPlatform=r,this.encodeFileName=i,this.streamFiles=t,this.accumulate=!1,this.contentBuffer=[],this.dirRecords=[],this.currentSourceOffset=0,this.entriesCount=0,this.currentFile=null,this._sources=[]}I.inherits(s,n),s.prototype.push=function(t){var e=t.meta.percent||0,r=this.entriesCount,i=this._sources.length;this.accumulate?this.contentBuffer.push(t):(this.bytesWritten+=t.data.length,n.prototype.push.call(this,{data:t.data,meta:{currentFile:this.currentFile,percent:r?(e+100*(r-i-1))/r:100}}))},s.prototype.openedSource=function(t){this.currentSourceOffset=this.bytesWritten,this.currentFile=t.file.name;var e=this.streamFiles&&!t.file.dir;if(e){var r=i(t,e,!1,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);this.push({data:r.fileRecord,meta:{percent:0}})}else this.accumulate=!0},s.prototype.closedSource=function(t){this.accumulate=!1;var e=this.streamFiles&&!t.file.dir,r=i(t,e,!0,this.currentSourceOffset,this.zipPlatform,this.encodeFileName);if(this.dirRecords.push(r.dirRecord),e)this.push({data:function(t){return R.DATA_DESCRIPTOR+A(t.crc32,4)+A(t.compressedSize,4)+A(t.uncompressedSize,4)}(t),meta:{percent:100}});else for(this.push({data:r.fileRecord,meta:{percent:0}});this.contentBuffer.length;)this.push(this.contentBuffer.shift());this.currentFile=null},s.prototype.flush=function(){for(var t=this.bytesWritten,e=0;e=this.index;e--)r=(r<<8)+this.byteAt(e);return this.index+=t,r},readString:function(t){return i.transformTo("string",this.readData(t))},readData:function(t){},lastIndexOfSignature:function(t){},readAndCheckSignature:function(t){},readDate:function(){var t=this.readInt(4);return new Date(Date.UTC(1980+(t>>25&127),(t>>21&15)-1,t>>16&31,t>>11&31,t>>5&63,(31&t)<<1))}},e.exports=n},{"../utils":32}],19:[function(t,e,r){"use strict";var i=t("./Uint8ArrayReader");function n(t){i.call(this,t)}t("../utils").inherits(n,i),n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./Uint8ArrayReader":21}],20:[function(t,e,r){"use strict";var i=t("./DataReader");function n(t){i.call(this,t)}t("../utils").inherits(n,i),n.prototype.byteAt=function(t){return this.data.charCodeAt(this.zero+t)},n.prototype.lastIndexOfSignature=function(t){return this.data.lastIndexOf(t)-this.zero},n.prototype.readAndCheckSignature=function(t){return t===this.readData(4)},n.prototype.readData=function(t){this.checkOffset(t);var e=this.data.slice(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./DataReader":18}],21:[function(t,e,r){"use strict";var i=t("./ArrayReader");function n(t){i.call(this,t)}t("../utils").inherits(n,i),n.prototype.readData=function(t){if(this.checkOffset(t),0===t)return new Uint8Array(0);var e=this.data.subarray(this.zero+this.index,this.zero+this.index+t);return this.index+=t,e},e.exports=n},{"../utils":32,"./ArrayReader":17}],22:[function(t,e,r){"use strict";var i=t("../utils"),n=t("../support"),s=t("./ArrayReader"),a=t("./StringReader"),o=t("./NodeBufferReader"),h=t("./Uint8ArrayReader");e.exports=function(t){var e=i.getTypeOf(t);return i.checkSupport(e),"string"!==e||n.uint8array?"nodebuffer"===e?new o(t):n.uint8array?new h(i.transformTo("uint8array",t)):new s(i.transformTo("array",t)):new a(t)}},{"../support":30,"../utils":32,"./ArrayReader":17,"./NodeBufferReader":19,"./StringReader":20,"./Uint8ArrayReader":21}],23:[function(t,e,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],24:[function(t,e,r){"use strict";var i=t("./GenericWorker"),n=t("../utils");function s(t){i.call(this,"ConvertWorker to "+t),this.destType=t}n.inherits(s,i),s.prototype.processChunk=function(t){this.push({data:n.transformTo(this.destType,t.data),meta:t.meta})},e.exports=s},{"../utils":32,"./GenericWorker":28}],25:[function(t,e,r){"use strict";var i=t("./GenericWorker"),n=t("../crc32");function s(){i.call(this,"Crc32Probe"),this.withStreamInfo("crc32",0)}t("../utils").inherits(s,i),s.prototype.processChunk=function(t){this.streamInfo.crc32=n(t.data,this.streamInfo.crc32||0),this.push(t)},e.exports=s},{"../crc32":4,"../utils":32,"./GenericWorker":28}],26:[function(t,e,r){"use strict";var i=t("../utils"),n=t("./GenericWorker");function s(t){n.call(this,"DataLengthProbe for "+t),this.propName=t,this.withStreamInfo(t,0)}i.inherits(s,n),s.prototype.processChunk=function(t){if(t){var e=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=e+t.data.length}n.prototype.processChunk.call(this,t)},e.exports=s},{"../utils":32,"./GenericWorker":28}],27:[function(t,e,r){"use strict";var i=t("../utils"),n=t("./GenericWorker");function s(t){n.call(this,"DataWorker");var e=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,t.then(function(t){e.dataIsReady=!0,e.data=t,e.max=t&&t.length||0,e.type=i.getTypeOf(t),e.isPaused||e._tickAndRepeat()},function(t){e.error(t)})}i.inherits(s,n),s.prototype.cleanUp=function(){n.prototype.cleanUp.call(this),this.data=null},s.prototype.resume=function(){return!!n.prototype.resume.call(this)&&(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,i.delay(this._tickAndRepeat,[],this)),!0)},s.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(i.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},s.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var t=null,e=Math.min(this.max,this.index+16384);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,e);break;case"uint8array":t=this.data.subarray(this.index,e);break;case"array":case"nodebuffer":t=this.data.slice(this.index,e)}return this.index=e,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},e.exports=s},{"../utils":32,"./GenericWorker":28}],28:[function(t,e,r){"use strict";function i(t){this.name=t||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}i.prototype={push:function(t){this.emit("data",t)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(t){this.emit("error",t)}return!0},error:function(t){return!this.isFinished&&(this.isPaused?this.generatedError=t:(this.isFinished=!0,this.emit("error",t),this.previous&&this.previous.error(t),this.cleanUp()),!0)},on:function(t,e){return this._listeners[t].push(e),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(t,e){if(this._listeners[t])for(var r=0;r "+t:t}},e.exports=i},{}],29:[function(t,e,r){"use strict";var h=t("../utils"),n=t("./ConvertWorker"),s=t("./GenericWorker"),u=t("../base64"),i=t("../support"),a=t("../external"),o=null;if(i.nodestream)try{o=t("../nodejs/NodejsStreamOutputAdapter")}catch(t){}function l(t,o){return new a.Promise(function(e,r){var i=[],n=t._internalType,s=t._outputType,a=t._mimeType;t.on("data",function(t,e){i.push(t),o&&o(e)}).on("error",function(t){i=[],r(t)}).on("end",function(){try{var t=function(t,e,r){switch(t){case"blob":return h.newBlob(h.transformTo("arraybuffer",e),r);case"base64":return u.encode(e);default:return h.transformTo(t,e)}}(s,function(t,e){var r,i=0,n=null,s=0;for(r=0;r>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e}(t)},s.utf8decode=function(t){return h.nodebuffer?o.transformTo("nodebuffer",t).toString("utf-8"):function(t){var e,r,i,n,s=t.length,a=new Array(2*s);for(e=r=0;e>10&1023,a[r++]=56320|1023&i)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)}(t=o.transformTo(h.uint8array?"uint8array":"array",t))},o.inherits(a,i),a.prototype.processChunk=function(t){var e=o.transformTo(h.uint8array?"uint8array":"array",t.data);if(this.leftOver&&this.leftOver.length){if(h.uint8array){var r=e;(e=new Uint8Array(r.length+this.leftOver.length)).set(this.leftOver,0),e.set(r,this.leftOver.length)}else e=this.leftOver.concat(e);this.leftOver=null}var i=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+u[t[r]]>e?r:e}(e),n=e;i!==e.length&&(h.uint8array?(n=e.subarray(0,i),this.leftOver=e.subarray(i,e.length)):(n=e.slice(0,i),this.leftOver=e.slice(i,e.length))),this.push({data:s.utf8decode(n),meta:t.meta})},a.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:s.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},s.Utf8DecodeWorker=a,o.inherits(l,i),l.prototype.processChunk=function(t){this.push({data:s.utf8encode(t.data),meta:t.meta})},s.Utf8EncodeWorker=l},{"./nodejsUtils":14,"./stream/GenericWorker":28,"./support":30,"./utils":32}],32:[function(t,e,a){"use strict";var o=t("./support"),h=t("./base64"),r=t("./nodejsUtils"),i=t("set-immediate-shim"),u=t("./external");function n(t){return t}function l(t,e){for(var r=0;r>8;this.dir=!!(16&this.externalFileAttributes),0==t&&(this.dosPermissions=63&this.externalFileAttributes),3==t&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(t){if(this.extraFields[1]){var e=i(this.extraFields[1].value);this.uncompressedSize===s.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===s.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===s.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===s.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(t){var e,r,i,n=t.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});t.index+4>>6:(r<65536?e[s++]=224|r>>>12:(e[s++]=240|r>>>18,e[s++]=128|r>>>12&63),e[s++]=128|r>>>6&63),e[s++]=128|63&r);return e},r.buf2binstring=function(t){return l(t,t.length)},r.binstring2buf=function(t){for(var e=new h.Buf8(t.length),r=0,i=e.length;r>10&1023,o[i++]=56320|1023&n)}return l(o,i)},r.utf8border=function(t,e){var r;for((e=e||t.length)>t.length&&(e=t.length),r=e-1;0<=r&&128==(192&t[r]);)r--;return r<0?e:0===r?e:r+u[t[r]]>e?r:e}},{"./common":41}],43:[function(t,e,r){"use strict";e.exports=function(t,e,r,i){for(var n=65535&t|0,s=t>>>16&65535|0,a=0;0!==r;){for(r-=a=2e3>>1:t>>>1;e[r]=t}return e}();e.exports=function(t,e,r,i){var n=o,s=i+r;t^=-1;for(var a=i;a>>8^n[255&(t^e[a])];return-1^t}},{}],46:[function(t,e,r){"use strict";var h,d=t("../utils/common"),u=t("./trees"),c=t("./adler32"),p=t("./crc32"),i=t("./messages"),l=0,f=4,m=0,_=-2,g=-1,b=4,n=2,v=8,y=9,s=286,a=30,o=19,w=2*s+1,k=15,x=3,S=258,z=S+x+1,C=42,E=113,A=1,I=2,O=3,B=4;function R(t,e){return t.msg=i[e],e}function T(t){return(t<<1)-(4t.avail_out&&(r=t.avail_out),0!==r&&(d.arraySet(t.output,e.pending_buf,e.pending_out,r,t.next_out),t.next_out+=r,e.pending_out+=r,t.total_out+=r,t.avail_out-=r,e.pending-=r,0===e.pending&&(e.pending_out=0))}function N(t,e){u._tr_flush_block(t,0<=t.block_start?t.block_start:-1,t.strstart-t.block_start,e),t.block_start=t.strstart,F(t.strm)}function U(t,e){t.pending_buf[t.pending++]=e}function P(t,e){t.pending_buf[t.pending++]=e>>>8&255,t.pending_buf[t.pending++]=255&e}function L(t,e){var r,i,n=t.max_chain_length,s=t.strstart,a=t.prev_length,o=t.nice_match,h=t.strstart>t.w_size-z?t.strstart-(t.w_size-z):0,u=t.window,l=t.w_mask,f=t.prev,d=t.strstart+S,c=u[s+a-1],p=u[s+a];t.prev_length>=t.good_match&&(n>>=2),o>t.lookahead&&(o=t.lookahead);do{if(u[(r=e)+a]===p&&u[r+a-1]===c&&u[r]===u[s]&&u[++r]===u[s+1]){s+=2,r++;do{}while(u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&u[++s]===u[++r]&&sh&&0!=--n);return a<=t.lookahead?a:t.lookahead}function j(t){var e,r,i,n,s,a,o,h,u,l,f=t.w_size;do{if(n=t.window_size-t.lookahead-t.strstart,t.strstart>=f+(f-z)){for(d.arraySet(t.window,t.window,f,f,0),t.match_start-=f,t.strstart-=f,t.block_start-=f,e=r=t.hash_size;i=t.head[--e],t.head[e]=f<=i?i-f:0,--r;);for(e=r=f;i=t.prev[--e],t.prev[e]=f<=i?i-f:0,--r;);n+=f}if(0===t.strm.avail_in)break;if(a=t.strm,o=t.window,h=t.strstart+t.lookahead,u=n,l=void 0,l=a.avail_in,u=x)for(s=t.strstart-t.insert,t.ins_h=t.window[s],t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x)if(i=u._tr_tally(t,t.strstart-t.match_start,t.match_length-x),t.lookahead-=t.match_length,t.match_length<=t.max_lazy_match&&t.lookahead>=x){for(t.match_length--;t.strstart++,t.ins_h=(t.ins_h<=x&&(t.ins_h=(t.ins_h<=x&&t.match_length<=t.prev_length){for(n=t.strstart+t.lookahead-x,i=u._tr_tally(t,t.strstart-1-t.prev_match,t.prev_length-x),t.lookahead-=t.prev_length-1,t.prev_length-=2;++t.strstart<=n&&(t.ins_h=(t.ins_h<t.pending_buf_size-5&&(r=t.pending_buf_size-5);;){if(t.lookahead<=1){if(j(t),0===t.lookahead&&e===l)return A;if(0===t.lookahead)break}t.strstart+=t.lookahead,t.lookahead=0;var i=t.block_start+r;if((0===t.strstart||t.strstart>=i)&&(t.lookahead=t.strstart-i,t.strstart=i,N(t,!1),0===t.strm.avail_out))return A;if(t.strstart-t.block_start>=t.w_size-z&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):(t.strstart>t.block_start&&(N(t,!1),t.strm.avail_out),A)}),new M(4,4,8,4,Z),new M(4,5,16,8,Z),new M(4,6,32,32,Z),new M(4,4,16,16,W),new M(8,16,32,32,W),new M(8,16,128,128,W),new M(8,32,128,256,W),new M(32,128,258,1024,W),new M(32,258,258,4096,W)],r.deflateInit=function(t,e){return Y(t,e,v,15,8,0)},r.deflateInit2=Y,r.deflateReset=K,r.deflateResetKeep=G,r.deflateSetHeader=function(t,e){return t&&t.state?2!==t.state.wrap?_:(t.state.gzhead=e,m):_},r.deflate=function(t,e){var r,i,n,s;if(!t||!t.state||5>8&255),U(i,i.gzhead.time>>16&255),U(i,i.gzhead.time>>24&255),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,255&i.gzhead.os),i.gzhead.extra&&i.gzhead.extra.length&&(U(i,255&i.gzhead.extra.length),U(i,i.gzhead.extra.length>>8&255)),i.gzhead.hcrc&&(t.adler=p(t.adler,i.pending_buf,i.pending,0)),i.gzindex=0,i.status=69):(U(i,0),U(i,0),U(i,0),U(i,0),U(i,0),U(i,9===i.level?2:2<=i.strategy||i.level<2?4:0),U(i,3),i.status=E);else{var a=v+(i.w_bits-8<<4)<<8;a|=(2<=i.strategy||i.level<2?0:i.level<6?1:6===i.level?2:3)<<6,0!==i.strstart&&(a|=32),a+=31-a%31,i.status=E,P(i,a),0!==i.strstart&&(P(i,t.adler>>>16),P(i,65535&t.adler)),t.adler=1}if(69===i.status)if(i.gzhead.extra){for(n=i.pending;i.gzindex<(65535&i.gzhead.extra.length)&&(i.pending!==i.pending_buf_size||(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending!==i.pending_buf_size));)U(i,255&i.gzhead.extra[i.gzindex]),i.gzindex++;i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),i.gzindex===i.gzhead.extra.length&&(i.gzindex=0,i.status=73)}else i.status=73;if(73===i.status)if(i.gzhead.name){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.gzindex=0,i.status=91)}else i.status=91;if(91===i.status)if(i.gzhead.comment){n=i.pending;do{if(i.pending===i.pending_buf_size&&(i.gzhead.hcrc&&i.pending>n&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),F(t),n=i.pending,i.pending===i.pending_buf_size)){s=1;break}s=i.gzindexn&&(t.adler=p(t.adler,i.pending_buf,i.pending-n,n)),0===s&&(i.status=103)}else i.status=103;if(103===i.status&&(i.gzhead.hcrc?(i.pending+2>i.pending_buf_size&&F(t),i.pending+2<=i.pending_buf_size&&(U(i,255&t.adler),U(i,t.adler>>8&255),t.adler=0,i.status=E)):i.status=E),0!==i.pending){if(F(t),0===t.avail_out)return i.last_flush=-1,m}else if(0===t.avail_in&&T(e)<=T(r)&&e!==f)return R(t,-5);if(666===i.status&&0!==t.avail_in)return R(t,-5);if(0!==t.avail_in||0!==i.lookahead||e!==l&&666!==i.status){var o=2===i.strategy?function(t,e){for(var r;;){if(0===t.lookahead&&(j(t),0===t.lookahead)){if(e===l)return A;break}if(t.match_length=0,r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++,r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):3===i.strategy?function(t,e){for(var r,i,n,s,a=t.window;;){if(t.lookahead<=S){if(j(t),t.lookahead<=S&&e===l)return A;if(0===t.lookahead)break}if(t.match_length=0,t.lookahead>=x&&0t.lookahead&&(t.match_length=t.lookahead)}if(t.match_length>=x?(r=u._tr_tally(t,1,t.match_length-x),t.lookahead-=t.match_length,t.strstart+=t.match_length,t.match_length=0):(r=u._tr_tally(t,0,t.window[t.strstart]),t.lookahead--,t.strstart++),r&&(N(t,!1),0===t.strm.avail_out))return A}return t.insert=0,e===f?(N(t,!0),0===t.strm.avail_out?O:B):t.last_lit&&(N(t,!1),0===t.strm.avail_out)?A:I}(i,e):h[i.level].func(i,e);if(o!==O&&o!==B||(i.status=666),o===A||o===O)return 0===t.avail_out&&(i.last_flush=-1),m;if(o===I&&(1===e?u._tr_align(i):5!==e&&(u._tr_stored_block(i,0,0,!1),3===e&&(D(i.head),0===i.lookahead&&(i.strstart=0,i.block_start=0,i.insert=0))),F(t),0===t.avail_out))return i.last_flush=-1,m}return e!==f?m:i.wrap<=0?1:(2===i.wrap?(U(i,255&t.adler),U(i,t.adler>>8&255),U(i,t.adler>>16&255),U(i,t.adler>>24&255),U(i,255&t.total_in),U(i,t.total_in>>8&255),U(i,t.total_in>>16&255),U(i,t.total_in>>24&255)):(P(i,t.adler>>>16),P(i,65535&t.adler)),F(t),0=r.w_size&&(0===s&&(D(r.head),r.strstart=0,r.block_start=0,r.insert=0),u=new d.Buf8(r.w_size),d.arraySet(u,e,l-r.w_size,r.w_size,0),e=u,l=r.w_size),a=t.avail_in,o=t.next_in,h=t.input,t.avail_in=l,t.next_in=0,t.input=e,j(r);r.lookahead>=x;){for(i=r.strstart,n=r.lookahead-(x-1);r.ins_h=(r.ins_h<>>=y=v>>>24,p-=y,0===(y=v>>>16&255))C[s++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(c&(1<>>=y,p-=y),p<15&&(c+=z[i++]<>>=y=v>>>24,p-=y,!(16&(y=v>>>16&255))){if(0==(64&y)){v=_[(65535&v)+(c&(1<>>=y,p-=y,(y=s-a)>3,c&=(1<<(p-=w<<3))-1,t.next_in=i,t.next_out=s,t.avail_in=i>>24&255)+(t>>>8&65280)+((65280&t)<<8)+((255&t)<<24)}function s(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new I.Buf16(320),this.work=new I.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function a(t){var e;return t&&t.state?(e=t.state,t.total_in=t.total_out=e.total=0,t.msg="",e.wrap&&(t.adler=1&e.wrap),e.mode=P,e.last=0,e.havedict=0,e.dmax=32768,e.head=null,e.hold=0,e.bits=0,e.lencode=e.lendyn=new I.Buf32(i),e.distcode=e.distdyn=new I.Buf32(n),e.sane=1,e.back=-1,N):U}function o(t){var e;return t&&t.state?((e=t.state).wsize=0,e.whave=0,e.wnext=0,a(t)):U}function h(t,e){var r,i;return t&&t.state?(i=t.state,e<0?(r=0,e=-e):(r=1+(e>>4),e<48&&(e&=15)),e&&(e<8||15=s.wsize?(I.arraySet(s.window,e,r-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(i<(n=s.wsize-s.wnext)&&(n=i),I.arraySet(s.window,e,r-i,n,s.wnext),(i-=n)?(I.arraySet(s.window,e,r-i,i,0),s.wnext=i,s.whave=s.wsize):(s.wnext+=n,s.wnext===s.wsize&&(s.wnext=0),s.whave>>8&255,r.check=B(r.check,E,2,0),l=u=0,r.mode=2;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&u)<<8)+(u>>8))%31){t.msg="incorrect header check",r.mode=30;break}if(8!=(15&u)){t.msg="unknown compression method",r.mode=30;break}if(l-=4,k=8+(15&(u>>>=4)),0===r.wbits)r.wbits=k;else if(k>r.wbits){t.msg="invalid window size",r.mode=30;break}r.dmax=1<>8&1),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=3;case 3:for(;l<32;){if(0===o)break t;o--,u+=i[s++]<>>8&255,E[2]=u>>>16&255,E[3]=u>>>24&255,r.check=B(r.check,E,4,0)),l=u=0,r.mode=4;case 4:for(;l<16;){if(0===o)break t;o--,u+=i[s++]<>8),512&r.flags&&(E[0]=255&u,E[1]=u>>>8&255,r.check=B(r.check,E,2,0)),l=u=0,r.mode=5;case 5:if(1024&r.flags){for(;l<16;){if(0===o)break t;o--,u+=i[s++]<>>8&255,r.check=B(r.check,E,2,0)),l=u=0}else r.head&&(r.head.extra=null);r.mode=6;case 6:if(1024&r.flags&&(o<(c=r.length)&&(c=o),c&&(r.head&&(k=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),I.arraySet(r.head.extra,i,s,c,k)),512&r.flags&&(r.check=B(r.check,i,c,s)),o-=c,s+=c,r.length-=c),r.length))break t;r.length=0,r.mode=7;case 7:if(2048&r.flags){if(0===o)break t;for(c=0;k=i[s+c++],r.head&&k&&r.length<65536&&(r.head.name+=String.fromCharCode(k)),k&&c>9&1,r.head.done=!0),t.adler=r.check=0,r.mode=12;break;case 10:for(;l<32;){if(0===o)break t;o--,u+=i[s++]<>>=7&l,l-=7&l,r.mode=27;break}for(;l<3;){if(0===o)break t;o--,u+=i[s++]<>>=1)){case 0:r.mode=14;break;case 1:if(j(r),r.mode=20,6!==e)break;u>>>=2,l-=2;break t;case 2:r.mode=17;break;case 3:t.msg="invalid block type",r.mode=30}u>>>=2,l-=2;break;case 14:for(u>>>=7&l,l-=7&l;l<32;){if(0===o)break t;o--,u+=i[s++]<>>16^65535)){t.msg="invalid stored block lengths",r.mode=30;break}if(r.length=65535&u,l=u=0,r.mode=15,6===e)break t;case 15:r.mode=16;case 16:if(c=r.length){if(o>>=5,l-=5,r.ndist=1+(31&u),u>>>=5,l-=5,r.ncode=4+(15&u),u>>>=4,l-=4,286>>=3,l-=3}for(;r.have<19;)r.lens[A[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,S={bits:r.lenbits},x=T(0,r.lens,0,19,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg="invalid code lengths set",r.mode=30;break}r.have=0,r.mode=19;case 19:for(;r.have>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=_,l-=_,r.lens[r.have++]=b;else{if(16===b){for(z=_+2;l>>=_,l-=_,0===r.have){t.msg="invalid bit length repeat",r.mode=30;break}k=r.lens[r.have-1],c=3+(3&u),u>>>=2,l-=2}else if(17===b){for(z=_+3;l>>=_)),u>>>=3,l-=3}else{for(z=_+7;l>>=_)),u>>>=7,l-=7}if(r.have+c>r.nlen+r.ndist){t.msg="invalid bit length repeat",r.mode=30;break}for(;c--;)r.lens[r.have++]=k}}if(30===r.mode)break;if(0===r.lens[256]){t.msg="invalid code -- missing end-of-block",r.mode=30;break}if(r.lenbits=9,S={bits:r.lenbits},x=T(D,r.lens,0,r.nlen,r.lencode,0,r.work,S),r.lenbits=S.bits,x){t.msg="invalid literal/lengths set",r.mode=30;break}if(r.distbits=6,r.distcode=r.distdyn,S={bits:r.distbits},x=T(F,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,S),r.distbits=S.bits,x){t.msg="invalid distances set",r.mode=30;break}if(r.mode=20,6===e)break t;case 20:r.mode=21;case 21:if(6<=o&&258<=h){t.next_out=a,t.avail_out=h,t.next_in=s,t.avail_in=o,r.hold=u,r.bits=l,R(t,d),a=t.next_out,n=t.output,h=t.avail_out,s=t.next_in,i=t.input,o=t.avail_in,u=r.hold,l=r.bits,12===r.mode&&(r.back=-1);break}for(r.back=0;g=(C=r.lencode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,r.length=b,0===g){r.mode=26;break}if(32&g){r.back=-1,r.mode=12;break}if(64&g){t.msg="invalid literal/length code",r.mode=30;break}r.extra=15&g,r.mode=22;case 22:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=23;case 23:for(;g=(C=r.distcode[u&(1<>>16&255,b=65535&C,!((_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>v)])>>>16&255,b=65535&C,!(v+(_=C>>>24)<=l);){if(0===o)break t;o--,u+=i[s++]<>>=v,l-=v,r.back+=v}if(u>>>=_,l-=_,r.back+=_,64&g){t.msg="invalid distance code",r.mode=30;break}r.offset=b,r.extra=15&g,r.mode=24;case 24:if(r.extra){for(z=r.extra;l>>=r.extra,l-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){t.msg="invalid distance too far back",r.mode=30;break}r.mode=25;case 25:if(0===h)break t;if(c=d-h,r.offset>c){if((c=r.offset-c)>r.whave&&r.sane){t.msg="invalid distance too far back",r.mode=30;break}p=c>r.wnext?(c-=r.wnext,r.wsize-c):r.wnext-c,c>r.length&&(c=r.length),m=r.window}else m=n,p=a-r.offset,c=r.length;for(hc?(m=R[T+a[v]],A[I+a[v]]):(m=96,0),h=1<>S)+(u-=h)]=p<<24|m<<16|_|0,0!==u;);for(h=1<>=1;if(0!==h?(E&=h-1,E+=h):E=0,v++,0==--O[b]){if(b===w)break;b=e[r+a[v]]}if(k>>7)]}function U(t,e){t.pending_buf[t.pending++]=255&e,t.pending_buf[t.pending++]=e>>>8&255}function P(t,e,r){t.bi_valid>c-r?(t.bi_buf|=e<>c-t.bi_valid,t.bi_valid+=r-c):(t.bi_buf|=e<>>=1,r<<=1,0<--e;);return r>>>1}function Z(t,e,r){var i,n,s=new Array(g+1),a=0;for(i=1;i<=g;i++)s[i]=a=a+r[i-1]<<1;for(n=0;n<=e;n++){var o=t[2*n+1];0!==o&&(t[2*n]=j(s[o]++,o))}}function W(t){var e;for(e=0;e>1;1<=r;r--)G(t,s,r);for(n=h;r=t.heap[1],t.heap[1]=t.heap[t.heap_len--],G(t,s,1),i=t.heap[1],t.heap[--t.heap_max]=r,t.heap[--t.heap_max]=i,s[2*n]=s[2*r]+s[2*i],t.depth[n]=(t.depth[r]>=t.depth[i]?t.depth[r]:t.depth[i])+1,s[2*r+1]=s[2*i+1]=n,t.heap[1]=n++,G(t,s,1),2<=t.heap_len;);t.heap[--t.heap_max]=t.heap[1],function(t,e){var r,i,n,s,a,o,h=e.dyn_tree,u=e.max_code,l=e.stat_desc.static_tree,f=e.stat_desc.has_stree,d=e.stat_desc.extra_bits,c=e.stat_desc.extra_base,p=e.stat_desc.max_length,m=0;for(s=0;s<=g;s++)t.bl_count[s]=0;for(h[2*t.heap[t.heap_max]+1]=0,r=t.heap_max+1;r<_;r++)p<(s=h[2*h[2*(i=t.heap[r])+1]+1]+1)&&(s=p,m++),h[2*i+1]=s,u>=7;i>>=1)if(1&r&&0!==t.dyn_ltree[2*e])return o;if(0!==t.dyn_ltree[18]||0!==t.dyn_ltree[20]||0!==t.dyn_ltree[26])return h;for(e=32;e>>3,(s=t.static_len+3+7>>>3)<=n&&(n=s)):n=s=r+5,r+4<=n&&-1!==e?J(t,e,r,i):4===t.strategy||s===n?(P(t,2+(i?1:0),3),K(t,z,C)):(P(t,4+(i?1:0),3),function(t,e,r,i){var n;for(P(t,e-257,5),P(t,r-1,5),P(t,i-4,4),n=0;n>>8&255,t.pending_buf[t.d_buf+2*t.last_lit+1]=255&e,t.pending_buf[t.l_buf+t.last_lit]=255&r,t.last_lit++,0===e?t.dyn_ltree[2*r]++:(t.matches++,e--,t.dyn_ltree[2*(A[r]+u+1)]++,t.dyn_dtree[2*N(e)]++),t.last_lit===t.lit_bufsize-1},r._tr_align=function(t){P(t,2,3),L(t,m,z),function(t){16===t.bi_valid?(U(t,t.bi_buf),t.bi_buf=0,t.bi_valid=0):8<=t.bi_valid&&(t.pending_buf[t.pending++]=255&t.bi_buf,t.bi_buf>>=8,t.bi_valid-=8)}(t)}},{"../utils/common":41}],53:[function(t,e,r){"use strict";e.exports=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}},{}],54:[function(t,e,r){"use strict";e.exports="function"==typeof setImmediate?setImmediate:function(){var t=[].slice.apply(arguments);t.splice(1,0,0),setTimeout.apply(null,t)}},{}]},{},[10])(10)}); \ No newline at end of file diff --git a/docs/legal/jquery.md b/docs/legal/jquery.md index 8054a34..d468b31 100644 --- a/docs/legal/jquery.md +++ b/docs/legal/jquery.md @@ -1,9 +1,9 @@ -## jQuery v3.5.1 +## jQuery v3.6.1 ### jQuery License ``` -jQuery v 3.5.1 -Copyright JS Foundation and other contributors, https://js.foundation/ +jQuery v 3.6.1 +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -26,7 +26,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ****************************************** -The jQuery JavaScript Library v3.5.1 also includes Sizzle.js +The jQuery JavaScript Library v3.6.1 also includes Sizzle.js Sizzle.js includes the following license: diff --git a/docs/legal/jszip.md b/docs/legal/jszip.md new file mode 100644 index 0000000..fad2cb1 --- /dev/null +++ b/docs/legal/jszip.md @@ -0,0 +1,653 @@ +## JSZip v3.7.1 + +JSZip is dual licensed. You may use it under the MIT license *or* the GPLv3 +license. + +### The MIT License +``` +Copyright (c) 2009-2016 Stuart Knightley, David Duponchel, Franz Buchinger, António Afonso + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +``` + +### GPL version 3 +``` + + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS +``` diff --git a/docs/legal/pako.md b/docs/legal/pako.md new file mode 100644 index 0000000..de339d8 --- /dev/null +++ b/docs/legal/pako.md @@ -0,0 +1,45 @@ +## Pako v1.0 + +### Pako License +
      +Copyright (C) 2014-2017 by Vitaly Puzrin and Andrei Tuputcyn
      +
      +Permission is hereby granted, free of charge, to any person obtaining a copy
      +of this software and associated documentation files (the "Software"), to deal
      +in the Software without restriction, including without limitation the rights
      +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      +copies of the Software, and to permit persons to whom the Software is
      +furnished to do so, subject to the following conditions:
      +
      +The above copyright notice and this permission notice shall be included in
      +all copies or substantial portions of the Software.
      +
      +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
      +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
      +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
      +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
      +THE SOFTWARE.
      +(C) 1995-2013 Jean-loup Gailly and Mark Adler
      +(C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin
      +
      +This software is provided 'as-is', without any express or implied
      +warranty. In no event will the authors be held liable for any damages
      +arising from the use of this software.
      +
      +Permission is granted to anyone to use this software for any purpose,
      +including commercial applications, and to alter it and redistribute it
      +freely, subject to the following restrictions:
      +
      +1. The origin of this software must not be misrepresented; you must not
      +claim that you wrote the original software. If you use this software
      +in a product, an acknowledgment in the product documentation would be
      +appreciated but is not required.
      +2. Altered source versions must be plainly marked as such, and must not be
      + misrepresented as being the original software.
      +3. This notice may not be removed or altered from any source distribution.
      +
      +
      + + diff --git a/docs/member-search-index.js b/docs/member-search-index.js index 700af5d..d534231 100644 --- a/docs/member-search-index.js +++ b/docs/member-search-index.js @@ -1 +1 @@ -memberSearchIndex = [{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"abortWasRequested()"},{"p":"com.nuix.nx.controls","c":"DisablingGlassPaneWrapper","l":"activateGlassPane(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ScrollableCustomTabPanel","l":"add(Component)","url":"add(java.awt.Component)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"addAllItems(Collection)","url":"addAllItems(java.util.Collection)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"addAllMd5ByteArrays(Collection)","url":"addAllMd5ByteArrays(java.util.Collection)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"addAllMd5Strings(Collection)","url":"addAllMd5Strings(java.util.Collection)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"addChoice(Choice)","url":"addChoice(com.nuix.nx.controls.models.Choice)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addData(String, String, Object)","url":"addData(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"addElement(E)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"addMenu(String, String, Runnable)","url":"addMenu(java.lang.String,java.lang.String,java.lang.Runnable)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"addPath(String)","url":"addPath(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"addProcessingFinishedListener(ProcessingFinishedListener)","url":"addProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"addProcessingFinishedListener(ProcessingFinishedListener)","url":"addProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addPropertyChangeListener(PropertyChangeListener)","url":"addPropertyChangeListener(java.beans.PropertyChangeListener)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"addRecord(Map)","url":"addRecord(java.util.Map)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"addRecord(Map)","url":"addRecord(java.util.Map)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"addRecord(Object)","url":"addRecord(java.lang.Object)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"addReport(ReportDataModel)","url":"addReport(com.nuix.nx.controls.models.ReportDataModel)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"addScrollableTab(String, String)","url":"addScrollableTab(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addSection(String)","url":"addSection(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addSection(String, Map)","url":"addSection(java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"addTab(String, String)","url":"addTab(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"addValue(ComboItem)","url":"addValue(com.nuix.nx.controls.ComboItem)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"addValue(String)","url":"addValue(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"addValue(String)","url":"addValue(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"addValue(String, String)","url":"addValue(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"afterFiltering()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"afterFiltering()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"allAreChecked(String...)","url":"allAreChecked(java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"anyAreChecked(String...)","url":"anyAreChecked(java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterLoadFileSettings(String)","url":"appendBatchExporterLoadFileSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterNativeSettings(String)","url":"appendBatchExporterNativeSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterPdfSettings(String)","url":"appendBatchExporterPdfSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterTextSettings(String)","url":"appendBatchExporterTextSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterTraversalSettings(String)","url":"appendBatchExporterTraversalSettings(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ButtonRow","l":"appendButton(String, String, ActionListener)","url":"appendButton(java.lang.String,java.lang.String,java.awt.event.ActionListener)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendButton(String, String, ActionListener)","url":"appendButton(java.lang.String,java.lang.String,java.awt.event.ActionListener)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendButtonRow(String)","url":"appendButtonRow(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCheckableTextField(String, boolean, String, String, String)","url":"appendCheckableTextField(java.lang.String,boolean,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCheckBox(String, String, boolean)","url":"appendCheckBox(java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCheckBoxes(String, String, boolean, String, String, boolean)","url":"appendCheckBoxes(java.lang.String,java.lang.String,boolean,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendChoiceTable(String, String, List>)","url":"appendChoiceTable(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendComboBox(String, String, Collection)","url":"appendComboBox(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendComboBox(String, String, Collection, Runnable)","url":"appendComboBox(java.lang.String,java.lang.String,java.util.Collection,java.lang.Runnable)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendComboItemBox(String, String, List, Runnable)","url":"appendComboItemBox(java.lang.String,java.lang.String,java.util.List,java.lang.Runnable)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCsvTable(String, List)","url":"appendCsvTable(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCsvTable(String, List, String)","url":"appendCsvTable(java.lang.String,java.util.List,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDatePicker(String, String)","url":"appendDatePicker(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDatePicker(String, String, Object)","url":"appendDatePicker(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String)","url":"appendDirectoryChooser(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String, PathSelectedCallback)","url":"appendDirectoryChooser(java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String, String)","url":"appendDirectoryChooser(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String, String, PathSelectedCallback)","url":"appendDirectoryChooser(java.lang.String,java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDynamicTable(String, String, List, List, DynamicTableValueCallback)","url":"appendDynamicTable(java.lang.String,java.lang.String,java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendFormattedInformation(String, String, String)","url":"appendFormattedInformation(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendHeader(String)","url":"appendHeader(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendImage(File)","url":"appendImage(java.io.File)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendImage(String)","url":"appendImage(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendInformation(String, String, String)","url":"appendInformation(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendLabel(String, String)","url":"appendLabel(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendLocalWorkerSettings(String)","url":"appendLocalWorkerSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendMultipleChoiceComboBox(String, String, List)","url":"appendMultipleChoiceComboBox(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendMultipleChoiceComboBox(String, String, List, List)","url":"appendMultipleChoiceComboBox(java.lang.String,java.lang.String,java.util.List,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOcrSettings(String)","url":"appendOcrSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String, PathSelectedCallback)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String, String)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String, String, PathSelectedCallback)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendPasswordField(String, String, String)","url":"appendPasswordField(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendPathList(String)","url":"appendPathList(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendPathList(String, List)","url":"appendPathList(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendRadioButton(String, String, String, boolean)","url":"appendRadioButton(java.lang.String,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendRadioButtonGroup(String, String, Map)","url":"appendRadioButtonGroup(java.lang.String,java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendRadioButtonLeft(String, String, String, boolean)","url":"appendRadioButtonLeft(java.lang.String,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSaveFileChooser(String, String, String, String)","url":"appendSaveFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSaveFileChooser(String, String, String, String, String)","url":"appendSaveFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSearchableComboBox(String, String, Collection)","url":"appendSearchableComboBox(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSeparator(String)","url":"appendSeparator(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String)","url":"appendSlider(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, double)","url":"appendSlider(java.lang.String,java.lang.String,double)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, double, double, double)","url":"appendSlider(java.lang.String,java.lang.String,double,double,double)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, int)","url":"appendSlider(java.lang.String,java.lang.String,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, int, int, int)","url":"appendSlider(java.lang.String,java.lang.String,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String)","url":"appendSpinner(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String, int)","url":"appendSpinner(java.lang.String,java.lang.String,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String, int, int, int)","url":"appendSpinner(java.lang.String,java.lang.String,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String, int, int, int, int)","url":"appendSpinner(java.lang.String,java.lang.String,int,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringChoiceTable(String, String, Collection)","url":"appendStringChoiceTable(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String)","url":"appendStringList(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String, boolean)","url":"appendStringList(java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String, List)","url":"appendStringList(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String, List, boolean)","url":"appendStringList(java.lang.String,java.util.List,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendTextArea(String, String, String)","url":"appendTextArea(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendTextField(String, String, String)","url":"appendTextField(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"ArrangeableListModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"BatchExporterLoadFileSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"BatchExporterNativeSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"BatchExporterPdfSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"BatchExporterTextSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"BatchExporterTraversalSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"beforeFiltering(String, List)","url":"beforeFiltering(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"beforeFiltering(String, List)","url":"beforeFiltering(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"beginProcessing(Processor)","url":"beginProcessing(nuix.Processor)"},{"p":"com.nuix.nx.controls","c":"ButtonRow","l":"ButtonRow()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ButtonRow","l":"ButtonRow(CustomTabPanel)","url":"%3Cinit%3E(com.nuix.nx.dialogs.CustomTabPanel)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"bytesToHex(byte[])"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"calculateTotalAuditedSize(Collection)","url":"calculateTotalAuditedSize(java.util.Collection)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"checkAll()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"checkDisplayedChoices()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"checkDisplayedRecords()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T)","url":"%3Cinit%3E(T)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T, String)","url":"%3Cinit%3E(T,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T, String, String)","url":"%3Cinit%3E(T,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T, String, String, boolean)","url":"%3Cinit%3E(T,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"ChoiceDialog(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"ChoiceTableControl()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"ChoiceTableControl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"ChoiceTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"cleanPathString(String)","url":"cleanPathString(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"clear()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"clear()"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"clear()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"clearLog()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"clearSettings()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"CombinedPdfExporter(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"CombinedPdfExporter(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"ComboItem(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"ComboItemBox()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"CommonDialogs()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"compareTo(NuixVersion)","url":"compareTo(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"constrainFirstColumn()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"createFromExistingDigestLists(Collection)","url":"createFromExistingDigestLists(java.util.Collection)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"createFromExistingDigestListsByName(Collection)","url":"createFromExistingDigestListsByName(java.util.Collection)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"CsvTable(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"CsvTableModel(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"currentlyContains(byte[])"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"currentlyContains(Item)","url":"currentlyContains(nuix.Item)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"currentlyContains(String)","url":"currentlyContains(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"CustomTabPanel(String, TabbedCustomDialog)","url":"%3Cinit%3E(java.lang.String,com.nuix.nx.dialogs.TabbedCustomDialog)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModelChangeListener","l":"dataChanged()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"DataProcessingSettingsControl()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"ControlDeserializationHandler","l":"deserializeControlData(Object, Component)","url":"deserializeControlData(java.lang.Object,java.awt.Component)"},{"p":"com.nuix.nx","c":"DialogTester","l":"DialogTester()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"DigestHelper()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"DIRECTORY"},{"p":"com.nuix.nx.controls","c":"DisablingGlassPaneWrapper","l":"DisablingGlassPaneWrapper(JComponent)","url":"%3Cinit%3E(javax.swing.JComponent)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"display()"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"displayAndBeginProcessing(Processor)","url":"displayAndBeginProcessing(nuix.Processor)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"displayNonModal(Consumer)","url":"displayNonModal(java.util.function.Consumer)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"doNotSerialize(String)","url":"doNotSerialize(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"DoubleBoundedRangeModel(double, double, double, double, int)","url":"%3Cinit%3E(double,double,double,double,int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialogBlockInterface","l":"DoWork(ProgressDialog)","url":"DoWork(com.nuix.nx.dialogs.ProgressDialog)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableAllRecordsFilter","l":"DynamicTableAllRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableCheckedRecordsFilter","l":"DynamicTableCheckedRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableContainsFilter","l":"DynamicTableContainsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"DynamicTableControl(List, List, DynamicTableValueCallback)","url":"%3Cinit%3E(java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"DynamicTableFilterProvider()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"DynamicTableModel(List, List, DynamicTableValueCallback, boolean)","url":"%3Cinit%3E(java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback,boolean)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"DynamicTableRegexFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableUncheckedRecordsFilter","l":"DynamicTableUncheckedRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"embiggen(int)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledIfAnyChecked(String, String...)","url":"enabledIfAnyChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenAllChecked(String, String...)","url":"enabledOnlyWhenAllChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledOnlyWhenChecked(String, String)","url":"enabledOnlyWhenChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenChecked(String, String)","url":"enabledOnlyWhenChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenNoneChecked(String, String...)","url":"enabledOnlyWhenNoneChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledOnlyWhenNotChecked(String, String)","url":"enabledOnlyWhenNotChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenNotChecked(String, String)","url":"enabledOnlyWhenNotChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enableStickySettings(String)","url":"enableStickySettings(java.lang.String)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"exportItems(File, List, Map)","url":"exportItems(java.io.File,java.util.List,java.util.Map)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"exportItems(String, List, Map)","url":"exportItems(java.lang.String,java.util.List,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"fillScreen(int)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"findContainerAncestor(Item)","url":"findContainerAncestor(nuix.Item)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"findContainerAncestors(Collection)","url":"findContainerAncestors(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"findContainerFamilies(Collection)","url":"findContainerFamilies(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"findPhysicalFileAncestor(Item)","url":"findPhysicalFileAncestor(nuix.Item)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"findPhysicalFileAncestors(Collection)","url":"findPhysicalFileAncestors(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"findPhysicalFileFamilies(Collection)","url":"findPhysicalFileFamilies(java.util.Collection)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"fitColumns()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"forBlock(ProgressDialogBlockInterface)","url":"forBlock(com.nuix.nx.dialogs.ProgressDialogBlockInterface)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forChoices(List>, String, String)","url":"forChoices(java.util.List,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forChoices(List>, String, String, boolean)","url":"forChoices(java.util.List,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forCustodians(Case)","url":"forCustodians(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forEvidenceItems(Case)","url":"forEvidenceItems(nuix.Case)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"forItem(Item)","url":"forItem(nuix.Item)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"forItems(Collection)","url":"forItems(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"forItems(Collection, SimpleProgressCallback)","url":"forItems(java.util.Collection,com.nuix.nx.callbacks.SimpleProgressCallback)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forItemSets(Case)","url":"forItemSets(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forKinds()"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"FormatHelpers()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"formatNumber(double)"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"formatNumber(int)"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"formatNumber(long)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forProductionSets(Case)","url":"forProductionSets(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forTags(Case)","url":"forTags(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forValues(Collection, String, String)","url":"forValues(java.util.Collection,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"fromAnyAddressIn(Collection)","url":"fromAnyAddressIn(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"fromAnyAddressOutside(Collection)","url":"fromAnyAddressOutside(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"generateFamiliesQuery(Collection)","url":"generateFamiliesQuery(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"generateGuidQuery(Collection)","url":"generateGuidQuery(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"generateGuidQueryFromItems(Collection)","url":"generateGuidQueryFromItems(java.util.Collection)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"get(String)","url":"get(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getAbortButtonVisible()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getBtnAddRecord()"},{"p":"com.nuix.nx.controls","c":"StringList","l":"getBtnImportFile()"},{"p":"com.nuix.nx.controls","c":"PathList","l":"getBtnImportTextFile()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getBugfix()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getBuild()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getChangeListener()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxDeskew()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getChckbxIncludeAttachments()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getChckbxPerPage()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxRegeneratePdfs()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getChckbxRegenerateStored()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getChckbxRegenerateStored()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxUpdateItemText()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxUpdatePdfText()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getChckbxWrapLines()"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"getCheckedChoices()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedChoices()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedLabels()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCheckedRecordHashes()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getCheckedRecords()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCheckedRecords()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedValueCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCheckedValueCount()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedValues()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getChoice(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getChoices()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getChoiceTableHeight()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"getComboDedupe()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboEncoding()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getComboEncoding()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboLineSeparator()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getComboLineSeparator()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboLoadFileType()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getComboMailFormat()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getComboNaming()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getComboNaming()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getComboNaming()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboProfile()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getComboQuality()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getComboRotation()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"getComboSortOrder()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getComboTextModification()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"getComboTraversal()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getConfirmation(Component, String, String)","url":"getConfirmation(java.awt.Component,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getConfirmation(String)","url":"getConfirmation(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getConfirmation(String, String)","url":"getConfirmation(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getControl(String)","url":"getControl(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getControl(String)","url":"getControl(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getCurrent()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"getCurrentCase()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"getCurrentNuixVersion()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCustomFilterProviders()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"getDataFieldsInSection(String)","url":"getDataFieldsInSection(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"getDataFieldValue(String, String)","url":"getDataFieldValue(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getDefaultImportDirectory()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"getDefaultSettings()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getDeserializer(String)","url":"getDeserializer(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"getDialogResult()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getDialogResult()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"getDigestListDirectory()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"getDigestListLocation(String)","url":"getDigestListLocation(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getDirectory(File, String)","url":"getDirectory(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getDirectory(String, String)","url":"getDirectory(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getDisplayedChoice(int)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctBccAddresses()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctBccDomains()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctCcAddresses()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctCcDomains()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"getDistinctDigestCount()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctFromAddresses()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctFromDomains()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctRecipientAddresses()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctRecipientDomains()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctToAddresses()"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getDistinctToDomains()"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"getElementAt(int)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"getEmailDomain(String)","url":"getEmailDomain(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getExtentAsDouble()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getFirstChoiceByLabel(String)","url":"getFirstChoiceByLabel(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getFirstChoiceByValue(T)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getHeaders()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getHeaders()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getHelpFile()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"getInitialDirectory()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getInput(String)","url":"getInput(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getInput(String, String)","url":"getInput(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"getLabel()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"getLabel()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getLabel()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getLanguageChoices()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getLogAllStatusUpdates()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getLogText()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getMajor()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getMaximumAsDouble()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getMemoryPerWorker()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getMinimumAsDouble()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getMinor()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getModel()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getOutputDirectory()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"getPath()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"getPathFile()"},{"p":"com.nuix.nx.controls","c":"PathList","l":"getPathFiles()"},{"p":"com.nuix.nx.controls","c":"PathList","l":"getPaths()"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"getPlaceholderData()"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getRecords()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getRecords()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getRecords()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getRecords()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"getSections()"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"getSelectedComboItem()"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"getSelectedLabel()"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"getSelectedValue()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getSelection(String, List)","url":"getSelection(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getSelection(String, List, String)","url":"getSelection(java.lang.String,java.util.List,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getSelection(String, List, String, String)","url":"getSelection(java.lang.String,java.util.List,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getSerializer(String)","url":"getSerializer(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"getSettings()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"getSettingsJSON()"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"getSize()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getSpinnerWrapLength()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getTab(String)","url":"getTab(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getTable()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getTable()"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"getTableModel()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getTableModel()"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"getTableModel()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"getTempDirectory()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getText(String)","url":"getText(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getText(String)","url":"getText(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getTimeoutMinutes()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getTimestampLoggedMessages()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"getToolTip()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getTotalValueCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getTotalValueCount()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getTxtPath()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getTxtPath()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getTxtPath()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getTxtSuffix()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getTxtSuffix()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getTxtSuffix()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getUncheckedChoices()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getUpdateDuplicates()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"getUtilities()"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"getValue()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"getValue()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getValueAsDouble()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValueAt(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getValueCallback()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValueCount()"},{"p":"com.nuix.nx.controls","c":"StringList","l":"getValues()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValues()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getVisibleValueCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getVisibleValueCount()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getWorkerCount()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getWorkerTempDirectory()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getWorkerTempDirectoryFile()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableAllRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableCheckedRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableContainsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableUncheckedRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"hexToBytes(String)","url":"hexToBytes(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"hideFileMenu()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"hideSaveLoadResetButtons()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"incrememntSubProgress()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"incrementMainProgress()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableValueCallback","l":"interact(Object, int, boolean, Object)","url":"interact(java.lang.Object,int,boolean,java.lang.Object)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isAtLeast(NuixVersion)","url":"isAtLeast(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isAtLeast(String)","url":"isAtLeast(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"isChecked(String)","url":"isChecked(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"isChecked(String)","url":"isChecked(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"isEditable()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isEqualTo(NuixVersion)","url":"isEqualTo(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isEqualTo(String)","url":"isEqualTo(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isGreaterThan(NuixVersion)","url":"isGreaterThan(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isGreaterThan(String)","url":"isGreaterThan(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isLessThan(NuixVersion)","url":"isLessThan(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isLessThan(String)","url":"isLessThan(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"isSelected()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"isSelected(Object)","url":"isSelected(java.lang.Object)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"isSingleSelectMode()"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"itemsFromGuids(Case, List)","url":"itemsFromGuids(nuix.Case,java.util.List)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"itemsFromGuids(Case, List, int)","url":"itemsFromGuids(nuix.Case,java.util.List,int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"ItemStatisticsTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableAllRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableCheckedRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableContainsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableUncheckedRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadDefaultSettings()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"loadDigestList(File)","url":"loadDigestList(java.io.File)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"loadDigestList(String)","url":"loadDigestList(java.lang.String)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"loadDigestListByName(String)","url":"loadDigestListByName(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJson(String)","url":"loadJson(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJson(String, Map)","url":"loadJson(java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJson(String, String)","url":"loadJson(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJsonFile(String)","url":"loadJsonFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettings(Map)","url":"loadSettings(java.util.Map)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettingsJSON(String)","url":"loadSettingsJSON(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettingsJSONFile(File)","url":"loadSettingsJSONFile(java.io.File)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettingsJSONFile(String)","url":"loadSettingsJSONFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"LocalWorkerSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"log(String)","url":"log(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"log(String)","url":"log(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"logMessage(String)","url":"logMessage(java.lang.String)"},{"p":"com.nuix.nx","c":"LookAndFeelHelper","l":"LookAndFeelHelper()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"DialogTester","l":"main(String[])","url":"main(java.lang.String[])"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"mergeExistingPdfFiles(File, List)","url":"mergeExistingPdfFiles(java.io.File,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialogLoggingCallback","l":"messageLogged(String)","url":"messageLogged(java.lang.String)"},{"p":"com.nuix.nx.helpers","c":"MetadataProfileHelper","l":"MetadataProfileHelper()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"MultipleChoiceComboBox()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"noneAreChecked(String...)","url":"noneAreChecked(java.lang.String...)"},{"p":"com.nuix.nx","c":"NuixConnection","l":"NuixConnection()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int)","url":"%3Cinit%3E(int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"NxItemUtility()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"OcrSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"onAbort(Runnable)","url":"onAbort(java.lang.Runnable)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"onMessageLogged(ProgressDialogLoggingCallback)","url":"onMessageLogged(com.nuix.nx.dialogs.ProgressDialogLoggingCallback)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"onVisit(SourceItemVisitCallback)","url":"onVisit(com.nuix.nx.sourceitem.SourceItemVisitCallback)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"OPEN_FILE"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(File, String)","url":"openFileDialog(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(File, String, String, String)","url":"openFileDialog(java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(String, String)","url":"openFileDialog(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(String, String, String, String)","url":"openFileDialog(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openMultipleFilesDialog(File, String, String, String)","url":"openMultipleFilesDialog(java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openMultipleFilesDialog(String, String, String, String)","url":"openMultipleFilesDialog(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"parse(String)","url":"parse(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"PathList()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"PathSelectedCallback","l":"pathSelected(String)","url":"pathSelected(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"PathSelectionControl(PathSelectionControl.ChooserType, String, String, String)","url":"%3Cinit%3E(com.nuix.nx.controls.PathSelectionControl.ChooserType,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"PlaceholderResolver()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ProcessingFinishedListener","l":"processingFinished()"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"ProcessingStatusControl()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"ProcessingStatusDialog()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.helpers","c":"MetadataProfileHelper","l":"profileContainsField(String, MetadataProfile)","url":"profileContainsField(java.lang.String,nuix.MetadataProfile)"},{"p":"com.nuix.nx.callbacks","c":"SimpleProgressCallback","l":"progressUpdated(long, long)","url":"progressUpdated(long,long)"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel.ReportDataChangeListener","l":"propertyChange(PropertyChangeEvent)","url":"propertyChange(java.beans.PropertyChangeEvent)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"receivedByAnyAddressIn(Collection)","url":"receivedByAnyAddressIn(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"AddressStatistics","l":"receivedByAnyAddressOutside(Collection)","url":"receivedByAnyAddressOutside(java.util.Collection)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"record(ProcessedItem)","url":"record(nuix.ProcessedItem)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"refresh()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"refreshTable()"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"remove(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"remove(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"removeChangeListener(ChoiceTableModelChangeListener)","url":"removeChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"removeExcluded(Collection)","url":"removeExcluded(java.util.Collection)"},{"p":"com.nuix.nx.collections","c":"NxItemUtility","l":"removeImmaterial(Collection)","url":"removeImmaterial(java.util.Collection)"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"removeProcessingFinishedListener(ProcessingFinishedListener)","url":"removeProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"removeProcessingFinishedListener(ProcessingFinishedListener)","url":"removeProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"removePropertyChangeListener(PropertyChangeListener)","url":"removePropertyChangeListener(java.beans.PropertyChangeListener)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"removeRecordAt(int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"removeValueAt(int)"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel.ReportDataChangeListener","l":"ReportDataChangeListener()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"ReportDataModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel","l":"ReportDisplayPanel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel","l":"ReportDisplayPanel(ReportDataModel)","url":"%3Cinit%3E(com.nuix.nx.controls.models.ReportDataModel)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"resolveTemplate(String)","url":"resolveTemplate(java.lang.String)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"resolveTemplatePath(String)","url":"resolveTemplatePath(java.lang.String)"},{"p":"com.nuix.nx","c":"DialogTester","l":"runCustomDialogTest()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"SAVE_FILE"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"saveDigestList(File)","url":"saveDigestList(java.io.File)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"saveDigestList(String)","url":"saveDigestList(java.lang.String)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"saveDigestListByName(String)","url":"saveDigestListByName(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"saveFileDialog(File, String, String, String)","url":"saveFileDialog(java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"saveFileDialog(String, String, String, String)","url":"saveFileDialog(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"saveJSONFile(File)","url":"saveJSONFile(java.io.File)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"saveJsonFile(String)","url":"saveJsonFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"saveJSONFile(String)","url":"saveJSONFile(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ScrollableCustomTabPanel","l":"ScrollableCustomTabPanel(String, TabbedCustomDialog)","url":"%3Cinit%3E(java.lang.String,com.nuix.nx.dialogs.TabbedCustomDialog)"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"secondsToElapsedString(double)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"SECTION_FIELD_DELIM"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectDirectories(File, String)","url":"selectDirectories(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectDirectories(String, String)","url":"selectDirectories(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectFilesDialog(File, String)","url":"selectFilesDialog(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectFilesDialog(String, String)","url":"selectFilesDialog(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ControlSerializationHandler","l":"serializeControlData(Component)","url":"serializeControlData(java.awt.Component)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setAbortButtonVisible(boolean)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setBugfix(int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setBuild(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChangeListener(ChoiceTableModelChangeListener)","url":"setChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setChangeListener(ChoiceTableModelChangeListener)","url":"setChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setChecked(String, boolean)","url":"setChecked(java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setChecked(String, boolean)","url":"setChecked(java.lang.String,boolean)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setCheckedAtIndex(int, boolean)","url":"setCheckedAtIndex(int,boolean)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setCheckedAtIndex(int, boolean)","url":"setCheckedAtIndex(int,boolean)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setCheckedByLabels(Collection, boolean)","url":"setCheckedByLabels(java.util.Collection,boolean)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"setCheckedChoices(List)","url":"setCheckedChoices(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setCheckedRecordsFromHashes(List)","url":"setCheckedRecordsFromHashes(java.util.List)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setChoices(List>)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChoices(List>)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"setChoices(List)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChoiceSelection(Choice, boolean)","url":"setChoiceSelection(com.nuix.nx.controls.models.Choice,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setChoiceTableHeight(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChoiceTypeName(String)","url":"setChoiceTypeName(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setColumnEditable(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setColumnName(int, String)","url":"setColumnName(int,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setCompleted()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"setCurrentCase(Case)","url":"setCurrentCase(nuix.Case)"},{"p":"com.nuix.nx","c":"NuixConnection","l":"setCurrentNuixVersion(String)","url":"setCurrentNuixVersion(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setCustomFilterProviders(List)","url":"setCustomFilterProviders(java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setDate(String, Object)","url":"setDate(java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setDefaultCheckState(boolean)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setDefaultCheckState(boolean)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"setDefaultImportDirectory(String)","url":"setDefaultImportDirectory(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettings(Map)","url":"setDefaultSettings(java.util.Map)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettingsFromJSON(String)","url":"setDefaultSettingsFromJSON(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettingsFromJSONFile(File)","url":"setDefaultSettingsFromJSONFile(java.io.File)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettingsFromJSONFile(String)","url":"setDefaultSettingsFromJSONFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setDirectoriesButtonVisible(boolean)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"setEditable(boolean)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"setEditable(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setExtent(double)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setFilesButtonVisible(boolean)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setHelpFile(File)","url":"setHelpFile(java.io.File)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setHelpFile(String)","url":"setHelpFile(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setHelpUrl(String)","url":"setHelpUrl(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setInitialDirectory(String)","url":"setInitialDirectory(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setLogAllStatusUpdates(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setLogVisible(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainProgress(int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainProgress(int, int)","url":"setMainProgress(int,int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainProgressVisible(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainStatus(String)","url":"setMainStatus(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainStatusAndLogIt(String)","url":"setMainStatusAndLogIt(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setMajor(int)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setMaximum(double)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setMemoryPerWorker(int)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setMinimum(double)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setMinor(int)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"setPath(String, String)","url":"setPath(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setPathFieldEditable(boolean)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setPaths(List)","url":"setPaths(java.util.List)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setRecords(List)","url":"setRecords(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setRecords(List)","url":"setRecords(java.util.List)"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel","l":"setReportDataModel(ReportDataModel)","url":"setReportDataModel(com.nuix.nx.controls.models.ReportDataModel)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setReportDisplayVisible(boolean)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setSelected(boolean)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setSelectedComboItem(ComboItem)","url":"setSelectedComboItem(com.nuix.nx.controls.ComboItem)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setSelectedLabel(String)","url":"setSelectedLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setSelectedTabIndex(int)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setSelectedValue(String)","url":"setSelectedValue(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setSingleSelectMode(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubProgress(int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubProgress(int, int)","url":"setSubProgress(int,int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubProgressVisible(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubStatus(String)","url":"setSubStatus(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubStatusAndLogIt(String)","url":"setSubStatusAndLogIt(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setTabLabel(String, String)","url":"setTabLabel(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setTableCellRenderer(Class, TableCellRenderer)","url":"setTableCellRenderer(java.lang.Class,javax.swing.table.TableCellRenderer)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setTableModel(ChoiceTableModel)","url":"setTableModel(com.nuix.nx.controls.models.ChoiceTableModel)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"setTableModel(ChoiceTableModel)","url":"setTableModel(com.nuix.nx.controls.models.ChoiceTableModel)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setTableModel(DynamicTableModel)","url":"setTableModel(com.nuix.nx.controls.models.DynamicTableModel)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setTabPlacement(int)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setTabPlacementLeft()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"setTempDirectory(File)","url":"setTempDirectory(java.io.File)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"setTempDirectory(String)","url":"setTempDirectory(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setText(String, String)","url":"setText(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setText(String, String)","url":"setText(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setTextWrapping(boolean)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"setTimeoutMinutes(int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setTimestampLoggedMessages(boolean)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setToolTip(String)","url":"setToolTip(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"setUpdateDuplicates(boolean)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setUserCanAddRecords(boolean, Supplier)","url":"setUserCanAddRecords(boolean,java.util.function.Supplier)"},{"p":"com.nuix.nx","c":"NuixConnection","l":"setUtilities(Utilities)","url":"setUtilities(nuix.Utilities)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setValue(double)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setValue(T)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx","c":"LookAndFeelHelper","l":"setWindowsIfMetal()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setWorkerCount(int)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setWorkerTempDirectory(String)","url":"setWorkerTempDirectory(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRows(int[], int)","url":"shiftRows(int[],int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"shiftRows(int[], int)","url":"shiftRows(int[],int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRows(List>, int)","url":"shiftRows(java.util.List,int)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"shiftRowsDown(int, int)","url":"shiftRowsDown(int,int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRowsDown(int[])"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"shiftRowsDown(int[])"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"shiftRowsUp(int, int)","url":"shiftRowsUp(int,int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRowsUp(int[])"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"shiftRowsUp(int[])"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showError(String)","url":"showError(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showError(String, String)","url":"showError(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showInformation(String)","url":"showInformation(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showInformation(String, String)","url":"showInformation(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showMessage(String)","url":"showMessage(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showMessage(String, String)","url":"showMessage(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showWarning(String)","url":"showWarning(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showWarning(String, String)","url":"showWarning(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"size()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"sortCheckedToTop()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"sortChoicesToTop(List)","url":"sortChoicesToTop(java.util.List)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"SourceItemVisitor()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"StringList","l":"StringList()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"StringListTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModelChangeListener","l":"structureChanged()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"TabbedCustomDialog()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"TabbedCustomDialog(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"toJson()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"toJson()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"toMap()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"toMap()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"toMap(boolean)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"toMap(boolean)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"toString()"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"toString()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"trackComponent(String, Component)","url":"trackComponent(java.lang.String,java.awt.Component)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"uncheckAll()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"uncheckAllChoices()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"uncheckDisplayedChoices()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"uncheckDisplayedRecords()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"updateData(String, String, Object)","url":"updateData(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.dialogs","c":"ValidationCallback","l":"validate(Map)","url":"validate(java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"validateBeforeClosing(ValidationCallback)","url":"validateBeforeClosing(com.nuix.nx.dialogs.ValidationCallback)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"values()"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"visit(File, Map, Map)","url":"visit(java.io.File,java.util.Map,java.util.Map)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"visit(String, Map, Map)","url":"visit(java.lang.String,java.util.Map,java.util.Map)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitCallback","l":"visitSourceItem(SourceItem)","url":"visitSourceItem(nuix.SourceItem)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"whenDeserializing(String, ControlDeserializationHandler)","url":"whenDeserializing(java.lang.String,com.nuix.nx.controls.models.ControlDeserializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"whenDeserializing(String, ControlDeserializationHandler)","url":"whenDeserializing(java.lang.String,com.nuix.nx.controls.models.ControlDeserializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"whenJsonFileLoaded(Runnable)","url":"whenJsonFileLoaded(java.lang.Runnable)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"whenPathSelected(PathSelectedCallback)","url":"whenPathSelected(com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"whenSerializing(String, ControlSerializationHandler)","url":"whenSerializing(java.lang.String,com.nuix.nx.controls.models.ControlSerializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"whenSerializing(String, ControlSerializationHandler)","url":"whenSerializing(java.lang.String,com.nuix.nx.controls.models.ControlSerializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"whenTextChanged(String, Consumer)","url":"whenTextChanged(java.lang.String,java.util.function.Consumer)"}] \ No newline at end of file +memberSearchIndex = [{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"abortWasRequested()"},{"p":"com.nuix.nx.controls","c":"DisablingGlassPaneWrapper","l":"activateGlassPane(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ScrollableCustomTabPanel","l":"add(Component)","url":"add(java.awt.Component)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"addAllItems(Collection)","url":"addAllItems(java.util.Collection)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"addAllMd5ByteArrays(Collection)","url":"addAllMd5ByteArrays(java.util.Collection)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"addAllMd5Strings(Collection)","url":"addAllMd5Strings(java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addBasicLabelledComponent(String, Component, boolean, boolean)","url":"addBasicLabelledComponent(java.lang.String,java.awt.Component,boolean,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addBasicLabelledComponent(String, Component, boolean)","url":"addBasicLabelledComponent(java.lang.String,java.awt.Component,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addBasicLabelledComponent(String, Component)","url":"addBasicLabelledComponent(java.lang.String,java.awt.Component)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"addChoice(Choice)","url":"addChoice(com.nuix.nx.controls.models.Choice)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"addChoice(Choice)","url":"addChoice(com.nuix.nx.controls.models.Choice)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addComponent(Component, GridBagConstraints)","url":"addComponent(java.awt.Component,java.awt.GridBagConstraints)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addComponent(Component, int, int, int, int, boolean)","url":"addComponent(java.awt.Component,int,int,int,int,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addComponent(Component, int, int, int, int, double, double)","url":"addComponent(java.awt.Component,int,int,int,int,double,double)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addComponent(Component, int, int, int, int)","url":"addComponent(java.awt.Component,int,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addComponent(Component, int)","url":"addComponent(java.awt.Component,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"addComponents(Component, Component)","url":"addComponents(java.awt.Component,java.awt.Component)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addData(String, String, Object)","url":"addData(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"addData(String, String, Object)","url":"addData(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"addElement(E)"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"addElement(E)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"addMenu(String, String, Runnable)","url":"addMenu(java.lang.String,java.lang.String,java.lang.Runnable)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"addPath(String)","url":"addPath(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"addProcessingFinishedListener(ProcessingFinishedListener)","url":"addProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"addProcessingFinishedListener(ProcessingFinishedListener)","url":"addProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addPropertyChangeListener(PropertyChangeListener)","url":"addPropertyChangeListener(java.beans.PropertyChangeListener)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"addPropertyChangeListener(PropertyChangeListener)","url":"addPropertyChangeListener(java.beans.PropertyChangeListener)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"addRecord(Map)","url":"addRecord(java.util.Map)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"addRecord(Map)","url":"addRecord(java.util.Map)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"addRecord(Map)","url":"addRecord(java.util.Map)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"addRecord(Object)","url":"addRecord(java.lang.Object)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"addRecord(Object)","url":"addRecord(java.lang.Object)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"addReport(ReportDataModel)","url":"addReport(com.nuix.nx.controls.models.ReportDataModel)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"addScrollableTab(String, String)","url":"addScrollableTab(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addSection(String, Map)","url":"addSection(java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"addSection(String, Map)","url":"addSection(java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"addSection(String)","url":"addSection(java.lang.String)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"addSection(String)","url":"addSection(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"addTab(String, String)","url":"addTab(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"addValue(ComboItem)","url":"addValue(com.nuix.nx.controls.ComboItem)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"addValue(String, String)","url":"addValue(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"addValue(String)","url":"addValue(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"addValue(String)","url":"addValue(java.lang.String)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"addValue(String)","url":"addValue(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"afterFiltering()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"afterFiltering()"},{"p":"com.nuix.nx.filters","c":"DynamicTableFilterProvider","l":"afterFiltering()"},{"p":"com.nuix.nx.filters","c":"DynamicTableRegexFilter","l":"afterFiltering()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"allAreChecked(String...)","url":"allAreChecked(java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"anyAreChecked(String...)","url":"anyAreChecked(java.lang.String...)"},{"p":"com.nuix.logging","c":"LogEventCallbackAppender","l":"append(LogEvent)","url":"append(org.apache.logging.log4j.core.LogEvent)"},{"p":"com.nuix.logging","c":"LogMessageCallbackAppender","l":"append(LogEvent)","url":"append(org.apache.logging.log4j.core.LogEvent)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterLoadFileSettings(String)","url":"appendBatchExporterLoadFileSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterNativeSettings(String)","url":"appendBatchExporterNativeSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterPdfSettings(String)","url":"appendBatchExporterPdfSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterTextSettings(String)","url":"appendBatchExporterTextSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendBatchExporterTraversalSettings(String)","url":"appendBatchExporterTraversalSettings(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ButtonRow","l":"appendButton(String, String, ActionListener)","url":"appendButton(java.lang.String,java.lang.String,java.awt.event.ActionListener)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendButton(String, String, ActionListener)","url":"appendButton(java.lang.String,java.lang.String,java.awt.event.ActionListener)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendButtonRow(String)","url":"appendButtonRow(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCheckableTextField(String, boolean, String, String, String)","url":"appendCheckableTextField(java.lang.String,boolean,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCheckBox(String, String, boolean)","url":"appendCheckBox(java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCheckBoxes(String, String, boolean, String, String, boolean)","url":"appendCheckBoxes(java.lang.String,java.lang.String,boolean,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendChoiceTable(String, String, List>)","url":"appendChoiceTable(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendComboBox(String, String, Collection, Runnable)","url":"appendComboBox(java.lang.String,java.lang.String,java.util.Collection,java.lang.Runnable)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendComboBox(String, String, Collection)","url":"appendComboBox(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendComboItemBox(String, String, List, Runnable)","url":"appendComboItemBox(java.lang.String,java.lang.String,java.util.List,java.lang.Runnable)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCsvTable(String, List, String)","url":"appendCsvTable(java.lang.String,java.util.List,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendCsvTable(String, List)","url":"appendCsvTable(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDatePicker(String, String, Object)","url":"appendDatePicker(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDatePicker(String, String)","url":"appendDatePicker(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String, PathSelectedCallback)","url":"appendDirectoryChooser(java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String, String, PathSelectedCallback)","url":"appendDirectoryChooser(java.lang.String,java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String, String)","url":"appendDirectoryChooser(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDirectoryChooser(String, String)","url":"appendDirectoryChooser(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendDynamicTable(String, String, List, List, DynamicTableValueCallback)","url":"appendDynamicTable(java.lang.String,java.lang.String,java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendFormattedInformation(String, String, String)","url":"appendFormattedInformation(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendHeader(String)","url":"appendHeader(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendImage(File)","url":"appendImage(java.io.File)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendImage(String)","url":"appendImage(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendInformation(String, String, String)","url":"appendInformation(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendLabel(String, String)","url":"appendLabel(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendLocalWorkerSettings(String)","url":"appendLocalWorkerSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendMultipleChoiceComboBox(String, String, List, List)","url":"appendMultipleChoiceComboBox(java.lang.String,java.lang.String,java.util.List,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendMultipleChoiceComboBox(String, String, List)","url":"appendMultipleChoiceComboBox(java.lang.String,java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOcrSettings(String)","url":"appendOcrSettings(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String, PathSelectedCallback)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String, String, PathSelectedCallback)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String, String)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendOpenFileChooser(String, String, String, String)","url":"appendOpenFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendPasswordField(String, String, String)","url":"appendPasswordField(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendPathList(String, List)","url":"appendPathList(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendPathList(String)","url":"appendPathList(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendRadioButton(String, String, String, boolean)","url":"appendRadioButton(java.lang.String,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendRadioButtonGroup(String, String, Map)","url":"appendRadioButtonGroup(java.lang.String,java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendRadioButtonLeft(String, String, String, boolean)","url":"appendRadioButtonLeft(java.lang.String,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSaveFileChooser(String, String, String, String, String)","url":"appendSaveFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSaveFileChooser(String, String, String, String)","url":"appendSaveFileChooser(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSearchableComboBox(String, String, Collection)","url":"appendSearchableComboBox(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSeparator(String)","url":"appendSeparator(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, double, double, double)","url":"appendSlider(java.lang.String,java.lang.String,double,double,double)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, double)","url":"appendSlider(java.lang.String,java.lang.String,double)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, int, int, int)","url":"appendSlider(java.lang.String,java.lang.String,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String, int)","url":"appendSlider(java.lang.String,java.lang.String,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSlider(String, String)","url":"appendSlider(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String, int, int, int, int)","url":"appendSpinner(java.lang.String,java.lang.String,int,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String, int, int, int)","url":"appendSpinner(java.lang.String,java.lang.String,int,int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String, int)","url":"appendSpinner(java.lang.String,java.lang.String,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendSpinner(String, String)","url":"appendSpinner(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringChoiceTable(String, String, Collection)","url":"appendStringChoiceTable(java.lang.String,java.lang.String,java.util.Collection)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String, boolean)","url":"appendStringList(java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String, List, boolean)","url":"appendStringList(java.lang.String,java.util.List,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String, List)","url":"appendStringList(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendStringList(String)","url":"appendStringList(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendTextArea(String, String, String)","url":"appendTextArea(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"appendTextField(String, String, String)","url":"appendTextField(java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"ArrangeableListModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"ArrangeableListModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.logging","c":"LogHelper","l":"attachConsoleAppender(String, Filter)","url":"attachConsoleAppender(java.lang.String,org.apache.logging.log4j.core.Filter)"},{"p":"com.nuix.logging","c":"LogHelper","l":"attachConsoleAppender(String, Function)","url":"attachConsoleAppender(java.lang.String,java.util.function.Function)"},{"p":"com.nuix.logging","c":"LogHelper","l":"attachLogAppender(Appender)","url":"attachLogAppender(org.apache.logging.log4j.core.Appender)"},{"p":"com.nuix.logging","c":"LogHelper","l":"attachLogMessageCallbackAppender(String, Collection, Consumer)","url":"attachLogMessageCallbackAppender(java.lang.String,java.util.Collection,java.util.function.Consumer)"},{"p":"com.nuix.logging","c":"LogHelper","l":"attachLogMessageCallbackAppender(String, Consumer)","url":"attachLogMessageCallbackAppender(java.lang.String,java.util.function.Consumer)"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"BatchExporterLoadFileSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"BatchExporterNativeSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"BatchExporterPdfSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"BatchExporterTextSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"BatchExporterTraversalSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"beforeFiltering(String, List)","url":"beforeFiltering(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"beforeFiltering(String, List)","url":"beforeFiltering(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.filters","c":"DynamicTableFilterProvider","l":"beforeFiltering(String, List)","url":"beforeFiltering(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.filters","c":"DynamicTableRegexFilter","l":"beforeFiltering(String, List)","url":"beforeFiltering(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"beginProcessing(Processor)","url":"beginProcessing(nuix.Processor)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"buildGenericSlider(String, String, BoundedRangeModel, Consumer)","url":"buildGenericSlider(java.lang.String,java.lang.String,javax.swing.BoundedRangeModel,java.util.function.Consumer)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"buttonGroups"},{"p":"com.nuix.nx.controls","c":"ButtonRow","l":"ButtonRow()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ButtonRow","l":"ButtonRow(CustomTabPanel)","url":"%3Cinit%3E(com.nuix.nx.dialogs.CustomTabPanel)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"bytesToHex(byte[])"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"checkAll()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"checkDisplayedChoices()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"checkDisplayedChoices()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"checkDisplayedRecords()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"checkDisplayedRecords()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.models","c":"Choice","l":"Choice()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T, String, String, boolean)","url":"%3Cinit%3E(T,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.models","c":"Choice","l":"Choice(T, String, String, boolean)","url":"%3Cinit%3E(T,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T, String, String)","url":"%3Cinit%3E(T,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.models","c":"Choice","l":"Choice(T, String, String)","url":"%3Cinit%3E(T,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T, String)","url":"%3Cinit%3E(T,java.lang.String)"},{"p":"com.nuix.nx.models","c":"Choice","l":"Choice(T, String)","url":"%3Cinit%3E(T,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"Choice(T)","url":"%3Cinit%3E(T)"},{"p":"com.nuix.nx.models","c":"Choice","l":"Choice(T)","url":"%3Cinit%3E(T)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"ChoiceDialog(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"ChoiceTableControl()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"ChoiceTableControl(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"ChoiceTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"ChoiceTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"cleanPathString(String)","url":"cleanPathString(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"clear()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"clear()"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"clear()"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"clear()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"clearLog()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"clearSettings()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"CombinedPdfExporter(File)","url":"%3Cinit%3E(java.io.File)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"CombinedPdfExporter(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"ComboItem(String, String)","url":"%3Cinit%3E(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"ComboItemBox()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"CommonDialogs()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"compareTo(NuixVersion)","url":"compareTo(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"confirmAbort()"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"constrainFirstColumn()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"CONTROL_COLUMN_WIDTH"},{"p":"com.nuix.logging","c":"LogHelper","l":"createAcceptAllFilter()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"createFromExistingDigestLists(Collection)","url":"createFromExistingDigestLists(java.util.Collection)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"createFromExistingDigestListsByName(Collection)","url":"createFromExistingDigestListsByName(java.util.Collection)"},{"p":"com.nuix.logging","c":"LogHelper","l":"createPassFailFilter(Function)","url":"createPassFailFilter(java.util.function.Function)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"CsvTable(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"CsvTableModel(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"CsvTableModel(List)","url":"%3Cinit%3E(java.util.List)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"currentlyContains(byte[])"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"currentlyContains(Item)","url":"currentlyContains(nuix.Item)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"currentlyContains(String)","url":"currentlyContains(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"CustomTabPanel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"CustomTabPanel(String, TabbedCustomDialog)","url":"%3Cinit%3E(java.lang.String,com.nuix.nx.dialogs.TabbedCustomDialog)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModelChangeListener","l":"dataChanged()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModelChangeListener","l":"dataChanged()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"DataProcessingSettingsControl()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"ControlDeserializationHandler","l":"deserializeControlData(Object, Component)","url":"deserializeControlData(java.lang.Object,java.awt.Component)"},{"p":"com.nuix.nx.models","c":"ControlDeserializationHandler","l":"deserializeControlData(Object, Component)","url":"deserializeControlData(java.lang.Object,java.awt.Component)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"DigestHelper()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"DIRECTORY"},{"p":"com.nuix.nx.controls","c":"DisablingGlassPaneWrapper","l":"DisablingGlassPaneWrapper(JComponent)","url":"%3Cinit%3E(javax.swing.JComponent)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"display()"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"displayAndBeginProcessing(Processor)","url":"displayAndBeginProcessing(nuix.Processor)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"displayNonModal(Consumer)","url":"displayNonModal(java.util.function.Consumer)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"doNotSerialize(String)","url":"doNotSerialize(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"DoubleBoundedRangeModel(double, double, double, double, int)","url":"%3Cinit%3E(double,double,double,double,int)"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"DoubleBoundedRangeModel(double, double, double, double, int)","url":"%3Cinit%3E(double,double,double,double,int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialogBlockInterface","l":"DoWork(ProgressDialog)","url":"DoWork(com.nuix.nx.dialogs.ProgressDialog)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableAllRecordsFilter","l":"DynamicTableAllRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.filters","c":"DynamicTableAllRecordsFilter","l":"DynamicTableAllRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableCheckedRecordsFilter","l":"DynamicTableCheckedRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.filters","c":"DynamicTableCheckedRecordsFilter","l":"DynamicTableCheckedRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableContainsFilter","l":"DynamicTableContainsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.filters","c":"DynamicTableContainsFilter","l":"DynamicTableContainsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"DynamicTableControl(List, List, DynamicTableValueCallback)","url":"%3Cinit%3E(java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"DynamicTableFilterProvider()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.filters","c":"DynamicTableFilterProvider","l":"DynamicTableFilterProvider()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"DynamicTableModel(List, List, DynamicTableValueCallback, boolean)","url":"%3Cinit%3E(java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback,boolean)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"DynamicTableModel(List, List, DynamicTableValueCallback, boolean)","url":"%3Cinit%3E(java.util.List,java.util.List,com.nuix.nx.controls.models.DynamicTableValueCallback,boolean)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"DynamicTableRegexFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.filters","c":"DynamicTableRegexFilter","l":"DynamicTableRegexFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableUncheckedRecordsFilter","l":"DynamicTableUncheckedRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.filters","c":"DynamicTableUncheckedRecordsFilter","l":"DynamicTableUncheckedRecordsFilter()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"embiggen(int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledIfAnyChecked(String, String...)","url":"enabledIfAnyChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledIfAnyChecked(String, String...)","url":"enabledIfAnyChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledOnlyWhenAllChecked(String, String...)","url":"enabledOnlyWhenAllChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenAllChecked(String, String...)","url":"enabledOnlyWhenAllChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledOnlyWhenChecked(String, String)","url":"enabledOnlyWhenChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenChecked(String, String)","url":"enabledOnlyWhenChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledOnlyWhenNoneChecked(String, String...)","url":"enabledOnlyWhenNoneChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenNoneChecked(String, String...)","url":"enabledOnlyWhenNoneChecked(java.lang.String,java.lang.String...)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"enabledOnlyWhenNotChecked(String, String)","url":"enabledOnlyWhenNotChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enabledOnlyWhenNotChecked(String, String)","url":"enabledOnlyWhenNotChecked(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"enableStickySettings(String)","url":"enableStickySettings(java.lang.String)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"exportItems(File, List, Map)","url":"exportItems(java.io.File,java.util.List,java.util.Map)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"exportItems(String, List, Map)","url":"exportItems(java.lang.String,java.util.List,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"fillScreen(int)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"firePathSelected()"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"fitColumns()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"forBlock(ProgressDialogBlockInterface)","url":"forBlock(com.nuix.nx.dialogs.ProgressDialogBlockInterface)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forChoices(List>, String, String, boolean)","url":"forChoices(java.util.List,java.lang.String,java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forChoices(List>, String, String)","url":"forChoices(java.util.List,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forCustodians(Case)","url":"forCustodians(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forEvidenceItems(Case)","url":"forEvidenceItems(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forItemSets(Case)","url":"forItemSets(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forKinds()"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"FormatHelpers()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"formatNumber(double)"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"formatNumber(int)"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"formatNumber(long)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forProductionSets(Case)","url":"forProductionSets(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forTags(Case)","url":"forTags(nuix.Case)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"forValues(Collection, String, String)","url":"forValues(java.util.Collection,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"get(String)","url":"get(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getAbortButtonVisible()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getBtnAddRecord()"},{"p":"com.nuix.nx.controls","c":"StringList","l":"getBtnImportFile()"},{"p":"com.nuix.nx.controls","c":"PathList","l":"getBtnImportTextFile()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getBugfix()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getBuild()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getChangeListener()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getChangeListener()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxDeskew()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getChckbxIncludeAttachments()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getChckbxPerPage()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxRegeneratePdfs()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getChckbxRegenerateStored()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getChckbxRegenerateStored()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxUpdateItemText()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getChckbxUpdatePdfText()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getChckbxWrapLines()"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"getCheckedChoices()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedChoices()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getCheckedChoices()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedLabels()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getCheckedLabels()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCheckedRecordHashes()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getCheckedRecordHashes()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getCheckedRecords()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCheckedRecords()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getCheckedRecords()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedValueCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCheckedValueCount()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getCheckedValueCount()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getCheckedValueCount()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getCheckedValues()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getCheckedValues()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getChoice(int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getChoice(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getChoices()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getChoices()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getChoiceTableHeight()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getColumnClass(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getColumnCount()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getColumnName(int)"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"getComboDedupe()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboEncoding()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getComboEncoding()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboLineSeparator()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getComboLineSeparator()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboLoadFileType()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getComboMailFormat()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getComboNaming()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getComboNaming()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getComboNaming()"},{"p":"com.nuix.nx.controls","c":"BatchExporterLoadFileSettings","l":"getComboProfile()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getComboQuality()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getComboRotation()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"getComboSortOrder()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getComboTextModification()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"getComboTraversal()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getConfirmation(Component, String, String)","url":"getConfirmation(java.awt.Component,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getConfirmation(String, String)","url":"getConfirmation(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getConfirmation(String)","url":"getConfirmation(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getControl(String)","url":"getControl(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getControl(String)","url":"getControl(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getCurrent()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"getCurrentCase()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"getCurrentNuixVersion()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getCustomFilterProviders()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getCustomFilterProviders()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"getDataFieldsInSection(String)","url":"getDataFieldsInSection(java.lang.String)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"getDataFieldsInSection(String)","url":"getDataFieldsInSection(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"getDataFieldValue(String, String)","url":"getDataFieldValue(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"getDataFieldValue(String, String)","url":"getDataFieldValue(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getDefaultImportDirectory()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"getDefaultSettings()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getDeserializer(String)","url":"getDeserializer(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"getDialogResult()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getDialogResult()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"getDigestListDirectory()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"getDigestListLocation(String)","url":"getDigestListLocation(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getDirectory(File, String)","url":"getDirectory(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getDirectory(String, String)","url":"getDirectory(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getDisplayedChoice(int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getDisplayedChoice(int)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"getDistinctDigestCount()"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"getElementAt(int)"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"getElementAt(int)"},{"p":"com.nuix.logging","c":"LogEventCallbackAppender","l":"getEventConsumer()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getExtentAsDouble()"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"getExtentAsDouble()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getFirstChoiceByLabel(String)","url":"getFirstChoiceByLabel(java.lang.String)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getFirstChoiceByLabel(String)","url":"getFirstChoiceByLabel(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getFirstChoiceByValue(T)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getFirstChoiceByValue(T)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getHeaders()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getHeaders()"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"getHeaders()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getHelpFile()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"getInitialDirectory()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getInput(String, String)","url":"getInput(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getInput(String)","url":"getInput(java.lang.String)"},{"p":"com.nuix.logging","c":"LogHelper","l":"getInstance()"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"getLabel()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"getLabel()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getLabel()"},{"p":"com.nuix.nx.models","c":"Choice","l":"getLabel()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getLanguageChoices()"},{"p":"com.nuix.nx.dialogs","c":"Toast","l":"getLastMessage()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getLogAllStatusUpdates()"},{"p":"com.nuix.logging","c":"LogHelper","l":"getLogger()"},{"p":"com.nuix.logging","c":"LogHelper","l":"getLogger(String)","url":"getLogger(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getLogText()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getMajor()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getMaximumAsDouble()"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"getMaximumAsDouble()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getMemoryPerWorker()"},{"p":"com.nuix.logging","c":"LogMessageCallbackAppender","l":"getMessageConsumer()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getMinimumAsDouble()"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"getMinimumAsDouble()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"getMinor()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getModel()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getOutputDirectory()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"getPath()"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"getPathFile()"},{"p":"com.nuix.nx.controls","c":"PathList","l":"getPathFiles()"},{"p":"com.nuix.nx.controls","c":"PathList","l":"getPaths()"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"getPlaceholderData()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getRecordHashes(List)","url":"getRecordHashes(java.util.List)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getRecordHashes(List)","url":"getRecordHashes(java.util.List)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getRecords()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getRecords()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getRecords()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getRecords()"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"getRecords()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getRecords()"},{"p":"com.nuix.logging","c":"LogHelper","l":"getRootLoggerLevel()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getRowCount()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"getSections()"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"getSections()"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"getSelectedComboItem()"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"getSelectedLabel()"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"getSelectedValue()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getSelection(String, List, String, String)","url":"getSelection(java.lang.String,java.util.List,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getSelection(String, List, String)","url":"getSelection(java.lang.String,java.util.List,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"getSelection(String, List)","url":"getSelection(java.lang.String,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getSerializer(String)","url":"getSerializer(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"getSettings()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"getSettingsJSON()"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"getSize()"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"getSize()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getSpinnerWrapLength()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getTab(String)","url":"getTab(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"getTable()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getTable()"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"getTableModel()"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"getTableModel()"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"getTableModel()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"getTempDirectory()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"getText(String)","url":"getText(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"getText(String)","url":"getText(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getTimeoutMinutes()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"getTimestampLoggedMessages()"},{"p":"com.nuix.nx.dialogs","c":"Toast","l":"getToastTimeInSeconds()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"getToolTip()"},{"p":"com.nuix.nx.models","c":"Choice","l":"getToolTip()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getTotalValueCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getTotalValueCount()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getTotalValueCount()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getTotalValueCount()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getTxtPath()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getTxtPath()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getTxtPath()"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"getTxtSuffix()"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"getTxtSuffix()"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"getTxtSuffix()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getUncheckedChoices()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getUncheckedChoices()"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"getUpdateDuplicates()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"getUtilities()"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"getValue()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"getValue()"},{"p":"com.nuix.nx.models","c":"Choice","l":"getValue()"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"getValueAsDouble()"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"getValueAsDouble()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getValueAt(int, int)","url":"getValueAt(int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValueAt(int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getValueAt(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getValueCallback()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getValueCallback()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValueCount()"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getValueCount()"},{"p":"com.nuix.nx.controls","c":"StringList","l":"getValues()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"getValues()"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"getValues()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"getVisibleValueCount()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"getVisibleValueCount()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"getVisibleValueCount()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"getVisibleValueCount()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getWorkerCount()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getWorkerTempDirectory()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"getWorkerTempDirectoryFile()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableAllRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableCheckedRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableContainsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableUncheckedRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.filters","c":"DynamicTableAllRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.filters","c":"DynamicTableCheckedRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.filters","c":"DynamicTableContainsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.filters","c":"DynamicTableFilterProvider","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.filters","c":"DynamicTableRegexFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.filters","c":"DynamicTableUncheckedRecordsFilter","l":"handlesExpression(String)","url":"handlesExpression(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"hashRecord(Object)","url":"hashRecord(java.lang.Object)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"hashRecord(Object)","url":"hashRecord(java.lang.Object)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"hexToBytes(String)","url":"hexToBytes(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"hideFileMenu()"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"hideSaveLoadResetButtons()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"incrememntSubProgress()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"incrementMainProgress()"},{"p":"com.nuix.logging","c":"LogHelper","l":"initAlternateLogFile(File, String, Filter)","url":"initAlternateLogFile(java.io.File,java.lang.String,org.apache.logging.log4j.core.Filter)"},{"p":"com.nuix.logging","c":"LogHelper","l":"initAlternateLogFile(File, String, Function)","url":"initAlternateLogFile(java.io.File,java.lang.String,java.util.function.Function)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"initDataBindings()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableValueCallback","l":"interact(Object, int, boolean, Object)","url":"interact(java.lang.Object,int,boolean,java.lang.Object)"},{"p":"com.nuix.nx.models","c":"DynamicTableValueCallback","l":"interact(Object, int, boolean, Object)","url":"interact(java.lang.Object,int,boolean,java.lang.Object)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isAtLeast(NuixVersion)","url":"isAtLeast(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isAtLeast(String)","url":"isAtLeast(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"isCellEditable(int, int)","url":"isCellEditable(int,int)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"isChecked(String)","url":"isChecked(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"isChecked(String)","url":"isChecked(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"isEditable()"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"isEditable()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isEqualTo(NuixVersion)","url":"isEqualTo(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isEqualTo(String)","url":"isEqualTo(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isGreaterThan(NuixVersion)","url":"isGreaterThan(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isGreaterThan(String)","url":"isGreaterThan(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isLessThan(NuixVersion)","url":"isLessThan(com.nuix.nx.NuixVersion)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"isLessThan(String)","url":"isLessThan(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"isSelected()"},{"p":"com.nuix.nx.models","c":"Choice","l":"isSelected()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"isSelected(Object)","url":"isSelected(java.lang.Object)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"isSelected(Object)","url":"isSelected(java.lang.Object)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"isSingleSelectMode()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"isSingleSelectMode()"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"ItemStatisticsTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"ItemStatisticsTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableAllRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableCheckedRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableContainsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableFilterProvider","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableRegexFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.controls.filters","c":"DynamicTableUncheckedRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.filters","c":"DynamicTableAllRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.filters","c":"DynamicTableCheckedRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.filters","c":"DynamicTableContainsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.filters","c":"DynamicTableFilterProvider","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.filters","c":"DynamicTableRegexFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.filters","c":"DynamicTableUncheckedRecordsFilter","l":"keepRecord(int, boolean, String, Object, Map)","url":"keepRecord(int,boolean,java.lang.String,java.lang.Object,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"label"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"LABEL_COLUMN_WIDTH"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadDefaultSettings()"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"loadDigestList(File)","url":"loadDigestList(java.io.File)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"loadDigestList(String)","url":"loadDigestList(java.lang.String)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"loadDigestListByName(String)","url":"loadDigestListByName(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJson(String, Map)","url":"loadJson(java.lang.String,java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJson(String, String)","url":"loadJson(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJson(String)","url":"loadJson(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"loadJsonFile(String)","url":"loadJsonFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettings(Map)","url":"loadSettings(java.util.Map)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettingsJSON(String)","url":"loadSettingsJSON(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettingsJSONFile(File)","url":"loadSettingsJSONFile(java.io.File)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"loadSettingsJSONFile(String)","url":"loadSettingsJSONFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"LocalWorkerSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"log(String)","url":"log(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"log(String)","url":"log(java.lang.String)"},{"p":"com.nuix.logging","c":"LogEventCallbackAppender","l":"LogEventCallbackAppender(String, Filter)","url":"%3Cinit%3E(java.lang.String,org.apache.logging.log4j.core.Filter)"},{"p":"com.nuix.logging","c":"LogEventCallbackAppender","l":"LogEventCallbackAppender(String, Function)","url":"%3Cinit%3E(java.lang.String,java.util.function.Function)"},{"p":"com.nuix.logging","c":"LogEventCallbackAppender","l":"LogEventCallbackAppender(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"logMessage(String)","url":"logMessage(java.lang.String)"},{"p":"com.nuix.logging","c":"LogMessageCallbackAppender","l":"LogMessageCallbackAppender(String, Layout, Filter)","url":"%3Cinit%3E(java.lang.String,org.apache.logging.log4j.core.Layout,org.apache.logging.log4j.core.Filter)"},{"p":"com.nuix.logging","c":"LogMessageCallbackAppender","l":"LogMessageCallbackAppender(String, Layout, Function)","url":"%3Cinit%3E(java.lang.String,org.apache.logging.log4j.core.Layout,java.util.function.Function)"},{"p":"com.nuix.logging","c":"LogMessageCallbackAppender","l":"LogMessageCallbackAppender(String, Layout)","url":"%3Cinit%3E(java.lang.String,org.apache.logging.log4j.core.Layout)"},{"p":"com.nuix.nx","c":"LookAndFeelHelper","l":"LookAndFeelHelper()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"makeComponentLabel(String)","url":"makeComponentLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"makeLabelConstraintsForNextRow()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"mergeExistingPdfFiles(File, List)","url":"mergeExistingPdfFiles(java.io.File,java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialogLoggingCallback","l":"messageLogged(String)","url":"messageLogged(java.lang.String)"},{"p":"com.nuix.nx.helpers","c":"MetadataProfileHelper","l":"MetadataProfileHelper()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"MultipleChoiceComboBox()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"noneAreChecked(String...)","url":"noneAreChecked(java.lang.String...)"},{"p":"com.nuix.nx","c":"NuixConnection","l":"NuixConnection()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int, int, int, int)","url":"%3Cinit%3E(int,int,int,int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int, int, int)","url":"%3Cinit%3E(int,int,int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int, int)","url":"%3Cinit%3E(int,int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"NuixVersion(int)","url":"%3Cinit%3E(int)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"OcrSettings()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"onAbort(Runnable)","url":"onAbort(java.lang.Runnable)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"onMessageLogged(ProgressDialogLoggingCallback)","url":"onMessageLogged(com.nuix.nx.dialogs.ProgressDialogLoggingCallback)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"onVisit(SourceItemVisitCallback)","url":"onVisit(com.nuix.nx.sourceitem.SourceItemVisitCallback)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"OPEN_FILE"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(File, String, String, String)","url":"openFileDialog(java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(File, String)","url":"openFileDialog(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(String, String, String, String)","url":"openFileDialog(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openFileDialog(String, String)","url":"openFileDialog(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openMultipleFilesDialog(File, String, String, String)","url":"openMultipleFilesDialog(java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"openMultipleFilesDialog(String, String, String, String)","url":"openMultipleFilesDialog(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"owner"},{"p":"com.nuix.nx","c":"NuixVersion","l":"parse(String)","url":"parse(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"PathList()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"PathSelectedCallback","l":"pathSelected(String)","url":"pathSelected(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"PathSelectionControl(PathSelectionControl.ChooserType, String, String, String)","url":"%3Cinit%3E(com.nuix.nx.controls.PathSelectionControl.ChooserType,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"PlaceholderResolver()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ProcessingFinishedListener","l":"processingFinished()"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"ProcessingStatusControl()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"ProcessingStatusDialog()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.helpers","c":"MetadataProfileHelper","l":"profileContainsField(String, MetadataProfile)","url":"profileContainsField(java.lang.String,nuix.MetadataProfile)"},{"p":"com.nuix.nx.callbacks","c":"SimpleProgressCallback","l":"progressUpdated(long, long)","url":"progressUpdated(long,long)"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel.ReportDataChangeListener","l":"propertyChange(PropertyChangeEvent)","url":"propertyChange(java.beans.PropertyChangeEvent)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"record(ProcessedItem)","url":"record(nuix.ProcessedItem)"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"record(ProcessedItem)","url":"record(nuix.ProcessedItem)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"recursivelyVisit(SourceItem)","url":"recursivelyVisit(nuix.SourceItem)"},{"p":"com.nuix.nx.controls.models","c":"ItemStatisticsTableModel","l":"refresh()"},{"p":"com.nuix.nx.models","c":"ItemStatisticsTableModel","l":"refresh()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"refreshTable()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"refreshTable()"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"remove(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"remove(int)"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"remove(int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"remove(int)"},{"p":"com.nuix.logging","c":"LogHelper","l":"removeAppender(Appender)","url":"removeAppender(org.apache.logging.log4j.core.Appender)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"removeChangeListener(ChoiceTableModelChangeListener)","url":"removeChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"removeChangeListener(ChoiceTableModelChangeListener)","url":"removeChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.controls","c":"ProcessingStatusControl","l":"removeProcessingFinishedListener(ProcessingFinishedListener)","url":"removeProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.dialogs","c":"ProcessingStatusDialog","l":"removeProcessingFinishedListener(ProcessingFinishedListener)","url":"removeProcessingFinishedListener(com.nuix.nx.controls.ProcessingFinishedListener)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"removePropertyChangeListener(PropertyChangeListener)","url":"removePropertyChangeListener(java.beans.PropertyChangeListener)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"removePropertyChangeListener(PropertyChangeListener)","url":"removePropertyChangeListener(java.beans.PropertyChangeListener)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"removeRecordAt(int)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"removeRecordAt(int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"removeValueAt(int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"removeValueAt(int)"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel.ReportDataChangeListener","l":"ReportDataChangeListener()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"ReportDataModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"ReportDataModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel","l":"ReportDisplayPanel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel","l":"ReportDisplayPanel(ReportDataModel)","url":"%3Cinit%3E(com.nuix.nx.controls.models.ReportDataModel)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"resolveTemplate(String)","url":"resolveTemplate(java.lang.String)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"resolveTemplatePath(String)","url":"resolveTemplatePath(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"SAVE_FILE"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"saveDigestList(File)","url":"saveDigestList(java.io.File)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"saveDigestList(String)","url":"saveDigestList(java.lang.String)"},{"p":"com.nuix.nx.digest","c":"DigestHelper","l":"saveDigestListByName(String)","url":"saveDigestListByName(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"saveFileDialog(File, String, String, String)","url":"saveFileDialog(java.io.File,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"saveFileDialog(String, String, String, String)","url":"saveFileDialog(java.lang.String,java.lang.String,java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"saveJSONFile(File)","url":"saveJSONFile(java.io.File)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"saveJsonFile(String)","url":"saveJsonFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"saveJSONFile(String)","url":"saveJSONFile(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ScrollableCustomTabPanel","l":"ScrollableCustomTabPanel(String, TabbedCustomDialog)","url":"%3Cinit%3E(java.lang.String,com.nuix.nx.dialogs.TabbedCustomDialog)"},{"p":"com.nuix.nx.helpers","c":"FormatHelpers","l":"secondsToElapsedString(double)"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"SECTION_FIELD_DELIM"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"SECTION_FIELD_DELIM"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectDirectories(File, String)","url":"selectDirectories(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectDirectories(String, String)","url":"selectDirectories(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectFilesDialog(File, String)","url":"selectFilesDialog(java.io.File,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"selectFilesDialog(String, String)","url":"selectFilesDialog(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ControlSerializationHandler","l":"serializeControlData(Component)","url":"serializeControlData(java.awt.Component)"},{"p":"com.nuix.nx.models","c":"ControlSerializationHandler","l":"serializeControlData(Component)","url":"serializeControlData(java.awt.Component)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"set(String, String)","url":"set(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setAbortButtonVisible(boolean)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setBugfix(int)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setBuild(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChangeListener(ChoiceTableModelChangeListener)","url":"setChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setChangeListener(ChoiceTableModelChangeListener)","url":"setChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setChangeListener(ChoiceTableModelChangeListener)","url":"setChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setChangeListener(ChoiceTableModelChangeListener)","url":"setChangeListener(com.nuix.nx.controls.models.ChoiceTableModelChangeListener)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setChecked(String, boolean)","url":"setChecked(java.lang.String,boolean)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setChecked(String, boolean)","url":"setChecked(java.lang.String,boolean)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setCheckedAtIndex(int, boolean)","url":"setCheckedAtIndex(int,boolean)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setCheckedAtIndex(int, boolean)","url":"setCheckedAtIndex(int,boolean)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setCheckedAtIndex(int, boolean)","url":"setCheckedAtIndex(int,boolean)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setCheckedByLabels(Collection, boolean)","url":"setCheckedByLabels(java.util.Collection,boolean)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setCheckedByLabels(Collection, boolean)","url":"setCheckedByLabels(java.util.Collection,boolean)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"setCheckedChoices(List)","url":"setCheckedChoices(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setCheckedRecordsFromHashes(List)","url":"setCheckedRecordsFromHashes(java.util.List)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setCheckedRecordsFromHashes(List)","url":"setCheckedRecordsFromHashes(java.util.List)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setChoices(List>)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChoices(List>)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setChoices(List>)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"setChoices(List)","url":"setChoices(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChoiceSelection(Choice, boolean)","url":"setChoiceSelection(com.nuix.nx.controls.models.Choice,boolean)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setChoiceSelection(Choice, boolean)","url":"setChoiceSelection(com.nuix.nx.controls.models.Choice,boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setChoiceTableHeight(int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setChoiceTypeName(String)","url":"setChoiceTypeName(java.lang.String)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setChoiceTypeName(String)","url":"setChoiceTypeName(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setColumnEditable(int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setColumnEditable(int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setColumnName(int, String)","url":"setColumnName(int,java.lang.String)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setColumnName(int, String)","url":"setColumnName(int,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setCompleted()"},{"p":"com.nuix.nx","c":"NuixConnection","l":"setCurrentCase(Case)","url":"setCurrentCase(nuix.Case)"},{"p":"com.nuix.nx","c":"NuixConnection","l":"setCurrentNuixVersion(String)","url":"setCurrentNuixVersion(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setCustomFilterProviders(List)","url":"setCustomFilterProviders(java.util.List)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setCustomFilterProviders(List)","url":"setCustomFilterProviders(java.util.List)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setDate(String, Object)","url":"setDate(java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setDefaultCheckState(boolean)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setDefaultCheckState(boolean)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setDefaultCheckState(boolean)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"setDefaultImportDirectory(String)","url":"setDefaultImportDirectory(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettings(Map)","url":"setDefaultSettings(java.util.Map)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettingsFromJSON(String)","url":"setDefaultSettingsFromJSON(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettingsFromJSONFile(File)","url":"setDefaultSettingsFromJSONFile(java.io.File)"},{"p":"com.nuix.nx.controls","c":"DataProcessingSettingsControl","l":"setDefaultSettingsFromJSONFile(String)","url":"setDefaultSettingsFromJSONFile(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setDirectoriesButtonVisible(boolean)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"setEditable(boolean)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"setEditable(boolean)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"setEditable(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterNativeSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterPdfSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterTextSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"BatchExporterTraversalSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"CsvTable","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"setEnabled(boolean)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setEnabled(boolean)"},{"p":"com.nuix.logging","c":"LogEventCallbackAppender","l":"setEventConsumer(Consumer)","url":"setEventConsumer(java.util.function.Consumer)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setExtent(double)"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"setExtent(double)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setFilesButtonVisible(boolean)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setFilter(String)","url":"setFilter(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setHelpFile(File)","url":"setHelpFile(java.io.File)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setHelpFile(String)","url":"setHelpFile(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setHelpUrl(String)","url":"setHelpUrl(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setInitialDirectory(String)","url":"setInitialDirectory(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.nuix.nx.models","c":"Choice","l":"setLabel(String)","url":"setLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setLogAllStatusUpdates(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setLogVisible(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainProgress(int, int)","url":"setMainProgress(int,int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainProgress(int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainProgressVisible(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainStatus(String)","url":"setMainStatus(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setMainStatusAndLogIt(String)","url":"setMainStatusAndLogIt(java.lang.String)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setMajor(int)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setMaximum(double)"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"setMaximum(double)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setMemoryPerWorker(int)"},{"p":"com.nuix.logging","c":"LogMessageCallbackAppender","l":"setMessageConsumer(Consumer)","url":"setMessageConsumer(java.util.function.Consumer)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setMinimum(double)"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"setMinimum(double)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"setMinor(int)"},{"p":"com.nuix.nx.misc","c":"PlaceholderResolver","l":"setPath(String, String)","url":"setPath(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setPath(String)","url":"setPath(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"setPathFieldEditable(boolean)"},{"p":"com.nuix.nx.controls","c":"PathList","l":"setPaths(List)","url":"setPaths(java.util.List)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setRecords(List)","url":"setRecords(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setRecords(List)","url":"setRecords(java.util.List)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setRecords(List)","url":"setRecords(java.util.List)"},{"p":"com.nuix.nx.controls","c":"ReportDisplayPanel","l":"setReportDataModel(ReportDataModel)","url":"setReportDataModel(com.nuix.nx.controls.models.ReportDataModel)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setReportDisplayVisible(boolean)"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevel(Level)","url":"setRootLoggerLevel(org.apache.logging.log4j.Level)"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelAll()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelDebug()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelError()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelFatal()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelInfo()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelOff()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelTrace()"},{"p":"com.nuix.logging","c":"LogHelper","l":"setRootLoggerLevelWarn()"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setSelected(boolean)"},{"p":"com.nuix.nx.models","c":"Choice","l":"setSelected(boolean)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setSelectedComboItem(ComboItem)","url":"setSelectedComboItem(com.nuix.nx.controls.ComboItem)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setSelectedLabel(String)","url":"setSelectedLabel(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setSelectedTabIndex(int)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setSelectedValue(String)","url":"setSelectedValue(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setSingleSelectMode(boolean)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setSingleSelectMode(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubProgress(int, int)","url":"setSubProgress(int,int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubProgress(int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubProgressVisible(boolean)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubStatus(String)","url":"setSubStatus(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setSubStatusAndLogIt(String)","url":"setSubStatusAndLogIt(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setTabLabel(String, String)","url":"setTabLabel(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setTableCellRenderer(Class, TableCellRenderer)","url":"setTableCellRenderer(java.lang.Class,javax.swing.table.TableCellRenderer)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setTableModel(ChoiceTableModel)","url":"setTableModel(com.nuix.nx.controls.models.ChoiceTableModel)"},{"p":"com.nuix.nx.dialogs","c":"ChoiceDialog","l":"setTableModel(ChoiceTableModel)","url":"setTableModel(com.nuix.nx.controls.models.ChoiceTableModel)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setTableModel(DynamicTableModel)","url":"setTableModel(com.nuix.nx.controls.models.DynamicTableModel)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setTabPlacement(int)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setTabPlacementLeft()"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"setTempDirectory(File)","url":"setTempDirectory(java.io.File)"},{"p":"com.nuix.nx.export","c":"CombinedPdfExporter","l":"setTempDirectory(String)","url":"setTempDirectory(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"setText(String, String)","url":"setText(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"setText(String, String)","url":"setText(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setTextWrapping(boolean)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"setTimeoutMinutes(int)"},{"p":"com.nuix.nx.dialogs","c":"ProgressDialog","l":"setTimestampLoggedMessages(boolean)"},{"p":"com.nuix.nx.dialogs","c":"Toast","l":"setToastTimeInSeconds(int)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setToolTip(String)","url":"setToolTip(java.lang.String)"},{"p":"com.nuix.nx.models","c":"Choice","l":"setToolTip(String)","url":"setToolTip(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"OcrSettings","l":"setUpdateDuplicates(boolean)"},{"p":"com.nuix.nx.controls","c":"DynamicTableControl","l":"setUserCanAddRecords(boolean, Supplier)","url":"setUserCanAddRecords(boolean,java.util.function.Supplier)"},{"p":"com.nuix.nx","c":"NuixConnection","l":"setUtilities(Utilities)","url":"setUtilities(nuix.Utilities)"},{"p":"com.nuix.nx.controls.models","c":"DoubleBoundedRangeModel","l":"setValue(double)"},{"p":"com.nuix.nx.models","c":"DoubleBoundedRangeModel","l":"setValue(double)"},{"p":"com.nuix.nx.controls.models","c":"Choice","l":"setValue(T)"},{"p":"com.nuix.nx.models","c":"Choice","l":"setValue(T)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls.models","c":"CsvTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.models","c":"CsvTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"setValueAt(Object, int, int)","url":"setValueAt(java.lang.Object,int,int)"},{"p":"com.nuix.nx.controls","c":"ComboItemBox","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.controls","c":"StringList","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx.controls","c":"ChoiceTableControl","l":"setValues(List)","url":"setValues(java.util.List)"},{"p":"com.nuix.nx","c":"LookAndFeelHelper","l":"setWindowsIfMetal()"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setWorkerCount(int)"},{"p":"com.nuix.nx.controls","c":"LocalWorkerSettings","l":"setWorkerTempDirectory(String)","url":"setWorkerTempDirectory(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRows(int[], int)","url":"shiftRows(int[],int)"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"shiftRows(int[], int)","url":"shiftRows(int[],int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"shiftRows(int[], int)","url":"shiftRows(int[],int)"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"shiftRows(int[], int)","url":"shiftRows(int[],int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRows(List>, int)","url":"shiftRows(java.util.List,int)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"shiftRows(List>, int)","url":"shiftRows(java.util.List,int)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"shiftRowsDown(int, int)","url":"shiftRowsDown(int,int)"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"shiftRowsDown(int, int)","url":"shiftRowsDown(int,int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRowsDown(int[])"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"shiftRowsDown(int[])"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"shiftRowsDown(int[])"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"shiftRowsDown(int[])"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"shiftRowsUp(int, int)","url":"shiftRowsUp(int,int)"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"shiftRowsUp(int, int)","url":"shiftRowsUp(int,int)"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"shiftRowsUp(int[])"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"shiftRowsUp(int[])"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"shiftRowsUp(int[])"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"shiftRowsUp(int[])"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showError(String, String)","url":"showError(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showError(String)","url":"showError(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showInformation(String, String)","url":"showInformation(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showInformation(String)","url":"showInformation(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"Toast","l":"showLastToast()"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showMessage(String, String)","url":"showMessage(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showMessage(String)","url":"showMessage(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"Toast","l":"showToast(String, Rectangle)","url":"showToast(java.lang.String,java.awt.Rectangle)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showWarning(String, String)","url":"showWarning(java.lang.String,java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"CommonDialogs","l":"showWarning(String)","url":"showWarning(java.lang.String)"},{"p":"com.nuix.nx.controls.models","c":"ArrangeableListModel","l":"size()"},{"p":"com.nuix.nx.models","c":"ArrangeableListModel","l":"size()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"sortCheckedToTop()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"sortCheckedToTop()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"sortChoicesToTop(List)","url":"sortChoicesToTop(java.util.List)"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"sortChoicesToTop(List)","url":"sortChoicesToTop(java.util.List)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"SourceItemVisitor()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls","c":"StringList","l":"StringList()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"StringListTableModel","l":"StringListTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.models","c":"StringListTableModel","l":"StringListTableModel()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModelChangeListener","l":"structureChanged()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModelChangeListener","l":"structureChanged()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"TabbedCustomDialog()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"TabbedCustomDialog(String)","url":"%3Cinit%3E(java.lang.String)"},{"p":"com.nuix.nx.dialogs","c":"Toast","l":"Toast()","url":"%3Cinit%3E()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"toJson()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"toJson()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"toMap()"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"toMap()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"toMap(boolean)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"toMap(boolean)"},{"p":"com.nuix.nx","c":"NuixVersion","l":"toString()"},{"p":"com.nuix.nx.controls","c":"ComboItem","l":"toString()"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"trackComponent(String, Component)","url":"trackComponent(java.lang.String,java.awt.Component)"},{"p":"com.nuix.nx.controls","c":"MultipleChoiceComboBox","l":"uncheckAll()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"uncheckAllChoices()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"uncheckAllChoices()"},{"p":"com.nuix.nx.controls.models","c":"ChoiceTableModel","l":"uncheckDisplayedChoices()"},{"p":"com.nuix.nx.models","c":"ChoiceTableModel","l":"uncheckDisplayedChoices()"},{"p":"com.nuix.nx.controls.models","c":"DynamicTableModel","l":"uncheckDisplayedRecords()"},{"p":"com.nuix.nx.models","c":"DynamicTableModel","l":"uncheckDisplayedRecords()"},{"p":"com.nuix.nx.controls.models","c":"ReportDataModel","l":"updateData(String, String, Object)","url":"updateData(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.models","c":"ReportDataModel","l":"updateData(String, String, Object)","url":"updateData(java.lang.String,java.lang.String,java.lang.Object)"},{"p":"com.nuix.nx.dialogs","c":"ValidationCallback","l":"validate(Map)","url":"validate(java.util.Map)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"validateBeforeClosing(ValidationCallback)","url":"validateBeforeClosing(com.nuix.nx.dialogs.ValidationCallback)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"valueOf(String)","url":"valueOf(java.lang.String)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl.ChooserType","l":"values()"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"visit(File, Map, Map)","url":"visit(java.io.File,java.util.Map,java.util.Map)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitor","l":"visit(String, Map, Map)","url":"visit(java.lang.String,java.util.Map,java.util.Map)"},{"p":"com.nuix.nx.sourceitem","c":"SourceItemVisitCallback","l":"visitSourceItem(SourceItem)","url":"visitSourceItem(nuix.SourceItem)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"whenDeserializing(String, ControlDeserializationHandler)","url":"whenDeserializing(java.lang.String,com.nuix.nx.controls.models.ControlDeserializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"whenDeserializing(String, ControlDeserializationHandler)","url":"whenDeserializing(java.lang.String,com.nuix.nx.controls.models.ControlDeserializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"whenJsonFileLoaded(Runnable)","url":"whenJsonFileLoaded(java.lang.Runnable)"},{"p":"com.nuix.nx.controls","c":"PathSelectionControl","l":"whenPathSelected(PathSelectedCallback)","url":"whenPathSelected(com.nuix.nx.controls.PathSelectedCallback)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"whenSerializing(String, ControlSerializationHandler)","url":"whenSerializing(java.lang.String,com.nuix.nx.controls.models.ControlSerializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"TabbedCustomDialog","l":"whenSerializing(String, ControlSerializationHandler)","url":"whenSerializing(java.lang.String,com.nuix.nx.controls.models.ControlSerializationHandler)"},{"p":"com.nuix.nx.dialogs","c":"CustomTabPanel","l":"whenTextChanged(String, Consumer)","url":"whenTextChanged(java.lang.String,java.util.function.Consumer)"}] \ No newline at end of file diff --git a/docs/member-search-index.zip b/docs/member-search-index.zip index e9e3a8b162b9473a633071fbe647f5e882b3e4d5..229fa6f76cd031a770cf189c9d037ff91d040496 100644 GIT binary patch literal 9584 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 JPxs&He*k!{#PR?D delta 8326 zcmV;1AbH>LN}NFsP)h>@6aWYa2mr@gTUL<{D1Y5O*>2-VlD|?YU;qtZ=w+}ki$V?L zqq^K{S9xr8Hx`4&fEH6SrzlcGQZ9Q2`|q0vlguOXWK!<#hi;dckr9!1WMmwF|Ihow z`~QBwsrSq3SiCH&mt|gLWxZ?PpS|DUlDnqfHK=Vb=~w)*#2>TAy6Jw&+I#e`BWgR8 zFMt00{{PN&RGYf$n!4n;E{isMEQ@OQLz%VhT~?uAn(S~u4M)4_is!6DL-FFVu1l0v zFm{>IhYhAwV*Kdh*mm`Pojnp1CC8oTi;H@Hs4G-;f5sn=4gdVl>^WOz-@Bzy4%6G= z#tv;EKR%;UU_Z}SWqIA9eTzwzCBn_AtA7vV!$*nY07WSuyP{l<@Kb2t=Kpp6+M!j` zWUmqrkNE4~f7Q5<;b-9Hp=u?c;!b}=Ia`48j*;iLs5)vbzCTtKAuP3- zLWZgs-=4triP7Wztb4t9B5Olz4DeZP2vn2Kqepz0 zQPx2u9uw=LeWn}R$ml)V)J?v)%?=;r#U<}?64ARGN5yVO|p(2*njyAZLhrO z1a!~di8GYVgO6U!oO#Sy|DkdWP=aCM%eCG=)rT&Und znsF(gunalSVpcF^28`sO-61JqkG{1GE=)0W)oqKiLk+YqexfCK=Xx&kQ4-(cZ>$94 zc3jge$nVh(y)Zl>n0;49S%0n?bn%2X-|$_M^}}+x6uM6WP`iwRP9a~tI><`^k>ufP zDZc(z`FYlDo~~ZVR)(6JI?Hjtq6gG<^gg7`C679Ovnr0kFB!h32eGHrn3K7?d>g`< z2tFrUYxL5E@Fl^|%2<;<<0YS!LELGTqBhd=W7pNyef?c#kABr|ihnD5J_8cBSjqF! zNR&P38Q*G`D%NQo`#a|xkA!LThw{X8k?yHfBE=K_Q-R8S=)PX}H}<3PY&Buhx{#v` z(JiEFCKea8xiKg>fyNMcH>UwAQV#}EYhqC!2M6y+-xZA9dyGh`b`H8ht)XNseHe6u zAN6*PRXryVy*3cEQ-8T85+^i$ta??sY6#12{cn24L0w>qCV1-!!&=o}01UH;L%5p7 zv4l>j85-3qcotGaOtXpu&phvKJQ)uHPu^1R@t0YL?h1TEXw0`j6>#oz$H)`#))35_ z=c9u^vqgiE)Xgj2Y3tVAjVk!;ooVOq>>YV8ctB*^!PiWDWq*ClHs7XmeFm$)L0a>+ zFV#4ld|+lCptl<_K|=!{M8jT5fAxybvv*=es+ThMhDagqkQ#s5bmA6{CUw!Ly4hzP z?(*wuOaEB_H#B%+gH=yHxj&;UAEva*Vqch;IRDj4pk8ZnV6Z|W7!pl60tj(@s?o|VGSrw ze6x#a$Vr-&wv}Hut~nz@B%Ui@@&Cw92I4dsy6Oc~KjlQutqk z>RGHBF+bC&m<1+&XzJrZYlPic3dRv~etX)f_%-1MZMzA>K&!vmP&{PMDE{bIYrp*o z5Z0a(wkvr?HGt~Oob$MV#@SQfccjoJgvKB5pWXYca* z2t1AW@_%&3tIx-p`gbC$@}GGaFDgx~@6Balc7B=6)cC(C?D7AmvUw<~%Dp&xsM%Ks z$PL_AzAVkwNv^>RVQ|*bR2WUiZ3>PlQkyw~#{s9|c$@Q$Vz%5~1c21*MkQ^ONi962 z5;k>SY_};JLrL#b4!)v#Oi>o5=|Ez*wQ7*=7JmoNssa4u(y4B%=H@i5ULn|#4=P%W zeE#V#7e!TcfBMUnpC_-?__!x&H&9MQTed8QC@Z$diRcP;!w^x?tT+)x(IOZkDOn7s zqN&>Xf`m0=;0WrWehrUkTQ_KQKah4d&A&&5j@odeyd>U`&-XsAsE=q@R3iv?)~p+m zDSsJ+(h=Yy482El;t3Pgh*RFVK?=aOzf`NmIKC4<`*vM_MlTEIa&Kx17rl6EzPu1i zz@PBQ7Ts%)Y?GCnW0`emU3XczI_5=(@`vKz$P!(^T*qJVQ#u-cQRF-lW8YO-x|X+( zgFeM|S+s{TdqusuZ5xEx#iPF2(W*q?ag$aOwoM+QChr zntW^E?gj!)`rD`iwNOmvlrA|z1T0o%o2~czy1E>`mFl+u)LbCLzkbG2K9-XBEUWj2 ztigiSLMRhf{!lFPDS=MeS}|PPHGf%AeJYx^!y?>qU&U?!4Z;HAr>5Rtz2JQXj~)Xe zn~W5yiOg$JwzSp@Q7lg2@BH;kwnx^0Qa<&grC}ui%iwGRtNPR>IO%1s}XH{N~?HUUCrc0x)G4%|2 zh|$6Z8fuIK)z_sT+@S@BSxbg(O(H6C*2GU?=c9c!h@U3h1V-aM+^Ky}EPK0>_3MG} zl9$)_R~PHA_y6lPX&g}^jeq5fAAyllmeI?y{f?_Hf3y#XZ{(1i=@fj0VRHzz9?`1G z&)ph1Gq8_tF05%^>I!cNS&2{Fsy*&e^WmIbe?Myc44~s_vprUHYAku}=p8h#ztr6W zUv%2utrSnWc3o1_jPv?f-s z;r(Kp4a$(qn)qWZWXO@9z8E@I)GCph@l{#&YBxzeZUagDjL=8#ad82GrRJm;FU&kh z028)n6{&FQ>Lm;LRXEsT&?s)s=mr@3d}IcgE^(NY(AxL74!7$sXXtsmzBB4o%ut$m zo&8j8{MI}S7_W{1)qh@S|5)sHs9JdL>c)c^(P$6(^>$Ug$}!8h3P*}v27x=(Ia4F5 z^+dl`R5UV>{Ow~ ziTm|8&gnx}Y`(o3{XIb-KQ=tI=?siT*e5E?{%GyP@mK@Fihor_?Y`MN*63^#!K`E) z62-2UL+{i$w)n&?A2toLon?L&4%>o+L88JgYE~7#wGuA~SrG`sIFx}C$lG!^7%GG) zlY{yCgvFGyK;CQ(@N;l=_w?Epo2(>j!ZKbUSh695u)Dekt}}NRd5#@eCH{rN^n|o6 z`gbGK8>xpByML`4s$f{ylnz4cIJjH2prVK}uE6xT-H;N^&uot()Pc6l$#%q3xCAbH z6WE<-xk4zD(*OhFDRhyw@<0n^6eR2y?LazM$N(zeL3zQQM0f)5(c6&3Uh&Y z%6iJqh^I+@q_YVgVx>I6K(DhMK!<)!fSu~nq?NX|A4YuzaD7GF;dt*1O}$@LuYK`# zWi_{k6nv*{s6XkjnuN z4m~?R#4N{k_E{?V^XFyCxI?2aMCfn>{IPjY0AfvZQ&djZ zn}7En?m-kORXxYJ^B9c$XGTiHX{PZz8j-S{`g7Jk`Sz=I`a(ZI`?1&qx2rBV1LYB!<2Fpp%|&FLFl;KMkxlNbDUz3`i@i# zZlAI8!wZT&hL{EvH5OhjQGPslioZT#FgV_;YE$QhGY4aUv^Ei|gI^*7j*;n-GCdWw zi}Svi7@()TcM#mSSy3_tXll%OM#qgKe2tle(lU0@I30s_*VJ2YB?NpkB53}0%zudX zX)2ogx?=(V)9)`280u@2Pt!0EL}ZZg-dJpl&0M?=<&%T)@(iNiwy6_7{NzKO+lC&ueFPNL3Q`?9MR!qUH)g>=NQ|b$R zB@?-6f6BJ(VYgQ}l{!XEKGE=H?SFM;O6P6>o8pJ#=Et6LTZc^K#V&gQ6EbL<9m|es z!H4`&>0Bg75{@7T{tIpNhXg_msO5>wUI<$H`yREpEz{fJgUs#*NwIL>aM#EMAtOm} zj4MTlN_dcr&0xl_AOjpkH*!tQgl&1sY@`hX1Z|Q^aH$aURnzk{!-^N>rhhx%YidqT^){~@eC_SC`*WxKsf@YI59@mNT1E!@VV-T!S62a!-Gv@bc4I$nC(!=!=cHb z>89ST%8~`KV1@{j@tMsSY&ZGa?4M5kao~P=o4pkK2d?rkkkqLa#Cboh}YyNUye^2&OABD@-(inX1m)|I~_DA0+ltu+&ubuRq z#us|jN{XXTSviE!On-nZ;FPx`Vp8w~nQPb%9l1;-&=h%0V%PzNLT|QGs=fU9Ow4au zCw|I`O*Q-wsu+&bcso?x(~$o7@bybV?Eww2pX!;t&qzhha8b203NilUiOZmYB%c$# zfUp>-)1`s{JVrNXjwV1Pb@OCH=JW93MB*7Pf}leCL*NbGaDS*A0|xTHxw(py%Cp@nuf zlcm%8CE!}-wsML`2XDRc_$&>6IBt#3O;JsbMrdrb7e?PnIYd+Q^Ukm>W~N=bJRVA7 z<77f5=rl?%HC7tq+QG-N2H$Z0jC_~MH}HM9uAL<{6u5axA^cT!YO1*q(cNgutr5oet%oOY9My7$+TxS8Yl4&Yk8 z4pNU-Q-2G?-d2lt)!m@1?ci)tW3kwJ2{ewHI+w?i8H{g=_5zjVRbF&dZ>P(H06+pM z{{&=Ba?c4!TV%te)ID^B7@ZVqSR!NyDLiS1Oh+)HZ-;IRU3*vmI%cIQFWgw1Xr*&> zdJplEX)ZEF`vXm&)~xZ-Yig4SlBiuGO1*7j>3`Jr-Qe@b*0`ZOQOgE=db5V2WO;9k zmOla~x#$V#v}1HE@;WO+&z1+=4a8rR&>$t=HpEaMvVw#UBNo~us2B_PXL{3CKq(yx z@0Y?a2{-D#?#EJM1(T_Gkv30<;r{y#p+g_wOcv+laOjQ@=?WHIxYORy#nf%~cF zFbOqPDuU=uR`6b(J9>2^|w`(e?q8~ z&KT``z~~GomzDxr@F6A1);U7Zchr=P-P5{okD492dZB){J6z1%R)ic{3yq2_rQ zR#*~PHA==lDN~;U;hT(4(2Hr-S@Os5)uJoggfFSlnKC$=bS}O~&AFj%>iZzp zc+s*cs(kck(zgj~Pq#W0zQnIG@P8btE1C&laeu663d9jRFBzBA2op{0R@wxuo2tl( zTn(VQbfAJ5ZtG*SK?O6ar0+2F0~teNMby>Jz&8E8P|6`j86Zq$X{_%f7XjX&OT7Qq zEow+eNj_2TuD<-^)Ah|&q_#;Cmc328wY`$=P3V#%lm^>eZ$5p!Tu60NCyBNvNf z3sko7vUDMiS3fXTu3l&=w%n4*PytMxU6G-`-tUQN96qI-oCu)d>(uM0W^~MQ!opmn zGHXEs3tkq?6GejGQGcsKV&M!N3CEt;B;Yg99H_GKRE=RCvH@q*nK4GVx2nYsm?8G| zf{hkgOvO>gbsl4_e4TI!(Az4L5DHF2MQNM=U9CSUwEEH4t%m(1-hn0FX|)TlTAuKx zr=X^R3>@SsOo(y|!kkBz<-xyMs$(Wa3a&Cjfbm?_4QZsKz4O=`H#!1o9o-yB}$J7?rL8Q_9)so zYjCr?mg!`Sn*_|zEZZ0*WqPquS@M3HNym=8kAhxTf-Vm1E00)6Q>}ca{^Y~y$%7g8 zpfot{U>GYh3cyj;q|9U!#J3iiW1N$+B$EfU6~Nf3{eJ=T8}GwNrK}jJ(FHDy^<+JY4%%giH8qyJ7m-zruQ(lBt~JgvNPK}^p;WP z6=)qmmqTt?#tkNY___5O3#K6!AZ*9hTHA536=3*Ezhd{}=}d70WZw&^qveeX%) zoE>wweGDT#G~cv>WN`P<5V94UkAi{yfvrHV5+qJBLfSOua%Opz>YtCJ=u7h`ZF zMa(mwgHoabl2Sw@GH!{CVFd)aPBZgv<;1Dve}6L9LLo)RAfl;=w#iT@=}>b`1u!Wq z-5t!X#>$QXq6qh@FfGW-QA@1{O5){C2iNJ6QSZk}4=VBiXTN}i4@D$?-g|Py^VXR2 z6_{=Y$oaHkdbU`rXCVMTkAI;~hzKH}r=bP(g#E^8Lb_Bt@GO3a4x0Xb7_W_0EJs@; z>VLQV^#{(Vsu=NbfJW>Cmgn7I%sonXv~Pl$I&I|fi1m=)DX;=@zmuSCvS)l4Wn~)N zwtGbsK5fsA!D2nMVi20$dm|C*Ycdv#!Hzl-BeGi;3v^t0#vnubP-Kl%#vH6_5fglnEwo z<4=vAD_AH>?E=yQId1{-8qDVO*{32eZwZb9p{Tl!&> z0uFlyLiNR^_&Gxm2`MJ-6gF`PL~nws><;oUjx=rAk;M1xt1ph4%NcBB!7fH zPjHBcU={q-EWye7Wr>1q{8~GarU~{nhP7|VpkX5ap3ojrCIzZXL6UK{S?)GdFRiG% zr!HKwl)%Pk238#Lz+sgEd172j7E&W|fLR{BW}*JxVQWm$%68L6TVnurvdyvI<|?rt zblI>=E`w)o(8WbhOxr@~a)*COJ%6affouzvC$nS}nq+{~(lE!4VTQN$1g&A2#w@L2 z0P|eew1~|K#1%0G#YBNhL8VJ@DnL4V3FSA8)hxb^g(;=C0jo`T(}7Yi8C)hVR`5t4 zU=o>J+YUtb6_N1Ocm+4aGONtm_QPL4QmbFNOyyFkIdVsFP;OtA?RU)Rl7C7JO910U zJ(3X7TV2y1)*p3--G`cr#_KYxC(M0A-h#)U5!M8k7!Cm>lNSt?k4f?!-_6q(-woQD z9DO{a4Yq17V@>xZ7rPZ;v4o+0L?@j{Nh2gehIcS1A#&QtwjN|&0KH1w{4FVy+$uNrWjkGG41d0FPV{{oZ=IJ5~^L8upRDHqfQ!zXPrh$=f2HS zvNTl`=0K{Yk1KkkumAR2@L|y|oSYZCiNXokvEC;847ALQmP35hseealTcC$wkszee zil7$U-)YHv$loH>bu7X6T)Pa%q{g^@DXP5w-d=A>EU0p72HaN8((60VJP*lnqPNqJhL^{T+&mtd}S50*==d zK|OLbB3!Lqo1@ROsO5jvia!2jW^Lv+VEeprXn|Ihyh+UA3eC?Cc2ZH zxNVzZ@$ay>d8Q4nZn%rwx?b0ZbU3NI7sDx>v7)S}g89gp-hc7bweJ%GGHGJ__+fg? zDvNjy6-_5-_jcxE*fqyZcWnBogQi%vo?17(V1_&%01ovQYChVHTdH@as z54V|V>3Xx^i^9S|3XgR+CPDoro9lEn8%w`cJ>2g7YWs9TlWo3T@Q4`0d2yi!)leYe zQ^O;^Mu?a0k$+{0T$Qeiu-7I(V&k5@>5%sJ9HTFJ3aMMg&6ThrxZ#LDN2Y2faZzLu zL3b+@Ktm#B*<20fdHHiz7C99@mDttKtN__P;sz)WKRD0z%u${rEEl7TvL!Su)Yq+citz8rtmRC!O_S4G2!DE}nPON(Br@)QJ$px9=!bs_ zZK9BROe8)9e3D=Wvc)H%H)F<}oGF-7mkaqef(U7O6xIY7N=gKbJVw4hq3ROxxJ%;A zqn|Hhp%~X`WK2h34Y8(~3)rbl*bDyHE#u+-Zt9GLyw{z%h=~Hf`U$ORk9*YU??h@1 z%XU4yaC2;!&0qf?P)i30Vof}=`X2xQj6VSYP)h*<6aW+e2nYxO$68xfVof}=`X2xQ Qj6ahuB|HW|AOHXW0LpD0dH?_b diff --git a/docs/module-search-index.js b/docs/module-search-index.js deleted file mode 100644 index 0d59754..0000000 --- a/docs/module-search-index.js +++ /dev/null @@ -1 +0,0 @@ -moduleSearchIndex = [];updateSearchResults(); \ No newline at end of file diff --git a/docs/overview-frame.html b/docs/overview-frame.html deleted file mode 100644 index 4c98042..0000000 --- a/docs/overview-frame.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -Overview List - - - - - - -

       

      - - diff --git a/docs/overview-summary.html b/docs/overview-summary.html index bb38d94..ed2e09a 100644 --- a/docs/overview-summary.html +++ b/docs/overview-summary.html @@ -3,18 +3,16 @@ -Generated Documentation (Untitled) +Nx 1.19.0 API - - - - + + - +