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

Reply via email to