#Signature file v4.1
#Version 1.9

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 abstract interface javax.accessibility.Accessible
meth public abstract javax.accessibility.AccessibleContext getAccessibleContext()

CLSS public abstract org.netbeans.api.visual.graph.GraphScene<%0 extends java.lang.Object, %1 extends java.lang.Object>
cons public init()
innr public abstract static StringGraph
meth protected abstract org.netbeans.api.visual.widget.Widget attachEdgeWidget({org.netbeans.api.visual.graph.GraphScene%1})
meth protected abstract org.netbeans.api.visual.widget.Widget attachNodeWidget({org.netbeans.api.visual.graph.GraphScene%0})
meth protected abstract void attachEdgeSourceAnchor({org.netbeans.api.visual.graph.GraphScene%1},{org.netbeans.api.visual.graph.GraphScene%0},{org.netbeans.api.visual.graph.GraphScene%0})
meth protected abstract void attachEdgeTargetAnchor({org.netbeans.api.visual.graph.GraphScene%1},{org.netbeans.api.visual.graph.GraphScene%0},{org.netbeans.api.visual.graph.GraphScene%0})
meth protected void detachEdgeWidget({org.netbeans.api.visual.graph.GraphScene%1},org.netbeans.api.visual.widget.Widget)
meth protected void detachNodeWidget({org.netbeans.api.visual.graph.GraphScene%0},org.netbeans.api.visual.widget.Widget)
meth protected void notifyEdgeAdded({org.netbeans.api.visual.graph.GraphScene%1},org.netbeans.api.visual.widget.Widget)
meth protected void notifyNodeAdded({org.netbeans.api.visual.graph.GraphScene%0},org.netbeans.api.visual.widget.Widget)
meth public boolean isEdge(java.lang.Object)
meth public boolean isNode(java.lang.Object)
meth public final java.util.Collection<{org.netbeans.api.visual.graph.GraphScene%0}> getNodes()
meth public final java.util.Collection<{org.netbeans.api.visual.graph.GraphScene%1}> findEdgesBetween({org.netbeans.api.visual.graph.GraphScene%0},{org.netbeans.api.visual.graph.GraphScene%0})
meth public final java.util.Collection<{org.netbeans.api.visual.graph.GraphScene%1}> findNodeEdges({org.netbeans.api.visual.graph.GraphScene%0},boolean,boolean)
meth public final java.util.Collection<{org.netbeans.api.visual.graph.GraphScene%1}> getEdges()
meth public final org.netbeans.api.visual.widget.Widget addEdge({org.netbeans.api.visual.graph.GraphScene%1})
meth public final org.netbeans.api.visual.widget.Widget addNode({org.netbeans.api.visual.graph.GraphScene%0})
meth public final void removeEdge({org.netbeans.api.visual.graph.GraphScene%1})
meth public final void removeNode({org.netbeans.api.visual.graph.GraphScene%0})
meth public final void removeNodeWithEdges({org.netbeans.api.visual.graph.GraphScene%0})
meth public final void setEdgeSource({org.netbeans.api.visual.graph.GraphScene%1},{org.netbeans.api.visual.graph.GraphScene%0})
meth public final void setEdgeTarget({org.netbeans.api.visual.graph.GraphScene%1},{org.netbeans.api.visual.graph.GraphScene%0})
meth public final {org.netbeans.api.visual.graph.GraphScene%0} getEdgeSource({org.netbeans.api.visual.graph.GraphScene%1})
meth public final {org.netbeans.api.visual.graph.GraphScene%0} getEdgeTarget({org.netbeans.api.visual.graph.GraphScene%1})
supr org.netbeans.api.visual.model.ObjectScene
hfds edgeSourceNodes,edgeTargetNodes,edges,edgesUm,nodeInputEdges,nodeOutputEdges,nodes,nodesUm

CLSS public org.netbeans.api.visual.model.ObjectScene
cons public init()
meth protected org.netbeans.api.visual.model.ObjectState findObjectState(java.lang.Object)
meth public !varargs final void addObject(java.lang.Object,org.netbeans.api.visual.widget.Widget[])
meth public !varargs final void addObjectSceneListener(org.netbeans.api.visual.model.ObjectSceneListener,org.netbeans.api.visual.model.ObjectSceneEventType[])
meth public !varargs final void removeObjectSceneListener(org.netbeans.api.visual.model.ObjectSceneListener,org.netbeans.api.visual.model.ObjectSceneEventType[])
meth public final boolean isObject(java.lang.Object)
meth public final java.lang.Object findObject(org.netbeans.api.visual.widget.Widget)
meth public final java.lang.Object findStoredObject(java.lang.Object)
meth public final java.lang.Object getFocusedObject()
meth public final java.lang.Object getHoveredObject()
meth public final java.util.List<org.netbeans.api.visual.widget.Widget> findWidgets(java.lang.Object)
meth public final java.util.Set<?> getHighlightedObjects()
meth public final java.util.Set<?> getObjects()
meth public final java.util.Set<?> getSelectedObjects()
meth public final org.netbeans.api.visual.action.WidgetAction createObjectHoverAction()
meth public final org.netbeans.api.visual.action.WidgetAction createSelectAction()
meth public final org.netbeans.api.visual.model.ObjectState getObjectState(java.lang.Object)
meth public final org.netbeans.api.visual.widget.Widget findWidget(java.lang.Object)
meth public final void removeObject(java.lang.Object)
meth public final void removeObjectMapping(java.lang.Object)
meth public final void setFocusedObject(java.lang.Object)
meth public final void setHighlightedObjects(java.util.Set<?>)
meth public final void setHoveredObject(java.lang.Object)
meth public final void setSelectedObjects(java.util.Set<?>)
meth public java.lang.Comparable getIdentityCode(java.lang.Object)
meth public void clearObjectState(java.lang.Object)
meth public void userSelectionSuggested(java.util.Set<?>,boolean)
supr org.netbeans.api.visual.widget.Scene
hfds EMPTY_LISTENERS,EMPTY_SET,EMPTY_WIDGETS_ARRAY,EMPTY_WIDGETS_LIST,event,focusedObject,highlightedObjects,highlightedObjectsUm,hoveredObject,listeners,object2widget,object2widgets,objectHoverAction,objectStates,objects,objectsUm,selectAction,selectedObjects,selectedObjectsUm,widget2object
hcls ObjectHoverProvider,ObjectSelectProvider

CLSS public org.netbeans.api.visual.widget.Scene
cons public init()
innr public abstract interface static SceneListener
meth protected boolean isRepaintRequiredForRevalidating()
meth public boolean isValidated()
meth public final double getZoomFactor()
meth public final java.awt.Graphics2D getGraphics()
meth public final java.awt.Point convertSceneToView(java.awt.Point)
meth public final java.awt.Rectangle convertSceneToView(java.awt.Rectangle)
meth public final java.awt.Rectangle getMaximumBounds()
meth public final java.lang.String getActiveTool()
meth public final org.netbeans.api.visual.action.WidgetAction$Chain getPriorActions()
meth public final org.netbeans.api.visual.animator.SceneAnimator getSceneAnimator()
meth public final org.netbeans.api.visual.laf.InputBindings getInputBindings()
meth public final org.netbeans.api.visual.laf.LookFeel getLookFeel()
meth public final org.netbeans.api.visual.widget.EventProcessingType getKeyEventProcessingType()
meth public final org.netbeans.api.visual.widget.Widget getFocusedWidget()
meth public final void addSceneListener(org.netbeans.api.visual.widget.Scene$SceneListener)
meth public final void paint(java.awt.Graphics2D)
meth public final void removeSceneListener(org.netbeans.api.visual.widget.Scene$SceneListener)
meth public final void setFocusedWidget(org.netbeans.api.visual.widget.Widget)
meth public final void setKeyEventProcessingType(org.netbeans.api.visual.widget.EventProcessingType)
meth public final void setLookFeel(org.netbeans.api.visual.laf.LookFeel)
meth public final void setMaximumBounds(java.awt.Rectangle)
meth public final void setZoomFactor(double)
meth public final void validate()
meth public final void validate(java.awt.Graphics2D)
meth public java.awt.Font getDefaultFont()
meth public java.awt.Point convertViewToScene(java.awt.Point)
meth public java.awt.Rectangle convertViewToScene(java.awt.Rectangle)
meth public javax.swing.JComponent createSatelliteView()
meth public javax.swing.JComponent createView()
meth public javax.swing.JComponent getView()
meth public org.netbeans.api.visual.action.WidgetAction createWidgetHoverAction()
meth public org.netbeans.api.visual.widget.BirdViewController createBirdView()
meth public org.netbeans.api.visual.widget.ResourceTable getResourceTable()
meth public void setActiveTool(java.lang.String)
meth public void setResourceTable(org.netbeans.api.visual.widget.ResourceTable)
supr org.netbeans.api.visual.widget.Widget
hfds activeTool,component,defaultFont,extendSceneOnly,focusedWidget,graphics,inputBindings,keyEventProcessingType,lookFeel,maximumBounds,paintEverything,priorActions,repaintRegion,repaintWidgets,resourceTable,sceneAnimator,sceneListeners,viewShowing,widgetHoverAction,zoomFactor
hcls WidgetHoverAction

