#Signature file v4.1
#Version 7.42.1

CLSS public abstract java.awt.Component
cons protected init()
fld public final static float BOTTOM_ALIGNMENT = 1.0
fld public final static float CENTER_ALIGNMENT = 0.5
fld public final static float LEFT_ALIGNMENT = 0.0
fld public final static float RIGHT_ALIGNMENT = 1.0
fld public final static float TOP_ALIGNMENT = 0.0
innr protected BltBufferStrategy
innr protected FlipBufferStrategy
innr protected abstract AccessibleAWTComponent
innr public final static !enum BaselineResizeBehavior
intf java.awt.MenuContainer
intf java.awt.image.ImageObserver
intf java.io.Serializable
meth protected boolean requestFocus(boolean)
meth protected boolean requestFocusInWindow(boolean)
meth protected final void disableEvents(long)
meth protected final void enableEvents(long)
meth protected java.awt.AWTEvent coalesceEvents(java.awt.AWTEvent,java.awt.AWTEvent)
meth protected java.lang.String paramString()
meth protected void firePropertyChange(java.lang.String,boolean,boolean)
meth protected void firePropertyChange(java.lang.String,int,int)
meth protected void firePropertyChange(java.lang.String,java.lang.Object,java.lang.Object)
meth protected void processComponentEvent(java.awt.event.ComponentEvent)
meth protected void processEvent(java.awt.AWTEvent)
meth protected void processFocusEvent(java.awt.event.FocusEvent)
meth protected void processHierarchyBoundsEvent(java.awt.event.HierarchyEvent)
meth protected void processHierarchyEvent(java.awt.event.HierarchyEvent)
meth protected void processInputMethodEvent(java.awt.event.InputMethodEvent)
meth protected void processKeyEvent(java.awt.event.KeyEvent)
meth protected void processMouseEvent(java.awt.event.MouseEvent)
meth protected void processMouseMotionEvent(java.awt.event.MouseEvent)
meth protected void processMouseWheelEvent(java.awt.event.MouseWheelEvent)
meth public <%0 extends java.util.EventListener> {%%0}[] getListeners(java.lang.Class<{%%0}>)
meth public boolean action(java.awt.Event,java.lang.Object)
 anno 0 java.lang.Deprecated()
meth public boolean areFocusTraversalKeysSet(int)
meth public boolean contains(int,int)
meth public boolean contains(java.awt.Point)
meth public boolean getFocusTraversalKeysEnabled()
meth public boolean getIgnoreRepaint()
meth public boolean gotFocus(java.awt.Event,java.lang.Object)
 anno 0 java.lang.Deprecated()
meth public boolean handleEvent(java.awt.Event)
 anno 0 java.lang.Deprecated()
meth public boolean hasFocus()
meth public boolean imageUpdate(java.awt.Image,int,int,int,int,int)
meth public boolean inside(int,int)
 anno 0 java.lang.Deprecated()
meth public boolean isBackgroundSet()
meth public boolean isCursorSet()
meth public boolean isDisplayable()
meth public boolean isDoubleBuffered()
meth public boolean isEnabled()
meth public boolean isFocusCycleRoot(java.awt.Container)
meth public boolean isFocusOwner()
meth public boolean isFocusTraversable()
 anno 0 java.lang.Deprecated()
meth public boolean isFocusable()
meth public boolean isFontSet()
meth public boolean isForegroundSet()
meth public boolean isLightweight()
meth public boolean isMaximumSizeSet()
meth public boolean isMinimumSizeSet()
meth public boolean isOpaque()
meth public boolean isPreferredSizeSet()
meth public boolean isShowing()
meth public boolean isValid()
meth public boolean isVisible()
meth public boolean keyDown(java.awt.Event,int)
 anno 0 java.lang.Deprecated()
meth public boolean keyUp(java.awt.Event,int)
 anno 0 java.lang.Deprecated()
meth public boolean lostFocus(java.awt.Event,java.lang.Object)
 anno 0 java.lang.Deprecated()
meth public boolean mouseDown(java.awt.Event,int,int)
 anno 0 java.lang.Deprecated()
meth public boolean mouseDrag(java.awt.Event,int,int)
 anno 0 java.lang.Deprecated()
meth public boolean mouseEnter(java.awt.Event,int,int)
 anno 0 java.lang.Deprecated()
meth public boolean mouseExit(java.awt.Event,int,int)
 anno 0 java.lang.Deprecated()
meth public boolean mouseMove(java.awt.Event,int,int)
 anno 0 java.lang.Deprecated()
meth public boolean mouseUp(java.awt.Event,int,int)
 anno 0 java.lang.Deprecated()
meth public boolean postEvent(java.awt.Event)
 anno 0 java.lang.Deprecated()
meth public boolean prepareImage(java.awt.Image,int,int,java.awt.image.ImageObserver)
meth public boolean prepareImage(java.awt.Image,java.awt.image.ImageObserver)
meth public boolean requestFocusInWindow()
meth public final java.lang.Object getTreeLock()
meth public final void dispatchEvent(java.awt.AWTEvent)
meth public float getAlignmentX()
meth public float getAlignmentY()
meth public int checkImage(java.awt.Image,int,int,java.awt.image.ImageObserver)
meth public int checkImage(java.awt.Image,java.awt.image.ImageObserver)
meth public int getBaseline(int,int)
meth public int getHeight()
meth public int getWidth()
meth public int getX()
meth public int getY()
meth public java.awt.Color getBackground()
meth public java.awt.Color getForeground()
meth public java.awt.Component getComponentAt(int,int)
meth public java.awt.Component getComponentAt(java.awt.Point)
meth public java.awt.Component locate(int,int)
 anno 0 java.lang.Deprecated()
meth public java.awt.Component$BaselineResizeBehavior getBaselineResizeBehavior()
meth public java.awt.ComponentOrientation getComponentOrientation()
meth public java.awt.Container getFocusCycleRootAncestor()
meth public java.awt.Container getParent()
meth public java.awt.Cursor getCursor()
meth public java.awt.Dimension getMaximumSize()
meth public java.awt.Dimension getMinimumSize()
meth public java.awt.Dimension getPreferredSize()
meth public java.awt.Dimension getSize()
meth public java.awt.Dimension getSize(java.awt.Dimension)
meth public java.awt.Dimension minimumSize()
 anno 0 java.lang.Deprecated()
meth public java.awt.Dimension preferredSize()
 anno 0 java.lang.Deprecated()
meth public java.awt.Dimension size()
 anno 0 java.lang.Deprecated()
meth public java.awt.Font getFont()
meth public java.awt.FontMetrics getFontMetrics(java.awt.Font)
meth public java.awt.Graphics getGraphics()
meth public java.awt.GraphicsConfiguration getGraphicsConfiguration()
meth public java.awt.Image createImage(int,int)
meth public java.awt.Image createImage(java.awt.image.ImageProducer)
meth public java.awt.Point getLocation()
meth public java.awt.Point getLocation(java.awt.Point)
meth public java.awt.Point getLocationOnScreen()
meth public java.awt.Point getMousePosition()
meth public java.awt.Point location()
 anno 0 java.lang.Deprecated()
meth public java.awt.Rectangle bounds()
 anno 0 java.lang.Deprecated()
meth public java.awt.Rectangle getBounds()
meth public java.awt.Rectangle getBounds(java.awt.Rectangle)
meth public java.awt.Toolkit getToolkit()
meth public java.awt.dnd.DropTarget getDropTarget()
meth public java.awt.event.ComponentListener[] getComponentListeners()
meth public java.awt.event.FocusListener[] getFocusListeners()
meth public java.awt.event.HierarchyBoundsListener[] getHierarchyBoundsListeners()
meth public java.awt.event.HierarchyListener[] getHierarchyListeners()
meth public java.awt.event.InputMethodListener[] getInputMethodListeners()
meth public java.awt.event.KeyListener[] getKeyListeners()
meth public java.awt.event.MouseListener[] getMouseListeners()
meth public java.awt.event.MouseMotionListener[] getMouseMotionListeners()
meth public java.awt.event.MouseWheelListener[] getMouseWheelListeners()
meth public java.awt.im.InputContext getInputContext()
meth public java.awt.im.InputMethodRequests getInputMethodRequests()
meth public java.awt.image.ColorModel getColorModel()
meth public java.awt.image.VolatileImage createVolatileImage(int,int)
meth public java.awt.image.VolatileImage createVolatileImage(int,int,java.awt.ImageCapabilities) throws java.awt.AWTException
meth public java.awt.peer.ComponentPeer getPeer()
 anno 0 java.lang.Deprecated()
meth public java.beans.PropertyChangeListener[] getPropertyChangeListeners()
meth public java.beans.PropertyChangeListener[] getPropertyChangeListeners(java.lang.String)
meth public java.lang.String getName()
meth public java.lang.String toString()
meth public java.util.Locale getLocale()
meth public java.util.Set<java.awt.AWTKeyStroke> getFocusTraversalKeys(int)
meth public javax.accessibility.AccessibleContext getAccessibleContext()
meth public void add(java.awt.PopupMenu)
meth public void addComponentListener(java.awt.event.ComponentListener)
meth public void addFocusListener(java.awt.event.FocusListener)
meth public void addHierarchyBoundsListener(java.awt.event.HierarchyBoundsListener)
meth public void addHierarchyListener(java.awt.event.HierarchyListener)
meth public void addInputMethodListener(java.awt.event.InputMethodListener)
meth public void addKeyListener(java.awt.event.KeyListener)
meth public void addMouseListener(java.awt.event.MouseListener)
meth public void addMouseMotionListener(java.awt.event.MouseMotionListener)
meth public void addMouseWheelListener(java.awt.event.MouseWheelListener)
meth public void addNotify()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void addPropertyChangeListener(java.lang.String,java.beans.PropertyChangeListener)
meth public void applyComponentOrientation(java.awt.ComponentOrientation)
meth public void deliverEvent(java.awt.Event)
 anno 0 java.lang.Deprecated()
meth public void disable()
 anno 0 java.lang.Deprecated()
meth public void doLayout()
meth public void enable()
 anno 0 java.lang.Deprecated()
meth public void enable(boolean)
 anno 0 java.lang.Deprecated()
meth public void enableInputMethods(boolean)
meth public void firePropertyChange(java.lang.String,byte,byte)
meth public void firePropertyChange(java.lang.String,char,char)
meth public void firePropertyChange(java.lang.String,double,double)
meth public void firePropertyChange(java.lang.String,float,float)
meth public void firePropertyChange(java.lang.String,long,long)
meth public void firePropertyChange(java.lang.String,short,short)
meth public void hide()
 anno 0 java.lang.Deprecated()
meth public void invalidate()
meth public void layout()
 anno 0 java.lang.Deprecated()
meth public void list()
meth public void list(java.io.PrintStream)
meth public void list(java.io.PrintStream,int)
meth public void list(java.io.PrintWriter)
meth public void list(java.io.PrintWriter,int)
meth public void move(int,int)
 anno 0 java.lang.Deprecated()
meth public void nextFocus()
 anno 0 java.lang.Deprecated()
meth public void paint(java.awt.Graphics)
meth public void paintAll(java.awt.Graphics)
meth public void print(java.awt.Graphics)
meth public void printAll(java.awt.Graphics)
meth public void remove(java.awt.MenuComponent)
meth public void removeComponentListener(java.awt.event.ComponentListener)
meth public void removeFocusListener(java.awt.event.FocusListener)
meth public void removeHierarchyBoundsListener(java.awt.event.HierarchyBoundsListener)
meth public void removeHierarchyListener(java.awt.event.HierarchyListener)
meth public void removeInputMethodListener(java.awt.event.InputMethodListener)
meth public void removeKeyListener(java.awt.event.KeyListener)
meth public void removeMouseListener(java.awt.event.MouseListener)
meth public void removeMouseMotionListener(java.awt.event.MouseMotionListener)
meth public void removeMouseWheelListener(java.awt.event.MouseWheelListener)
meth public void removeNotify()
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public void removePropertyChangeListener(java.lang.String,java.beans.PropertyChangeListener)
meth public void repaint()
meth public void repaint(int,int,int,int)
meth public void repaint(long)
meth public void repaint(long,int,int,int,int)
meth public void requestFocus()
meth public void reshape(int,int,int,int)
 anno 0 java.lang.Deprecated()
meth public void resize(int,int)
 anno 0 java.lang.Deprecated()
meth public void resize(java.awt.Dimension)
 anno 0 java.lang.Deprecated()
