#Signature file v4.1
#Version 2.9.0

CLSS public java.lang.Object
cons public init()
meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected void finalize() throws java.lang.Throwable
meth public boolean equals(java.lang.Object)
meth public final java.lang.Class<?> getClass()
meth public final void notify()
meth public final void notifyAll()
meth public final void wait() throws java.lang.InterruptedException
meth public final void wait(long) throws java.lang.InterruptedException
meth public final void wait(long,int) throws java.lang.InterruptedException
meth public int hashCode()
meth public java.lang.String toString()

CLSS public org.netbeans.modules.java.lsp.server.ui.AbstractApplyEditsImplementation
cons public init()
intf org.netbeans.spi.lsp.ApplyEditsImplementation
meth public java.util.concurrent.CompletableFuture<java.util.List<java.lang.String>> applyChanges(java.util.List<org.netbeans.api.lsp.WorkspaceEdit>,boolean)
supr java.lang.Object
hfds LOG
hcls Worker

CLSS public org.netbeans.modules.java.lsp.server.ui.AbstractDiagnosticReporter
cons public init()
intf org.netbeans.spi.lsp.DiagnosticReporter
meth public org.netbeans.api.lsp.Diagnostic$ReporterControl findDiagnosticControl(org.openide.util.Lookup,org.openide.filesystems.FileObject)
supr java.lang.Object

CLSS public org.netbeans.modules.java.lsp.server.ui.AbstractDialogDisplayer
cons public init()
meth public <%0 extends org.openide.NotifyDescriptor> java.util.concurrent.CompletableFuture<{%%0}> notifyFuture({%%0})
meth public java.awt.Dialog createDialog(org.openide.DialogDescriptor)
meth public java.lang.Object notify(org.openide.NotifyDescriptor)
meth public void notifyLater(org.openide.NotifyDescriptor)
supr org.openide.DialogDisplayer
hfds LOG

CLSS public org.netbeans.modules.java.lsp.server.ui.AbstractGlobalActionContext
cons public init()
intf org.openide.util.ContextGlobalProvider
intf org.openide.util.Lookup$Provider
meth public org.openide.util.Lookup createGlobalContext()
meth public org.openide.util.Lookup getLookup()
meth public static <%0 extends java.lang.Object> {%%0} withActionContext(org.openide.util.Lookup,java.util.concurrent.Callable<{%%0}>)
supr java.lang.Object
hcls ContextHolder

CLSS public abstract org.netbeans.modules.java.lsp.server.ui.AbstractJavaPlatformProviderOverride
cons public init()
intf org.netbeans.modules.java.platform.implspi.JavaPlatformProvider
meth public org.netbeans.api.java.platform.JavaPlatform getDefaultPlatform()
meth public org.netbeans.api.java.platform.JavaPlatform[] getInstalledPlatforms()
meth public static void setDefaultPlatformOverride(java.lang.String)
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
supr java.lang.Object
hfds NO_PLATFORMS,defaultPlatformOverride,pcs

CLSS public abstract org.netbeans.modules.java.lsp.server.ui.AbstractLspBrokenReferences
cons protected init()
intf org.netbeans.spi.project.ui.ProjectProblemsImplementation
meth public java.util.concurrent.CompletableFuture<java.lang.Void> showAlert(org.netbeans.api.project.Project)
meth public java.util.concurrent.CompletableFuture<java.lang.Void> showCustomizer(org.netbeans.api.project.Project)
supr java.lang.Object
hfds delegate

CLSS public org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer
cons protected init()
innr protected final View
intf org.netbeans.spi.htmlui.HTMLViewerSpi<org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.Object>
meth public <%0 extends java.lang.Object> {%%0} component(org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.Class<{%%0}>)
meth public java.lang.Object createButton(org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.String)
meth public java.lang.String getId(org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.Object)
meth public org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View newView(org.netbeans.spi.htmlui.HTMLViewerSpi$Context)
meth public void runLater(org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.Runnable)
meth public void setEnabled(org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.Object,boolean)
meth public void setText(org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View,java.lang.Object,java.lang.String)
supr java.lang.Object

CLSS protected final org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer$View
 outer org.netbeans.modules.java.lsp.server.ui.AbstractLspHtmlViewer
supr java.lang.Object
hfds ctx,presenter,ui

