diff --git a/pom.xml b/pom.xml index 7a16ef8..7190d1d 100644 --- a/pom.xml +++ b/pom.xml @@ -55,9 +55,14 @@ - de.adito.nbm - de-adito-groupedtabs-api - RELEASE125-1.9.0 + org.netbeans.api + org-netbeans-modules-projectapi + ${netbeans.version} + + + org.netbeans.api + org-openide-filesystems + ${netbeans.version} diff --git a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupAction.java b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupAction.java index 4f89aeb..f253132 100644 --- a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupAction.java +++ b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupAction.java @@ -1,7 +1,7 @@ package de.adito.aditoweb.nbm.groupedtabs.actions; import de.adito.aditoweb.nbm.groupedtabs.NbUtils; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import org.openide.awt.*; import org.openide.loaders.DataObject; import org.openide.util.*; diff --git a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupAction.java b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupAction.java index f403424..95f47f9 100644 --- a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupAction.java +++ b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupAction.java @@ -1,7 +1,7 @@ package de.adito.aditoweb.nbm.groupedtabs.actions; import de.adito.aditoweb.nbm.groupedtabs.*; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import org.jetbrains.annotations.*; import org.openide.awt.*; import org.openide.loaders.DataObject; @@ -86,6 +86,7 @@ static Stream getGroupsInTopComponentMode(@NotNull TopComponent pTopComp // get the underlaying DataObject for the TopComponent and fetch the group using it .map(pTc -> pTc.getLookup().lookup(DataObject.class)) + .filter(Objects::nonNull) .map(groupProvider::group) // flatmap Optional diff --git a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsAction.java b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsAction.java index 449a738..1f9141d 100644 --- a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsAction.java +++ b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsAction.java @@ -1,7 +1,7 @@ package de.adito.aditoweb.nbm.groupedtabs.actions; import de.adito.aditoweb.nbm.groupedtabs.*; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import org.jetbrains.annotations.NotNull; import org.openide.awt.*; import org.openide.loaders.DataObject; diff --git a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/api/IDataObjectGroupProvider.java b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/api/IDataObjectGroupProvider.java new file mode 100644 index 0000000..9cc0f62 --- /dev/null +++ b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/api/IDataObjectGroupProvider.java @@ -0,0 +1,38 @@ +package de.adito.aditoweb.nbm.groupedtabs.api; + +import org.jetbrains.annotations.*; +import org.openide.loaders.DataObject; +import org.openide.util.Lookup; + +import java.util.*; + +/** + * Provide an implementation of this interface in the global lookup to alter the grouping behavior of DataObject tabs. + * Implementations also have to implement a Comparator for DataObjects, to sort DataObjects inside groups. + * + * @author p.neub, 27.02.2023 + */ +public interface IDataObjectGroupProvider extends Comparator +{ + /** + * Returns an instance of the {@link IDataObjectGroupProvider}. + * The default implementation is {@link de.adito.nbm.groupedtabs.impl.DefaultDataObjectGroupProvider} + * + * @return an instance of {@link IDataObjectGroupProvider} + */ + @NotNull + static IDataObjectGroupProvider getDefault() + { + return Objects.requireNonNull(Lookup.getDefault().lookup(IDataObjectGroupProvider.class)); + } + + /** + * Name of the group that the specified DataObject is part of. + * Return {@link Optional#empty()} if this DataObject does not belong to any specific group. + * + * @param pDataObject the DataObject + * @return the group of the DataObject + */ + @NotNull + Optional group(@NotNull DataObject pDataObject); +} diff --git a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/DefaultDataObjectGroupProvider.java b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/DefaultDataObjectGroupProvider.java new file mode 100644 index 0000000..2f7c4ed --- /dev/null +++ b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/DefaultDataObjectGroupProvider.java @@ -0,0 +1,71 @@ +package de.adito.aditoweb.nbm.groupedtabs.impl; + +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; +import org.jetbrains.annotations.NotNull; +import org.netbeans.api.project.*; +import org.openide.filesystems.FileObject; +import org.openide.loaders.DataObject; +import org.openide.util.lookup.ServiceProvider; + +import java.util.*; + +/** + * Default implementation of {@link IDataObjectGroupProvider}. + * All files that are inside the folder of an entity belong to one group. + * All other files belong to the default group. + * DataObjects are sorted by their path. + * + * @author p.neub, 28.02.2023 + */ +@ServiceProvider(service = IDataObjectGroupProvider.class) +public final class DefaultDataObjectGroupProvider implements IDataObjectGroupProvider +{ + @NotNull + @Override + public Optional group(@NotNull DataObject pDataObject) + { + final FileObject file = pDataObject.getPrimaryFile(); + return Optional.ofNullable(file) + .map(FileOwnerQuery::getOwner) + .map(Project::getProjectDirectory) + .map(FileObject::getPath) + .map(pProjectDir -> { + FileObject curr = file.getParent(); + while (true) + { + FileObject parent = curr.getParent(); + if (parent == null || pProjectDir.equals(parent.getPath())) + return null; + switch (parent.getName()) + { + case "entity": + return curr.getName(); + case "neonView": + return "#VIEW"; + case "neonDashboard": + return "#DASHBOARD"; + case "language": + return "#LANGUAGE"; + case "process": + return "#PROCESS"; + } + curr = parent; + } + }); + } + + @Override + public int compare(DataObject pFirst, DataObject pSecond) + { + final Optional group = group(pFirst); + if (group.isPresent()) + { + if (pFirst.getPrimaryFile().getName().equals(group.get())) + return -1; + if (pSecond.getPrimaryFile().getName().equals(group.get())) + return 1; + } + return pFirst.getPrimaryFile().getPath() + .compareToIgnoreCase(pSecond.getPrimaryFile().getPath()); + } +} diff --git a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/GroupingTabDecorator.java b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/GroupingTabDecorator.java index d02d1a0..4248f3b 100644 --- a/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/GroupingTabDecorator.java +++ b/src/main/java/de/adito/aditoweb/nbm/groupedtabs/impl/GroupingTabDecorator.java @@ -1,7 +1,7 @@ package de.adito.aditoweb.nbm.groupedtabs.impl; import de.adito.aditoweb.nbm.groupedtabs.*; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import org.netbeans.core.multitabs.TabDecorator; import org.netbeans.swing.tabcontrol.TabData; import org.openide.loaders.DataObject; diff --git a/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupActionTest.java b/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupActionTest.java index 438024e..2750100 100644 --- a/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupActionTest.java +++ b/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/CloseGroupActionTest.java @@ -1,6 +1,6 @@ package de.adito.aditoweb.nbm.groupedtabs.actions; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import org.junit.jupiter.api.Test; import org.mockito.MockedStatic; import org.openide.loaders.DataObject; diff --git a/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupActionTest.java b/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupActionTest.java index 145322e..c4edf88 100644 --- a/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupActionTest.java +++ b/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SelectGroupActionTest.java @@ -1,6 +1,6 @@ package de.adito.aditoweb.nbm.groupedtabs.actions; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import org.junit.jupiter.api.Test; import org.mockito.*; import org.openide.loaders.DataObject; diff --git a/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsActionTest.java b/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsActionTest.java index ba7c274..3dae148 100644 --- a/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsActionTest.java +++ b/src/test/java/de/adito/aditoweb/nbm/groupedtabs/actions/SortTabsActionTest.java @@ -1,6 +1,6 @@ package de.adito.aditoweb.nbm.groupedtabs.actions; -import de.adito.nbm.groupedtabs.api.IDataObjectGroupProvider; +import de.adito.aditoweb.nbm.groupedtabs.api.IDataObjectGroupProvider; import lombok.SneakyThrows; import org.junit.jupiter.api.*; import org.mockito.MockedStatic;