CLSS public org.netbeans.api.visual.widget.Widget
cons public init(org.netbeans.api.visual.widget.Scene)
innr public abstract interface static Dependency
intf javax.accessibility.Accessible
intf org.openide.util.Lookup$Provider
meth protected boolean isRepaintRequiredForRevalidating()
meth protected final void updateResources(org.netbeans.api.visual.widget.Widget,boolean)
meth protected java.awt.Cursor getCursorAt(java.awt.Point)
meth protected java.awt.Graphics2D getGraphics()
meth protected java.awt.Rectangle calculateClientArea()
meth protected void notifyAdded()
meth protected void notifyBackgroundChanged(java.awt.Paint)
meth protected void notifyFontChanged(java.awt.Font)
meth protected void notifyForegroundChanged(java.awt.Color)
meth protected void notifyRemoved()
meth protected void notifyStateChanged(org.netbeans.api.visual.model.ObjectState,org.netbeans.api.visual.model.ObjectState)
meth protected void paintBackground()
meth protected void paintBorder()
meth protected void paintChildren()
meth protected void paintWidget()
meth public boolean isHitAt(java.awt.Point)
meth public boolean isValidated()
meth public final boolean equals(java.lang.Object)
meth public final boolean isCheckClipping()
meth public final boolean isEnabled()
meth public final boolean isOpaque()
meth public final boolean isPreferredBoundsSet()
meth public final boolean isVisible()
meth public final int hashCode()
meth public final java.awt.Color getForeground()
meth public final java.awt.Cursor getCursor()
meth public final java.awt.Dimension getMaximumSize()
meth public final java.awt.Dimension getMinimumSize()
meth public final java.awt.Dimension getPreferredSize()
meth public final java.awt.Font getFont()
meth public final java.awt.Paint getBackground()
meth public final java.awt.Point convertLocalToScene(java.awt.Point)
meth public final java.awt.Point convertSceneToLocal(java.awt.Point)
meth public final java.awt.Point getLocation()
meth public final java.awt.Point getPreferredLocation()
meth public final java.awt.Rectangle convertLocalToScene(java.awt.Rectangle)
 anno 0 org.netbeans.api.annotations.common.NonNull()
 anno 1 org.netbeans.api.annotations.common.NonNull()
meth public final java.awt.Rectangle convertSceneToLocal(java.awt.Rectangle)
meth public final java.awt.Rectangle getBounds()
 anno 0 org.netbeans.api.annotations.common.CheckForNull()
meth public final java.awt.Rectangle getClientArea()
meth public final java.awt.Rectangle getPreferredBounds()
meth public final java.lang.Object getChildConstraint(org.netbeans.api.visual.widget.Widget)
meth public final java.lang.String getToolTipText()
meth public final java.util.Collection<org.netbeans.api.visual.widget.Widget$Dependency> getDependencies()
meth public final java.util.List<org.netbeans.api.visual.widget.Widget> getChildren()
meth public final javax.accessibility.AccessibleContext getAccessibleContext()
meth public final org.netbeans.api.visual.action.WidgetAction$Chain createActions(java.lang.String)
meth public final org.netbeans.api.visual.action.WidgetAction$Chain getActions()
meth public final org.netbeans.api.visual.action.WidgetAction$Chain getActions(java.lang.String)
meth public final org.netbeans.api.visual.border.Border getBorder()
meth public final org.netbeans.api.visual.layout.Layout getLayout()
meth public final org.netbeans.api.visual.model.ObjectState getState()
meth public final org.netbeans.api.visual.widget.Scene getScene()
meth public final org.netbeans.api.visual.widget.Widget getParentWidget()
meth public final void addChild(int,org.netbeans.api.visual.widget.Widget)
meth public final void addChild(int,org.netbeans.api.visual.widget.Widget,java.lang.Object)
meth public final void addChild(org.netbeans.api.visual.widget.Widget)
meth public final void addChild(org.netbeans.api.visual.widget.Widget,java.lang.Object)
meth public final void addChildren(java.util.List<? extends org.netbeans.api.visual.widget.Widget>)
meth public final void addDependency(org.netbeans.api.visual.widget.Widget$Dependency)
meth public final void bringToBack()
meth public final void bringToFront()
meth public final void paint()
meth public final void removeChild(org.netbeans.api.visual.widget.Widget)
meth public final void removeChildren()
meth public final void removeChildren(java.util.List<org.netbeans.api.visual.widget.Widget>)
meth public final void removeDependency(org.netbeans.api.visual.widget.Widget$Dependency)
meth public final void removeFromParent()
meth public final void repaint()
meth public final void resolveBounds(java.awt.Point,java.awt.Rectangle)
meth public final void revalidate()
meth public final void revalidate(boolean)
meth public final void setAccessibleContext(javax.accessibility.AccessibleContext)
meth public final void setBackground(java.awt.Paint)
meth public final void setBackgroundFromResource(java.lang.String)
meth public final void setBorder(javax.swing.border.Border)
meth public final void setBorder(org.netbeans.api.visual.border.Border)
meth public final void setCheckClipping(boolean)
meth public final void setChildConstraint(org.netbeans.api.visual.widget.Widget,java.lang.Object)
meth public final void setCursor(java.awt.Cursor)
meth public final void setEnabled(boolean)
meth public final void setFont(java.awt.Font)
meth public final void setFontFromResource(java.lang.String)
meth public final void setForeground(java.awt.Color)
meth public final void setForegroundFromResource(java.lang.String)
meth public final void setLayout(org.netbeans.api.visual.layout.Layout)
meth public final void setMaximumSize(java.awt.Dimension)
meth public final void setMinimumSize(java.awt.Dimension)
meth public final void setOpaque(boolean)
meth public final void setPreferredBounds(java.awt.Rectangle)
meth public final void setPreferredLocation(java.awt.Point)
meth public final void setPreferredSize(java.awt.Dimension)
meth public final void setState(org.netbeans.api.visual.model.ObjectState)
meth public final void setToolTipText(java.lang.String)
meth public final void setVisible(boolean)
meth public org.netbeans.api.visual.widget.ResourceTable getResourceTable()
meth public org.openide.util.Lookup getLookup()
meth public void setResourceTable(org.netbeans.api.visual.widget.ResourceTable)
supr java.lang.Object
hfds EMPTY_HASH_MAP,MESSAGE_NULL_BOUNDS,accessibleContext,actionsChain,background,backgroundListener,backgroundProperty,border,bounds,calculatedPreferredBounds,checkClipping,children,childrenUm,constraints,cursor,dependencies,enabled,font,fontListener,fontProperties,foreground,foregroundListener,foregroundProperty,layout,location,maximumSize,minimumSize,opaque,parentWidget,preferredBounds,preferredLocation,preferredSize,requiresFullJustification,requiresFullValidation,requiresPartJustification,requiresPartValidation,resourceTable,scene,state,toolTipText,toolsActions,visible