meth public void revalidate()
meth public void setBackground(java.awt.Color)
meth public void setBounds(int,int,int,int)
meth public void setBounds(java.awt.Rectangle)
meth public void setComponentOrientation(java.awt.ComponentOrientation)
meth public void setCursor(java.awt.Cursor)
meth public void setDropTarget(java.awt.dnd.DropTarget)
meth public void setEnabled(boolean)
meth public void setFocusTraversalKeys(int,java.util.Set<? extends java.awt.AWTKeyStroke>)
meth public void setFocusTraversalKeysEnabled(boolean)
meth public void setFocusable(boolean)
meth public void setFont(java.awt.Font)
meth public void setForeground(java.awt.Color)
meth public void setIgnoreRepaint(boolean)
meth public void setLocale(java.util.Locale)
meth public void setLocation(int,int)
meth public void setLocation(java.awt.Point)
meth public void setMaximumSize(java.awt.Dimension)
meth public void setMinimumSize(java.awt.Dimension)
meth public void setName(java.lang.String)
meth public void setPreferredSize(java.awt.Dimension)
meth public void setSize(int,int)
meth public void setSize(java.awt.Dimension)
meth public void setVisible(boolean)
meth public void show()
 anno 0 java.lang.Deprecated()
meth public void show(boolean)
 anno 0 java.lang.Deprecated()
meth public void transferFocus()
meth public void transferFocusBackward()
meth public void transferFocusUpCycle()
meth public void update(java.awt.Graphics)
meth public void validate()
supr java.lang.Object
hfds FOCUS_TRAVERSABLE_DEFAULT,FOCUS_TRAVERSABLE_SET,FOCUS_TRAVERSABLE_UNKNOWN,LOCK,acc,accessibleContext,actionListenerK,adjustmentListenerK,appContext,autoFocusTransferOnDisposal,background,backgroundEraseDisabled,boundsOp,bufferStrategy,changeSupport,coalesceEventsParams,coalesceMap,coalescingEnabled,componentListener,componentListenerK,componentOrientation,componentSerializedDataVersion,compoundShape,containerListenerK,cursor,dropTarget,enabled,eventCache,eventLog,eventMask,focusListener,focusListenerK,focusLog,focusTraversalKeyPropertyNames,focusTraversalKeys,focusTraversalKeysEnabled,focusable,font,foreground,graphicsConfig,height,hierarchyBoundsListener,hierarchyBoundsListenerK,hierarchyListener,hierarchyListenerK,ignoreRepaint,incRate,inputMethodListener,inputMethodListenerK,isAddNotifyComplete,isFocusTraversableOverridden,isInc,isPacked,itemListenerK,keyListener,keyListenerK,locale,log,maxSize,maxSizeSet,minSize,minSizeSet,mixingCutoutRegion,mixingLog,mouseListener,mouseListenerK,mouseMotionListener,mouseMotionListenerK,mouseWheelListener,mouseWheelListenerK,name,nameExplicitlySet,newEventsOnly,objectLock,ownedWindowK,parent,peer,peerFont,popups,prefSize,prefSizeSet,requestFocusController,serialVersionUID,textListenerK,valid,visible,width,windowClosingException,windowFocusListenerK,windowListenerK,windowStateListenerK,x,y
hcls AWTTreeLock,BltSubRegionBufferStrategy,DummyRequestFocusController,FlipSubRegionBufferStrategy,ProxyCapabilities,SingleBufferStrategy

CLSS public java.awt.Container
cons public init()
innr protected AccessibleAWTContainer
meth protected java.lang.String paramString()
meth protected void addImpl(java.awt.Component,java.lang.Object,int)
meth protected void processContainerEvent(java.awt.event.ContainerEvent)
meth protected void processEvent(java.awt.AWTEvent)
meth protected void validateTree()
meth public <%0 extends java.util.EventListener> {%%0}[] getListeners(java.lang.Class<{%%0}>)
meth public boolean areFocusTraversalKeysSet(int)
meth public boolean isAncestorOf(java.awt.Component)
meth public boolean isFocusCycleRoot()
meth public boolean isFocusCycleRoot(java.awt.Container)
meth public boolean isFocusTraversalPolicySet()
meth public boolean isValidateRoot()
meth public final boolean isFocusTraversalPolicyProvider()
meth public final void setFocusTraversalPolicyProvider(boolean)
meth public float getAlignmentX()
meth public float getAlignmentY()
meth public int countComponents()
 anno 0 java.lang.Deprecated()
meth public int getComponentCount()
meth public int getComponentZOrder(java.awt.Component)
meth public java.awt.Component add(java.awt.Component)
meth public java.awt.Component add(java.awt.Component,int)
meth public java.awt.Component add(java.lang.String,java.awt.Component)
meth public java.awt.Component findComponentAt(int,int)
meth public java.awt.Component findComponentAt(java.awt.Point)
meth public java.awt.Component getComponent(int)
meth public java.awt.Component getComponentAt(int,int)
meth public java.awt.Component getComponentAt(java.awt.Point)
meth public java.awt.Component locate(int,int)
 anno 0 java.lang.Deprecated()
meth public java.awt.Component[] getComponents()
meth public java.awt.Dimension getMaximumSize()
meth public java.awt.Dimension getMinimumSize()
meth public java.awt.Dimension getPreferredSize()
meth public java.awt.Dimension minimumSize()
 anno 0 java.lang.Deprecated()
meth public java.awt.Dimension preferredSize()
 anno 0 java.lang.Deprecated()
meth public java.awt.FocusTraversalPolicy getFocusTraversalPolicy()
meth public java.awt.Insets getInsets()
meth public java.awt.Insets insets()
 anno 0 java.lang.Deprecated()
meth public java.awt.LayoutManager getLayout()
meth public java.awt.Point getMousePosition(boolean)
meth public java.awt.event.ContainerListener[] getContainerListeners()
meth public java.util.Set<java.awt.AWTKeyStroke> getFocusTraversalKeys(int)
meth public void add(java.awt.Component,java.lang.Object)
meth public void add(java.awt.Component,java.lang.Object,int)
meth public void addContainerListener(java.awt.event.ContainerListener)
meth public void addNotify()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void addPropertyChangeListener(java.lang.String,java.beans.PropertyChangeListener)
meth public void applyComponentOrientation(java.awt.ComponentOrientation)
meth public void deliverEvent(java.awt.Event)
 anno 0 java.lang.Deprecated()
meth public void doLayout()
meth public void invalidate()
meth public void layout()
 anno 0 java.lang.Deprecated()
meth public void list(java.io.PrintStream,int)
meth public void list(java.io.PrintWriter,int)
meth public void paint(java.awt.Graphics)
meth public void paintComponents(java.awt.Graphics)
meth public void print(java.awt.Graphics)
meth public void printComponents(java.awt.Graphics)
meth public void remove(int)
meth public void remove(java.awt.Component)
meth public void removeAll()
meth public void removeContainerListener(java.awt.event.ContainerListener)
meth public void removeNotify()
meth public void setComponentZOrder(java.awt.Component,int)
meth public void setFocusCycleRoot(boolean)
meth public void setFocusTraversalKeys(int,java.util.Set<? extends java.awt.AWTKeyStroke>)
meth public void setFocusTraversalPolicy(java.awt.FocusTraversalPolicy)
meth public void setFont(java.awt.Font)
meth public void setLayout(java.awt.LayoutManager)
meth public void transferFocusDownCycle()
meth public void update(java.awt.Graphics)
meth public void validate()
supr java.awt.Component
hfds EMPTY_ARRAY,INCLUDE_SELF,SEARCH_HEAVYWEIGHTS,component,containerListener,containerSerializedDataVersion,descendUnconditionallyWhenValidating,descendantsCount,dispatcher,eventLog,focusCycleRoot,focusTraversalPolicy,focusTraversalPolicyProvider,isJavaAwtSmartInvalidate,layoutMgr,listeningBoundsChildren,listeningChildren,log,mixingLog,modalAppContext,modalComp,numOfHWComponents,numOfLWComponents,preserveBackgroundColor,printing,printingThreads,serialPersistentFields,serialVersionUID
hcls DropTargetEventTargetFilter,EventTargetFilter,MouseEventTargetFilter,WakingRunnable

CLSS public java.awt.Dialog
cons public init(java.awt.Dialog)
cons public init(java.awt.Dialog,java.lang.String)
cons public init(java.awt.Dialog,java.lang.String,boolean)
cons public init(java.awt.Dialog,java.lang.String,boolean,java.awt.GraphicsConfiguration)
cons public init(java.awt.Frame)
cons public init(java.awt.Frame,boolean)
cons public init(java.awt.Frame,java.lang.String)
cons public init(java.awt.Frame,java.lang.String,boolean)
cons public init(java.awt.Frame,java.lang.String,boolean,java.awt.GraphicsConfiguration)
cons public init(java.awt.Window)
cons public init(java.awt.Window,java.awt.Dialog$ModalityType)
cons public init(java.awt.Window,java.lang.String)
cons public init(java.awt.Window,java.lang.String,java.awt.Dialog$ModalityType)
cons public init(java.awt.Window,java.lang.String,java.awt.Dialog$ModalityType,java.awt.GraphicsConfiguration)
fld public final static java.awt.Dialog$ModalityType DEFAULT_MODALITY_TYPE
innr protected AccessibleAWTDialog
innr public final static !enum ModalExclusionType
innr public final static !enum ModalityType
meth protected java.lang.String paramString()
meth public boolean isModal()
meth public boolean isResizable()
meth public boolean isUndecorated()
meth public java.awt.Dialog$ModalityType getModalityType()
meth public java.lang.String getTitle()
meth public javax.accessibility.AccessibleContext getAccessibleContext()
meth public void addNotify()
meth public void hide()
 anno 0 java.lang.Deprecated()
meth public void setBackground(java.awt.Color)
meth public void setModal(boolean)
meth public void setModalityType(java.awt.Dialog$ModalityType)
meth public void setOpacity(float)
meth public void setResizable(boolean)
meth public void setShape(java.awt.Shape)
meth public void setTitle(java.lang.String)
meth public void setUndecorated(boolean)
meth public void setVisible(boolean)
meth public void show()
 anno 0 java.lang.Deprecated()
meth public void toBack()
supr java.awt.Window
hfds base,blockedWindows,initialized,isInDispose,isInHide,modal,modalDialogs,modalFilter,modalityType,nameCounter,resizable,secondaryLoop,serialVersionUID,title,undecorated

CLSS public abstract interface java.awt.MenuContainer
meth public abstract boolean postEvent(java.awt.Event)
 anno 0 java.lang.Deprecated()
meth public abstract java.awt.Font getFont()
meth public abstract void remove(java.awt.MenuComponent)

CLSS public java.awt.Window
cons public init(java.awt.Frame)
cons public init(java.awt.Window)
cons public init(java.awt.Window,java.awt.GraphicsConfiguration)
innr protected AccessibleAWTWindow
innr public final static !enum Type
intf javax.accessibility.Accessible
meth protected void processEvent(java.awt.AWTEvent)
meth protected void processWindowEvent(java.awt.event.WindowEvent)
meth protected void processWindowFocusEvent(java.awt.event.WindowEvent)
meth protected void processWindowStateEvent(java.awt.event.WindowEvent)
meth public <%0 extends java.util.EventListener> {%%0}[] getListeners(java.lang.Class<{%%0}>)
meth public boolean getFocusableWindowState()
meth public boolean isActive()
meth public boolean isAlwaysOnTopSupported()
meth public boolean isAutoRequestFocus()
meth public boolean isFocused()
meth public boolean isLocationByPlatform()
meth public boolean isOpaque()
meth public boolean isShowing()
meth public boolean isValidateRoot()
meth public boolean postEvent(java.awt.Event)
 anno 0 java.lang.Deprecated()
