This is an automated email from the ASF dual-hosted git repository.
lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 3f0b738 Adding breadcrumbs for LSP languages. (#2445)
3f0b738 is described below
commit 3f0b738a9f2b9b505b8c2281328f3184f8e46d8b
Author: Jan Lahoda <[email protected]>
AuthorDate: Thu Oct 15 18:47:46 2020 +0200
Adding breadcrumbs for LSP languages. (#2445)
* Adding support for breadcrumbs for LSP languages.
* Fixing editor.breadcrumbs friends.
---
ide/editor.breadcrumbs/nbproject/project.xml | 3 +-
ide/lsp.client/manifest.mf | 1 +
ide/lsp.client/nbproject/project.xml | 29 +-
.../netbeans/modules/lsp/client/LSPBindings.java | 18 +
.../src/org/netbeans/modules/lsp/client/Utils.java | 4 +
.../lsp/client/bindings/BreadcrumbsImpl.java | 368 +++++++++++++++++++++
.../TextDocumentSyncServerCapabilityHandler.java | 5 +
.../src/org/netbeans/modules/lsp/client/layer.xml | 34 ++
8 files changed, 451 insertions(+), 11 deletions(-)
diff --git a/ide/editor.breadcrumbs/nbproject/project.xml
b/ide/editor.breadcrumbs/nbproject/project.xml
index 31a366d..b4c337d 100644
--- a/ide/editor.breadcrumbs/nbproject/project.xml
+++ b/ide/editor.breadcrumbs/nbproject/project.xml
@@ -149,7 +149,8 @@
<friend>org.netbeans.modules.csl.api</friend>
<friend>org.netbeans.modules.java.navigation</friend>
<friend>org.netbeans.modules.latex.ui</friend>
- <friend> org.netbeans.modules.xml.text</friend>
+ <friend>org.netbeans.modules.lsp.client</friend>
+ <friend>org.netbeans.modules.xml.text</friend>
<package>org.netbeans.modules.editor.breadcrumbs.spi</package>
</friend-packages>
</data>
diff --git a/ide/lsp.client/manifest.mf b/ide/lsp.client/manifest.mf
index 70ddd82..2a3e0fa 100644
--- a/ide/lsp.client/manifest.mf
+++ b/ide/lsp.client/manifest.mf
@@ -2,5 +2,6 @@ Manifest-Version: 1.0
AutoUpdate-Show-In-Client: true
OpenIDE-Module: org.netbeans.modules.lsp.client/0
OpenIDE-Module-Implementation-Version: 1
+OpenIDE-Module-Layer: org/netbeans/modules/lsp/client/layer.xml
OpenIDE-Module-Localizing-Bundle:
org/netbeans/modules/lsp/client/Bundle.properties
diff --git a/ide/lsp.client/nbproject/project.xml
b/ide/lsp.client/nbproject/project.xml
index 6fb2dc6..14c73d2 100644
--- a/ide/lsp.client/nbproject/project.xml
+++ b/ide/lsp.client/nbproject/project.xml
@@ -85,6 +85,15 @@
</run-dependency>
</dependency>
<dependency>
+
<code-name-base>org.netbeans.modules.editor.breadcrumbs</code-name-base>
+ <build-prerequisite/>
+ <compile-dependency/>
+ <run-dependency>
+ <release-version>0-1</release-version>
+ <specification-version>1.27</specification-version>
+ </run-dependency>
+ </dependency>
+ <dependency>
<code-name-base>org.netbeans.modules.editor.completion</code-name-base>
<build-prerequisite/>
<compile-dependency/>
@@ -138,39 +147,39 @@
</run-dependency>
</dependency>
<dependency>
- <code-name-base>org.netbeans.modules.lexer</code-name-base>
+
<code-name-base>org.netbeans.modules.editor.settings</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
- <release-version>2</release-version>
- <specification-version>1.69</specification-version>
+ <release-version>1</release-version>
+ <specification-version>1.64</specification-version>
</run-dependency>
</dependency>
<dependency>
-
<code-name-base>org.netbeans.modules.options.api</code-name-base>
+
<code-name-base>org.netbeans.modules.editor.util</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
<release-version>1</release-version>
- <specification-version>1.51</specification-version>
+ <specification-version>1.72</specification-version>
</run-dependency>
</dependency>
<dependency>
-
<code-name-base>org.netbeans.modules.editor.settings</code-name-base>
+ <code-name-base>org.netbeans.modules.lexer</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
- <release-version>1</release-version>
- <specification-version>1.64</specification-version>
+ <release-version>2</release-version>
+ <specification-version>1.69</specification-version>
</run-dependency>
</dependency>
<dependency>
-
<code-name-base>org.netbeans.modules.editor.util</code-name-base>
+
<code-name-base>org.netbeans.modules.options.api</code-name-base>
<build-prerequisite/>
<compile-dependency/>
<run-dependency>
<release-version>1</release-version>
- <specification-version>1.72</specification-version>
+ <specification-version>1.51</specification-version>
</run-dependency>
</dependency>
<dependency>
diff --git
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
index a2a6f17..27d5d18 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
@@ -44,6 +44,7 @@ import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
+import javax.swing.event.ChangeListener;
import org.eclipse.lsp4j.ClientCapabilities;
import org.eclipse.lsp4j.DocumentSymbolCapabilities;
import org.eclipse.lsp4j.InitializeParams;
@@ -73,11 +74,13 @@ import
org.netbeans.modules.lsp.client.spi.LanguageServerProvider.LanguageServer
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.modules.OnStop;
+import org.openide.util.ChangeSupport;
import org.openide.util.Exceptions;
import org.openide.util.Lookup;
import org.openide.util.NbBundle.Messages;
import org.openide.util.RequestProcessor;
import org.openide.util.RequestProcessor.Task;
+import org.openide.util.WeakListeners;
import org.openide.util.lookup.Lookups;
/**
@@ -89,6 +92,7 @@ public class LSPBindings {
private static final RequestProcessor WORKER = new
RequestProcessor(LanguageClientImpl.class.getName(), 1, false, false);
private static final int DELAY = 500;
+ private static final ChangeSupport cs = new
ChangeSupport(LSPBindings.class);
private static final Map<URI, Map<String, LSPBindings>>
project2MimeType2Server = new WeakHashMap<>();
private static final Map<FileObject, Map<String, LSPBindings>>
workspace2Extension2Server = new HashMap<>();
private final Map<FileObject, Map<BackgroundTask, RequestProcessor.Task>>
backgroundTasks = new WeakHashMap<>();
@@ -121,6 +125,8 @@ public class LSPBindings {
return null;
}
+ boolean[] created = new boolean[1];
+
LSPBindings bindings =
project2MimeType2Server.computeIfAbsent(uri, p -> new
HashMap<>())
.computeIfAbsent(mimeType, mt -> {
@@ -168,6 +174,7 @@ public class LSPBindings {
lci.setBindings(b);
LanguageServerProviderAccessor.getINSTANCE().setBindings(desc, b);
TextDocumentSyncServerCapabilityHandler.refreshOpenedFilesInServers();
+ created[0] = true;
return b;
} catch
(InterruptedException | ExecutionException ex) {
LOG.log(Level.WARNING,
null, ex);
@@ -181,8 +188,14 @@ public class LSPBindings {
//XXX: what now
return null;
}
+
+ if (created[0]) {
+ WORKER.post(() -> cs.fireChange());
+ }
+
return bindings.server != null ? bindings : null;
}
+
private static final Logger LOG =
Logger.getLogger(LSPBindings.class.getName());
@Messages("LBL_Connecting=Connecting to language server")
@@ -209,6 +222,7 @@ public class LSPBindings {
lc.setBindings(bindings);
workspace2Extension2Server.put(root,
Arrays.stream(extensions).collect(Collectors.toMap(k -> k, v -> bindings)));
+ WORKER.post(() -> cs.fireChange());
} catch (InterruptedException | ExecutionException | IOException
ex) {
Exceptions.printStackTrace(ex);
}
@@ -295,6 +309,10 @@ public class LSPBindings {
}
}
+ public static void addChangeListener(ChangeListener l) {
+ cs.addChangeListener(WeakListeners.change(l, cs));
+ }
+
public void runOnBackground(Runnable r) {
WORKER.post(r);
}
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
index ab1c088..d8f36fb 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
@@ -287,4 +287,8 @@ public class Utils {
return c2 - c1;
}
};
+
+ public static boolean isTrue(Boolean b) {
+ return b != null && b;
+ }
}
diff --git
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
new file mode 100644
index 0000000..a19f481
--- /dev/null
+++
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
@@ -0,0 +1,368 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.lsp.client.bindings;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Image;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.CharConversionException;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Document;
+import javax.swing.text.JTextComponent;
+import javax.swing.text.Position;
+import org.eclipse.lsp4j.DocumentSymbol;
+import org.eclipse.lsp4j.DocumentSymbolParams;
+import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.netbeans.api.actions.Openable;
+import org.netbeans.editor.SideBarFactory;
+import org.netbeans.modules.editor.NbEditorUtilities;
+import org.netbeans.modules.editor.breadcrumbs.spi.BreadcrumbsController;
+import org.netbeans.modules.editor.breadcrumbs.spi.BreadcrumbsElement;
+import org.netbeans.modules.lsp.client.LSPBindings;
+import org.netbeans.modules.lsp.client.LSPBindings.BackgroundTask;
+import org.netbeans.modules.lsp.client.Utils;
+import org.openide.filesystems.FileObject;
+import org.openide.loaders.DataObject;
+import org.openide.loaders.DataObjectNotFoundException;
+import org.openide.util.Exceptions;
+import org.openide.util.ImageUtilities;
+import org.openide.util.Lookup;
+import org.openide.util.RequestProcessor;
+import org.openide.util.lookup.Lookups;
+import org.openide.xml.XMLUtil;
+
+/**
+ *
+ * @author lahvac
+ */
+public class BreadcrumbsImpl implements BackgroundTask {
+
+ private static final RequestProcessor WORKER = new
RequestProcessor(BreadcrumbsImpl.class.getName(), 1, false, false);
+ private final JTextComponent comp;
+ private final Document doc;
+ private RootBreadcrumbsElementImpl rootElement;
+
+ public BreadcrumbsImpl(JTextComponent comp) {
+ this.comp = comp;
+ this.doc = comp.getDocument();
+ this.comp.addCaretListener(evt -> {
+ update();
+ });
+ }
+
+ @Override
+ public void run(LSPBindings bindings, FileObject file) {
+ try {
+ //TODO: modified while the query is running?
+ List<Either<SymbolInformation, DocumentSymbol>> symbols =
bindings.getTextDocumentService().documentSymbol(new DocumentSymbolParams(new
TextDocumentIdentifier(Utils.toURI(file)))).get();
+
+ synchronized (this) {
+ this.rootElement = new RootBreadcrumbsElementImpl(file, doc,
symbols.stream().map(this::toDocumentSymbol).collect(Collectors.toList()));
+ }
+
+ SwingUtilities.invokeLater(() -> update());
+ } catch (InterruptedException | ExecutionException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ }
+
+ private DocumentSymbol toDocumentSymbol(Either<SymbolInformation,
DocumentSymbol> variants) {
+ if (variants.isRight()) return variants.getRight();
+
+ SymbolInformation left = variants.getLeft();
+
+ return new DocumentSymbol(left.getName(), left.getKind(),
left.getLocation().getRange(), left.getLocation().getRange(), null,
Collections.emptyList());
+ }
+
+ private void update() {
+ BreadcrumbsElement element;
+
+ synchronized (this) {
+ element = this.rootElement;
+ }
+
+ if (element == null) {
+ return ;
+ }
+
+ element = ((RootBreadcrumbsElementImpl) element).children.get(0);
+ //TODO: stale results... modified while the query is running?
+
+ int caret = comp.getCaretPosition();
+
+ OUTER: while (true) {
+ for (BreadcrumbsElement child : element.getChildren()) {
+ BreadcrumbsElementImpl impl = (BreadcrumbsElementImpl) child;
+ if (impl.startPos.getOffset() <= caret && caret <=
impl.endPos.getOffset()) {
+ element = child;
+ continue OUTER;
+ }
+ }
+ break;
+ }
+
+ BreadcrumbsController.setBreadcrumbs(doc, element);
+ }
+
+ private static final class RootBreadcrumbsElementImpl implements
BreadcrumbsElement {
+ private final List<BreadcrumbsElement> children;
+
+ public RootBreadcrumbsElementImpl(FileObject file, Document doc,
List<DocumentSymbol> symbols) {
+ this.children = Collections.singletonList(new
FileBreadcrumbsElementImpl(file, doc, this, symbols));
+ }
+
+ @Override
+ public String getHtmlDisplayName() {
+ return "";
+ }
+
+ @Override
+ public Image getIcon(int type) {
+ return BreadcrumbsController.NO_ICON;
+ }
+
+ @Override
+ public Image getOpenedIcon(int type) {
+ return BreadcrumbsController.NO_ICON;
+ }
+
+ @Override
+ public List<BreadcrumbsElement> getChildren() {
+ return children;
+ }
+
+ @Override
+ public Lookup getLookup() {
+ return Lookup.EMPTY;
+ }
+
+ @Override
+ public BreadcrumbsElement getParent() {
+ return null;
+ }
+ }
+
+ private static final class FileBreadcrumbsElementImpl implements
BreadcrumbsElement {
+ private final FileObject file;
+ private final BreadcrumbsElement root;
+ private final List<BreadcrumbsElement> children;
+
+ public FileBreadcrumbsElementImpl(FileObject file, Document doc,
BreadcrumbsElement root, List<DocumentSymbol> symbols) {
+ this.file = file;
+ this.root = root;
+ this.children = BreadcrumbsElementImpl.create(this, symbols, file,
doc);
+ }
+
+ @Override
+ public String getHtmlDisplayName() {
+ return escape(file.getNameExt());
+ }
+
+ @Override
+ public Image getIcon(int type) {
+ try {
+ return DataObject.find(file).getNodeDelegate().getIcon(type);
+ } catch (DataObjectNotFoundException ex) {
+ return BreadcrumbsController.NO_ICON;
+ }
+ }
+
+ @Override
+ public Image getOpenedIcon(int type) {
+ try {
+ return
DataObject.find(file).getNodeDelegate().getOpenedIcon(type);
+ } catch (DataObjectNotFoundException ex) {
+ return BreadcrumbsController.NO_ICON;
+ }
+ }
+
+ @Override
+ public List<BreadcrumbsElement> getChildren() {
+ return children;
+ }
+
+ @Override
+ public Lookup getLookup() {
+ return Lookup.EMPTY;
+ }
+
+ @Override
+ public BreadcrumbsElement getParent() {
+ return root;
+ }
+
+ }
+
+ private static final class BreadcrumbsElementImpl implements
BreadcrumbsElement {
+
+ private final BreadcrumbsElement parent;
+ private final DocumentSymbol symbol;
+ private final Position startPos;
+ private final Position endPos;
+ private final List<BreadcrumbsElement> children;
+ private final Lookup lookup;
+
+ public BreadcrumbsElementImpl(BreadcrumbsElement parent, FileObject
file, Document doc, DocumentSymbol symbol) throws BadLocationException {
+ this.parent = parent;
+ this.symbol = symbol;
+ this.startPos = doc.createPosition(Utils.getOffset(doc,
symbol.getRange().getStart()));
+ this.endPos = doc.createPosition(Utils.getOffset(doc,
symbol.getRange().getEnd()));
+ this.children = create(this, symbol.getChildren(), file, doc);
+ this.lookup = Lookups.fixed(new Openable() {
+ @Override
+ public void open() {
+ Utils.open(Utils.toURI(file), symbol.getRange());
+ }
+ });
+ }
+
+
+ @Override
+ public String getHtmlDisplayName() {
+ return escape(symbol.getName());
+ }
+
+ @Override
+ public Image getIcon(int type) {
+ return
ImageUtilities.loadImage(Icons.getSymbolIconBase(symbol.getKind()));
+ }
+
+
+ @Override
+ public Image getOpenedIcon(int type) {
+ return getIcon(type);
+ }
+
+ @Override
+ public List<BreadcrumbsElement> getChildren() {
+ return children;
+ }
+
+ @Override
+ public Lookup getLookup() {
+ return lookup;
+ }
+
+ @Override
+ public BreadcrumbsElement getParent() {
+ return parent;
+ }
+
+ public static List<BreadcrumbsElement> create(BreadcrumbsElement
parent, List<DocumentSymbol> symbols, FileObject file, Document doc) {
+ return symbols.stream()
+ .map(c -> create(parent, file, doc, c))
+ .filter(e -> e != null)
+ .sorted((be1, be2) -> ((BreadcrumbsElementImpl)
be1).startPos.getOffset() - ((BreadcrumbsElementImpl) be2).endPos.getOffset())
+ .collect(Collectors.toList());
+ }
+
+ private static BreadcrumbsElement create(BreadcrumbsElement parent,
FileObject file, Document doc, DocumentSymbol symbol) {
+ try {
+ return new BreadcrumbsElementImpl(parent, file, doc, symbol);
+ } catch (BadLocationException ex) {
+ return null;
+ }
+ }
+ }
+
+ static String escape(String s) {
+ if (s != null) {
+ try {
+ return XMLUtil.toAttributeValue(s);
+ } catch (CharConversionException ex) {
+ }
+ }
+ return null;
+ }
+
+ public static SideBarFactory createSideBarFactory() {
+ SideBarFactory delegate = BreadcrumbsController.createSideBarFactory();
+ return new SideBarFactory() {
+ @Override
+ public JComponent createSideBar(JTextComponent target) {
+ return new LSPBreadcrumbPanel(delegate, target);
+ }
+ };
+ }
+
+ private static class LSPBreadcrumbPanel extends JPanel implements
PropertyChangeListener, ChangeListener {
+
+ private final JTextComponent component;
+ private final JComponent sidebar;
+
+ public LSPBreadcrumbPanel(SideBarFactory delegate, JTextComponent
component) {
+ this.component = component;
+ this.sidebar = delegate.createSideBar(component);
+ setLayout(new BorderLayout());
+ add(sidebar, BorderLayout.CENTER);
+ sidebar.addPropertyChangeListener(this);
+ LSPBindings.addChangeListener(this);
+ update();
+ }
+
+ private void update() {
+ WORKER.post(() -> {
+ FileObject file =
NbEditorUtilities.getFileObject(component.getDocument());
+ LSPBindings bindings = file != null ?
LSPBindings.getBindings(file) : null;
+ Runnable r;
+
+ if (bindings != null &&
Utils.isTrue(bindings.getInitResult().getCapabilities().getDocumentSymbolProvider()))
{
+ r = () -> {
+ setPreferredSize(sidebar.getPreferredSize());
+ setMaximumSize(sidebar.getMaximumSize());
+ };
+ } else {
+ r = () -> {
+ setPreferredSize(new Dimension(0,0));
+ setMaximumSize(new Dimension(0,0));
+ };
+ }
+
+ SwingUtilities.invokeLater(r);
+ });
+ }
+
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String propertyName = evt.getPropertyName();
+
+ if (propertyName == null || "preferredSize".equals(propertyName)
|| "maximumSize".equals(propertyName)) {
+ update();
+ }
+ }
+
+ @Override
+ public void stateChanged(ChangeEvent e) {
+ update();
+ }
+ }
+}
diff --git
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
index f4aa6bd..60e38d3 100644
---
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
+++
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java
@@ -226,6 +226,11 @@ public class TextDocumentSyncServerCapabilityHandler {
LSPBindings.addBackgroundTask(file, mo);
opened.putClientProperty(MarkOccurrences.class, mo);
}
+ if (opened.getClientProperty(BreadcrumbsImpl.class) == null) {
+ BreadcrumbsImpl bi = new BreadcrumbsImpl(opened);
+ LSPBindings.addBackgroundTask(file, bi);
+ opened.putClientProperty(BreadcrumbsImpl.class, bi);
+ }
server.scheduleBackgroundTasks(file);
});
}
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/layer.xml
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/layer.xml
new file mode 100644
index 0000000..e1cafac
--- /dev/null
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/layer.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+-->
+<!DOCTYPE filesystem PUBLIC "-//NetBeans//DTD Filesystem 1.2//EN"
"http://www.netbeans.org/dtds/filesystem-1_2.dtd">
+<filesystem>
+ <folder name="Editors">
+ <folder name="SideBar">
+ <file name="breadcrumbs.instance">
+ <attr name="location" stringvalue="South"/>
+ <attr name="position" intvalue="5237"/>
+ <attr name="scrollable" boolvalue="false"/>
+ <attr name="instanceCreate"
methodvalue="org.netbeans.modules.lsp.client.bindings.BreadcrumbsImpl.createSideBarFactory"
/>
+ </file>
+ </folder>
+ </folder>
+</filesystem>
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists