diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/bell.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/bell.svg
new file mode 100644
index 0000000000..3c125639a9
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/bell.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/bracket.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/bracket.svg
new file mode 100644
index 0000000000..af267ca1d4
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/bracket.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/callhierarchy-incoming.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/callhierarchy-incoming.svg
new file mode 100644
index 0000000000..c235778bc6
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/callhierarchy-incoming.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/circuit-board.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/circuit-board.svg
new file mode 100644
index 0000000000..cc10d5d390
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/circuit-board.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/coffee.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/coffee.svg
new file mode 100644
index 0000000000..4640e3ac3e
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/coffee.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/database.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/database.svg
new file mode 100644
index 0000000000..6b8df4c5ba
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/database.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/debug-breakpoint-data-unverified.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/debug-breakpoint-data-unverified.svg
new file mode 100644
index 0000000000..4fbd73edf9
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/debug-breakpoint-data-unverified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/debug-disconnect.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/debug-disconnect.svg
new file mode 100644
index 0000000000..bb050c2717
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/debug-disconnect.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/file-binary.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/file-binary.svg
new file mode 100644
index 0000000000..00649d2d6b
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/file-binary.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/gear.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/gear.svg
new file mode 100644
index 0000000000..8ee3ec48ab
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/gear.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/globe.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/globe.svg
new file mode 100644
index 0000000000..4699fb5419
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/globe.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/layers.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/layers.svg
new file mode 100644
index 0000000000..f67ac65f33
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/layers.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/library.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/library.svg
new file mode 100644
index 0000000000..bedd9ee1d3
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/library.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/lightbulb.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/lightbulb.svg
new file mode 100644
index 0000000000..37df948008
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/lightbulb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/link.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/link.svg
new file mode 100644
index 0000000000..46bf4d5340
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/link.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/package.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/package.svg
new file mode 100644
index 0000000000..ee991f892d
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/package.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/project.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/project.svg
new file mode 100644
index 0000000000..5aca8548e5
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/project.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/record.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/record.svg
new file mode 100644
index 0000000000..abebeac9c1
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/record.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/search.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/search.svg
new file mode 100644
index 0000000000..c6e88e26f9
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/search.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-class.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-class.svg
new file mode 100644
index 0000000000..d837c94d3c
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-class.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-field.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-field.svg
new file mode 100644
index 0000000000..a344cf007f
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-field.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-interface.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-interface.svg
new file mode 100644
index 0000000000..cef462e73f
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-interface.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-method.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-method.svg
new file mode 100644
index 0000000000..15066578a9
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-method.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-property.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-property.svg
new file mode 100644
index 0000000000..e5222f9f1c
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-property.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-value.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-value.svg
new file mode 100644
index 0000000000..c7839cc169
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/symbol-value.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/target.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/target.svg
new file mode 100644
index 0000000000..e6aa0c249c
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/target.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/text-size.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/text-size.svg
new file mode 100644
index 0000000000..7a0c63ffc2
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/text-size.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/verified.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/verified.svg
new file mode 100644
index 0000000000..8235c09907
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/verified.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/zap.svg b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/zap.svg
new file mode 100644
index 0000000000..ea695e85bd
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/icons/stereotypes/zap.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml
index 20765430a3..ef018ee22c 100644
--- a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml
@@ -928,5 +928,17 @@
-->
+
+
+
+
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPlugin.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPlugin.java
index fa1315de84..9936c069ef 100644
--- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPlugin.java
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPlugin.java
@@ -12,12 +12,17 @@
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Enumeration;
import java.util.List;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.jdt.internal.ui.JavaPluginImages;
import org.eclipse.jface.bindings.Binding;
import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.keys.IBindingService;
import org.eclipse.ui.plugin.AbstractUIPlugin;
@@ -33,6 +38,8 @@
*/
public class BootLanguageServerPlugin extends AbstractUIPlugin {
+ private static final String STEREOTYPE_IMG_PREFIX = "stereotype-";
+
public static final String SPRING_ICON = "SPRING_ICON";
public static String PLUGIN_ID = "org.springframework.tooling.boot.ls";
@@ -43,6 +50,8 @@ public class BootLanguageServerPlugin extends AbstractUIPlugin {
private static BootLanguageServerPlugin plugin;
public static final String BOOT_LS_DEFINITION_ID = "org.eclipse.languageserver.languages.springboot";
+
+ private BootLsState lsState = new BootLsState();
public BootLanguageServerPlugin() {
// Empty
@@ -51,7 +60,7 @@ public BootLanguageServerPlugin() {
public static IEclipsePreferences getPreferences() {
return InstanceScope.INSTANCE.getNode(PLUGIN_ID);
}
-
+
@Override
public void start(BundleContext context) throws Exception {
plugin = this;
@@ -112,11 +121,31 @@ public void run() {
}
}
+ @SuppressWarnings("restriction")
@Override
protected void initializeImageRegistry(ImageRegistry reg) {
super.initializeImageRegistry(reg);
reg.put(SPRING_ICON, imageDescriptorFromPlugin(PLUGIN_ID, "icons/spring_obj.gif"));
+
+ // Add setereotype icons to the registry
+ Enumeration paths = getBundle().getEntryPaths("icons/stereotypes");
+ while(paths.hasMoreElements()) {
+ String relativePath = paths.nextElement();
+ IPath p = new Path(relativePath);
+ if (p.getFileExtension().equals("svg")) {
+ String fileName = p.lastSegment();
+ String name = fileName.substring(0, fileName.length() - 4);
+ reg.put(STEREOTYPE_IMG_PREFIX + name, JavaPluginImages.createImageDescriptor(getBundle(), p, false));
+ }
+ }
+ }
+
+ public BootLsState getLsState() {
+ return lsState;
+ }
+
+ public Image getStereotypeImage(String name) {
+ return getImageRegistry().get(STEREOTYPE_IMG_PREFIX + name);
}
-
}
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLsState.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLsState.java
new file mode 100644
index 0000000000..16362fd0b3
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLsState.java
@@ -0,0 +1,46 @@
+package org.springframework.tooling.boot.ls;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
+
+import org.eclipse.core.runtime.ListenerList;
+
+public class BootLsState {
+
+ private enum State {
+ INITIALIZED,
+ INDEXED,
+ STOPPED
+ }
+
+ private AtomicReference state = new AtomicReference<>(State.STOPPED);
+ private ListenerList> listeners = new ListenerList<>();
+
+ public boolean isIndexed() {
+ return state.get() == State.INDEXED;
+ }
+
+ void indexed() {
+ state.set(State.INDEXED);
+ listeners.forEach(l -> l.accept(this));
+ }
+
+ void initialized() {
+ state.set(State.INITIALIZED);
+ listeners.forEach(l -> l.accept(this));
+ }
+
+ void stopped() {
+ state.set(State.STOPPED);
+ listeners.forEach(l -> l.accept(this));
+ }
+
+ public void addStateChangedListener(Consumer l) {
+ listeners.add(l);
+ }
+
+ public void removeStateChangedListener(Consumer l) {
+ listeners.remove(l);
+ }
+
+}
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java
index 204e2f139c..ce3a3cbf1f 100644
--- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/DelegatingStreamConnectionProvider.java
@@ -36,6 +36,7 @@
import org.eclipse.lsp4j.ExecuteCommandParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.jsonrpc.messages.Message;
+import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage;
import org.eclipse.lsp4j.jsonrpc.messages.ResponseMessage;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.ui.PlatformUI;
@@ -127,6 +128,7 @@ public InputStream getErrorStream() {
@Override
public void stop() {
+ BootLanguageServerPlugin.getDefault().getLsState().stopped();
IProxyService proxyService = PlatformUI.getWorkbench().getService(IProxyService.class);
if (proxyService != null) {
proxyService.removeProxyChangeListener(proxySettingsListener);
@@ -171,7 +173,7 @@ public void handleMessage(Message message, LanguageServer languageServer, URI ro
//Add remote boot apps listener
RemoteBootAppsDataHolder.getDefault().getRemoteApps().addListener(remoteAppsListener);
-
+
if (isCopilotInstalled()) {
// Enable Copilot features if the Copilot plugin is installed
languageServer.getWorkspaceService().executeCommand(new ExecuteCommandParams(
@@ -179,8 +181,18 @@ public void handleMessage(Message message, LanguageServer languageServer, URI ro
List.of(true)
));
}
+
+ BootLanguageServerPlugin.getDefault().getLsState().initialized();
+ }
+ } else if (message instanceof NotificationMessage) {
+ NotificationMessage notification = (NotificationMessage) message;
+ // Handle spring/index/updated notification
+ if ("spring/index/updated".equals(notification.getMethod())) {
+ // Emit event to the Flux
+ BootLanguageServerPlugin.getDefault().getLsState().indexed();
}
}
+
}
private boolean isCopilotInstalled() {
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/views/GroupingAction.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/views/GroupingAction.java
new file mode 100644
index 0000000000..500dc8711e
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/views/GroupingAction.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Broadcom, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.springframework.tooling.boot.ls.views;
+
+import org.eclipse.jdt.internal.ui.JavaPluginImages;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.lsp4e.ui.UI;
+
+class GroupingAction extends Action {
+
+ private LogicalStructureView structureView;
+
+ @SuppressWarnings("restriction")
+ public GroupingAction(LogicalStructureView structureView) {
+ super("Grouping...", JavaPluginImages.DESC_ELCL_FILTER);
+ this.structureView = structureView;
+ }
+
+ @Override
+ public void run() {
+ GroupingDialog dialog = new GroupingDialog(UI.getActiveShell(), structureView::fetchGroups, structureView::getGroupings);
+ if (dialog.open() == IDialogConstants.OK_ID) {
+ structureView.setGroupings(dialog.getResult());
+ structureView.fetchStructure(false);
+ }
+ }
+
+}
diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/views/GroupingDialog.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/views/GroupingDialog.java
new file mode 100644
index 0000000000..6c0015defb
--- /dev/null
+++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/views/GroupingDialog.java
@@ -0,0 +1,164 @@
+/*******************************************************************************
+ * Copyright (c) 2025 Broadcom, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Broadcom, Inc. - initial API and implementation
+ *******************************************************************************/
+package org.springframework.tooling.boot.ls.views;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Supplier;
+
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.TrayDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.viewers.ICheckStateProvider;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.lsp4e.ui.UI;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.ContainerCheckedTreeViewer;
+import org.osgi.framework.FrameworkUtil;
+import org.springframework.tooling.boot.ls.views.GroupingDialogModel.GroupItem;
+import org.springframework.tooling.boot.ls.views.GroupingDialogModel.ProjectItem;
+import org.springframework.tooling.boot.ls.views.GroupingDialogModel.TreeItem;
+import org.springframework.tooling.boot.ls.views.StructureClient.Groups;
+
+public class GroupingDialog extends TrayDialog {
+
+ private GroupingDialogModel model;
+
+ protected GroupingDialog(Shell parentShell, Supplier>> client, Supplier