meth public final boolean isAlwaysOnTop()
meth public final boolean isFocusCycleRoot()
meth public final boolean isFocusableWindow()
meth public final java.awt.Container getFocusCycleRootAncestor()
meth public final java.lang.String getWarningString()
meth public final void setAlwaysOnTop(boolean)
meth public final void setFocusCycleRoot(boolean)
meth public float getOpacity()
meth public java.awt.Color getBackground()
meth public java.awt.Component getFocusOwner()
meth public java.awt.Component getMostRecentFocusOwner()
meth public java.awt.Dialog$ModalExclusionType getModalExclusionType()
meth public java.awt.Shape getShape()
meth public java.awt.Toolkit getToolkit()
meth public java.awt.Window getOwner()
meth public java.awt.Window$Type getType()
meth public java.awt.Window[] getOwnedWindows()
meth public java.awt.event.WindowFocusListener[] getWindowFocusListeners()
meth public java.awt.event.WindowListener[] getWindowListeners()
meth public java.awt.event.WindowStateListener[] getWindowStateListeners()
meth public java.awt.im.InputContext getInputContext()
meth public java.awt.image.BufferStrategy getBufferStrategy()
meth public java.util.List<java.awt.Image> getIconImages()
meth public java.util.Locale getLocale()
meth public java.util.Set<java.awt.AWTKeyStroke> getFocusTraversalKeys(int)
meth public javax.accessibility.AccessibleContext getAccessibleContext()
meth public static java.awt.Window[] getOwnerlessWindows()
meth public static java.awt.Window[] getWindows()
meth public void addNotify()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void addPropertyChangeListener(java.lang.String,java.beans.PropertyChangeListener)
meth public void addWindowFocusListener(java.awt.event.WindowFocusListener)
meth public void addWindowListener(java.awt.event.WindowListener)
meth public void addWindowStateListener(java.awt.event.WindowStateListener)
meth public void applyResourceBundle(java.lang.String)
 anno 0 java.lang.Deprecated()
meth public void applyResourceBundle(java.util.ResourceBundle)
 anno 0 java.lang.Deprecated()
meth public void createBufferStrategy(int)
meth public void createBufferStrategy(int,java.awt.BufferCapabilities) throws java.awt.AWTException
meth public void dispose()
meth public void hide()
 anno 0 java.lang.Deprecated()
meth public void pack()
meth public void paint(java.awt.Graphics)
meth public void removeNotify()
meth public void removeWindowFocusListener(java.awt.event.WindowFocusListener)
meth public void removeWindowListener(java.awt.event.WindowListener)
meth public void removeWindowStateListener(java.awt.event.WindowStateListener)
meth public void reshape(int,int,int,int)
 anno 0 java.lang.Deprecated()
meth public void setAutoRequestFocus(boolean)
meth public void setBackground(java.awt.Color)
meth public void setBounds(int,int,int,int)
meth public void setBounds(java.awt.Rectangle)
meth public void setCursor(java.awt.Cursor)
meth public void setFocusableWindowState(boolean)
meth public void setIconImage(java.awt.Image)
meth public void setIconImages(java.util.List<? extends java.awt.Image>)
meth public void setLocation(int,int)
meth public void setLocation(java.awt.Point)
meth public void setLocationByPlatform(boolean)
meth public void setLocationRelativeTo(java.awt.Component)
meth public void setMinimumSize(java.awt.Dimension)
meth public void setModalExclusionType(java.awt.Dialog$ModalExclusionType)
meth public void setOpacity(float)
meth public void setShape(java.awt.Shape)
meth public void setSize(int,int)
meth public void setSize(java.awt.Dimension)
meth public void setType(java.awt.Window$Type)
meth public void setVisible(boolean)
meth public void show()
 anno 0 java.lang.Deprecated()
meth public void toBack()
meth public void toFront()
supr java.awt.Container
hfds OPENED,allWindows,alwaysOnTop,anchor,autoRequestFocus,base,beforeFirstShow,beforeFirstWindowShown,disposing,focusMgr,focusableWindowState,icons,inputContext,inputContextLock,isInShow,isTrayIconWindow,locationByPlatform,locationByPlatformProp,log,modalBlocker,modalExclusionType,nameCounter,opacity,ownedWindowList,securityWarningAlignmentX,securityWarningAlignmentY,securityWarningHeight,securityWarningPointX,securityWarningPointY,securityWarningWidth,serialVersionUID,shape,showWithParent,state,syncLWRequests,systemSyncLWRequests,temporaryLostComponent,type,warningString,weakThis,windowFocusListener,windowListener,windowSerializedDataVersion,windowStateListener
hcls WindowDisposerRecord

CLSS public abstract interface java.awt.event.ActionListener
intf java.util.EventListener
meth public abstract void actionPerformed(java.awt.event.ActionEvent)

CLSS public abstract interface java.awt.image.ImageObserver
fld public final static int ABORT = 128
fld public final static int ALLBITS = 32
fld public final static int ERROR = 64
fld public final static int FRAMEBITS = 16
fld public final static int HEIGHT = 2
fld public final static int PROPERTIES = 4
fld public final static int SOMEBITS = 8
fld public final static int WIDTH = 1
meth public abstract boolean imageUpdate(java.awt.Image,int,int,int,int,int)

CLSS public abstract interface java.beans.Customizer
meth public abstract void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public abstract void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public abstract void setObject(java.lang.Object)

CLSS public java.beans.FeatureDescriptor
cons public init()
meth public boolean isExpert()
meth public boolean isHidden()
meth public boolean isPreferred()
meth public java.lang.Object getValue(java.lang.String)
meth public java.lang.String getDisplayName()
meth public java.lang.String getName()
meth public java.lang.String getShortDescription()
meth public java.lang.String toString()
meth public java.util.Enumeration<java.lang.String> attributeNames()
meth public void setDisplayName(java.lang.String)
meth public void setExpert(boolean)
meth public void setHidden(boolean)
meth public void setName(java.lang.String)
meth public void setPreferred(boolean)
meth public void setShortDescription(java.lang.String)
meth public void setValue(java.lang.String,java.lang.Object)
supr java.lang.Object
hfds TRANSIENT,classRef,displayName,expert,hidden,name,preferred,shortDescription,table

CLSS public abstract interface java.beans.PropertyChangeListener
intf java.util.EventListener
meth public abstract void propertyChange(java.beans.PropertyChangeEvent)

CLSS public abstract interface java.io.Externalizable
intf java.io.Serializable
meth public abstract void readExternal(java.io.ObjectInput) throws java.io.IOException,java.lang.ClassNotFoundException
meth public abstract void writeExternal(java.io.ObjectOutput) throws java.io.IOException

CLSS public java.io.IOException
cons public init()
cons public init(java.lang.String)
cons public init(java.lang.String,java.lang.Throwable)
cons public init(java.lang.Throwable)
supr java.lang.Exception
hfds serialVersionUID

CLSS public abstract interface java.io.Serializable

CLSS public abstract interface java.lang.Cloneable

CLSS public abstract interface !annotation java.lang.Deprecated
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[CONSTRUCTOR, FIELD, LOCAL_VARIABLE, METHOD, PACKAGE, PARAMETER, TYPE])
intf java.lang.annotation.Annotation

CLSS public java.lang.Exception
cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
cons public init()
cons public init(java.lang.String)
cons public init(java.lang.String,java.lang.Throwable)
cons public init(java.lang.Throwable)
supr java.lang.Throwable
hfds serialVersionUID

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 java.lang.Throwable
cons protected init(java.lang.String,java.lang.Throwable,boolean,boolean)
cons public init()
cons public init(java.lang.String)
cons public init(java.lang.String,java.lang.Throwable)
cons public init(java.lang.Throwable)
intf java.io.Serializable
meth public final java.lang.Throwable[] getSuppressed()
meth public final void addSuppressed(java.lang.Throwable)
meth public java.lang.StackTraceElement[] getStackTrace()
meth public java.lang.String getLocalizedMessage()
meth public java.lang.String getMessage()
meth public java.lang.String toString()
meth public java.lang.Throwable fillInStackTrace()
meth public java.lang.Throwable getCause()
meth public java.lang.Throwable initCause(java.lang.Throwable)
meth public void printStackTrace()
meth public void printStackTrace(java.io.PrintStream)
meth public void printStackTrace(java.io.PrintWriter)
meth public void setStackTrace(java.lang.StackTraceElement[])
supr java.lang.Object
hfds CAUSE_CAPTION,EMPTY_THROWABLE_ARRAY,NULL_CAUSE_MESSAGE,SELF_SUPPRESSION_MESSAGE,SUPPRESSED_CAPTION,SUPPRESSED_SENTINEL,UNASSIGNED_STACK,backtrace,cause,detailMessage,serialVersionUID,stackTrace,suppressedExceptions
hcls PrintStreamOrWriter,SentinelHolder,WrappedPrintStream,WrappedPrintWriter

CLSS public abstract interface java.lang.annotation.Annotation
meth public abstract boolean equals(java.lang.Object)
meth public abstract int hashCode()
meth public abstract java.lang.Class<? extends java.lang.annotation.Annotation> annotationType()
meth public abstract java.lang.String toString()

CLSS public abstract interface !annotation java.lang.annotation.Documented
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
intf java.lang.annotation.Annotation

CLSS public abstract interface !annotation java.lang.annotation.Retention
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
intf java.lang.annotation.Annotation
meth public abstract java.lang.annotation.RetentionPolicy value()

CLSS public abstract interface !annotation java.lang.annotation.Target
 anno 0 java.lang.annotation.Documented()
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[ANNOTATION_TYPE])
intf java.lang.annotation.Annotation
meth public abstract java.lang.annotation.ElementType[] value()

CLSS public abstract interface java.util.EventListener

CLSS public java.util.EventObject
cons public init(java.lang.Object)
fld protected java.lang.Object source
intf java.io.Serializable
meth public java.lang.Object getSource()
meth public java.lang.String toString()
supr java.lang.Object
hfds serialVersionUID

CLSS public abstract interface javax.accessibility.Accessible
meth public abstract javax.accessibility.AccessibleContext getAccessibleContext()

CLSS public abstract interface javax.swing.Action
fld public final static java.lang.String ACCELERATOR_KEY = "AcceleratorKey"
fld public final static java.lang.String ACTION_COMMAND_KEY = "ActionCommandKey"
fld public final static java.lang.String DEFAULT = "Default"
fld public final static java.lang.String DISPLAYED_MNEMONIC_INDEX_KEY = "SwingDisplayedMnemonicIndexKey"
fld public final static java.lang.String LARGE_ICON_KEY = "SwingLargeIconKey"
fld public final static java.lang.String LONG_DESCRIPTION = "LongDescription"
fld public final static java.lang.String MNEMONIC_KEY = "MnemonicKey"
fld public final static java.lang.String NAME = "Name"
fld public final static java.lang.String SELECTED_KEY = "SwingSelectedKey"
fld public final static java.lang.String SHORT_DESCRIPTION = "ShortDescription"
fld public final static java.lang.String SMALL_ICON = "SmallIcon"
intf java.awt.event.ActionListener
meth public abstract boolean isEnabled()
meth public abstract java.lang.Object getValue(java.lang.String)
meth public abstract void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public abstract void putValue(java.lang.String,java.lang.Object)
meth public abstract void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public abstract void setEnabled(boolean)

CLSS public javax.swing.JDialog
cons public init()
cons public init(java.awt.Dialog)
cons public init(java.awt.Dialog,boolean)
cons public init(java.awt.Dialog,java.lang.String)
cons public init(java.awt.Dialog,java.lang.String,boolean)
cons public init(java.awt.Dialog,java.lang.String,boolean,java.awt.GraphicsConfiguration)
cons public init(java.awt.Frame)
cons public init(java.awt.Frame,boolean)
cons public init(java.awt.Frame,java.lang.String)
cons public init(java.awt.Frame,java.lang.String,boolean)
cons public init(java.awt.Frame,java.lang.String,boolean,java.awt.GraphicsConfiguration)
cons public init(java.awt.Window)
cons public init(java.awt.Window,java.awt.Dialog$ModalityType)
cons public init(java.awt.Window,java.lang.String)
cons public init(java.awt.Window,java.lang.String,java.awt.Dialog$ModalityType)
cons public init(java.awt.Window,java.lang.String,java.awt.Dialog$ModalityType,java.awt.GraphicsConfiguration)
fld protected boolean rootPaneCheckingEnabled
fld protected javax.accessibility.AccessibleContext accessibleContext
fld protected javax.swing.JRootPane rootPane
innr protected AccessibleJDialog
intf javax.accessibility.Accessible
intf javax.swing.RootPaneContainer
intf javax.swing.WindowConstants
meth protected boolean isRootPaneCheckingEnabled()
meth protected java.lang.String paramString()
meth protected javax.swing.JRootPane createRootPane()
meth protected void addImpl(java.awt.Component,java.lang.Object,int)
meth protected void dialogInit()
meth protected void processWindowEvent(java.awt.event.WindowEvent)
meth protected void setRootPane(javax.swing.JRootPane)
meth protected void setRootPaneCheckingEnabled(boolean)
meth public int getDefaultCloseOperation()
meth public java.awt.Component getGlassPane()
meth public java.awt.Container getContentPane()
meth public java.awt.Graphics getGraphics()
meth public javax.accessibility.AccessibleContext getAccessibleContext()
meth public javax.swing.JLayeredPane getLayeredPane()
meth public javax.swing.JMenuBar getJMenuBar()
meth public javax.swing.JRootPane getRootPane()
meth public javax.swing.TransferHandler getTransferHandler()
meth public static boolean isDefaultLookAndFeelDecorated()
meth public static void setDefaultLookAndFeelDecorated(boolean)
meth public void remove(java.awt.Component)
meth public void repaint(long,int,int,int,int)
meth public void setContentPane(java.awt.Container)
meth public void setDefaultCloseOperation(int)
meth public void setGlassPane(java.awt.Component)
meth public void setJMenuBar(javax.swing.JMenuBar)
meth public void setLayeredPane(javax.swing.JLayeredPane)
meth public void setLayout(java.awt.LayoutManager)
meth public void setTransferHandler(javax.swing.TransferHandler)
meth public void update(java.awt.Graphics)
supr java.awt.Dialog
hfds defaultCloseOperation,defaultLookAndFeelDecoratedKey,transferHandler