CLSS public org.netbeans.modules.java.graph.DependencyGraphScene<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
cons public init(javax.swing.JScrollPane)
cons public init(org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>,org.netbeans.modules.java.graph.DependencyGraphScene$HighlightDepthProvider,org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>,org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>)
innr public abstract interface static ActionsProvider
innr public abstract interface static HighlightDepthProvider
innr public abstract interface static PaintingProvider
innr public abstract interface static VersionProvider
meth protected org.netbeans.api.visual.widget.Widget attachEdgeWidget(org.netbeans.modules.java.graph.GraphEdge)
meth protected org.netbeans.api.visual.widget.Widget attachNodeWidget(org.netbeans.modules.java.graph.GraphNode)
meth protected void attachEdgeSourceAnchor(org.netbeans.modules.java.graph.GraphEdge,org.netbeans.modules.java.graph.GraphNode,org.netbeans.modules.java.graph.GraphNode)
meth protected void attachEdgeTargetAnchor(org.netbeans.modules.java.graph.GraphEdge,org.netbeans.modules.java.graph.GraphNode,org.netbeans.modules.java.graph.GraphNode)
meth protected void notifyStateChanged(org.netbeans.api.visual.model.ObjectState,org.netbeans.api.visual.model.ObjectState)
meth public boolean isIncluded({org.netbeans.modules.java.graph.DependencyGraphScene%0})
meth public int getMaxNodeDepth()
meth public org.netbeans.modules.java.graph.GraphEdge addEdge({org.netbeans.modules.java.graph.DependencyGraphScene%0},{org.netbeans.modules.java.graph.DependencyGraphScene%0})
meth public org.netbeans.modules.java.graph.GraphNode getGraphNodeRepresentant(org.netbeans.modules.java.graph.GraphNodeImplementation)
 anno 0 org.netbeans.api.annotations.common.CheckForNull()
meth public org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene%0}> getRootGraphNode()
meth public void addGraphNodeImpl({org.netbeans.modules.java.graph.DependencyGraphScene%0})
meth public void calculatePrimaryPathsAndLevels()
meth public void highlightDepth(int)
meth public void initialLayout()
meth public void notifyModelChanged(org.netbeans.modules.java.graph.GraphEdge<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>)
meth public void notifyModelChanged(org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>)
meth public void resetHighlight()
meth public void setMyZoomFactor(double)
meth public void setSearchString(java.lang.String)
meth public void setSurroundingScrollPane(javax.swing.JScrollPane)
meth public void updateVisibility()
supr org.netbeans.api.visual.graph.GraphScene<org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>,org.netbeans.modules.java.graph.GraphEdge<{org.netbeans.modules.java.graph.DependencyGraphScene%0}>>
hfds EMPTY_SELECTION,allActionsP,animated,connectionLayer,editAction,fitViewL,highlightProvider,highlightV,highlitedZoomToFitAction,hoverAction,layout,mainLayer,maxDepth,moveAction,nodeActionProvider,paintingProvider,panAction,pane,popupMenuAction,rootNode,sceneZoomToFitAction,versionProvider,zoomAction
hcls AllActionsProvider,FitToViewLayout,FruchtermanReingoldLayoutAction,HierarchicalGraphLayoutAction,HighlightedZoomToFitAction,HoverController,SceneZoomToFitAction,TreeGraphLayoutHorizontalAction,TreeGraphLayoutVerticalAction

CLSS public abstract interface static org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
 outer org.netbeans.modules.java.graph.DependencyGraphScene
meth public abstract javax.swing.Action createExcludeDepAction(org.netbeans.modules.java.graph.DependencyGraphScene,org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider%0}>,org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider%0}>)
meth public abstract javax.swing.Action createFixVersionConflictAction(org.netbeans.modules.java.graph.DependencyGraphScene,org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider%0}>,org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider%0}>)
meth public abstract javax.swing.Action createShowGraphAction(org.netbeans.modules.java.graph.GraphNode<{org.netbeans.modules.java.graph.DependencyGraphScene$ActionsProvider%0}>)

