From 8ca763f18515e1f7cb870df5b6560e4f7fbe090c Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 2 Jul 2023 15:31:46 +0000 Subject: [PATCH] More fixes --- .../java/io/xpipe/api/impl/DataTableImpl.java | 87 +--- .../java/io/xpipe/api/impl/DataTextImpl.java | 55 +-- .../app/browser/BrowserBookmarkList.java | 19 +- .../app/browser/OpenFileSystemModel.java | 6 +- .../xpipe/app/comp/base/ListBoxViewComp.java | 32 +- .../app/comp/base/LoadingOverlayComp.java | 12 +- .../xpipe/app/comp/base/NamedToggleComp.java | 35 ++ .../xpipe/app/comp/base/SystemStateComp.java | 75 ++++ .../source/DataSourceTargetChoiceComp.java | 101 ----- .../app/comp/source/DsCollectionComp.java | 61 --- .../app/comp/source/DsDataTransferComp.java | 203 --------- .../app/comp/source/DsProviderChoiceComp.java | 88 ---- .../io/xpipe/app/comp/source/DsRawComp.java | 35 -- .../comp/source/DsStorageGroupSelector.java | 44 -- .../app/comp/source/DsStorageTargetComp.java | 75 ---- .../app/comp/source/DsStructureComp.java | 66 --- .../io/xpipe/app/comp/source/DsTableComp.java | 93 ----- .../app/comp/source/DsTableMappingComp.java | 49 --- .../io/xpipe/app/comp/source/DsTextComp.java | 34 -- .../app/comp/source/DsTypeChoiceComp.java | 83 ---- .../app/comp/source/GuiDsConfigStep.java | 278 ------------ .../comp/source/GuiDsCreatorMultiStep.java | 294 ------------- .../app/comp/source/GuiDsCreatorSaveStep.java | 72 ---- .../comp/source/GuiDsCreatorTransferStep.java | 112 ----- .../app/comp/source/GuiDsStoreSelectStep.java | 123 ------ .../source/GuiDsTableMappingConfirmation.java | 107 ----- .../comp/source/NamedSourceChoiceComp.java | 146 ------- .../collection/SourceCollectionComp.java | 197 --------- .../SourceCollectionContextMenu.java | 105 ----- .../SourceCollectionEmptyIntroComp.java | 81 ---- .../SourceCollectionFilterBarComp.java | 60 --- .../SourceCollectionLayoutComp.java | 106 ----- .../collection/SourceCollectionListComp.java | 17 - .../collection/SourceCollectionSortMode.java | 66 --- .../collection/SourceCollectionViewState.java | 222 ---------- .../collection/SourceCollectionWrapper.java | 164 -------- .../comp/storage/source/SourceEntryComp.java | 224 ---------- .../source/SourceEntryContextMenu.java | 93 ----- .../source/SourceEntryDisplayMode.java | 44 -- .../storage/source/SourceEntryListComp.java | 70 ---- .../source/SourceEntryListHeaderComp.java | 295 ------------- .../storage/source/SourceEntryWrapper.java | 122 ------ .../source/SourceStorageEmptyIntroComp.java | 77 ---- .../storage/store/DenseStoreEntryComp.java | 70 ++++ .../storage/store/StandardStoreEntryComp.java | 60 +++ .../storage/store/StoreCreationBarComp.java | 2 +- .../comp/storage/store/StoreEntryComp.java | 258 ++++++------ .../storage/store/StoreEntryListComp.java | 11 +- .../comp/storage/store/StoreEntryWrapper.java | 51 ++- .../comp/storage/store/StoreIntroComp.java | 3 +- .../comp/storage/store/StoreLayoutComp.java | 1 + .../app/comp/storage/store/StoreSection.java | 76 ++-- ...ntrySection.java => StoreSectionComp.java} | 52 ++- .../comp/storage/store/StoreViewState.java | 21 +- .../store/DataStoreSelectorComp.java | 2 +- .../store/DsDbStoreChooserComp.java | 2 +- .../{source => }/store/DsFileHistoryComp.java | 2 +- .../store/DsLocalDirectoryBrowseComp.java | 2 +- .../store/DsLocalFileBrowseComp.java | 2 +- .../store/DsRemoteFileChoiceComp.java | 2 +- .../store/DsStoreProviderChoiceComp.java | 4 +- .../store/DsStreamStoreChoiceComp.java | 6 +- .../{source => }/store/GuiDsStoreCreator.java | 4 +- .../store/NamedStoreChoiceComp.java | 2 +- .../java/io/xpipe/app/core/mode/BaseMode.java | 2 - .../io/xpipe/app/core/mode/PlatformMode.java | 2 - .../app/exchange/ConvertExchangeImpl.java | 70 ---- .../xpipe/app/exchange/EditExchangeImpl.java | 24 -- .../app/exchange/MessageExchangeImpl.java | 41 -- .../exchange/QueryDataSourceExchangeImpl.java | 27 -- .../xpipe/app/exchange/ReadExchangeImpl.java | 10 +- .../app/exchange/SelectExchangeImpl.java | 22 - .../exchange/WriteExecuteExchangeImpl.java | 50 --- .../WritePreparationExchangeImpl.java | 62 --- .../exchange/api/AddSourceExchangeImpl.java | 28 -- .../app/exchange/api/ForwardExchangeImpl.java | 24 -- .../api/QueryRawDataExchangeImpl.java | 25 -- .../api/QueryTableDataExchangeImpl.java | 39 -- .../api/QueryTextDataExchangeImpl.java | 31 -- .../cli/ListCollectionsExchangeImpl.java | 24 -- .../exchange/cli/ListEntriesExchangeImpl.java | 37 -- .../exchange/cli/ListStoresExchangeImpl.java | 2 +- .../cli/RemoveCollectionExchangeImpl.java | 17 - .../exchange/cli/RemoveEntryExchangeImpl.java | 18 - .../cli/RenameCollectionExchangeImpl.java | 16 - .../exchange/cli/RenameEntryExchangeImpl.java | 24 -- .../cli/SourceProviderListExchangeImpl.java | 35 -- .../cli/StoreProviderListExchangeImpl.java | 2 +- .../java/io/xpipe/app/ext/ActionProvider.java | 3 +- .../io/xpipe/app/ext/DataStoreProvider.java | 61 ++- .../java/io/xpipe/app/ext/ScanProvider.java | 4 +- .../xpipe/app/ext/XPipeServiceProviders.java | 4 +- .../main/java/io/xpipe/app/fxcomps/Comp.java | 27 +- .../app/fxcomps/impl/DataStoreChoiceComp.java | 5 +- .../impl/FileSystemStoreChoiceComp.java | 3 +- .../app/fxcomps/impl/IconButtonComp.java | 10 +- .../app/fxcomps/impl/PrettyImageComp.java | 144 +++---- .../xpipe/app/fxcomps/impl/WrapperComp.java | 20 - .../xpipe/app/storage/CollectionListener.java | 10 - .../app/storage/DataSourceCollection.java | 141 ------- .../io/xpipe/app/storage/DataSourceEntry.java | 246 ----------- .../app/storage/DataStateProviderImpl.java | 7 +- .../io/xpipe/app/storage/DataStorage.java | 394 ++++-------------- .../xpipe/app/storage/DataStorageParser.java | 9 - .../xpipe/app/storage/DataStorageWriter.java | 16 - .../io/xpipe/app/storage/DataStoreEntry.java | 58 ++- .../app/storage/ImpersistentStorage.java | 2 - .../io/xpipe/app/storage/StandardStorage.java | 167 +------- .../io/xpipe/app/storage/StorageListener.java | 8 +- .../io/xpipe/app/util/DataStoreFormatter.java | 9 +- .../java/io/xpipe/app/util/DialogHelper.java | 21 +- .../java/io/xpipe/app/util/FileBridge.java | 19 +- .../java/io/xpipe/app/util/FileOpener.java | 4 + .../java/io/xpipe/app/util/ScanAlert.java | 43 +- .../java/io/xpipe/app/util/XPipeDaemon.java | 24 -- .../xpipe/app/util/XPipeDaemonProvider.java | 39 -- app/src/main/java/module-info.java | 30 +- .../resources/lang/dscreation_en.properties | 1 + .../xpipe/app/resources/style/header-bars.css | 7 +- .../io/xpipe/app/resources/style/prefs.css | 2 +- .../app/resources/style/store-entry-comp.css | 59 ++- .../io/xpipe/app/resources/style/style.css | 4 + .../exchange/api/QueryRawDataExchange.java | 33 -- .../exchange/api/QueryTableDataExchange.java | 40 -- .../exchange/api/QueryTextDataExchange.java | 34 -- beacon/src/main/java/module-info.java | 24 -- .../java/io/xpipe/core/process/OsType.java | 9 +- .../io/xpipe/core/process/ShellDialect.java | 2 + .../io/xpipe/core/util/XPipeSystemId.java | 3 + .../io/xpipe/ext/base/FileStoreProvider.java | 4 +- .../xpipe/ext/base/InMemoryStoreProvider.java | 2 +- .../ext/base/InternalStreamProvider.java | 2 +- .../ext/base/SinkDrainStoreProvider.java | 2 +- .../ext/base/actions/AddStoreAction.java | 2 +- .../actions/DeleteStoreChildrenAction.java | 5 +- .../ext/base/actions/EditStoreAction.java | 2 +- .../ext/base/actions/RefreshStoreAction.java | 64 +++ .../ext/base/apps/CommandLineTarget.java | 67 --- .../ext/base/apps/DataSourceOutputTarget.java | 118 ------ .../xpipe/ext/base/apps/FileOutputTarget.java | 154 ------- .../io/xpipe/ext/base/apps/JavaTarget.java | 123 ------ .../ext/base/apps/RawFileOutputTarget.java | 87 ---- .../xpipe/ext/base/apps/SaveSourceTarget.java | 90 ---- ...ction.java => RefreshDirectoryAction.java} | 2 +- ext/base/src/main/java/module-info.java | 13 +- .../resources/lang/translations_en.properties | 2 +- 146 files changed, 1102 insertions(+), 6976 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/comp/base/NamedToggleComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/base/SystemStateComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DataSourceTargetChoiceComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsCollectionComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsDataTransferComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsProviderChoiceComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsRawComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsStorageGroupSelector.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsStorageTargetComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsStructureComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsTableComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsTableMappingComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsTextComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/DsTypeChoiceComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/GuiDsConfigStep.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/GuiDsCreatorMultiStep.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/GuiDsCreatorSaveStep.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/GuiDsCreatorTransferStep.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/GuiDsStoreSelectStep.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/GuiDsTableMappingConfirmation.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/source/NamedSourceChoiceComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionContextMenu.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionEmptyIntroComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionFilterBarComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionLayoutComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionListComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionSortMode.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionViewState.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/collection/SourceCollectionWrapper.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryContextMenu.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryDisplayMode.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryListComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryListHeaderComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceEntryWrapper.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/storage/source/SourceStorageEmptyIntroComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/storage/store/DenseStoreEntryComp.java create mode 100644 app/src/main/java/io/xpipe/app/comp/storage/store/StandardStoreEntryComp.java rename app/src/main/java/io/xpipe/app/comp/storage/store/{StoreEntrySection.java => StoreSectionComp.java} (55%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DataStoreSelectorComp.java (98%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsDbStoreChooserComp.java (97%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsFileHistoryComp.java (97%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsLocalDirectoryBrowseComp.java (98%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsLocalFileBrowseComp.java (98%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsRemoteFileChoiceComp.java (97%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsStoreProviderChoiceComp.java (96%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/DsStreamStoreChoiceComp.java (97%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/GuiDsStoreCreator.java (99%) rename app/src/main/java/io/xpipe/app/comp/{source => }/store/NamedStoreChoiceComp.java (99%) delete mode 100644 app/src/main/java/io/xpipe/app/exchange/ConvertExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/EditExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/QueryDataSourceExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/SelectExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/WriteExecuteExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/WritePreparationExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/api/AddSourceExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/api/ForwardExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/api/QueryRawDataExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/api/QueryTableDataExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/api/QueryTextDataExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/ListCollectionsExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/ListEntriesExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/RemoveCollectionExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/RemoveEntryExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/RenameCollectionExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/RenameEntryExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/exchange/cli/SourceProviderListExchangeImpl.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/WrapperComp.java delete mode 100644 app/src/main/java/io/xpipe/app/storage/CollectionListener.java delete mode 100644 app/src/main/java/io/xpipe/app/storage/DataSourceCollection.java delete mode 100644 app/src/main/java/io/xpipe/app/storage/DataSourceEntry.java delete mode 100644 app/src/main/java/io/xpipe/app/util/XPipeDaemon.java delete mode 100644 app/src/main/java/io/xpipe/app/util/XPipeDaemonProvider.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/exchange/api/QueryRawDataExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/exchange/api/QueryTableDataExchange.java delete mode 100644 beacon/src/main/java/io/xpipe/beacon/exchange/api/QueryTextDataExchange.java create mode 100644 ext/base/src/main/java/io/xpipe/ext/base/actions/RefreshStoreAction.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/apps/CommandLineTarget.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/apps/DataSourceOutputTarget.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/apps/FileOutputTarget.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/apps/JavaTarget.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/apps/RawFileOutputTarget.java delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/apps/SaveSourceTarget.java rename ext/base/src/main/java/io/xpipe/ext/base/browser/{RefreshAction.java => RefreshDirectoryAction.java} (95%) diff --git a/api/src/main/java/io/xpipe/api/impl/DataTableImpl.java b/api/src/main/java/io/xpipe/api/impl/DataTableImpl.java index e61f3ebd..436ac316 100644 --- a/api/src/main/java/io/xpipe/api/impl/DataTableImpl.java +++ b/api/src/main/java/io/xpipe/api/impl/DataTableImpl.java @@ -2,25 +2,16 @@ package io.xpipe.api.impl; import io.xpipe.api.DataSourceConfig; import io.xpipe.api.DataTable; -import io.xpipe.api.connector.XPipeApiConnection; -import io.xpipe.beacon.BeaconConnection; -import io.xpipe.beacon.BeaconException; -import io.xpipe.beacon.exchange.api.QueryTableDataExchange; import io.xpipe.core.data.node.ArrayNode; import io.xpipe.core.data.node.DataStructureNode; import io.xpipe.core.data.node.TupleNode; -import io.xpipe.core.data.typed.TypedAbstractReader; -import io.xpipe.core.data.typed.TypedDataStreamParser; -import io.xpipe.core.data.typed.TypedDataStructureNodeReader; import io.xpipe.core.source.DataSourceId; -import io.xpipe.core.source.DataSourceReference; import io.xpipe.core.source.DataSourceType; -import java.io.IOException; -import java.io.InputStream; -import java.util.*; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; import java.util.stream.Stream; -import java.util.stream.StreamSupport; public class DataTableImpl extends DataSourceImpl implements DataTable { @@ -34,9 +25,7 @@ public class DataTableImpl extends DataSourceImpl implements DataTable { } public Stream stream() { - var iterator = new TableIterator(); - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false) - .onClose(iterator::finish); + return Stream.of(); } @Override @@ -52,71 +41,21 @@ public class DataTableImpl extends DataSourceImpl implements DataTable { @Override public ArrayNode read(int maxRows) { List nodes = new ArrayList<>(); - XPipeApiConnection.execute(con -> { - var req = QueryTableDataExchange.Request.builder() - .ref(DataSourceReference.id(getId())) - .maxRows(maxRows) - .build(); - con.performInputExchange(req, (QueryTableDataExchange.Response res, InputStream in) -> { - var r = new TypedDataStreamParser(res.getDataType()); - - r.parseStructures(in, TypedDataStructureNodeReader.of(res.getDataType()), nodes::add); - }); - }); return ArrayNode.of(nodes); } @Override public Iterator iterator() { - return new TableIterator(); - } - - private class TableIterator implements Iterator { - - private final BeaconConnection connection; - private final TypedDataStreamParser parser; - private final TypedAbstractReader nodeReader; - private TupleNode node; - - { - connection = XPipeApiConnection.open(); - var req = QueryTableDataExchange.Request.builder() - .ref(DataSourceReference.id(getId())) - .maxRows(Integer.MAX_VALUE) - .build(); - connection.sendRequest(req); - QueryTableDataExchange.Response response = connection.receiveResponse(); - - nodeReader = TypedDataStructureNodeReader.of(response.getDataType()); - parser = new TypedDataStreamParser(response.getDataType()); - - connection.receiveBody(); - } - - private void finish() { - connection.close(); - } - - @Override - public boolean hasNext() { - connection.checkClosed(); - - try { - node = (TupleNode) parser.parseStructure(connection.getInputStream(), nodeReader); - } catch (IOException e) { - throw new BeaconException(e); + return new Iterator() { + @Override + public boolean hasNext() { + return false; } - if (node == null) { - // finish(); + + @Override + public TupleNode next() { + return null; } - return node != null; - } - - @Override - public TupleNode next() { - connection.checkClosed(); - - return node; - } + }; } } diff --git a/api/src/main/java/io/xpipe/api/impl/DataTextImpl.java b/api/src/main/java/io/xpipe/api/impl/DataTextImpl.java index f272c7dd..c4c72f22 100644 --- a/api/src/main/java/io/xpipe/api/impl/DataTextImpl.java +++ b/api/src/main/java/io/xpipe/api/impl/DataTextImpl.java @@ -2,25 +2,12 @@ package io.xpipe.api.impl; import io.xpipe.api.DataSourceConfig; import io.xpipe.api.DataText; -import io.xpipe.api.connector.XPipeApiConnection; -import io.xpipe.beacon.BeaconConnection; -import io.xpipe.beacon.BeaconException; -import io.xpipe.beacon.exchange.api.QueryTextDataExchange; import io.xpipe.core.source.DataSourceId; -import io.xpipe.core.source.DataSourceReference; import io.xpipe.core.source.DataSourceType; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; -import java.util.Iterator; import java.util.List; -import java.util.Spliterator; -import java.util.Spliterators; import java.util.stream.Collectors; import java.util.stream.Stream; -import java.util.stream.StreamSupport; public class DataTextImpl extends DataSourceImpl implements DataText { @@ -53,47 +40,7 @@ public class DataTextImpl extends DataSourceImpl implements DataText { @Override public Stream lines() { - var iterator = new Iterator() { - - private final BeaconConnection connection; - private final BufferedReader reader; - private String nextValue; - - { - connection = XPipeApiConnection.open(); - var req = QueryTextDataExchange.Request.builder() - .ref(DataSourceReference.id(getId())) - .maxLines(-1) - .build(); - connection.sendRequest(req); - connection.receiveResponse(); - reader = new BufferedReader(new InputStreamReader(connection.receiveBody(), StandardCharsets.UTF_8)); - } - - private void close() { - connection.close(); - } - - @Override - public boolean hasNext() { - connection.checkClosed(); - - try { - nextValue = reader.readLine(); - } catch (IOException e) { - throw new BeaconException(e); - } - return nextValue != null; - } - - @Override - public String next() { - return nextValue; - } - }; - - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false) - .onClose(iterator::close); + return Stream.of(); } @Override diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java b/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java index 1177de3c..1cf1e4c3 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkList.java @@ -11,6 +11,7 @@ import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.BusyProperty; import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.store.DataStore; +import io.xpipe.core.store.FixedHierarchyStore; import io.xpipe.core.store.ShellStore; import javafx.application.Platform; import javafx.beans.property.*; @@ -130,11 +131,15 @@ final class BrowserBookmarkList extends SimpleComp { } ThreadHelper.runFailableAsync(() -> { - BusyProperty.execute(busy, () -> { - getItem().refreshIfNeeded(); - }); if (getItem().getEntry().getStore() instanceof ShellStore fileSystem) { + BusyProperty.execute(busy, () -> { + getItem().refreshIfNeeded(); + }); model.openFileSystemAsync(null, fileSystem, null, busy); + } else if (getItem().getEntry().getStore() instanceof FixedHierarchyStore) { + BusyProperty.execute(busy, () -> { + getItem().refreshWithChildren(); + }); } }); event.consume(); @@ -170,10 +175,14 @@ final class BrowserBookmarkList extends SimpleComp { super.updateItem(item, empty); if (empty || item == null) { setText(null); + // Don't set image as that would trigger image comp update // and cells are emptied on each change, leading to unnecessary changes // img.set(null); - setGraphic(null); + + // Use opacity instead of visibility as visibility is kinda bugged with web views + setOpacity(0.0); + setFocusTraversable(false); setAccessibleText(null); } else { @@ -190,7 +199,7 @@ final class BrowserBookmarkList extends SimpleComp { img.set(item.getEntry() .getProvider() .getDisplayIconFileName(item.getEntry().getStore())); - setGraphic(imageView); + setOpacity(1.0); setFocusTraversable(true); setAccessibleText( item.getName() + " " + item.getEntry().getProvider().getDisplayName()); diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java index 1bbc17c9..b635bc0c 100644 --- a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java @@ -6,7 +6,6 @@ import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.BusyProperty; import io.xpipe.app.util.TerminalHelper; import io.xpipe.app.util.ThreadHelper; -import io.xpipe.app.util.XPipeDaemon; import io.xpipe.core.impl.FileNames; import io.xpipe.core.process.ShellControl; import io.xpipe.core.process.ShellDialects; @@ -133,7 +132,7 @@ public final class OpenFileSystemModel { && fileSystem.getShell().isPresent()) { var directory = currentPath.get(); var name = adjustedPath + " - " - + XPipeDaemon.getInstance().getStoreName(store).orElse("?"); + + DataStorage.get().getStoreDisplayName(store).orElse("?"); ThreadHelper.runFailableAsync(() -> { if (ShellDialects.ALL.stream() .anyMatch(dialect -> adjustedPath.startsWith(dialect.getOpenCommand()))) { @@ -379,8 +378,7 @@ public final class OpenFileSystemModel { var command = s.control() .initWith(connection.getShellDialect().getCdCommand(directory)) .prepareTerminalOpen(directory + " - " - + XPipeDaemon.getInstance() - .getStoreName(store) + + DataStorage.get().getStoreDisplayName(store) .orElse("?")); TerminalHelper.open(directory, command); } diff --git a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java index c56aa25a..7717da33 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ListBoxViewComp.java @@ -7,6 +7,7 @@ import io.xpipe.app.fxcomps.util.PlatformThread; import javafx.application.Platform; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; +import javafx.css.PseudoClass; import javafx.scene.control.ScrollPane; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; @@ -18,6 +19,9 @@ import java.util.function.Function; public class ListBoxViewComp extends Comp> { + private static final PseudoClass ODD = PseudoClass.getPseudoClass("odd"); + private static final PseudoClass EVEN = PseudoClass.getPseudoClass("even"); + private final ObservableList shown; private final ObservableList all; private final Function> compFunction; @@ -32,30 +36,35 @@ public class ListBoxViewComp extends Comp> { public CompStructure createBase() { Map cache = new HashMap<>(); - VBox listView = new VBox(); - listView.setFocusTraversable(false); + VBox vbox = new VBox(); + vbox.getStyleClass().add("content"); + vbox.setFocusTraversable(false); - refresh(listView, shown, cache, false); - listView.requestLayout(); + refresh(vbox, shown, all, cache, false); + vbox.requestLayout(); shown.addListener((ListChangeListener) (c) -> { - refresh(listView, c.getList(), cache, true); + refresh(vbox, c.getList(), all, cache, true); }); all.addListener((ListChangeListener) c -> { cache.keySet().retainAll(c.getList()); }); - var scroll = new ScrollPane(listView); + var scroll = new ScrollPane(vbox); scroll.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); scroll.setFitToWidth(true); + scroll.getStyleClass().add("list-box-view-comp"); return new SimpleCompStructure<>(scroll); } - private void refresh(VBox listView, List c, Map cache, boolean asynchronous) { + private void refresh(VBox listView, List shown, List all, Map cache, boolean asynchronous) { Runnable update = () -> { - var newShown = c.stream() + // Clear cache of unused values + cache.keySet().removeIf(t -> !all.contains(t)); + + var newShown = shown.stream() .map(v -> { if (!cache.containsKey(v)) { cache.put(v, compFunction.apply(v).createRegion()); @@ -65,6 +74,13 @@ public class ListBoxViewComp extends Comp> { }) .toList(); + for (int i = 0; i < newShown.size(); i++) { + var r = newShown.get(i); + r.pseudoClassStateChanged(ODD, false); + r.pseudoClassStateChanged(EVEN, false); + r.pseudoClassStateChanged(i % 2 == 0 ? EVEN : ODD, true); + } + if (!listView.getChildren().equals(newShown)) { listView.getChildren().setAll(newShown); listView.layout(); diff --git a/app/src/main/java/io/xpipe/app/comp/base/LoadingOverlayComp.java b/app/src/main/java/io/xpipe/app/comp/base/LoadingOverlayComp.java index 2c270f13..700f9906 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/LoadingOverlayComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/LoadingOverlayComp.java @@ -7,6 +7,7 @@ import io.xpipe.app.fxcomps.SimpleCompStructure; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.util.ThreadHelper; import javafx.application.Platform; +import javafx.beans.binding.Bindings; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.scene.layout.StackPane; @@ -27,8 +28,6 @@ public class LoadingOverlayComp extends Comp> { var loading = new RingProgressIndicator(0, false); loading.setProgress(-1); - loading.setPrefWidth(50); - loading.setPrefHeight(50); var loadingBg = new StackPane(loading); loadingBg.getStyleClass().add("loading-comp"); @@ -69,7 +68,14 @@ public class LoadingOverlayComp extends Comp> { }; PlatformThread.sync(showLoading).addListener(listener); - var stack = new StackPane(compStruc.get(), loadingBg); + var r = compStruc.get(); + var stack = new StackPane(r, loadingBg); + + loading.prefWidthProperty().bind(Bindings.createDoubleBinding(() -> { + return Math.min(r.getHeight() - 20, 50); + }, r.heightProperty())); + loading.prefHeightProperty().bind(loading.prefWidthProperty()); + return new SimpleCompStructure<>(stack); } } diff --git a/app/src/main/java/io/xpipe/app/comp/base/NamedToggleComp.java b/app/src/main/java/io/xpipe/app/comp/base/NamedToggleComp.java new file mode 100644 index 00000000..de9c08c5 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/base/NamedToggleComp.java @@ -0,0 +1,35 @@ +package io.xpipe.app.comp.base; + +import atlantafx.base.controls.ToggleSwitch; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.util.PlatformThread; +import javafx.beans.property.BooleanProperty; +import javafx.beans.value.ObservableValue; +import javafx.scene.layout.Region; + +public class NamedToggleComp extends SimpleComp { + + private final BooleanProperty selected; + private final ObservableValue name; + + public NamedToggleComp(BooleanProperty selected, ObservableValue name) { + this.selected = selected; + this.name = name; + } + + @Override + protected Region createSimple() { + var s = new ToggleSwitch(); + s.setSelected(selected.getValue()); + s.selectedProperty().addListener((observable, oldValue, newValue) -> { + selected.set(newValue); + }); + selected.addListener((observable, oldValue, newValue) -> { + PlatformThread.runLaterIfNeeded(() -> { + s.setSelected(newValue); + }); + }); + s.textProperty().bind(PlatformThread.sync(name)); + return s; + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/base/SystemStateComp.java b/app/src/main/java/io/xpipe/app/comp/base/SystemStateComp.java new file mode 100644 index 00000000..494fa0e4 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/comp/base/SystemStateComp.java @@ -0,0 +1,75 @@ +package io.xpipe.app.comp.base; + +import atlantafx.base.theme.Styles; +import io.xpipe.app.fxcomps.SimpleComp; +import io.xpipe.app.fxcomps.impl.FancyTooltipAugment; +import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.fxcomps.util.SimpleChangeListener; +import javafx.beans.binding.Bindings; +import javafx.beans.value.ObservableValue; +import javafx.geometry.Pos; +import javafx.scene.layout.Region; +import org.kordamp.ikonli.javafx.FontIcon; +import org.kordamp.ikonli.javafx.StackedFontIcon; + +public class SystemStateComp extends SimpleComp { + + + public SystemStateComp(ObservableValue name, ObservableValue state) { + this.name = name; + this.state = state; + } + + public static enum State { + FAILURE, + SUCCESS, + OTHER + } + + private final ObservableValue name; + private final ObservableValue state; + + @Override + protected Region createSimple() { + var icon = PlatformThread.sync(Bindings.createStringBinding( + () -> { + return state.getValue() == State.FAILURE + ? "mdi2l-lightning-bolt" + : state.getValue() == State.SUCCESS ? "mdal-check" : "mdsmz-remove"; + }, + state)); + var fi = new FontIcon(); + fi.getStyleClass().add("inner-icon"); + SimpleChangeListener.apply(icon, val -> fi.setIconLiteral(val)); + + var border = new FontIcon("mdi2c-circle-outline"); + border.getStyleClass().add("outer-icon"); + border.setOpacity(0.5); + + var success = Styles.toDataURI(".stacked-ikonli-font-icon > .outer-icon { -fx-icon-color: -color-success-emphasis; }"); + var failure = Styles.toDataURI(".stacked-ikonli-font-icon > .outer-icon { -fx-icon-color: -color-danger-emphasis; }"); + var other = Styles.toDataURI(".stacked-ikonli-font-icon > .outer-icon { -fx-icon-color: -color-accent-emphasis; }"); + + var pane = new StackedFontIcon(); + pane.getChildren().addAll(fi, border); + pane.setAlignment(Pos.CENTER); + + var dataClass1 = """ + .stacked-ikonli-font-icon > .outer-icon { + -fx-icon-size: 22px; + } + .stacked-ikonli-font-icon > .inner-icon { + -fx-icon-size: 12px; + } + """; + pane.getStylesheets().add(Styles.toDataURI(dataClass1)); + + SimpleChangeListener.apply(PlatformThread.sync(state), val -> { + pane.getStylesheets().removeAll(success, failure, other); + pane.getStylesheets().add(val == State.SUCCESS ? success : val == State.FAILURE ? failure: other); + }); + + new FancyTooltipAugment<>(PlatformThread.sync(name)).augment(pane); + return pane; + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/source/DataSourceTargetChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/source/DataSourceTargetChoiceComp.java deleted file mode 100644 index 8e7b9bf9..00000000 --- a/app/src/main/java/io/xpipe/app/comp/source/DataSourceTargetChoiceComp.java +++ /dev/null @@ -1,101 +0,0 @@ -package io.xpipe.app.comp.source; - -import io.xpipe.app.core.AppCache; -import io.xpipe.app.core.AppI18n; -import io.xpipe.app.ext.DataSourceTarget; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.util.CustomComboBoxBuilder; -import javafx.beans.property.Property; -import javafx.geometry.Pos; -import javafx.scene.Node; -import javafx.scene.control.ComboBox; -import javafx.scene.control.Label; -import javafx.scene.layout.Region; -import org.kordamp.ikonli.javafx.FontIcon; - -import java.util.List; -import java.util.function.Predicate; - -public class DataSourceTargetChoiceComp extends Comp>> { - - private final Property selectedApplication; - private final List all; - - private DataSourceTargetChoiceComp(Property selectedApplication, List all) { - this.selectedApplication = selectedApplication; - this.all = all; - } - - public static DataSourceTargetChoiceComp create( - Property selectedApplication, Predicate filter) { - selectedApplication.addListener((observable, oldValue, val) -> { - AppCache.update("application-last-used", val != null ? val.getId() : null); - }); - var all = DataSourceTarget.getAll().stream().filter(filter).toList(); - - if (selectedApplication.getValue() == null) { - String selectedId = AppCache.get("application-last-used", String.class, () -> null); - var selectedProvider = selectedId != null - ? DataSourceTarget.byId(selectedId).filter(filter).orElse(null) - : null; - selectedApplication.setValue(selectedProvider); - } - - return new DataSourceTargetChoiceComp(selectedApplication, all); - } - - private String getIconCode(DataSourceTarget p) { - return p.getGraphicIcon() != null - ? p.getGraphicIcon() - : p.getCategory().equals(DataSourceTarget.Category.PROGRAMMING_LANGUAGE) - ? "mdi2c-code-tags" - : "mdral-indeterminate_check_box"; - } - - private Region createLabel(DataSourceTarget p) { - var g = new FontIcon(getIconCode(p)); - var l = new Label(p.getName().getValue(), g); - l.setAlignment(Pos.CENTER); - g.iconColorProperty().bind(l.textFillProperty()); - return l; - } - - @Override - public CompStructure> createBase() { - var addMoreLabel = new Label(AppI18n.get("addMore"), new FontIcon("mdmz-plus")); - - var builder = - new CustomComboBoxBuilder<>(selectedApplication, app -> createLabel(app), new Label(""), v -> true); - builder.setAccessibleNames( - dataSourceTarget -> dataSourceTarget.getName().getValue()); - - // builder.addFilter((v, s) -> v.getName().getValue().toLowerCase().contains(s)); - - builder.addHeader(AppI18n.get("programmingLanguages")); - all.stream() - .filter(p -> p.getCategory().equals(DataSourceTarget.Category.PROGRAMMING_LANGUAGE)) - .forEach(builder::add); - - builder.addHeader(AppI18n.get("applications")); - all.stream() - .filter(p -> p.getCategory().equals(DataSourceTarget.Category.APPLICATION)) - .forEach(builder::add); - - builder.addHeader(AppI18n.get("other")); - all.stream() - .filter(p -> p.getCategory().equals(DataSourceTarget.Category.OTHER)) - .forEach(builder::add); - - // builder.addSeparator(); - // builder.addAction(addMoreLabel, () -> { - // - // }); - - var cb = builder.build(); - cb.getStyleClass().add("application-choice-comp"); - cb.setMaxWidth(2000); - return new SimpleCompStructure<>(cb); - } -} diff --git a/app/src/main/java/io/xpipe/app/comp/source/DsCollectionComp.java b/app/src/main/java/io/xpipe/app/comp/source/DsCollectionComp.java deleted file mode 100644 index 28e0218b..00000000 --- a/app/src/main/java/io/xpipe/app/comp/source/DsCollectionComp.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.xpipe.app.comp.source; - -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.issue.ErrorEvent; -import io.xpipe.core.source.CollectionReadConnection; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; -import javafx.scene.control.TreeItem; -import javafx.scene.control.TreeView; - -import java.util.ArrayList; - -public class DsCollectionComp extends Comp>> { - - private final ObservableValue con; - - private final ObservableValue value; - - public DsCollectionComp(ObservableValue con) { - this.con = con; - this.value = new SimpleObjectProperty<>("/"); - } - - private TreeItem createTree() { - var c = new ArrayList>(); - - if (con.getValue() != null) { - try { - con.getValue().listEntries().forEach(e -> { - // var item = new TreeItem(e.getFileName()); - // c.add(item); - }); - } catch (Exception ex) { - ErrorEvent.fromThrowable(ex).handle(); - } - } - - var ar = new TreeItem<>(value.getValue()); - ar.getChildren().setAll(c); - return ar; - } - - private void setupListener(TreeView tv) { - ChangeListener listener = (c, o, n) -> { - var nt = createTree(); - tv.setRoot(nt); - }; - con.addListener(listener); - listener.changed(con, null, con.getValue()); - } - - @Override - public CompStructure> createBase() { - var table = new TreeView(); - setupListener(table); - return new SimpleCompStructure<>(table); - } -} diff --git a/app/src/main/java/io/xpipe/app/comp/source/DsDataTransferComp.java b/app/src/main/java/io/xpipe/app/comp/source/DsDataTransferComp.java deleted file mode 100644 index cbb22553..00000000 --- a/app/src/main/java/io/xpipe/app/comp/source/DsDataTransferComp.java +++ /dev/null @@ -1,203 +0,0 @@ -package io.xpipe.app.comp.source; - -import io.xpipe.app.comp.base.ButtonComp; -import io.xpipe.app.comp.base.MultiStepComp; -import io.xpipe.app.core.AppFont; -import io.xpipe.app.core.AppI18n; -import io.xpipe.app.core.AppWindowHelper; -import io.xpipe.app.ext.DataSourceTarget; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.DynamicOptionsComp; -import io.xpipe.app.fxcomps.impl.HorizontalComp; -import io.xpipe.app.fxcomps.util.PlatformThread; -import io.xpipe.app.fxcomps.util.SimpleChangeListener; -import io.xpipe.app.storage.DataSourceEntry; -import io.xpipe.app.storage.DataStorage; -import io.xpipe.app.util.BusyProperty; -import io.xpipe.app.util.Hyperlinks; -import io.xpipe.app.util.ThreadHelper; -import io.xpipe.core.source.DataSourceId; -import javafx.application.Platform; -import javafx.beans.binding.Bindings; -import javafx.beans.property.Property; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.value.ObservableValue; -import javafx.geometry.Pos; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; -import javafx.scene.layout.Region; -import javafx.scene.layout.VBox; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.experimental.FieldDefaults; -import org.kordamp.ikonli.javafx.FontIcon; - -import java.util.ArrayList; -import java.util.List; - -@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) -@AllArgsConstructor -@Getter -public class DsDataTransferComp extends SimpleComp { - - private final Property dataSourceEntry; - Property selectedTarget = new SimpleObjectProperty<>(); - Property selectedDisplay = new SimpleObjectProperty<>(); - List excludedTargets = new ArrayList<>(); - - public DsDataTransferComp selectApplication(DataSourceTarget t) { - selectedTarget.setValue(t); - return this; - } - - public DsDataTransferComp exclude(DataSourceTarget t) { - excludedTargets.add(t); - return this; - } - - public static void showPipeWindow(DataSourceEntry e) { - Platform.runLater(() -> { - var loading = new SimpleBooleanProperty(); - AppWindowHelper.sideWindow( - AppI18n.get("pipeDataSource"), - window -> { - var ms = new DsDataTransferComp(new SimpleObjectProperty<>(e)) - .exclude(DataSourceTarget.byId("base.saveSource") - .orElseThrow()); - var multi = new MultiStepComp() { - @Override - protected List setup() { - return List.of(new Entry(null, new Step<>() { - @Override - public CompStructure createBase() { - return ms.createStructure(); - } - - @Override - public boolean canContinue() { - var selected = ms.selectedTarget.getValue(); - if (selected == null) { - return false; - } - - var validator = ms.selectedDisplay - .getValue() - .getValidator(); - if (validator == null) { - return true; - } - - return validator.validate(); - } - })); - } - - @Override - protected void finish() { - var onFinish = ms.getSelectedDisplay() - .getValue() - .getOnFinish(); - if (onFinish != null) { - ThreadHelper.runAsync(() -> { - try (var busy = new BusyProperty(loading)) { - onFinish.run(); - PlatformThread.runLaterIfNeeded(() -> window.close()); - } - }); - } - } - }; - return multi.apply(s -> { - SimpleChangeListener.apply(ms.getSelectedTarget(), (c) -> { - if (c != null && c.getAccessType() == DataSourceTarget.AccessType.PASSIVE) { - ((Region) s.get().getChildren().get(2)).setMaxHeight(0); - ((Region) s.get().getChildren().get(2)).setMinHeight(0); - s.get().getChildren().get(2).setVisible(false); - } else { - - ((Region) s.get().getChildren().get(2)).setMaxHeight(Region.USE_PREF_SIZE); - ((Region) s.get().getChildren().get(2)).setMinHeight(Region.USE_PREF_SIZE); - s.get().getChildren().get(2).setVisible(true); - } - }); - s.get().setPrefWidth(600); - s.get().setPrefHeight(700); - AppFont.medium(s.get()); - }); - }, - false, - loading) - .show(); - }); - } - - @Override - public Region createSimple() { - ObservableValue id = Bindings.createObjectBinding( - () -> { - if (!DataStorage.get().getSourceEntries().contains(dataSourceEntry.getValue())) { - return null; - } - - return DataStorage.get().getId(dataSourceEntry.getValue()); - }, - dataSourceEntry); - - var chooser = DataSourceTargetChoiceComp.create( - selectedTarget, - a -> !excludedTargets.contains(a) - && a.isApplicable(dataSourceEntry.getValue().getSource()) - && a.createRetrievalInstructions( - dataSourceEntry.getValue().getSource(), id) - != null); - - var setupGuideButton = new ButtonComp( - AppI18n.observable("setupGuide"), new FontIcon("mdoal-integration_instructions"), () -> { - Hyperlinks.open(selectedTarget.getValue().getSetupGuideURL()); - }) - .apply(s -> s.get() - .visibleProperty() - .bind(Bindings.createBooleanBinding( - () -> { - return selectedTarget.getValue() != null - && selectedTarget.getValue().getSetupGuideURL() != null; - }, - selectedTarget))); - var top = new HorizontalComp(List.>of( - chooser.apply(struc -> HBox.setHgrow(struc.get(), Priority.ALWAYS)), setupGuideButton)) - .apply(struc -> { - struc.get().setAlignment(Pos.CENTER); - struc.get().setSpacing(12); - struc.get().getStyleClass().add("top"); - }); - - // setupGuideButton.prefHeightProperty().bind(chooserR.heightProperty()); - - var content = new VBox( - new DynamicOptionsComp(List.of(new DynamicOptionsComp.Entry(null, null, top)), false).createRegion(), - new Region()); - SimpleChangeListener.apply(selectedTarget, c -> { - if (selectedTarget.getValue() == null) { - content.getChildren().set(1, new Region()); - selectedDisplay.setValue(null); - return; - } - - var instructions = selectedTarget - .getValue() - .createRetrievalInstructions(dataSourceEntry.getValue().getSource(), id); - content.getChildren().set(1, instructions.getRegion()); - VBox.setVgrow(instructions.getRegion(), Priority.ALWAYS); - selectedDisplay.setValue(instructions); - }); - - content.setSpacing(15); - var r = content; - r.getStyleClass().add("data-source-retrieve"); - return r; - } -} diff --git a/app/src/main/java/io/xpipe/app/comp/source/DsProviderChoiceComp.java b/app/src/main/java/io/xpipe/app/comp/source/DsProviderChoiceComp.java deleted file mode 100644 index cedcdfc6..00000000 --- a/app/src/main/java/io/xpipe/app/comp/source/DsProviderChoiceComp.java +++ /dev/null @@ -1,88 +0,0 @@ -package io.xpipe.app.comp.source; - -import io.xpipe.app.core.AppI18n; -import io.xpipe.app.ext.DataSourceProvider; -import io.xpipe.app.ext.DataSourceProviders; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.app.util.*; -import io.xpipe.core.source.DataSourceType; -import javafx.beans.property.Property; -import javafx.scene.Node; -import javafx.scene.control.ComboBox; -import javafx.scene.layout.Region; -import lombok.Getter; -import net.synedra.validatorfx.Check; - -import java.util.List; - -public class DsProviderChoiceComp extends Comp>> implements Validatable { - - private final DataSourceProvider.Category type; - private final Property> provider; - - @Getter - private final Validator validator = new SimpleValidator(); - - private final Check check; - private final DataSourceType filter; - - public DsProviderChoiceComp( - DataSourceProvider.Category type, Property> provider, DataSourceType filter) { - this.type = type; - this.provider = provider; - check = Validator.nonNull(validator, AppI18n.observable("provider"), provider); - this.filter = filter; - } - - private Region createDefaultNode() { - return switch (type) { - case STREAM -> JfxHelper.createNamedEntry( - AppI18n.get("anyStream"), AppI18n.get("anyStreamDescription"), "file_icon.png"); - case DATABASE -> JfxHelper.createNamedEntry( - AppI18n.get("selectQueryType"), AppI18n.get("selectQueryTypeDescription"), "db_icon.png"); - }; - } - - private List> getProviders() { - return switch (type) { - case STREAM -> DataSourceProviders.getAll().stream() - .filter(p -> AppPrefs.get().developerShowHiddenProviders().get() - || p.getCategory() == DataSourceProvider.Category.STREAM) - .filter(p -> p.shouldShow(filter)) - .toList(); - case DATABASE -> DataSourceProviders.getAll().stream() - .filter(p -> p.getCategory() == DataSourceProvider.Category.DATABASE) - .filter(p -> AppPrefs.get().developerShowHiddenProviders().get() || p.shouldShow(filter)) - .toList(); - }; - } - - private Region createGraphic(DataSourceProvider provider) { - if (provider == null) { - return createDefaultNode(); - } - - var graphic = provider.getDisplayIconFileName(); - - return JfxHelper.createNamedEntry(provider.getDisplayName(), provider.getDisplayDescription(), graphic); - } - - @Override - public CompStructure> createBase() { - var comboBox = new CustomComboBoxBuilder<>(provider, this::createGraphic, createDefaultNode(), v -> true); - comboBox.setAccessibleNames( - dataSourceProvider -> dataSourceProvider != null ? dataSourceProvider.getDisplayName() : null); - comboBox.add(null); - comboBox.addSeparator(); - comboBox.addFilter((v, s) -> v.getDisplayName().toLowerCase().contains(s.toLowerCase())); - getProviders().forEach(comboBox::add); - ComboBox cb = comboBox.build(); - check.decorates(cb); - cb.getStyleClass().add("data-source-type"); - cb.getStyleClass().add("choice-comp"); - return new SimpleCompStructure<>(cb); - } -} diff --git a/app/src/main/java/io/xpipe/app/comp/source/DsRawComp.java b/app/src/main/java/io/xpipe/app/comp/source/DsRawComp.java deleted file mode 100644 index c3b8ca3b..00000000 --- a/app/src/main/java/io/xpipe/app/comp/source/DsRawComp.java +++ /dev/null @@ -1,35 +0,0 @@ -package io.xpipe.app.comp.source; - -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.fxcomps.util.PlatformThread; -import io.xpipe.app.fxcomps.util.SimpleChangeListener; -import javafx.beans.value.ObservableValue; -import javafx.scene.control.TextArea; - -import java.util.HexFormat; - -public class DsRawComp extends Comp> { - - private final ObservableValue value; - - public DsRawComp(ObservableValue value) { - this.value = value; - } - - private void setupListener(TextArea ta) { - var format = HexFormat.of().withDelimiter(" ").withUpperCase(); - SimpleChangeListener.apply(PlatformThread.sync(value), val -> { - ta.textProperty().setValue(format.formatHex(val)); - }); - } - - @Override - public CompStructure