CLSS public abstract interface javax.swing.RootPaneContainer
meth public abstract java.awt.Component getGlassPane()
meth public abstract java.awt.Container getContentPane()
meth public abstract javax.swing.JLayeredPane getLayeredPane()
meth public abstract javax.swing.JRootPane getRootPane()
meth public abstract void setContentPane(java.awt.Container)
meth public abstract void setGlassPane(java.awt.Component)
meth public abstract void setLayeredPane(javax.swing.JLayeredPane)

CLSS public abstract interface javax.swing.WindowConstants
fld public final static int DISPOSE_ON_CLOSE = 2
fld public final static int DO_NOTHING_ON_CLOSE = 0
fld public final static int EXIT_ON_CLOSE = 3
fld public final static int HIDE_ON_CLOSE = 1

CLSS public abstract interface org.netbeans.api.actions.Closable
meth public abstract boolean close()

CLSS public abstract interface org.netbeans.api.actions.Editable
meth public abstract void edit()

CLSS public abstract interface org.netbeans.api.actions.Openable
meth public abstract void open()

CLSS public abstract interface org.netbeans.api.actions.Printable
meth public abstract void print()

CLSS public abstract interface org.netbeans.api.actions.Savable
fld public final static org.openide.util.Lookup REGISTRY
meth public abstract java.lang.String toString()
meth public abstract void save() throws java.io.IOException

CLSS public abstract interface org.netbeans.api.actions.Viewable
meth public abstract void view()

CLSS public abstract interface org.openide.cookies.CloseCookie
intf org.netbeans.api.actions.Closable
intf org.openide.nodes.Node$Cookie

CLSS public abstract interface org.openide.cookies.ConnectionCookie
 anno 0 java.lang.Deprecated()
innr public abstract interface static Listener
innr public abstract interface static Type
innr public static Event
intf org.openide.nodes.Node$Cookie
meth public abstract java.util.Set<? extends org.openide.cookies.ConnectionCookie$Type> getTypes()
meth public abstract void register(org.openide.cookies.ConnectionCookie$Type,org.openide.nodes.Node) throws java.io.IOException
meth public abstract void unregister(org.openide.cookies.ConnectionCookie$Type,org.openide.nodes.Node) throws java.io.IOException

CLSS public static org.openide.cookies.ConnectionCookie$Event
 outer org.openide.cookies.ConnectionCookie
cons public init(org.openide.nodes.Node,org.openide.cookies.ConnectionCookie$Type)
meth public org.openide.cookies.ConnectionCookie$Type getType()
meth public org.openide.nodes.Node getNode()
supr java.util.EventObject
hfds serialVersionUID,type

CLSS public abstract interface static org.openide.cookies.ConnectionCookie$Listener
 outer org.openide.cookies.ConnectionCookie
intf java.util.EventListener
intf org.openide.nodes.Node$Cookie
meth public abstract void notify(org.openide.cookies.ConnectionCookie$Event)

CLSS public abstract interface static org.openide.cookies.ConnectionCookie$Type
 outer org.openide.cookies.ConnectionCookie
intf java.io.Serializable
meth public abstract boolean isPersistent()
meth public abstract boolean overlaps(org.openide.cookies.ConnectionCookie$Type)
meth public abstract java.lang.Class<?> getEventClass()

CLSS public abstract interface org.openide.cookies.EditCookie
intf org.netbeans.api.actions.Editable
intf org.openide.nodes.Node$Cookie

CLSS public abstract interface org.openide.cookies.FilterCookie
 anno 0 java.lang.Deprecated()
intf org.openide.nodes.Node$Cookie
meth public abstract java.lang.Class getFilterClass()
meth public abstract java.lang.Object getFilter()
meth public abstract void setFilter(java.lang.Object)

CLSS public abstract interface org.openide.cookies.InstanceCookie
innr public abstract interface static Of
intf org.openide.nodes.Node$Cookie
meth public abstract java.lang.Class<?> instanceClass() throws java.io.IOException,java.lang.ClassNotFoundException
meth public abstract java.lang.Object instanceCreate() throws java.io.IOException,java.lang.ClassNotFoundException
meth public abstract java.lang.String instanceName()

CLSS public abstract interface static org.openide.cookies.InstanceCookie$Of
 outer org.openide.cookies.InstanceCookie
intf org.openide.cookies.InstanceCookie
meth public abstract boolean instanceOf(java.lang.Class<?>)

CLSS public abstract interface org.openide.cookies.OpenCookie
intf org.netbeans.api.actions.Openable
intf org.openide.nodes.Node$Cookie

CLSS public abstract interface org.openide.cookies.PrintCookie
intf org.netbeans.api.actions.Printable
intf org.openide.nodes.Node$Cookie

CLSS public abstract interface org.openide.cookies.SaveCookie
intf org.netbeans.api.actions.Savable
intf org.openide.nodes.Node$Cookie

CLSS public abstract interface org.openide.cookies.ViewCookie
intf org.netbeans.api.actions.Viewable
intf org.openide.nodes.Node$Cookie

CLSS public org.openide.nodes.AbstractNode
cons public init(org.openide.nodes.Children)
cons public init(org.openide.nodes.Children,org.openide.util.Lookup)
fld protected java.text.MessageFormat displayFormat
fld protected org.openide.util.actions.SystemAction[] systemActions
 anno 0 java.lang.Deprecated()
meth protected final org.openide.nodes.CookieSet getCookieSet()
meth protected final org.openide.nodes.Sheet getSheet()
meth protected final void setCookieSet(org.openide.nodes.CookieSet)
 anno 0 java.lang.Deprecated()
meth protected final void setSheet(org.openide.nodes.Sheet)
meth protected org.openide.nodes.Sheet createSheet()
meth protected org.openide.util.actions.SystemAction[] createActions()
 anno 0 java.lang.Deprecated()
meth protected void createPasteTypes(java.awt.datatransfer.Transferable,java.util.List<org.openide.util.datatransfer.PasteType>)
meth public <%0 extends org.openide.nodes.Node$Cookie> {%%0} getCookie(java.lang.Class<{%%0}>)
meth public boolean canCopy()
meth public boolean canCut()
meth public boolean canDestroy()
meth public boolean canRename()
meth public boolean hasCustomizer()
meth public final org.openide.util.datatransfer.PasteType[] getPasteTypes(java.awt.datatransfer.Transferable)
meth public final void setIconBaseWithExtension(java.lang.String)
meth public java.awt.Component getCustomizer()
meth public java.awt.Image getIcon(int)
meth public java.awt.Image getOpenedIcon(int)
meth public java.awt.datatransfer.Transferable clipboardCopy() throws java.io.IOException
meth public java.awt.datatransfer.Transferable clipboardCut() throws java.io.IOException
meth public java.awt.datatransfer.Transferable drag() throws java.io.IOException
meth public javax.swing.Action getPreferredAction()
meth public org.openide.nodes.Node cloneNode()
meth public org.openide.nodes.Node$Handle getHandle()
meth public org.openide.nodes.Node$PropertySet[] getPropertySets()
meth public org.openide.util.HelpCtx getHelpCtx()
meth public org.openide.util.actions.SystemAction getDefaultAction()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.actions.SystemAction[] getActions()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.datatransfer.NewType[] getNewTypes()
meth public org.openide.util.datatransfer.PasteType getDropType(java.awt.datatransfer.Transferable,int,int)
meth public void setDefaultAction(org.openide.util.actions.SystemAction)
 anno 0 java.lang.Deprecated()
meth public void setIconBase(java.lang.String)
 anno 0 java.lang.Deprecated()
meth public void setName(java.lang.String)
supr org.openide.nodes.Node
hfds DEFAULT_ICON,DEFAULT_ICON_BASE,DEFAULT_ICON_EXTENSION,ICON_BASE,NO_NEW_TYPES,NO_PASTE_TYPES,OPENED_ICON_BASE,iconBase,iconExtension,icons,lookup,overridesGetDefaultAction,preferredAction,sheet,sheetCookieL
hcls SheetAndCookieListener

CLSS public org.openide.nodes.BeanChildren
cons public init(java.beans.beancontext.BeanContext)
cons public init(java.beans.beancontext.BeanContext,org.openide.nodes.BeanChildren$Factory)
innr public abstract interface static Factory
meth protected org.openide.nodes.Node[] createNodes(java.lang.Object)
meth protected void addNotify()
meth protected void removeNotify()
supr org.openide.nodes.Children$Keys
hfds DEFAULT_FACTORY,bean,contextL,factory,nodes2Beans
hcls BeanFactory,ContextL

CLSS public abstract interface static org.openide.nodes.BeanChildren$Factory
 outer org.openide.nodes.BeanChildren
meth public abstract org.openide.nodes.Node createNode(java.lang.Object) throws java.beans.IntrospectionException

CLSS public abstract interface !annotation org.openide.nodes.BeanInfoSearchPath
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PACKAGE])
intf java.lang.annotation.Annotation

CLSS public org.openide.nodes.BeanNode<%0 extends java.lang.Object>
cons protected init({org.openide.nodes.BeanNode%0},org.openide.nodes.Children) throws java.beans.IntrospectionException
cons protected init({org.openide.nodes.BeanNode%0},org.openide.nodes.Children,org.openide.util.Lookup) throws java.beans.IntrospectionException
cons public init({org.openide.nodes.BeanNode%0}) throws java.beans.IntrospectionException
innr public final static Descriptor
meth protected void createProperties({org.openide.nodes.BeanNode%0},java.beans.BeanInfo)
meth protected void setSynchronizeName(boolean)
meth protected {org.openide.nodes.BeanNode%0} getBean()
meth public boolean canCopy()
meth public boolean canCut()
meth public boolean canDestroy()
meth public boolean canRename()
meth public boolean hasCustomizer()
meth public java.awt.Component getCustomizer()
meth public java.awt.Image getIcon(int)
meth public java.awt.Image getOpenedIcon(int)
meth public javax.swing.Action getPreferredAction()
meth public javax.swing.Action[] getActions(boolean)
meth public org.openide.util.HelpCtx getHelpCtx()
meth public static org.openide.nodes.BeanNode$Descriptor computeProperties(java.lang.Object,java.beans.BeanInfo)
meth public void destroy() throws java.io.IOException
meth public void setName(java.lang.String)
supr org.openide.nodes.AbstractNode
hfds ICON_BASE,bean,beanInfo,nameGetter,nameSetter,propertyChangeListener,removePCLMethod,synchronizeName
hcls PropL

CLSS public final static org.openide.nodes.BeanNode$Descriptor
 outer org.openide.nodes.BeanNode
fld public final org.openide.nodes.Node$Property[] expert
fld public final org.openide.nodes.Node$Property[] hidden
fld public final org.openide.nodes.Node$Property[] property
supr java.lang.Object

CLSS public abstract org.openide.nodes.ChildFactory<%0 extends java.lang.Object>
cons public init()
innr public abstract static Detachable
meth protected abstract boolean createKeys(java.util.List<{org.openide.nodes.ChildFactory%0}>)
meth protected final void refresh(boolean)
meth protected org.openide.nodes.Node createNodeForKey({org.openide.nodes.ChildFactory%0})
meth protected org.openide.nodes.Node createWaitNode()
meth protected org.openide.nodes.Node[] createNodesForKey({org.openide.nodes.ChildFactory%0})
supr java.lang.Object
hfds observer
hcls Observer,WaitFilterNode

CLSS public abstract static org.openide.nodes.ChildFactory$Detachable<%0 extends java.lang.Object>
 outer org.openide.nodes.ChildFactory