CLSS public abstract org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider
cons protected init()
innr public final static LspIO
intf org.netbeans.spi.io.InputOutputProvider<org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter,java.lang.Void,java.lang.Void>
meth public final boolean isIOClosed(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final java.io.PrintWriter getErr(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final java.io.PrintWriter getOut(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final java.io.Reader getIn(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final java.lang.String getIODescription(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final java.lang.String getId()
meth public final java.lang.Void getCurrentPosition(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter)
meth public final java.lang.Void startFold(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter,boolean)
meth public final org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO getIO(java.lang.String,boolean,org.openide.util.Lookup)
meth public final org.openide.util.Lookup getIOLookup(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final void closeIO(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final void endFold(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter,java.lang.Void)
meth public final void print(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter,java.lang.String,org.netbeans.api.io.Hyperlink,org.netbeans.api.io.OutputColor,boolean)
meth public final void resetIO(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO)
meth public final void scrollTo(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter,java.lang.Void)
meth public final void setFoldExpanded(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.io.PrintWriter,java.lang.Void,boolean)
meth public final void setIODescription(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.lang.String)
meth public final void showIO(org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO,java.util.Set<org.netbeans.api.io.ShowOperation>)
supr java.lang.Object

CLSS public final static org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider$LspIO
 outer org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider
supr java.lang.Object
hfds ctx,err,in,lookup,name,out
hcls LspWriter

CLSS public abstract org.netbeans.modules.java.lsp.server.ui.AbstractLspStatusDisplayer
cons protected init()
meth public final java.lang.String getStatusText()
meth public final org.openide.awt.StatusDisplayer$Message setStatusText(java.lang.String,int)
meth public final void addChangeListener(javax.swing.event.ChangeListener)
meth public final void removeChangeListener(javax.swing.event.ChangeListener)
meth public final void setStatusText(java.lang.String)
supr org.openide.awt.StatusDisplayer
hfds text

CLSS public abstract org.netbeans.modules.java.lsp.server.ui.AbstractProgressEnvironment
cons protected init()
cons protected init(org.openide.util.Lookup)
intf org.netbeans.modules.progress.spi.ProgressEnvironment
meth public org.netbeans.api.progress.ProgressHandle createHandle(java.lang.String,org.openide.util.Cancellable,boolean)
meth public org.netbeans.modules.progress.spi.Controller findController(org.netbeans.modules.progress.spi.InternalHandle)
meth public org.netbeans.modules.progress.spi.Controller getController()
supr java.lang.Object
hfds MASK_CANCELLABLES,NO_CONTEXT_CONTROLLER,env,patternMaskingCancellables
hcls NoContextHandle

CLSS public abstract org.netbeans.modules.java.lsp.server.ui.IOContext
cons public init()
meth protected abstract boolean isValid()
meth protected abstract void stdErr(java.lang.String)
meth protected abstract void stdOut(java.lang.String)
meth protected java.io.InputStream getStdIn() throws java.io.IOException
meth protected void stdIn(java.lang.String) throws java.io.IOException
supr java.lang.Object
hfds lastCtx
hcls StdErrContext

CLSS public abstract interface org.netbeans.modules.java.platform.implspi.JavaPlatformProvider
fld public final static java.lang.String PROP_INSTALLED_PLATFORMS = "installedPlatforms"
meth public abstract org.netbeans.api.java.platform.JavaPlatform getDefaultPlatform()
meth public abstract org.netbeans.api.java.platform.JavaPlatform[] getInstalledPlatforms()
meth public abstract void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public abstract void removePropertyChangeListener(java.beans.PropertyChangeListener)

CLSS public abstract interface org.netbeans.modules.progress.spi.ProgressEnvironment
meth public abstract org.netbeans.api.progress.ProgressHandle createHandle(java.lang.String,org.openide.util.Cancellable,boolean)
meth public abstract org.netbeans.modules.progress.spi.Controller getController()

CLSS public abstract interface org.netbeans.spi.htmlui.HTMLViewerSpi<%0 extends java.lang.Object, %1 extends java.lang.Object>
innr public final static Context
meth public abstract <%0 extends java.lang.Object> {%%0} component({org.netbeans.spi.htmlui.HTMLViewerSpi%0},java.lang.Class<{%%0}>)
meth public abstract java.lang.String getId({org.netbeans.spi.htmlui.HTMLViewerSpi%0},{org.netbeans.spi.htmlui.HTMLViewerSpi%1})
meth public abstract void runLater({org.netbeans.spi.htmlui.HTMLViewerSpi%0},java.lang.Runnable)
meth public abstract void setEnabled({org.netbeans.spi.htmlui.HTMLViewerSpi%0},{org.netbeans.spi.htmlui.HTMLViewerSpi%1},boolean)
meth public abstract void setText({org.netbeans.spi.htmlui.HTMLViewerSpi%0},{org.netbeans.spi.htmlui.HTMLViewerSpi%1},java.lang.String)
meth public abstract {org.netbeans.spi.htmlui.HTMLViewerSpi%0} newView(org.netbeans.spi.htmlui.HTMLViewerSpi$Context)
meth public abstract {org.netbeans.spi.htmlui.HTMLViewerSpi%1} createButton({org.netbeans.spi.htmlui.HTMLViewerSpi%0},java.lang.String)

CLSS public abstract interface org.netbeans.spi.io.InputOutputProvider<%0 extends java.lang.Object, %1 extends java.io.PrintWriter, %2 extends java.lang.Object, %3 extends java.lang.Object>
meth public abstract boolean isIOClosed({org.netbeans.spi.io.InputOutputProvider%0})
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract java.io.Reader getIn({org.netbeans.spi.io.InputOutputProvider%0})
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract java.lang.String getIODescription({org.netbeans.spi.io.InputOutputProvider%0})
 anno 0 org.netbeans.api.annotations.common.CheckForNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract java.lang.String getId()
 anno 0 org.netbeans.api.annotations.common.NonNull()
meth public abstract org.openide.util.Lookup getIOLookup({org.netbeans.spi.io.InputOutputProvider%0})
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract void closeIO({org.netbeans.spi.io.InputOutputProvider%0})
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract void endFold({org.netbeans.spi.io.InputOutputProvider%0},{org.netbeans.spi.io.InputOutputProvider%1},{org.netbeans.spi.io.InputOutputProvider%3})
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public abstract void print({org.netbeans.spi.io.InputOutputProvider%0},{org.netbeans.spi.io.InputOutputProvider%1},java.lang.String,org.netbeans.api.io.Hyperlink,org.netbeans.api.io.OutputColor,boolean)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NullAllowed()
 anno 4 org.netbeans.api.annotations.common.NullAllowed()
 anno 5 org.netbeans.api.annotations.common.NullAllowed()
meth public abstract void resetIO({org.netbeans.spi.io.InputOutputProvider%0})
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract void scrollTo({org.netbeans.spi.io.InputOutputProvider%0},{org.netbeans.spi.io.InputOutputProvider%1},{org.netbeans.spi.io.InputOutputProvider%2})
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public abstract void setFoldExpanded({org.netbeans.spi.io.InputOutputProvider%0},{org.netbeans.spi.io.InputOutputProvider%1},{org.netbeans.spi.io.InputOutputProvider%3},boolean)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
meth public abstract void setIODescription({org.netbeans.spi.io.InputOutputProvider%0},java.lang.String)
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NullAllowed()
meth public abstract void showIO({org.netbeans.spi.io.InputOutputProvider%0},java.util.Set<org.netbeans.api.io.ShowOperation>)
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract {org.netbeans.spi.io.InputOutputProvider%0} getIO(java.lang.String,boolean,org.openide.util.Lookup)
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 3 org.netbeans.api.annotations.common.NonNull()
meth public abstract {org.netbeans.spi.io.InputOutputProvider%1} getErr({org.netbeans.spi.io.InputOutputProvider%0})
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract {org.netbeans.spi.io.InputOutputProvider%1} getOut({org.netbeans.spi.io.InputOutputProvider%0})
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract {org.netbeans.spi.io.InputOutputProvider%2} getCurrentPosition({org.netbeans.spi.io.InputOutputProvider%0},{org.netbeans.spi.io.InputOutputProvider%1})
 anno 0 org.netbeans.api.annotations.common.CheckForNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()
meth public abstract {org.netbeans.spi.io.InputOutputProvider%3} startFold({org.netbeans.spi.io.InputOutputProvider%0},{org.netbeans.spi.io.InputOutputProvider%1},boolean)
 anno 0 org.netbeans.api.annotations.common.CheckForNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
 anno 2 org.netbeans.api.annotations.common.NonNull()

CLSS public abstract interface org.netbeans.spi.lsp.ApplyEditsImplementation
meth public abstract java.util.concurrent.CompletableFuture<java.util.List<java.lang.String>> applyChanges(java.util.List<org.netbeans.api.lsp.WorkspaceEdit>,boolean)

CLSS public abstract interface org.netbeans.spi.lsp.DiagnosticReporter
meth public abstract org.netbeans.api.lsp.Diagnostic$ReporterControl findDiagnosticControl(org.openide.util.Lookup,org.openide.filesystems.FileObject)
 anno 0 org.netbeans.api.annotations.common.CheckForNull()
 anno 1 org.netbeans.api.annotations.common.NullAllowed()
 anno 2 org.netbeans.api.annotations.common.NullAllowed()

CLSS public abstract interface org.netbeans.spi.project.ui.ProjectProblemsImplementation
meth public abstract java.util.concurrent.CompletableFuture<java.lang.Void> showAlert(org.netbeans.api.project.Project)
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public abstract java.util.concurrent.CompletableFuture<java.lang.Void> showCustomizer(org.netbeans.api.project.Project)
 anno 1 org.netbeans.api.annotations.common.NonNull()

CLSS public abstract org.openide.DialogDisplayer
cons protected init()
meth public <%0 extends org.openide.NotifyDescriptor> java.util.concurrent.CompletableFuture<{%%0}> notifyFuture({%%0})
meth public abstract java.awt.Dialog createDialog(org.openide.DialogDescriptor)
meth public abstract java.lang.Object notify(org.openide.NotifyDescriptor)
meth public java.awt.Dialog createDialog(org.openide.DialogDescriptor,java.awt.Frame)
meth public static org.openide.DialogDisplayer getDefault()
meth public void notifyLater(org.openide.NotifyDescriptor)
supr java.lang.Object
hcls Trivial

CLSS public abstract org.openide.awt.StatusDisplayer
cons protected init()
fld public final static int IMPORTANCE_ANNOTATION = 1000
fld public final static int IMPORTANCE_ERROR_HIGHLIGHT = 700
fld public final static int IMPORTANCE_FIND_OR_REPLACE = 800
fld public final static int IMPORTANCE_INCREMENTAL_FIND = 900
innr public abstract interface static Message
meth public abstract java.lang.String getStatusText()
meth public abstract void addChangeListener(javax.swing.event.ChangeListener)
meth public abstract void removeChangeListener(javax.swing.event.ChangeListener)
meth public abstract void setStatusText(java.lang.String)
meth public org.openide.awt.StatusDisplayer$Message setStatusText(java.lang.String,int)
meth public static org.openide.awt.StatusDisplayer getDefault()
supr java.lang.Object
hfds INSTANCE
hcls Trivial

CLSS public abstract interface org.openide.util.ContextGlobalProvider
meth public abstract org.openide.util.Lookup createGlobalContext()

CLSS public abstract org.openide.util.Lookup
cons public init()
fld public final static org.openide.util.Lookup EMPTY
innr public abstract interface static Provider
innr public abstract static Item
innr public abstract static Result
innr public final static Template
meth public <%0 extends java.lang.Object> java.util.Collection<? extends {%%0}> lookupAll(java.lang.Class<{%%0}>)
meth public <%0 extends java.lang.Object> org.openide.util.Lookup$Item<{%%0}> lookupItem(org.openide.util.Lookup$Template<{%%0}>)
meth public <%0 extends java.lang.Object> org.openide.util.Lookup$Result<{%%0}> lookupResult(java.lang.Class<{%%0}>)
meth public abstract <%0 extends java.lang.Object> org.openide.util.Lookup$Result<{%%0}> lookup(org.openide.util.Lookup$Template<{%%0}>)
meth public abstract <%0 extends java.lang.Object> {%%0} lookup(java.lang.Class<{%%0}>)
meth public static org.openide.util.Lookup getDefault()
supr java.lang.Object
hfds LOG,defaultLookup,defaultLookupProvider
hcls DefLookup,Empty

CLSS public abstract interface static org.openide.util.Lookup$Provider
 outer org.openide.util.Lookup
meth public abstract org.openide.util.Lookup getLookup()