CLSS public abstract interface static org.netbeans.modules.java.graph.DependencyGraphScene$HighlightDepthProvider
 outer org.netbeans.modules.java.graph.DependencyGraphScene
meth public abstract int getDepth()

CLSS public abstract interface static org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
 outer org.netbeans.modules.java.graph.DependencyGraphScene
meth public abstract boolean isVisible({org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0})
meth public abstract boolean isVisible({org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0},{org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0})
meth public abstract java.awt.Color getColor({org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0})
meth public abstract java.awt.Stroke getStroke({org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0},{org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0})
meth public abstract javax.swing.Icon getIcon({org.netbeans.modules.java.graph.DependencyGraphScene$PaintingProvider%0})

CLSS public abstract interface static org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
 outer org.netbeans.modules.java.graph.DependencyGraphScene
fld public final static int VERSION_CONFLICT = 2
fld public final static int VERSION_NO_CONFLICT = 0
fld public final static int VERSION_POTENTIAL_CONFLICT = 1
meth public abstract boolean isIncluded({org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider%0})
meth public abstract boolean isOmmitedForConflict({org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider%0})
meth public abstract int compareVersions({org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider%0},{org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider%0})
meth public abstract java.lang.String getVersion({org.netbeans.modules.java.graph.DependencyGraphScene$VersionProvider%0})

CLSS public final org.netbeans.modules.java.graph.GraphEdge<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
cons public init({org.netbeans.modules.java.graph.GraphEdge%0},{org.netbeans.modules.java.graph.GraphEdge%0})
meth public boolean isPrimary()
meth public java.lang.String toString()
meth public void setPrimaryPath(boolean)
meth public {org.netbeans.modules.java.graph.GraphEdge%0} getSource()
meth public {org.netbeans.modules.java.graph.GraphEdge%0} getTarget()
supr java.lang.Object
hfds primary,source,target,toString

CLSS public final org.netbeans.modules.java.graph.GraphNode<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
cons public init({org.netbeans.modules.java.graph.GraphNode%0})
 anno 1 org.netbeans.api.annotations.common.NonNull()
fld public final static int MANAGED = 1
fld public final static int OVERRIDES_MANAGED = 2
fld public final static int UNMANAGED = 0
meth public boolean represents({org.netbeans.modules.java.graph.GraphNode%0})
meth public int getPrimaryLevel()
meth public java.lang.String getName()
meth public java.lang.String getTooltipText()
meth public java.util.Set<{org.netbeans.modules.java.graph.GraphNode%0}> getDuplicatesOrConflicts()
meth public void addDuplicateOrConflict({org.netbeans.modules.java.graph.GraphNode%0})
meth public void setImpl({org.netbeans.modules.java.graph.GraphNode%0})
meth public void setManagedState(int)
meth public void setParent({org.netbeans.modules.java.graph.GraphNode%0})
meth public void setPrimaryLevel(int)
meth public {org.netbeans.modules.java.graph.GraphNode%0} getImpl()
meth public {org.netbeans.modules.java.graph.GraphNode%0} getParent()
supr java.lang.Object
hfds duplicates,impl,level,managedState,parentAfterFix

CLSS public abstract interface org.netbeans.modules.java.graph.GraphNodeImplementation
meth public abstract <%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation> java.util.List<{%%0}> getChildren()
meth public abstract <%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation> {%%0} getParent()
meth public abstract java.lang.String getName()
meth public abstract java.lang.String getQualifiedName()
meth public abstract java.lang.String getTooltipText()

CLSS public abstract interface org.netbeans.modules.java.graph.GraphNodeVisitor<%0 extends org.netbeans.modules.java.graph.GraphNodeImplementation>
meth public abstract boolean endVisit({org.netbeans.modules.java.graph.GraphNodeVisitor%0})
meth public abstract boolean visit({org.netbeans.modules.java.graph.GraphNodeVisitor%0})
meth public boolean accept({org.netbeans.modules.java.graph.GraphNodeVisitor%0})

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()