cons public init()
meth protected void addNotify()
meth protected void removeNotify()
supr org.openide.nodes.ChildFactory<{org.openide.nodes.ChildFactory$Detachable%0}>

CLSS public abstract org.openide.nodes.Children
cons public init()
fld public final static org.openide.nodes.Children LEAF
fld public final static org.openide.util.Mutex MUTEX
innr public abstract static Keys
innr public static Array
innr public static Map
innr public static SortedArray
innr public static SortedMap
meth protected final boolean isInitialized()
meth protected final org.openide.nodes.Node getNode()
meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth protected void addNotify()
meth protected void removeNotify()
meth public abstract boolean add(org.openide.nodes.Node[])
meth public abstract boolean remove(org.openide.nodes.Node[])
meth public final int getNodesCount()
meth public final java.util.Enumeration<org.openide.nodes.Node> nodes()
meth public final java.util.List<org.openide.nodes.Node> snapshot()
meth public final org.openide.nodes.Node getNodeAt(int)
meth public final org.openide.nodes.Node[] getNodes()
meth public int getNodesCount(boolean)
meth public org.openide.nodes.Node findChild(java.lang.String)
meth public org.openide.nodes.Node[] getNodes(boolean)
meth public static <%0 extends java.lang.Object> org.openide.nodes.Children create(org.openide.nodes.ChildFactory<{%%0}>,boolean)
meth public static org.openide.nodes.Children createLazy(java.util.concurrent.Callable<org.openide.nodes.Children>)
supr java.lang.Object
hfds LOG,PR,entrySupport,lazySupport,parent
hcls Dupl,Empty,Entry,LazyChildren,ProjectManagerDeadlockDetector

CLSS public static org.openide.nodes.Children$Array
 outer org.openide.nodes.Children
cons protected init(java.util.Collection<org.openide.nodes.Node>)
cons public init()
fld protected java.util.Collection<org.openide.nodes.Node> nodes
intf java.lang.Cloneable
meth protected final void refresh()
meth protected java.util.Collection<org.openide.nodes.Node> initCollection()
meth public boolean add(org.openide.nodes.Node[])
meth public boolean remove(org.openide.nodes.Node[])
meth public java.lang.Object clone()
supr org.openide.nodes.Children
hfds COLLECTION_LOCK,nodesEntry
hcls AE

CLSS public abstract static org.openide.nodes.Children$Keys<%0 extends java.lang.Object>
 outer org.openide.nodes.Children
cons protected init(boolean)
cons public init()
meth protected abstract org.openide.nodes.Node[] createNodes({org.openide.nodes.Children$Keys%0})
meth protected final void refreshKey({org.openide.nodes.Children$Keys%0})
meth protected final void setBefore(boolean)
meth protected final void setKeys(java.util.Collection<? extends {org.openide.nodes.Children$Keys%0}>)
meth protected final void setKeys({org.openide.nodes.Children$Keys%0}[])
meth protected void destroyNodes(org.openide.nodes.Node[])
meth public boolean add(org.openide.nodes.Node[])
 anno 0 java.lang.Deprecated()
meth public boolean remove(org.openide.nodes.Node[])
 anno 0 java.lang.Deprecated()
meth public java.lang.Object clone()
supr org.openide.nodes.Children$Array
hfds before,lastRuns
hcls KE

CLSS public static org.openide.nodes.Children$Map<%0 extends java.lang.Object>
 outer org.openide.nodes.Children
cons protected init(java.util.Map<{org.openide.nodes.Children$Map%0},org.openide.nodes.Node>)
cons public init()
fld protected java.util.Map<{org.openide.nodes.Children$Map%0},org.openide.nodes.Node> nodes
meth protected final void put({org.openide.nodes.Children$Map%0},org.openide.nodes.Node)
meth protected final void putAll(java.util.Map<? extends {org.openide.nodes.Children$Map%0},? extends org.openide.nodes.Node>)
meth protected final void refresh()
meth protected final void refreshKey({org.openide.nodes.Children$Map%0})
meth protected final void removeAll(java.util.Collection<? extends {org.openide.nodes.Children$Map%0}>)
meth protected java.util.Map<{org.openide.nodes.Children$Map%0},org.openide.nodes.Node> initMap()
meth protected void remove({org.openide.nodes.Children$Map%0})
meth public boolean add(org.openide.nodes.Node[])
meth public boolean remove(org.openide.nodes.Node[])
supr org.openide.nodes.Children
hcls ME

CLSS public static org.openide.nodes.Children$SortedArray
 outer org.openide.nodes.Children
cons protected init(java.util.Collection<org.openide.nodes.Node>)
cons public init()
meth public java.util.Comparator<? super org.openide.nodes.Node> getComparator()
meth public void setComparator(java.util.Comparator<? super org.openide.nodes.Node>)
supr org.openide.nodes.Children$Array
hfds comp
hcls SAE

CLSS public static org.openide.nodes.Children$SortedMap<%0 extends java.lang.Object>
 outer org.openide.nodes.Children
cons protected init(java.util.Map<{org.openide.nodes.Children$SortedMap%0},org.openide.nodes.Node>)
cons public init()
meth public java.util.Comparator<? super org.openide.nodes.Node> getComparator()
meth public void setComparator(java.util.Comparator<? super org.openide.nodes.Node>)
supr org.openide.nodes.Children$Map<{org.openide.nodes.Children$SortedMap%0}>
hfds comp
hcls SMComparator

CLSS public final org.openide.nodes.CookieSet
cons public init()
innr public abstract interface static Before
innr public abstract interface static Factory
intf org.openide.util.Lookup$Provider
meth public !varargs <%0 extends java.lang.Object> void assign(java.lang.Class<? extends {%%0}>,{%%0}[])
meth public <%0 extends org.openide.nodes.Node$Cookie> {%%0} getCookie(java.lang.Class<{%%0}>)
meth public org.openide.util.Lookup getLookup()
meth public static org.openide.nodes.CookieSet createGeneric(org.openide.nodes.CookieSet$Before)
meth public void add(java.lang.Class<? extends org.openide.nodes.Node$Cookie>,org.openide.nodes.CookieSet$Factory)
meth public void add(java.lang.Class<? extends org.openide.nodes.Node$Cookie>[],org.openide.nodes.CookieSet$Factory)
meth public void add(org.openide.nodes.Node$Cookie)
meth public void addChangeListener(javax.swing.event.ChangeListener)
meth public void remove(java.lang.Class<? extends org.openide.nodes.Node$Cookie>,org.openide.nodes.CookieSet$Factory)
meth public void remove(java.lang.Class<? extends org.openide.nodes.Node$Cookie>[],org.openide.nodes.CookieSet$Factory)
meth public void remove(org.openide.nodes.Node$Cookie)
meth public void removeChangeListener(javax.swing.event.ChangeListener)
supr java.lang.Object
hfds QUERY_MODE,cs,ic,lookup,map
hcls C,CookieEntry,CookieEntryPair,PairWrap,R

CLSS public abstract interface static org.openide.nodes.CookieSet$Before
 outer org.openide.nodes.CookieSet
meth public abstract void beforeLookup(java.lang.Class<?>)

CLSS public abstract interface static org.openide.nodes.CookieSet$Factory
 outer org.openide.nodes.CookieSet
meth public abstract <%0 extends org.openide.nodes.Node$Cookie> {%%0} createCookie(java.lang.Class<{%%0}>)

CLSS public final org.openide.nodes.DefaultHandle
intf org.openide.nodes.Node$Handle
meth public java.lang.String toString()
meth public org.openide.nodes.Node getNode() throws java.io.IOException
meth public static org.openide.nodes.DefaultHandle createHandle(org.openide.nodes.Node)
supr java.lang.Object
hfds parent,path,serialVersionUID

CLSS public org.openide.nodes.FilterNode
cons public init(org.openide.nodes.Node)
cons public init(org.openide.nodes.Node,org.openide.nodes.Children)
cons public init(org.openide.nodes.Node,org.openide.nodes.Children,org.openide.util.Lookup)
fld protected final static int DELEGATE_DESTROY = 64
fld protected final static int DELEGATE_GET_ACTIONS = 128
fld protected final static int DELEGATE_GET_CONTEXT_ACTIONS = 256
fld protected final static int DELEGATE_GET_DISPLAY_NAME = 8
fld protected final static int DELEGATE_GET_NAME = 2
fld protected final static int DELEGATE_GET_SHORT_DESCRIPTION = 32
fld protected final static int DELEGATE_GET_VALUE = 1024
fld protected final static int DELEGATE_SET_DISPLAY_NAME = 4
fld protected final static int DELEGATE_SET_NAME = 1
fld protected final static int DELEGATE_SET_SHORT_DESCRIPTION = 16
fld protected final static int DELEGATE_SET_VALUE = 512
innr protected static NodeAdapter
innr protected static PropertyChangeAdapter
innr public static Children
meth protected final void changeOriginal(org.openide.nodes.Node,boolean)
meth protected final void disableDelegation(int)
meth protected final void enableDelegation(int)
meth protected java.beans.PropertyChangeListener createPropertyChangeListener()
meth protected org.openide.nodes.Node getOriginal()
meth protected org.openide.nodes.NodeListener createNodeListener()
meth public <%0 extends org.openide.nodes.Node$Cookie> {%%0} getCookie(java.lang.Class<{%%0}>)
meth public boolean canCopy()
meth public boolean canCut()
meth public boolean canDestroy()
meth public boolean canRename()
meth public boolean equals(java.lang.Object)
meth public boolean hasCustomizer()
meth public int hashCode()
meth public java.awt.Component getCustomizer()
meth public java.awt.Image getIcon(int)
meth public java.awt.Image getOpenedIcon(int)
meth public java.awt.datatransfer.Transferable clipboardCopy() throws java.io.IOException
meth public java.awt.datatransfer.Transferable clipboardCut() throws java.io.IOException
meth public java.awt.datatransfer.Transferable drag() throws java.io.IOException
meth public java.lang.Object getValue(java.lang.String)
meth public java.lang.String getDisplayName()
meth public java.lang.String getHtmlDisplayName()
meth public java.lang.String getName()
meth public java.lang.String getShortDescription()
meth public javax.swing.Action getPreferredAction()
meth public javax.swing.Action[] getActions(boolean)
meth public org.openide.nodes.Node cloneNode()
meth public org.openide.nodes.Node$Handle getHandle()
meth public org.openide.nodes.Node$PropertySet[] getPropertySets()
meth public org.openide.util.HelpCtx getHelpCtx()
meth public org.openide.util.actions.SystemAction getDefaultAction()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.actions.SystemAction[] getActions()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.actions.SystemAction[] getContextActions()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.datatransfer.NewType[] getNewTypes()
meth public org.openide.util.datatransfer.PasteType getDropType(java.awt.datatransfer.Transferable,int,int)
meth public org.openide.util.datatransfer.PasteType[] getPasteTypes(java.awt.datatransfer.Transferable)
meth public void destroy() throws java.io.IOException
meth public void setDisplayName(java.lang.String)
meth public void setName(java.lang.String)
meth public void setShortDescription(java.lang.String)
meth public void setValue(java.lang.String,java.lang.Object)
supr org.openide.nodes.Node
hfds DELEGATE_ALL,LISTENER_LOCK,LOGGER,childrenProvided,delegateMask,hashCodeDepth,lookupProvided,nodeL,original,overridesGetDisplayNameCache,pchlAttached,propL,replaceProvidedLookupCache
hcls ChildrenAdapter,FilterHandle,FilterLookup,StackError

CLSS public static org.openide.nodes.FilterNode$Children
 outer org.openide.nodes.FilterNode
cons public init(org.openide.nodes.Node)
fld protected org.openide.nodes.Node original
intf java.lang.Cloneable
meth protected final void changeOriginal(org.openide.nodes.Node)
meth protected org.openide.nodes.Node copyNode(org.openide.nodes.Node)
meth protected org.openide.nodes.Node[] createNodes(org.openide.nodes.Node)
meth protected void addNotify()
meth protected void filterChildrenAdded(org.openide.nodes.NodeMemberEvent)
meth protected void filterChildrenRemoved(org.openide.nodes.NodeMemberEvent)
meth protected void filterChildrenReordered(org.openide.nodes.NodeReorderEvent)
meth protected void finalize()
meth protected void removeNotify()
meth public boolean add(org.openide.nodes.Node[])
 anno 0 java.lang.Deprecated()
meth public boolean remove(org.openide.nodes.Node[])
 anno 0 java.lang.Deprecated()
meth public int getNodesCount(boolean)
meth public java.lang.Object clone()
meth public org.openide.nodes.Node findChild(java.lang.String)
meth public org.openide.nodes.Node[] getNodes(boolean)
supr org.openide.nodes.Children$Keys<org.openide.nodes.Node>
hfds nodeL
hcls DefaultSupport,FilterChildrenSupport,LazySupport

CLSS protected static org.openide.nodes.FilterNode$NodeAdapter
 outer org.openide.nodes.FilterNode
cons public init(org.openide.nodes.FilterNode)
intf org.openide.nodes.NodeListener
meth protected void propertyChange(org.openide.nodes.FilterNode,java.beans.PropertyChangeEvent)
meth public final void nodeDestroyed(org.openide.nodes.NodeEvent)
meth public final void propertyChange(java.beans.PropertyChangeEvent)
meth public void childrenAdded(org.openide.nodes.NodeMemberEvent)
meth public void childrenRemoved(org.openide.nodes.NodeMemberEvent)
meth public void childrenReordered(org.openide.nodes.NodeReorderEvent)
supr java.lang.Object
hfds fnRef

CLSS protected static org.openide.nodes.FilterNode$PropertyChangeAdapter
 outer org.openide.nodes.FilterNode
cons public init(org.openide.nodes.FilterNode)
intf java.beans.PropertyChangeListener
meth protected void propertyChange(org.openide.nodes.FilterNode,java.beans.PropertyChangeEvent)
meth public final void propertyChange(java.beans.PropertyChangeEvent)
supr java.lang.Object
hfds fnRef

CLSS public abstract interface org.openide.nodes.Index
innr public abstract static KeysChildren
innr public abstract static Support
innr public static ArrayChildren
intf org.openide.nodes.Node$Cookie
meth public abstract int getNodesCount()
meth public abstract int indexOf(org.openide.nodes.Node)
meth public abstract org.openide.nodes.Node[] getNodes()
meth public abstract void addChangeListener(javax.swing.event.ChangeListener)
meth public abstract void exchange(int,int)
meth public abstract void move(int,int)
meth public abstract void moveDown(int)
meth public abstract void moveUp(int)
meth public abstract void removeChangeListener(javax.swing.event.ChangeListener)
meth public abstract void reorder()
meth public abstract void reorder(int[])

CLSS public static org.openide.nodes.Index$ArrayChildren
 outer org.openide.nodes.Index
cons public init()
fld protected org.openide.nodes.Index support
intf org.openide.nodes.Index
meth protected java.util.List<org.openide.nodes.Node> initCollection()
meth public int indexOf(org.openide.nodes.Node)
meth public void addChangeListener(javax.swing.event.ChangeListener)
meth public void exchange(int,int)
meth public void move(int,int)
meth public void moveDown(int)
meth public void moveUp(int)
meth public void removeChangeListener(javax.swing.event.ChangeListener)
meth public void reorder()
meth public void reorder(int[])
supr org.openide.nodes.Children$Array

CLSS public abstract static org.openide.nodes.Index$KeysChildren<%0 extends java.lang.Object>
 outer org.openide.nodes.Index
cons public init(java.util.List<{org.openide.nodes.Index$KeysChildren%0}>)
fld protected final java.util.List<{org.openide.nodes.Index$KeysChildren%0}> list
meth protected java.lang.Object lock()
meth protected org.openide.nodes.Index createIndex()
meth protected void reorder(int[])
meth public final void update()
meth public org.openide.nodes.Index getIndex()
supr org.openide.nodes.Children$Keys<{org.openide.nodes.Index$KeysChildren%0}>
hfds support

CLSS public abstract static org.openide.nodes.Index$Support
 outer org.openide.nodes.Index
cons public init()
intf org.openide.nodes.Index
meth protected void fireChangeEvent(javax.swing.event.ChangeEvent)
meth public abstract int getNodesCount()
meth public abstract org.openide.nodes.Node[] getNodes()
meth public abstract void reorder(int[])
meth public int indexOf(org.openide.nodes.Node)
meth public static void showIndexedCustomizer(org.openide.nodes.Index)
meth public void addChangeListener(javax.swing.event.ChangeListener)
meth public void exchange(int,int)
meth public void move(int,int)
meth public void moveDown(int)
meth public void moveUp(int)
meth public void removeChangeListener(javax.swing.event.ChangeListener)
meth public void reorder()
supr java.lang.Object
hfds listeners

CLSS public final org.openide.nodes.IndexedCustomizer
 anno 0 java.lang.Deprecated()
cons public init()
intf java.beans.Customizer
meth public boolean isImmediateReorder()
meth public java.awt.Dimension getPreferredSize()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public void setImmediateReorder(boolean)
meth public void setObject(java.lang.Object)
supr javax.swing.JDialog
hfds buttonClose,buttonDown,buttonUp,control,immediateReorder,index,nodeChangesL,nodes,permutation,serialVersionUID
hcls AutoscrollJList,IndexTransferable,IndexedDragSource,IndexedDropTarget,IndexedListCellRenderer

CLSS public org.openide.nodes.IndexedNode
cons protected init(org.openide.nodes.Children,org.openide.nodes.Index)
cons protected init(org.openide.nodes.Children,org.openide.nodes.Index,org.openide.util.Lookup)
cons public init()
meth public <%0 extends org.openide.nodes.Node$Cookie> {%%0} getCookie(java.lang.Class<{%%0}>)
meth public boolean hasCustomizer()
meth public java.awt.Component getCustomizer()
supr org.openide.nodes.AbstractNode
hfds indexImpl

CLSS public org.openide.nodes.IndexedPropertySupport<%0 extends java.lang.Object, %1 extends java.lang.Object>
cons public init(java.lang.Object,java.lang.Class<{org.openide.nodes.IndexedPropertySupport%0}>,java.lang.Class<{org.openide.nodes.IndexedPropertySupport%1}>,java.lang.reflect.Method,java.lang.reflect.Method,java.lang.reflect.Method,java.lang.reflect.Method)
fld protected java.lang.Object instance
meth public boolean canIndexedRead()
meth public boolean canIndexedWrite()
meth public boolean canRead()
meth public boolean canWrite()
meth public final void setDisplayName(java.lang.String)
meth public final void setName(java.lang.String)
meth public final void setShortDescription(java.lang.String)
meth public void setIndexedValue(int,{org.openide.nodes.IndexedPropertySupport%1}) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public void setValue({org.openide.nodes.IndexedPropertySupport%0}) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public {org.openide.nodes.IndexedPropertySupport%0} getValue() throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public {org.openide.nodes.IndexedPropertySupport%1} getIndexedValue(int) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
supr org.openide.nodes.Node$IndexedProperty<{org.openide.nodes.IndexedPropertySupport%0},{org.openide.nodes.IndexedPropertySupport%1}>
hfds getter,indexedGetter,indexedSetter,setter

CLSS public abstract org.openide.nodes.Node
cons protected init(org.openide.nodes.Children)
cons protected init(org.openide.nodes.Children,org.openide.util.Lookup)
fld public final static java.lang.String PROP_COOKIE = "cookie"
fld public final static java.lang.String PROP_DISPLAY_NAME = "displayName"
fld public final static java.lang.String PROP_ICON = "icon"
fld public final static java.lang.String PROP_LEAF = "leaf"
fld public final static java.lang.String PROP_NAME = "name"
fld public final static java.lang.String PROP_OPENED_ICON = "openedIcon"
fld public final static java.lang.String PROP_PARENT_NODE = "parentNode"
fld public final static java.lang.String PROP_PROPERTY_SETS = "propertySets"
fld public final static java.lang.String PROP_SHORT_DESCRIPTION = "shortDescription"
fld public final static org.openide.nodes.Node EMPTY
innr public abstract interface static Cookie
innr public abstract interface static Handle
innr public abstract static IndexedProperty
innr public abstract static Property
innr public abstract static PropertySet
intf org.openide.util.HelpCtx$Provider
intf org.openide.util.Lookup$Provider
meth protected final boolean hasPropertyChangeListener()
meth protected final void fireCookieChange()
meth protected final void fireDisplayNameChange(java.lang.String,java.lang.String)
meth protected final void fireIconChange()
meth protected final void fireNameChange(java.lang.String,java.lang.String)
meth protected final void fireNodeDestroyed()
meth protected final void fireOpenedIconChange()
meth protected final void firePropertyChange(java.lang.String,java.lang.Object,java.lang.Object)
meth protected final void firePropertySetsChange(org.openide.nodes.Node$PropertySet[],org.openide.nodes.Node$PropertySet[])
meth protected final void fireShortDescriptionChange(java.lang.String,java.lang.String)
meth protected final void setChildren(org.openide.nodes.Children)
meth protected java.lang.Object clone() throws java.lang.CloneNotSupportedException
meth public <%0 extends org.openide.nodes.Node$Cookie> {%%0} getCookie(java.lang.Class<{%%0}>)
meth public abstract boolean canCopy()
meth public abstract boolean canCut()
meth public abstract boolean canDestroy()
meth public abstract boolean canRename()
meth public abstract boolean hasCustomizer()
meth public abstract java.awt.Component getCustomizer()
meth public abstract java.awt.Image getIcon(int)
meth public abstract java.awt.Image getOpenedIcon(int)
meth public abstract java.awt.datatransfer.Transferable clipboardCopy() throws java.io.IOException
meth public abstract java.awt.datatransfer.Transferable clipboardCut() throws java.io.IOException
meth public abstract java.awt.datatransfer.Transferable drag() throws java.io.IOException
meth public abstract org.openide.nodes.Node cloneNode()
meth public abstract org.openide.nodes.Node$Handle getHandle()
meth public abstract org.openide.nodes.Node$PropertySet[] getPropertySets()
meth public abstract org.openide.util.HelpCtx getHelpCtx()
meth public abstract org.openide.util.datatransfer.NewType[] getNewTypes()
meth public abstract org.openide.util.datatransfer.PasteType getDropType(java.awt.datatransfer.Transferable,int,int)
meth public abstract org.openide.util.datatransfer.PasteType[] getPasteTypes(java.awt.datatransfer.Transferable)
meth public boolean equals(java.lang.Object)
meth public final boolean isLeaf()
meth public final javax.swing.JPopupMenu getContextMenu()
meth public final org.openide.nodes.Children getChildren()
meth public final org.openide.nodes.Node getParentNode()
meth public final org.openide.util.Lookup getLookup()
meth public final void addNodeListener(org.openide.nodes.NodeListener)
meth public final void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public final void removeNodeListener(org.openide.nodes.NodeListener)
meth public final void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public int hashCode()
meth public java.lang.String getHtmlDisplayName()
meth public java.lang.String toString()
meth public javax.swing.Action getPreferredAction()
meth public javax.swing.Action[] getActions(boolean)
meth public org.openide.util.actions.SystemAction getDefaultAction()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.actions.SystemAction[] getActions()
 anno 0 java.lang.Deprecated()
meth public org.openide.util.actions.SystemAction[] getContextActions()
 anno 0 java.lang.Deprecated()
meth public void destroy() throws java.io.IOException
meth public void setDisplayName(java.lang.String)
meth public void setHidden(boolean)
 anno 0 java.lang.Deprecated()
meth public void setName(java.lang.String)
meth public void setShortDescription(java.lang.String)
supr java.beans.FeatureDescriptor
hfds BLOCK_EVENTS,INIT_LOCK,LOCK,TEMPL_COOKIE,err,hierarchy,listeners,lookups,parent,warnedBadProperties
hcls LookupEventList,PropertyEditorRef

CLSS public abstract interface static org.openide.nodes.Node$Cookie
 outer org.openide.nodes.Node

CLSS public abstract interface static org.openide.nodes.Node$Handle
 outer org.openide.nodes.Node
fld public final static long serialVersionUID = -4518262478987434353
 anno 0 java.lang.Deprecated()
intf java.io.Serializable
meth public abstract org.openide.nodes.Node getNode() throws java.io.IOException

CLSS public abstract static org.openide.nodes.Node$IndexedProperty<%0 extends java.lang.Object, %1 extends java.lang.Object>
 outer org.openide.nodes.Node
cons public init(java.lang.Class<{org.openide.nodes.Node$IndexedProperty%0}>,java.lang.Class<{org.openide.nodes.Node$IndexedProperty%1}>)
meth public abstract boolean canIndexedRead()
meth public abstract boolean canIndexedWrite()
meth public abstract void setIndexedValue(int,{org.openide.nodes.Node$IndexedProperty%1}) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public abstract {org.openide.nodes.Node$IndexedProperty%1} getIndexedValue(int) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public boolean equals(java.lang.Object)
meth public int hashCode()
meth public java.beans.PropertyEditor getIndexedPropertyEditor()
meth public java.lang.Class<{org.openide.nodes.Node$IndexedProperty%1}> getElementType()
supr org.openide.nodes.Node$Property<{org.openide.nodes.Node$IndexedProperty%0}>
hfds elementType

CLSS public abstract static org.openide.nodes.Node$Property<%0 extends java.lang.Object>
 outer org.openide.nodes.Node
cons public init(java.lang.Class<{org.openide.nodes.Node$Property%0}>)
meth public abstract boolean canRead()
meth public abstract boolean canWrite()
meth public abstract void setValue({org.openide.nodes.Node$Property%0}) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public abstract {org.openide.nodes.Node$Property%0} getValue() throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public boolean equals(java.lang.Object)
meth public boolean isDefaultValue()
meth public boolean supportsDefaultValue()
meth public int hashCode()
meth public java.beans.PropertyEditor getPropertyEditor()
meth public java.lang.Class<{org.openide.nodes.Node$Property%0}> getValueType()
meth public java.lang.String getHtmlDisplayName()
meth public void restoreDefaultValue() throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
supr java.beans.FeatureDescriptor
hfds edRef,type,warnedNames

CLSS public abstract static org.openide.nodes.Node$PropertySet
 outer org.openide.nodes.Node
cons public init()
cons public init(java.lang.String,java.lang.String,java.lang.String)
meth public abstract org.openide.nodes.Node$Property<?>[] getProperties()
meth public boolean equals(java.lang.Object)
meth public int hashCode()
meth public java.lang.String getHtmlDisplayName()
supr java.beans.FeatureDescriptor

CLSS public abstract interface org.openide.nodes.NodeAcceptor
meth public abstract boolean acceptNodes(org.openide.nodes.Node[])

CLSS public org.openide.nodes.NodeAdapter
cons public init()
intf org.openide.nodes.NodeListener
meth public void childrenAdded(org.openide.nodes.NodeMemberEvent)
meth public void childrenRemoved(org.openide.nodes.NodeMemberEvent)
meth public void childrenReordered(org.openide.nodes.NodeReorderEvent)
meth public void nodeDestroyed(org.openide.nodes.NodeEvent)
meth public void propertyChange(java.beans.PropertyChangeEvent)
supr java.lang.Object

CLSS public org.openide.nodes.NodeEvent
cons public init(org.openide.nodes.Node)
meth public final org.openide.nodes.Node getNode()
supr java.util.EventObject
hfds serialVersionUID

CLSS public abstract interface org.openide.nodes.NodeListener
intf java.beans.PropertyChangeListener
meth public abstract void childrenAdded(org.openide.nodes.NodeMemberEvent)
meth public abstract void childrenRemoved(org.openide.nodes.NodeMemberEvent)
meth public abstract void childrenReordered(org.openide.nodes.NodeReorderEvent)
meth public abstract void nodeDestroyed(org.openide.nodes.NodeEvent)

CLSS public org.openide.nodes.NodeMemberEvent
meth public final boolean isAddEvent()
meth public final java.util.List<org.openide.nodes.Node> getSnapshot()
meth public final org.openide.nodes.Node[] getDelta()
meth public int[] getDeltaIndices()
meth public java.lang.String toString()
supr org.openide.nodes.NodeEvent
hfds add,currSnapshot,delta,indices,prevSnapshot,serialVersionUID,sourceEntry

CLSS public final org.openide.nodes.NodeNotFoundException
meth public int getClosestNodeDepth()
meth public java.lang.String getMessage()
meth public java.lang.String getMissingChildName()
meth public org.openide.nodes.Node getClosestNode()
supr java.io.IOException
hfds depth,name,node,serialVersionUID

CLSS public final org.openide.nodes.NodeOp
meth public static boolean isSon(org.openide.nodes.Node,org.openide.nodes.Node)
meth public static int[] computePermutation(org.openide.nodes.Node[],org.openide.nodes.Node[])
meth public static java.lang.String[] createPath(org.openide.nodes.Node,org.openide.nodes.Node)
meth public static javax.swing.Action[] findActions(org.openide.nodes.Node[])
meth public static javax.swing.JPopupMenu findContextMenu(org.openide.nodes.Node[])
meth public static org.openide.nodes.Node findChild(org.openide.nodes.Node,java.lang.String)
meth public static org.openide.nodes.Node findPath(org.openide.nodes.Node,java.lang.String[]) throws org.openide.nodes.NodeNotFoundException
meth public static org.openide.nodes.Node findPath(org.openide.nodes.Node,java.util.Enumeration<java.lang.String>) throws org.openide.nodes.NodeNotFoundException
meth public static org.openide.nodes.Node findRoot(org.openide.nodes.Node)
meth public static org.openide.nodes.Node$Handle[] toHandles(org.openide.nodes.Node[])
meth public static org.openide.nodes.NodeListener weakNodeListener(org.openide.nodes.NodeListener,java.lang.Object)
meth public static org.openide.nodes.Node[] fromHandles(org.openide.nodes.Node$Handle[]) throws java.io.IOException
meth public static org.openide.util.actions.SystemAction[] getDefaultActions()
 anno 0 java.lang.Deprecated()
meth public static void registerPropertyEditors()
meth public static void setDefaultActions(org.openide.util.actions.SystemAction[])
 anno 0 java.lang.Deprecated()
supr java.lang.Object
hfds LOG,defaultActions

CLSS public abstract org.openide.nodes.NodeOperation
cons protected init()
meth public !varargs void showCustomEditorDialog(org.openide.nodes.Node$Property<?>,java.lang.Object[])
meth public abstract boolean customize(org.openide.nodes.Node)
meth public abstract org.openide.nodes.Node[] select(java.lang.String,java.lang.String,org.openide.nodes.Node,org.openide.nodes.NodeAcceptor,java.awt.Component) throws org.openide.util.UserCancelException
meth public abstract void explore(org.openide.nodes.Node)
meth public abstract void showProperties(org.openide.nodes.Node)
meth public abstract void showProperties(org.openide.nodes.Node[])
meth public final org.openide.nodes.Node select(java.lang.String,java.lang.String,org.openide.nodes.Node) throws org.openide.util.UserCancelException
meth public org.openide.nodes.Node[] select(java.lang.String,java.lang.String,org.openide.nodes.Node,org.openide.nodes.NodeAcceptor) throws org.openide.util.UserCancelException
meth public static org.openide.nodes.NodeOperation getDefault()
supr java.lang.Object

CLSS public final org.openide.nodes.NodeReorderEvent
meth public final java.util.List<org.openide.nodes.Node> getSnapshot()
meth public int getPermutationSize()
meth public int newIndexOf(int)
meth public int[] getPermutation()
meth public java.lang.String toString()
supr org.openide.nodes.NodeEvent
hfds currSnapshot,newIndices,serialVersionUID

CLSS public abstract org.openide.nodes.NodeTransfer
fld public final static int CLIPBOARD_COPY = 1
fld public final static int CLIPBOARD_CUT = 4
fld public final static int COPY = 1
fld public final static int DND_COPY = 1
fld public final static int DND_COPY_OR_MOVE = 3
fld public final static int DND_LINK = 1073741824
fld public final static int DND_MOVE = 2
fld public final static int DND_NONE = 0
fld public final static int DND_REFERENCE = 1073741824
fld public final static int MOVE = 6
innr public abstract interface static Paste
meth public static <%0 extends org.openide.nodes.Node$Cookie> {%%0} cookie(java.awt.datatransfer.Transferable,int,java.lang.Class<{%%0}>)
meth public static org.openide.nodes.Node node(java.awt.datatransfer.Transferable,int)
meth public static org.openide.nodes.NodeTransfer$Paste findPaste(java.awt.datatransfer.Transferable)
meth public static org.openide.nodes.Node[] nodes(java.awt.datatransfer.Transferable,int)
meth public static org.openide.util.datatransfer.ExTransferable$Single createPaste(org.openide.nodes.NodeTransfer$Paste)
meth public static org.openide.util.datatransfer.ExTransferable$Single transferable(org.openide.nodes.Node,int)
supr java.lang.Object
hfds dndMimeType,nodePasteFlavor

CLSS public abstract interface static org.openide.nodes.NodeTransfer$Paste
 outer org.openide.nodes.NodeTransfer
meth public abstract org.openide.util.datatransfer.PasteType[] types(org.openide.nodes.Node)

CLSS public abstract interface !annotation org.openide.nodes.PropertyEditorRegistration
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=RUNTIME)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[TYPE])
intf java.lang.annotation.Annotation
meth public abstract java.lang.Class<?>[] targetType()

CLSS public abstract interface !annotation org.openide.nodes.PropertyEditorSearchPath
 anno 0 java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy value=SOURCE)
 anno 0 java.lang.annotation.Target(java.lang.annotation.ElementType[] value=[PACKAGE])
intf java.lang.annotation.Annotation

CLSS public abstract org.openide.nodes.PropertySupport<%0 extends java.lang.Object>
cons public init(java.lang.String,java.lang.Class<{org.openide.nodes.PropertySupport%0}>,java.lang.String,java.lang.String,boolean,boolean)
innr public abstract static ReadOnly
innr public abstract static ReadWrite
innr public abstract static WriteOnly
innr public final static Name
innr public static Reflection
meth public boolean canRead()
meth public boolean canWrite()
supr org.openide.nodes.Node$Property<{org.openide.nodes.PropertySupport%0}>
hfds canR,canW

CLSS public final static org.openide.nodes.PropertySupport$Name
 outer org.openide.nodes.PropertySupport
cons public init(org.openide.nodes.Node)
cons public init(org.openide.nodes.Node,java.lang.String,java.lang.String)
meth public java.lang.String getValue() throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public void setValue(java.lang.String) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
supr org.openide.nodes.PropertySupport<java.lang.String>
hfds node

CLSS public abstract static org.openide.nodes.PropertySupport$ReadOnly<%0 extends java.lang.Object>
 outer org.openide.nodes.PropertySupport
cons public init(java.lang.String,java.lang.Class<{org.openide.nodes.PropertySupport$ReadOnly%0}>,java.lang.String,java.lang.String)
meth public void setValue({org.openide.nodes.PropertySupport$ReadOnly%0}) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
supr org.openide.nodes.PropertySupport<{org.openide.nodes.PropertySupport$ReadOnly%0}>

CLSS public abstract static org.openide.nodes.PropertySupport$ReadWrite<%0 extends java.lang.Object>
 outer org.openide.nodes.PropertySupport
cons public init(java.lang.String,java.lang.Class<{org.openide.nodes.PropertySupport$ReadWrite%0}>,java.lang.String,java.lang.String)
supr org.openide.nodes.PropertySupport<{org.openide.nodes.PropertySupport$ReadWrite%0}>

CLSS public static org.openide.nodes.PropertySupport$Reflection<%0 extends java.lang.Object>
 outer org.openide.nodes.PropertySupport
cons public init(java.lang.Object,java.lang.Class<{org.openide.nodes.PropertySupport$Reflection%0}>,java.lang.String) throws java.lang.NoSuchMethodException
cons public init(java.lang.Object,java.lang.Class<{org.openide.nodes.PropertySupport$Reflection%0}>,java.lang.String,java.lang.String) throws java.lang.NoSuchMethodException
cons public init(java.lang.Object,java.lang.Class<{org.openide.nodes.PropertySupport$Reflection%0}>,java.lang.reflect.Method,java.lang.reflect.Method)
fld protected java.lang.Object instance
meth public boolean canRead()
meth public boolean canWrite()
meth public java.beans.PropertyEditor getPropertyEditor()
meth public void setPropertyEditorClass(java.lang.Class<? extends java.beans.PropertyEditor>)
meth public void setValue({org.openide.nodes.PropertySupport$Reflection%0}) throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
meth public {org.openide.nodes.PropertySupport$Reflection%0} getValue() throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
supr org.openide.nodes.Node$Property<{org.openide.nodes.PropertySupport$Reflection%0}>
hfds getter,propertyEditorClass,setter

CLSS public abstract static org.openide.nodes.PropertySupport$WriteOnly<%0 extends java.lang.Object>
 outer org.openide.nodes.PropertySupport
cons public init(java.lang.String,java.lang.Class<{org.openide.nodes.PropertySupport$WriteOnly%0}>,java.lang.String,java.lang.String)
meth public {org.openide.nodes.PropertySupport$WriteOnly%0} getValue() throws java.lang.IllegalAccessException,java.lang.reflect.InvocationTargetException
supr org.openide.nodes.PropertySupport<{org.openide.nodes.PropertySupport$WriteOnly%0}>

CLSS public final org.openide.nodes.Sheet
cons public init()
fld public final static java.lang.String EXPERT = "expert"
fld public final static java.lang.String PROPERTIES = "properties"
innr public final static Set
meth public final org.openide.nodes.Node$PropertySet[] toArray()
meth public org.openide.nodes.Sheet cloneSheet()
meth public org.openide.nodes.Sheet$Set get(java.lang.String)
meth public org.openide.nodes.Sheet$Set put(org.openide.nodes.Sheet$Set)
meth public org.openide.nodes.Sheet$Set remove(java.lang.String)
meth public static org.openide.nodes.Sheet createDefault()
meth public static org.openide.nodes.Sheet$Set createExpertSet()
meth public static org.openide.nodes.Sheet$Set createPropertiesSet()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
supr java.lang.Object
hfds array,propL,sets,supp

CLSS public final static org.openide.nodes.Sheet$Set
 outer org.openide.nodes.Sheet
cons public init()
meth public org.openide.nodes.Node$Property<?> get(java.lang.String)
meth public org.openide.nodes.Node$Property<?> put(org.openide.nodes.Node$Property<?>)
meth public org.openide.nodes.Node$Property<?> remove(java.lang.String)
meth public org.openide.nodes.Node$Property<?>[] getProperties()
meth public org.openide.nodes.Sheet$Set cloneSet()
meth public void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public void put(org.openide.nodes.Node$Property<?>[])
meth public void removePropertyChangeListener(java.beans.PropertyChangeListener)
supr org.openide.nodes.Node$PropertySet
hfds array,props,supp

CLSS public abstract interface org.openide.util.ContextAwareAction
intf javax.swing.Action
meth public abstract javax.swing.Action createContextAwareInstance(org.openide.util.Lookup)

CLSS public final org.openide.util.HelpCtx
cons public init(java.lang.Class<?>)
 anno 0 java.lang.Deprecated()
cons public init(java.lang.String)
cons public init(java.net.URL)
 anno 0 java.lang.Deprecated()
fld public final static org.openide.util.HelpCtx DEFAULT_HELP
innr public abstract interface static Displayer
innr public abstract interface static Provider
meth public boolean display()
meth public boolean equals(java.lang.Object)
meth public int hashCode()
meth public java.lang.String getHelpID()
meth public java.lang.String toString()
meth public java.net.URL getHelp()
meth public static org.openide.util.HelpCtx findHelp(java.awt.Component)
meth public static org.openide.util.HelpCtx findHelp(java.lang.Object)
meth public static void setHelpIDString(javax.swing.JComponent,java.lang.String)
supr java.lang.Object
hfds err,helpCtx,helpID

CLSS public abstract interface static org.openide.util.HelpCtx$Provider
 outer org.openide.util.HelpCtx
meth public abstract org.openide.util.HelpCtx getHelpCtx()

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

CLSS public abstract org.openide.util.SharedClassObject
cons protected init()
intf java.io.Externalizable
meth protected boolean clearSharedData()
meth protected final java.lang.Object getLock()
meth protected final java.lang.Object getProperty(java.lang.Object)
meth protected final java.lang.Object putProperty(java.lang.Object,java.lang.Object)
meth protected final java.lang.Object putProperty(java.lang.String,java.lang.Object,boolean)
meth protected final void finalize() throws java.lang.Throwable
meth protected java.lang.Object writeReplace()
meth protected void addNotify()
meth protected void firePropertyChange(java.lang.String,java.lang.Object,java.lang.Object)
meth protected void initialize()
meth protected void removeNotify()
meth protected void reset()
meth public final boolean equals(java.lang.Object)
meth public final int hashCode()
meth public final void addPropertyChangeListener(java.beans.PropertyChangeListener)
meth public final void removePropertyChangeListener(java.beans.PropertyChangeListener)
meth public static <%0 extends org.openide.util.SharedClassObject> {%%0} findObject(java.lang.Class<{%%0}>)
meth public static <%0 extends org.openide.util.SharedClassObject> {%%0} findObject(java.lang.Class<{%%0}>,boolean)
meth public void readExternal(java.io.ObjectInput) throws java.io.IOException,java.lang.ClassNotFoundException
meth public void writeExternal(java.io.ObjectOutput) throws java.io.IOException
supr java.lang.Object
hfds PROP_SUPPORT,addNotifySuper,alreadyWarnedAboutDupes,dataEntry,err,first,firstTrace,inReadExternal,initializeSuper,instancesBeingCreated,lock,prematureSystemOptionMutation,removeNotifySuper,serialVersionUID,systemOption,values,waitingOnSystemOption
hcls DataEntry,SetAccessibleAction,WriteReplace

CLSS public abstract org.openide.util.actions.ActionInvoker
cons protected init()
meth protected abstract void invokeAction(javax.swing.Action,java.awt.event.ActionEvent)
meth public static void invokeAction(javax.swing.Action,java.awt.event.ActionEvent,boolean,java.lang.Runnable)
supr java.lang.Object
hfds RP
hcls ActionRunnable

CLSS public abstract interface org.openide.util.actions.ActionPerformer
 anno 0 java.lang.Deprecated()
meth public abstract void performAction(org.openide.util.actions.SystemAction)

CLSS public abstract org.openide.util.actions.ActionPresenterProvider
cons protected init()
meth public abstract java.awt.Component createToolbarPresenter(javax.swing.Action)
meth public abstract java.awt.Component[] convertComponents(java.awt.Component)
meth public abstract javax.swing.JMenuItem createMenuPresenter(javax.swing.Action)
meth public abstract javax.swing.JMenuItem createPopupPresenter(javax.swing.Action)
meth public abstract javax.swing.JPopupMenu createEmptyPopup()
meth public static org.openide.util.actions.ActionPresenterProvider getDefault()
supr java.lang.Object
hcls Default

CLSS public abstract org.openide.util.actions.BooleanStateAction
cons public init()
fld public final static java.lang.String PROP_BOOLEAN_STATE = "booleanState"
intf org.openide.util.actions.Presenter$Menu
intf org.openide.util.actions.Presenter$Popup
intf org.openide.util.actions.Presenter$Toolbar
meth protected void initialize()
meth public boolean getBooleanState()
meth public java.awt.Component getToolbarPresenter()
meth public javax.swing.JMenuItem getMenuPresenter()
meth public javax.swing.JMenuItem getPopupPresenter()
meth public void actionPerformed(java.awt.event.ActionEvent)
meth public void setBooleanState(boolean)
supr org.openide.util.actions.SystemAction
hfds serialVersionUID

CLSS public abstract org.openide.util.actions.CallableSystemAction
cons public init()
intf org.openide.util.actions.Presenter$Menu
intf org.openide.util.actions.Presenter$Popup
intf org.openide.util.actions.Presenter$Toolbar
meth protected boolean asynchronous()
meth public abstract void performAction()
meth public java.awt.Component getToolbarPresenter()
meth public javax.swing.JMenuItem getMenuPresenter()
meth public javax.swing.JMenuItem getPopupPresenter()
meth public void actionPerformed(java.awt.event.ActionEvent)
supr org.openide.util.actions.SystemAction
hfds DEFAULT_ASYNCH,serialVersionUID,warnedAsynchronousActions

CLSS public abstract org.openide.util.actions.CallbackSystemAction
cons public init()
intf org.openide.util.ContextAwareAction
meth protected void initialize()
meth public boolean getSurviveFocusChange()
meth public java.lang.Object getActionMapKey()
meth public javax.swing.Action createContextAwareInstance(org.openide.util.Lookup)
meth public org.openide.util.actions.ActionPerformer getActionPerformer()
 anno 0 java.lang.Deprecated()
meth public void actionPerformed(java.awt.event.ActionEvent)
meth public void performAction()
 anno 0 java.lang.Deprecated()
meth public void setActionPerformer(org.openide.util.actions.ActionPerformer)
 anno 0 java.lang.Deprecated()
meth public void setSurviveFocusChange(boolean)
supr org.openide.util.actions.CallableSystemAction
hfds LISTENER,PROP_ACTION_PERFORMER,err,notSurviving,serialVersionUID,surviving
hcls ActionDelegateListener,DelegateAction,GlobalManager,WeakAction

CLSS public abstract org.openide.util.actions.CookieAction
cons public init()
fld public final static int MODE_ALL = 4
fld public final static int MODE_ANY = 7
fld public final static int MODE_EXACTLY_ONE = 8
fld public final static int MODE_ONE = 1
fld public final static int MODE_SOME = 2
meth protected abstract int mode()
meth protected abstract java.lang.Class<?>[] cookieClasses()
meth protected boolean enable(org.openide.nodes.Node[])
meth public javax.swing.Action createContextAwareInstance(org.openide.util.Lookup)
supr org.openide.util.actions.NodeAction
hfds PROP_COOKIES,listener,serialVersionUID
hcls CookieDelegateAction,CookiesChangeListener

CLSS public abstract org.openide.util.actions.NodeAction
cons public init()
intf org.openide.util.ContextAwareAction
meth protected abstract boolean enable(org.openide.nodes.Node[])
meth protected abstract void performAction(org.openide.nodes.Node[])
meth protected boolean surviveFocusChange()
meth protected void addNotify()
meth protected void initialize()
meth protected void removeNotify()
meth public boolean isEnabled()
meth public final org.openide.nodes.Node[] getActivatedNodes()
meth public javax.swing.Action createContextAwareInstance(org.openide.util.Lookup)
meth public void actionPerformed(java.awt.event.ActionEvent)
 anno 0 java.lang.Deprecated()
meth public void performAction()
 anno 0 java.lang.Deprecated()
meth public void setEnabled(boolean)
supr org.openide.util.actions.CallableSystemAction
hfds PROP_HAS_LISTENERS,PROP_LAST_ENABLED,PROP_LAST_NODES,l,listeningActions,serialVersionUID
hcls DelegateAction,NodesL

CLSS public abstract interface org.openide.util.actions.Presenter
innr public abstract interface static Menu
innr public abstract interface static Popup
innr public abstract interface static Toolbar

CLSS public abstract interface static org.openide.util.actions.Presenter$Menu
 outer org.openide.util.actions.Presenter
intf org.openide.util.actions.Presenter
meth public abstract javax.swing.JMenuItem getMenuPresenter()

CLSS public abstract interface static org.openide.util.actions.Presenter$Popup
 outer org.openide.util.actions.Presenter
intf org.openide.util.actions.Presenter
meth public abstract javax.swing.JMenuItem getPopupPresenter()

CLSS public abstract interface static org.openide.util.actions.Presenter$Toolbar
 outer org.openide.util.actions.Presenter
intf org.openide.util.actions.Presenter
meth public abstract java.awt.Component getToolbarPresenter()

CLSS public abstract org.openide.util.actions.SystemAction
cons public init()
fld public final static java.lang.String PROP_ENABLED = "enabled"
fld public final static java.lang.String PROP_ICON = "icon"
intf javax.swing.Action
intf org.openide.util.HelpCtx$Provider
meth protected boolean clearSharedData()
meth protected java.lang.String iconResource()
meth protected void initialize()
meth public abstract java.lang.String getName()
meth public abstract org.openide.util.HelpCtx getHelpCtx()
meth public abstract void actionPerformed(java.awt.event.ActionEvent)
meth public boolean isEnabled()
meth public final java.lang.Object getValue(java.lang.String)
meth public final javax.swing.Icon getIcon()
meth public final javax.swing.Icon getIcon(boolean)
meth public final void putValue(java.lang.String,java.lang.Object)
meth public final void setIcon(javax.swing.Icon)
meth public static <%0 extends org.openide.util.actions.SystemAction> {%%0} get(java.lang.Class<{%%0}>)
meth public static javax.swing.JPopupMenu createPopupMenu(org.openide.util.actions.SystemAction[])
 anno 0 java.lang.Deprecated()
meth public static javax.swing.JToolBar createToolbarPresenter(org.openide.util.actions.SystemAction[])
meth public static org.openide.util.actions.SystemAction[] linkActions(org.openide.util.actions.SystemAction[],org.openide.util.actions.SystemAction[])
meth public void setEnabled(boolean)
supr org.openide.util.SharedClassObject
hfds LOG,PROP_ICON_TEXTUAL,relativeIconResourceClasses,serialVersionUID
hcls ComponentIcon

