Full Code of java-decompiler/jd-gui for AI

master b3c1ced04e57 cached
257 files
945.3 KB
208.6k tokens
1839 symbols
1 requests
Download .txt
Showing preview only (1,033K chars total). Download the full file or copy to clipboard to get everything.
Repository: java-decompiler/jd-gui
Branch: master
Commit: b3c1ced04e57
Files: 257
Total size: 945.3 KB

Directory structure:
gitextract_0mx2o5ea/

├── .gitattributes
├── .gitignore
├── LICENSE
├── NOTICE
├── README.md
├── api/
│   ├── build.gradle
│   └── src/
│       └── main/
│           └── java/
│               └── org/
│                   └── jd/
│                       └── gui/
│                           ├── api/
│                           │   ├── API.java
│                           │   ├── feature/
│                           │   │   ├── ContainerEntryGettable.java
│                           │   │   ├── ContentCopyable.java
│                           │   │   ├── ContentIndexable.java
│                           │   │   ├── ContentSavable.java
│                           │   │   ├── ContentSearchable.java
│                           │   │   ├── ContentSelectable.java
│                           │   │   ├── FocusedTypeGettable.java
│                           │   │   ├── IndexesChangeListener.java
│                           │   │   ├── LineNumberNavigable.java
│                           │   │   ├── PageChangeListener.java
│                           │   │   ├── PageChangeable.java
│                           │   │   ├── PageClosable.java
│                           │   │   ├── PageCreator.java
│                           │   │   ├── PreferencesChangeListener.java
│                           │   │   ├── SourcesSavable.java
│                           │   │   ├── TreeNodeExpandable.java
│                           │   │   ├── UriGettable.java
│                           │   │   └── UriOpenable.java
│                           │   └── model/
│                           │       ├── Container.java
│                           │       ├── Indexes.java
│                           │       ├── TreeNodeData.java
│                           │       └── Type.java
│                           └── spi/
│                               ├── ContainerFactory.java
│                               ├── ContextualActionsFactory.java
│                               ├── FileLoader.java
│                               ├── Indexer.java
│                               ├── PanelFactory.java
│                               ├── PasteHandler.java
│                               ├── PreferencesPanel.java
│                               ├── SourceLoader.java
│                               ├── SourceSaver.java
│                               ├── TreeNodeFactory.java
│                               ├── TypeFactory.java
│                               └── UriLoader.java
├── app/
│   ├── build.gradle
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── jd/
│           │           └── gui/
│           │               ├── App.java
│           │               ├── Constants.java
│           │               ├── OsxApp.java
│           │               ├── controller/
│           │               │   ├── AboutController.java
│           │               │   ├── GoToController.java
│           │               │   ├── MainController.java
│           │               │   ├── OpenTypeController.java
│           │               │   ├── OpenTypeHierarchyController.java
│           │               │   ├── PreferencesController.java
│           │               │   ├── SaveAllSourcesController.java
│           │               │   ├── SearchInConstantPoolsController.java
│           │               │   └── SelectLocationController.java
│           │               ├── model/
│           │               │   ├── configuration/
│           │               │   │   └── Configuration.java
│           │               │   ├── container/
│           │               │   │   └── DelegatingFilterContainer.java
│           │               │   └── history/
│           │               │       └── History.java
│           │               ├── service/
│           │               │   ├── actions/
│           │               │   │   └── ContextualActionsFactoryService.java
│           │               │   ├── configuration/
│           │               │   │   ├── ConfigurationPersister.java
│           │               │   │   ├── ConfigurationPersisterService.java
│           │               │   │   └── ConfigurationXmlPersisterProvider.java
│           │               │   ├── container/
│           │               │   │   └── ContainerFactoryService.java
│           │               │   ├── extension/
│           │               │   │   └── ExtensionService.java
│           │               │   ├── fileloader/
│           │               │   │   └── FileLoaderService.java
│           │               │   ├── indexer/
│           │               │   │   └── IndexerService.java
│           │               │   ├── mainpanel/
│           │               │   │   ├── ContainerPanelFactoryProvider.java
│           │               │   │   └── PanelFactoryService.java
│           │               │   ├── pastehandler/
│           │               │   │   └── PasteHandlerService.java
│           │               │   ├── platform/
│           │               │   │   └── PlatformService.java
│           │               │   ├── preferencespanel/
│           │               │   │   ├── PreferencesPanelService.java
│           │               │   │   ├── UISingleInstancePreferencesProvider.java
│           │               │   │   └── UITabsPreferencesProvider.java
│           │               │   ├── sourceloader/
│           │               │   │   └── SourceLoaderService.java
│           │               │   ├── sourcesaver/
│           │               │   │   └── SourceSaverService.java
│           │               │   ├── treenode/
│           │               │   │   └── TreeNodeFactoryService.java
│           │               │   ├── type/
│           │               │   │   └── TypeFactoryService.java
│           │               │   └── uriloader/
│           │               │       └── UriLoaderService.java
│           │               ├── util/
│           │               │   ├── exception/
│           │               │   │   └── ExceptionUtil.java
│           │               │   ├── function/
│           │               │   │   └── TriConsumer.java
│           │               │   ├── net/
│           │               │   │   ├── InterProcessCommunicationUtil.java
│           │               │   │   └── UriUtil.java
│           │               │   └── swing/
│           │               │       └── SwingUtil.java
│           │               └── view/
│           │                   ├── AboutView.java
│           │                   ├── GoToView.java
│           │                   ├── MainView.java
│           │                   ├── OpenTypeHierarchyView.java
│           │                   ├── OpenTypeView.java
│           │                   ├── PreferencesView.java
│           │                   ├── SaveAllSourcesView.java
│           │                   ├── SearchInConstantPoolsView.java
│           │                   ├── SelectLocationView.java
│           │                   ├── bean/
│           │                   │   └── OpenTypeListCellBean.java
│           │                   ├── component/
│           │                   │   ├── IconButton.java
│           │                   │   ├── List.java
│           │                   │   ├── Tree.java
│           │                   │   └── panel/
│           │                   │       ├── MainTabbedPanel.java
│           │                   │       ├── TabbedPanel.java
│           │                   │       └── TreeTabbedPanel.java
│           │                   └── renderer/
│           │                       ├── OpenTypeListCellRenderer.java
│           │                       └── TreeNodeRenderer.java
│           └── resources/
│               └── META-INF/
│                   └── services/
│                       ├── org.jd.gui.spi.PanelFactory
│                       └── org.jd.gui.spi.PreferencesPanel
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── services/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── antlr/
│       │   │   └── Java.g4
│       │   ├── java/
│       │   │   └── org/
│       │   │       ├── fife/
│       │   │       │   └── ui/
│       │   │       │       └── rtextarea/
│       │   │       │           └── Marker.java
│       │   │       └── jd/
│       │   │           └── gui/
│       │   │               ├── model/
│       │   │               │   └── container/
│       │   │               │       ├── ContainerEntryComparator.java
│       │   │               │       ├── EarContainer.java
│       │   │               │       ├── GenericContainer.java
│       │   │               │       ├── JarContainer.java
│       │   │               │       ├── JavaModuleContainer.java
│       │   │               │       ├── KarContainer.java
│       │   │               │       └── WarContainer.java
│       │   │               ├── service/
│       │   │               │   ├── actions/
│       │   │               │   │   ├── CopyQualifiedNameContextualActionsFactory.java
│       │   │               │   │   └── InvalidFormatException.java
│       │   │               │   ├── container/
│       │   │               │   │   ├── EarContainerFactoryProvider.java
│       │   │               │   │   ├── GenericContainerFactoryProvider.java
│       │   │               │   │   ├── JarContainerFactoryProvider.java
│       │   │               │   │   ├── JavaModuleContainerFactoryProvider.java
│       │   │               │   │   ├── KarContainerFactoryProvider.java
│       │   │               │   │   └── WarContainerFactoryProvider.java
│       │   │               │   ├── fileloader/
│       │   │               │   │   ├── AarFileLoaderProvider.java
│       │   │               │   │   ├── AbstractFileLoaderProvider.java
│       │   │               │   │   ├── AbstractTypeFileLoaderProvider.java
│       │   │               │   │   ├── ClassFileLoaderProvider.java
│       │   │               │   │   ├── EarFileLoaderProvider.java
│       │   │               │   │   ├── JarFileLoaderProvider.java
│       │   │               │   │   ├── JavaFileLoaderProvider.java
│       │   │               │   │   ├── JavaModuleFileLoaderProvider.java
│       │   │               │   │   ├── KarFileLoaderProvider.java
│       │   │               │   │   ├── LogFileLoaderProvider.java
│       │   │               │   │   ├── WarFileLoaderProvider.java
│       │   │               │   │   └── ZipFileLoaderProvider.java
│       │   │               │   ├── indexer/
│       │   │               │   │   ├── AbstractIndexerProvider.java
│       │   │               │   │   ├── ClassFileIndexerProvider.java
│       │   │               │   │   ├── DirectoryIndexerProvider.java
│       │   │               │   │   ├── EjbJarXmlFileIndexerProvider.java
│       │   │               │   │   ├── JavaFileIndexerProvider.java
│       │   │               │   │   ├── JavaModuleFileIndexerProvider.java
│       │   │               │   │   ├── JavaModuleInfoFileIndexerProvider.java
│       │   │               │   │   ├── MetainfServiceFileIndexerProvider.java
│       │   │               │   │   ├── TextFileIndexerProvider.java
│       │   │               │   │   ├── WebXmlFileIndexerProvider.java
│       │   │               │   │   ├── XmlBasedFileIndexerProvider.java
│       │   │               │   │   ├── XmlFileIndexerProvider.java
│       │   │               │   │   └── ZipFileIndexerProvider.java
│       │   │               │   ├── pastehandler/
│       │   │               │   │   └── LogPasteHandler.java
│       │   │               │   ├── preferencespanel/
│       │   │               │   │   ├── ClassFileDecompilerPreferencesProvider.java
│       │   │               │   │   ├── ClassFileSaverPreferencesProvider.java
│       │   │               │   │   ├── DirectoryIndexerPreferencesProvider.java
│       │   │               │   │   ├── MavenOrgSourceLoaderPreferencesProvider.java
│       │   │               │   │   └── ViewerPreferencesProvider.java
│       │   │               │   ├── sourceloader/
│       │   │               │   │   └── MavenOrgSourceLoaderProvider.java
│       │   │               │   ├── sourcesaver/
│       │   │               │   │   ├── AbstractSourceSaverProvider.java
│       │   │               │   │   ├── ClassFileSourceSaverProvider.java
│       │   │               │   │   ├── DirectorySourceSaverProvider.java
│       │   │               │   │   ├── FileSourceSaverProvider.java
│       │   │               │   │   ├── PackageSourceSaverProvider.java
│       │   │               │   │   └── ZipFileSourceSaverProvider.java
│       │   │               │   ├── treenode/
│       │   │               │   │   ├── AbstractTreeNodeFactoryProvider.java
│       │   │               │   │   ├── AbstractTypeFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ClassFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ClassesDirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── CssFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── DirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── DtdFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── EarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── EjbJarXmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── FileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── HtmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ImageFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavaFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavaModuleFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavaModulePackageTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavascriptFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JsonFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JspFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── KarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ManifestFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── MetainfDirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── MetainfServiceFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ModuleInfoFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── PackageTreeNodeFactoryProvider.java
│       │   │               │   │   ├── PropertiesFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── SpiFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── SqlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── TextFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WarPackageTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WebXmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WebinfLibDirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── XmlBasedFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── XmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   └── ZipFileTreeNodeFactoryProvider.java
│       │   │               │   ├── type/
│       │   │               │   │   ├── AbstractTypeFactoryProvider.java
│       │   │               │   │   ├── ClassFileTypeFactoryProvider.java
│       │   │               │   │   └── JavaFileTypeFactoryProvider.java
│       │   │               │   └── uriloader/
│       │   │               │       └── FileUriLoaderProvider.java
│       │   │               ├── util/
│       │   │               │   ├── container/
│       │   │               │   │   └── JarContainerEntryUtil.java
│       │   │               │   ├── decompiler/
│       │   │               │   │   ├── ClassPathLoader.java
│       │   │               │   │   ├── ContainerLoader.java
│       │   │               │   │   ├── LineNumberStringBuilderPrinter.java
│       │   │               │   │   ├── NopPrinter.java
│       │   │               │   │   └── StringBuilderPrinter.java
│       │   │               │   ├── exception/
│       │   │               │   │   └── ExceptionUtil.java
│       │   │               │   ├── index/
│       │   │               │   │   └── IndexesUtil.java
│       │   │               │   ├── io/
│       │   │               │   │   ├── NewlineOutputStream.java
│       │   │               │   │   └── TextReader.java
│       │   │               │   ├── matcher/
│       │   │               │   │   └── DescriptorMatcher.java
│       │   │               │   ├── parser/
│       │   │               │   │   └── antlr/
│       │   │               │   │       ├── ANTLRJavaParser.java
│       │   │               │   │       └── AbstractJavaListener.java
│       │   │               │   └── xml/
│       │   │               │       └── AbstractXmlPathFinder.java
│       │   │               └── view/
│       │   │                   ├── component/
│       │   │                   │   ├── AbstractTextPage.java
│       │   │                   │   ├── ClassFilePage.java
│       │   │                   │   ├── CustomLineNumbersPage.java
│       │   │                   │   ├── DynamicPage.java
│       │   │                   │   ├── EjbJarXmlFilePage.java
│       │   │                   │   ├── HyperlinkPage.java
│       │   │                   │   ├── JavaFilePage.java
│       │   │                   │   ├── LogPage.java
│       │   │                   │   ├── ManifestFilePage.java
│       │   │                   │   ├── ModuleInfoFilePage.java
│       │   │                   │   ├── OneTypeReferencePerLinePage.java
│       │   │                   │   ├── RoundMarkErrorStrip.java
│       │   │                   │   ├── TextPage.java
│       │   │                   │   ├── TypePage.java
│       │   │                   │   ├── TypeReferencePage.java
│       │   │                   │   ├── WebXmlFilePage.java
│       │   │                   │   └── XmlFilePage.java
│       │   │                   └── data/
│       │   │                       └── TreeNodeBean.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       ├── org.jd.gui.spi.ContainerFactory
│       │       │       ├── org.jd.gui.spi.ContextualActionsFactory
│       │       │       ├── org.jd.gui.spi.FileLoader
│       │       │       ├── org.jd.gui.spi.Indexer
│       │       │       ├── org.jd.gui.spi.PasteHandler
│       │       │       ├── org.jd.gui.spi.PreferencesPanel
│       │       │       ├── org.jd.gui.spi.SourceLoader
│       │       │       ├── org.jd.gui.spi.SourceSaver
│       │       │       ├── org.jd.gui.spi.TreeNodeFactory
│       │       │       ├── org.jd.gui.spi.TypeFactory
│       │       │       └── org.jd.gui.spi.UriLoader
│       │       └── rsyntaxtextarea/
│       │           ├── RSyntaxTextArea_License.txt
│       │           └── themes/
│       │               └── eclipse.xml
│       └── test/
│           └── java/
│               └── org/
│                   └── jd/
│                       └── gui/
│                           ├── util/
│                           │   └── matcher/
│                           │       └── DescriptorMatcherTest.java
│                           └── view/
│                               └── component/
│                                   ├── ClassFilePageTest.java
│                                   └── JavaFilePageTest.java
├── settings.gradle
└── src/
    ├── linux/
    │   └── resources/
    │       └── jd-gui.desktop
    ├── osx/
    │   ├── dist/
    │   │   └── JD-GUI.app/
    │   │       └── Contents/
    │   │           └── Resources/
    │   │               └── jd-gui.icns
    │   └── resources/
    │       ├── Info.plist
    │       └── universalJavaApplicationStub.sh
    └── proguard/
        └── resources/
            └── proguard.config.txt

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
# Set the default behavior, in case people don't have core.autocrlf set.
* text=auto

# Declare OSX files that will always have LF line endings on checkout.
Info.plist text eol=lf

# Declare script files that will always have LF line endings on checkout.
*.sh text eol=lf

# Declare script files that will always have CR/LF line endings on checkout.
*.bat text eol=crlf

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary
*.gif binary
*.icns binary


================================================
FILE: .gitignore
================================================
# Java
*.class

# JD
debug*

# JD-GUI
src-generated/
jd-gui.cfg

# Idea
.idea/
out/
*.ipr
*.iml
*.iws

# Eclipse
.settings/
classes/
.classpath
.project

# Mac
.DS_Store

#Windows
Thumbs.db

# Maven
log/
target/

# Gradle
.gradle/
build/
!gradle/wrapper/*

# WinMerge
*.bak


================================================
FILE: LICENSE
================================================
                     GNU GENERAL PUBLIC LICENSE

                       Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU General Public License is a free, copyleft license for
software and other kinds of works.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.  We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors.  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.

  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received.  You must make sure that they, too, receive
or can get the source code.  And you must show them these terms so they
know their rights.

  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.

  For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software.  For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.

  Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so.  This is fundamentally incompatible with the aim of
protecting users' freedom to change the software.  The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable.  Therefore, we
have designed this version of the GPL to prohibit the practice for those
products.  If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.

  Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary.  To prevent this, the GPL assures that
patents cannot be used to render the program non-free.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Use with the GNU Affero General Public License.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

  Each version is given a distinguishing version number.  If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    JD-GUI, a standalone graphical utility that displays Java sources from
	CLASS files
    Copyright (C) 2008-2019  Emmanuel Dupuy

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

  If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:

    JD-GUI  Copyright (C) 2008-2019  Emmanuel Dupuy
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.

  The GNU General Public License does not permit incorporating your program
into proprietary programs.  If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.  But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.


================================================
FILE: NOTICE
================================================
JD-GUI license - GPLv3

Libraries used:

Groovy - Apache License 2.0
Gradle - Apache License 2.0
JD-Core Java Release - GPLv3
RSyntaxTextArea - Modified BSD license

JD-GUI Mac OSX distribution:

universalJavaApplicationStub - MIT License

JD-GUI Windows distribution:

Launch4j - MIT License


================================================
FILE: README.md
================================================
# JD-GUI

JD-GUI, a standalone graphical utility that displays Java sources from CLASS files.

![](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/jd-gui.png)

- Java Decompiler projects home page: [http://java-decompiler.github.io](http://java-decompiler.github.io)
- JD-GUI source code: [https://github.com/java-decompiler/jd-gui](https://github.com/java-decompiler/jd-gui)

## Description
JD-GUI is a standalone graphical utility that displays Java source codes of 
".class" files. You can browse the reconstructed source code with the JD-GUI
for instant access to methods and fields.

## How to build JD-GUI ?
```
> git clone https://github.com/java-decompiler/jd-gui.git
> cd jd-gui
> ./gradlew build 
```
generate :
- _"build/libs/jd-gui-x.y.z.jar"_
- _"build/libs/jd-gui-x.y.z-min.jar"_
- _"build/distributions/jd-gui-windows-x.y.z.zip"_
- _"build/distributions/jd-gui-osx-x.y.z.tar"_
- _"build/distributions/jd-gui-x.y.z.deb"_
- _"build/distributions/jd-gui-x.y.z.rpm"_

## How to launch JD-GUI ?
- Double-click on _"jd-gui-x.y.z.jar"_
- Double-click on _"jd-gui.exe"_ application from Windows
- Double-click on _"JD-GUI"_ application from Mac OSX
- Execute _"java -jar jd-gui-x.y.z.jar"_ or _"java -classpath jd-gui-x.y.z.jar org.jd.gui.App"_

## How to use JD-GUI ?
- Open a file with menu "File > Open File..."
- Open recent files with menu "File > Recent Files"
- Drag and drop files from your file explorer

## How to extend JD-GUI ?
```
> ./gradlew idea 
```
generate Idea Intellij project
```
> ./gradlew eclipse
```
generate Eclipse project
```
> java -classpath jd-gui-x.y.z.jar;myextension1.jar;myextension2.jar org.jd.gui.App
```
launch JD-GUI with your extensions

## How to uninstall JD-GUI ?
- Java: Delete "jd-gui-x.y.z.jar" and "jd-gui.cfg".
- Mac OSX: Drag and drop "JD-GUI" application into the trash.
- Windows: Delete "jd-gui.exe" and "jd-gui.cfg".

## License
Released under the [GNU GPL v3](LICENSE).

## Donations
Did JD-GUI help you to solve a critical situation? Do you use JD-Eclipse daily? What about making a donation?

[![paypal](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/btn_donate_euro.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=C88ZMVZ78RF22) [![paypal](https://raw.githubusercontent.com/java-decompiler/jd-gui/master/src/website/img/btn_donate_usd.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CRMXT4Y4QLQGU)


================================================
FILE: api/build.gradle
================================================
apply plugin: 'java'

version = '1.0.0'


================================================
FILE: api/src/main/java/org/jd/gui/api/API.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api;

import org.jd.gui.api.feature.UriGettable;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;
import org.jd.gui.spi.*;

import javax.swing.*;
import java.io.File;
import java.net.URI;
import java.nio.file.Path;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.Future;

public interface API {
    boolean openURI(URI uri);

    boolean openURI(int x, int y, Collection<Container.Entry> entries, String query, String fragment);

    void addURI(URI uri);

    <T extends JComponent & UriGettable> void addPanel(String title, Icon icon, String tip, T component);

    Collection<Action> getContextualActions(Container.Entry entry, String fragment);

    UriLoader getUriLoader(URI uri);

    FileLoader getFileLoader(File file);

    ContainerFactory getContainerFactory(Path rootPath);

    PanelFactory getMainPanelFactory(Container container);

    TreeNodeFactory getTreeNodeFactory(Container.Entry entry);

    TypeFactory getTypeFactory(Container.Entry entry);

    Indexer getIndexer(Container.Entry entry);

    SourceSaver getSourceSaver(Container.Entry entry);

    Map<String, String> getPreferences();

    Collection<Future<Indexes>> getCollectionOfFutureIndexes();

    interface LoadSourceListener {
        void sourceLoaded(String source);
    }

    String getSource(Container.Entry entry);

    void loadSource(Container.Entry entry, LoadSourceListener listener);

    File loadSourceFile(Container.Entry entry);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/ContainerEntryGettable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.model.Container;

public interface ContainerEntryGettable {
    Container.Entry getEntry();
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/ContentCopyable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface ContentCopyable {
    void copy();
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/ContentIndexable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Indexes;

public interface ContentIndexable {
    Indexes index(API api);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/ContentSavable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.API;

import java.io.OutputStream;

public interface ContentSavable {
    String getFileName();

    void save(API api, OutputStream os);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/ContentSearchable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface ContentSearchable {
    boolean highlightText(String text, boolean caseSensitive);

    void findNext(String text, boolean caseSensitive);

    void findPrevious(String text, boolean caseSensitive);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/ContentSelectable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface ContentSelectable {
    void selectAll();
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/FocusedTypeGettable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface FocusedTypeGettable extends ContainerEntryGettable {
    String getFocusedTypeName();
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/IndexesChangeListener.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.model.Indexes;

import java.util.Collection;
import java.util.concurrent.Future;

public interface IndexesChangeListener {
    void indexesChanged(Collection<Future<Indexes>> collectionOfFutureIndexes);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/LineNumberNavigable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface LineNumberNavigable {
    int getMaximumLineNumber();

    void goToLineNumber(int lineNumber);

    boolean checkLineNumber(int lineNumber);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/PageChangeListener.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import javax.swing.*;

public interface PageChangeListener {
    <T extends JComponent & UriGettable> void pageChanged(T page);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/PageChangeable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface PageChangeable {
    void addPageChangeListener(PageChangeListener listener);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/PageClosable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

public interface PageClosable {
    boolean closePage();
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/PageCreator.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.API;

import javax.swing.*;

public interface PageCreator {
    <T extends JComponent & UriGettable> T createPage(API api);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/PreferencesChangeListener.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import java.util.Map;

public interface PreferencesChangeListener {
    void preferencesChanged(Map<String, String> preferences);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/SourcesSavable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.API;

import java.nio.file.Path;

public interface SourcesSavable {
    String getSourceFileName();

    int getFileCount();

    void save(API api, Controller controller, Listener listener, Path path);

    interface Controller {
        boolean isCancelled();
    }

    interface Listener {
        void pathSaved(Path path);
    }
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/TreeNodeExpandable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import org.jd.gui.api.API;

public interface TreeNodeExpandable {
    void populateTreeNode(API api);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/UriGettable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import java.net.URI;

public interface UriGettable {
    URI getUri();
}


================================================
FILE: api/src/main/java/org/jd/gui/api/feature/UriOpenable.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.feature;

import java.net.URI;

/**
 * uri                : scheme '://' path ('?' query)? ('#' fragment)?<br>
 * scheme             : 'generic' | 'jar' | 'war' | 'ear' | 'dex' | ...<br>
 * path               : singlePath('!' singlePath)*<br>
 * singlePath         : [path/to/dir/] | [path/to/file]<br>
 * query              : queryLineNumber | queryPosition | querySearch<br>
 * queryLineNumber    : 'lineNumber=' [numeric]<br>
 * queryPosition      : 'position=' [numeric]<br>
 * querySearch        : 'highlightPattern=' queryPattern '&highlightFlags=' queryFlags ('&highlightScope=' typeName)?<br>
 * queryPattern       : [start of string] | [start of type name] | [start of field name] | [start of method name]<br>
 * queryFlags         : 'd'? // Match declarations<br>
 *                      'r'? // Match references<br>
 *                      't'? // Match types<br>
 *                      'c'? // Match constructors<br>
 *                      'm'? // Match methods<br>
 *                      'f'? // Match fields<br>
 *                      's'? // Match strings<br>
 * fragment            : fragmentType | fragmentField | fragmentMethod<br>
 * fragmentType        : typeName<br>
 * fragmentField       : typeName '-' [field name] '-' descriptor<br>
 * fragmentMethod      : typeName '-' [method name] '-' methodDescriptor<br>
 * methodDescriptor    : '(*)?' | // Match all method descriptors<br>
 *                       '(' descriptor* ')' descriptor<br>
 * descriptor          : '?' | // Match a primitive or a type name<br>
 *                       '['* primitiveOrTypeName<br>
 * primitiveOrTypeName : 'B' | 'C' | 'D' | 'F' | 'I' | 'J' | 'L' typeName ';' | 'S' | 'Z'<br>
 * typeName            : [internal qualified name] | '*\/' [name]<br>
 * <br>
 * Examples:<br>
 * <ul>
 *  <li>file://dir1/dir2/</li>
 *  <li>file://dir1/dir2/file</li>
 *  <li>jar://dir1/dir2/</li>
 *  <li>jar://dir1/dir2/file</li>
 *
 *  <li>jar://dir1/dir2/javafile</li>
 *  <li>jar://dir1/dir2/javafile#type</li>
 *  <li>jar://dir1/dir2/javafile#type-fieldName-descriptor</li>
 *  <li>jar://dir1/dir2/javafile#type-methodName-descriptor</li>
 *  <li>jar://dir1/dir2/javafile#innertype</li>
 *  <li>jar://dir1/dir2/javafile#innertype-fieldName-?</li>
 *  <li>jar://dir1/dir2/javafile#innertype-methodName-(*)?</li>
 *  <li>jar://dir1/dir2/javafile#innertype-methodName-(?JZLjava/lang/Sting;C)I</li>
 *  <li>jar://dir1/dir2/javafile#innertype-fieldName-descriptor</li>
 *  <li>jar://dir1/dir2/javafile#innertype-methodName-descriptor</li>
 *
 *  <li>file://dir1/dir2/file?lineNumber=numeric</li>
 *  <li>file://dir1/dir2/file?position=numeric</li>
 *  <li>file://dir1/dir2/file?highlightPattern=hello&highlightFlags=drtcmfs&highlightScope=java/lang/String</li>
 *  <li>file://dir1/dir2/file?highlightPattern=hello&highlightFlags=drtcmfs&highlightScope=*\/String</li>
 * </ul>
 */
public interface UriOpenable {
    boolean openUri(URI uri);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/model/Container.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.model;

import java.io.InputStream;
import java.net.URI;
import java.util.Collection;

public interface Container {
    String getType();

    Entry getRoot();

    /**
     * File or directory
     */
    interface Entry {
        Container getContainer();

        Entry getParent();

        URI getUri();

        String getPath();

        boolean isDirectory();

        long length();

        InputStream getInputStream();

        Collection<Entry> getChildren();
    }
}


================================================
FILE: api/src/main/java/org/jd/gui/api/model/Indexes.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.model;

import java.util.Collection;
import java.util.Map;

/**
 * Whatever the language/file format (Java|Groovy|Scala/Class|DEX, Java|Javascript/Source, C#/CIL, ...), type names,
 * stored in the indexes, use the JVM internal format (package separator = '/', inner class separator = '$').<br>
 * <br>
 * List of default indexes:
 * <ul>
 *     <li>
 *         Map "strings"<br>
 *         key: a string<br>
 *         value: a list of entries containing the string
 *     </li>
 *     <li>
 *         Map "typeDeclarations"<br>
 *         key: a type name using internal JVM internal format<br>
 *         value: a list of entries containing the type declaration
 *     </li>
 *     <li>
 *         Map "constructorDeclarations"<br>
 *         key: a type name using internal JVM internal format<br>
 *         value: a list of entries containing the constructor declaration
 *     </li>
 *     <li>
 *         Map "constructorReferences"<br>
 *         key: a type name using internal JVM internal format<br>
 *         value: a list of entries containing the constructor reference
 *     </li>
 *     <li>
 *         Map "methodDeclarations"<br>
 *         key: a method name<br>
 *         value: a list of entries containing the method declaration
 *     </li>
 *     <li>
 *         Map "methodReferences"<br>
 *         key: a method name<br>
 *         value: a list of entries containing the method reference
 *     </li>
 *     <li>
 *         Map "fieldDeclarations"<br>
 *         key: a field name<br>
 *         value: a list of entries containing the field declaration
 *     </li>
 *     <li>
 *         Map "fieldReferences"<br>
 *         key: a field name<br>
 *         value: a list of entries containing the field reference
 *     </li>
 *     <li>
 *         Map "subTypeNames"<br>
 *         key: a super type name using internal JVM internal format<br>
 *         value: a list of sub type names using internal JVM internal format
 *     </li>
 * </ul>
 */
public interface Indexes {
    Map<String, Collection> getIndex(String name);
}


================================================
FILE: api/src/main/java/org/jd/gui/api/model/TreeNodeData.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.model;

import javax.swing.*;

public interface TreeNodeData {
    String getLabel();

    String getTip();

    Icon getIcon();

    Icon getOpenIcon();
}

================================================
FILE: api/src/main/java/org/jd/gui/api/model/Type.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.api.model;

import javax.swing.*;
import java.util.Collection;

public interface Type {
    int FLAG_PUBLIC = 1;
    int FLAG_PRIVATE = 2;
    int FLAG_PROTECTED = 4;
    int FLAG_STATIC = 8;
    int FLAG_FINAL = 16;
    int FLAG_VARARGS = 128;
    int FLAG_INTERFACE = 512;
    int FLAG_ABSTRACT = 1024;
    int FLAG_ANNOTATION = 8192;
    int FLAG_ENUM = 16384;

    int getFlags();

    String getName();

    String getSuperName();

    String getOuterName();

    String getDisplayTypeName();

    String getDisplayInnerTypeName();

    String getDisplayPackageName();

    Icon getIcon();

    Collection<Type> getInnerTypes();

    Collection<Field> getFields();

    Collection<Method> getMethods();

    interface Field {
        int getFlags();

        String getName();

        String getDescriptor();

        String getDisplayName();

        Icon getIcon();
    }

    interface Method {
        int getFlags();

        String getName();

        String getDescriptor();

        String getDisplayName();

        Icon getIcon();
    }
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/ContainerFactory.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;

import java.nio.file.Path;

public interface ContainerFactory {
    String getType();

    boolean accept(API api, Path rootPath);

    Container make(API api, Container.Entry parentEntry, Path rootPath);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/ContextualActionsFactory.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;

import javax.swing.*;
import java.util.Collection;

public interface ContextualActionsFactory {
    String GROUP_NAME = "GroupNameKey";

    /**
     * Build a collection of actions for 'entry' and 'fragment', grouped by GROUP_NAME and sorted by NAME. Null values
     * are added for separators.
     *
     * @param fragment @see jd.gui.api.feature.UriOpenable
     * @return a collection of actions
     */
    Collection<Action> make(API api, Container.Entry entry, String fragment);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/FileLoader.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;

import java.io.File;

public interface FileLoader {
	String[] getExtensions();
	
	String getDescription();
	
	boolean accept(API api, File file);
	
	boolean load(API api, File file);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/Indexer.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;

import java.util.regex.Pattern;

public interface Indexer {
    String[] getSelectors();

    Pattern getPathPattern();

    void index(API api, Container.Entry entry, Indexes indexes);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/PanelFactory.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.UriGettable;
import org.jd.gui.api.model.Container;

import javax.swing.*;

public interface PanelFactory {
	String[] getTypes();
	
	<T extends JComponent & UriGettable> T make(API api, Container container);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/PasteHandler.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;

public interface PasteHandler {
    boolean accept(Object obj);

    void paste(API api, Object obj);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/PreferencesPanel.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import javax.swing.*;
import java.awt.*;
import java.util.Map;

public interface PreferencesPanel {
    String getPreferencesGroupTitle();

    String getPreferencesPanelTitle();

    JComponent getPanel();

    void init(Color errorBackgroundColor);

    boolean isActivated();

    void loadPreferences(Map<String, String> preferences);

    void savePreferences(Map<String, String> preferences);

    boolean arePreferencesValid();

    void addPreferencesChangeListener(PreferencesPanelChangeListener listener);

    interface PreferencesPanelChangeListener {
        void preferencesPanelChanged(PreferencesPanel source);
    }
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/SourceLoader.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;

import java.io.File;

public interface SourceLoader {
    String getSource(API api, Container.Entry entry);

    String loadSource(API api, Container.Entry entry);

    File loadSourceFile(API api, Container.Entry entry);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/SourceSaver.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;

import java.nio.file.Path;
import java.util.regex.Pattern;

public interface SourceSaver {
    String[] getSelectors();

    Pattern getPathPattern();

    String getSourcePath(Container.Entry entry);

    int getFileCount(API api, Container.Entry entry);

    /**
     * Check parent path, build source file name, create NIO path and save the content.
     */
    void save(API api, Controller controller, Listener listener, Path rootPath, Container.Entry entry);

    /**
     * Save content:
     * <ul>
     * <li>For file, save the source content.</li>
     * <li>For directory, call 'save' for each children.</li>
     * </ul>
     */
    void saveContent(API api, Controller controller, Listener listener, Path rootPath, Path path, Container.Entry entry);

    interface Controller {
        boolean isCancelled();
    }

    interface Listener {
        void pathSaved(Path path);
    }
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/TreeNodeFactory.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.ContainerEntryGettable;
import org.jd.gui.api.feature.UriGettable;
import org.jd.gui.api.model.Container;

import javax.swing.tree.DefaultMutableTreeNode;
import java.util.regex.Pattern;

public interface TreeNodeFactory {
    String[] getSelectors();

    Pattern getPathPattern();

    <T extends DefaultMutableTreeNode & ContainerEntryGettable & UriGettable> T make(API api, Container.Entry entry);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/TypeFactory.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Type;

import java.util.Collection;
import java.util.regex.Pattern;

public interface TypeFactory {
	String[] getSelectors();

    Pattern getPathPattern();

	/**
	 * @return all root types contains in 'entry'
	 */
	Collection<Type> make(API api, Container.Entry entry);

	/**
     * @param fragment @see jd.gui.api.feature.UriOpenable
	 * @return if 'fragment' is null, return the main type in 'entry',
	 *         otherwise, return the type or sub-type matching with 'fragment'
	 */
	Type make(API api, Container.Entry entry, String fragment);
}


================================================
FILE: api/src/main/java/org/jd/gui/spi/UriLoader.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.spi;

import org.jd.gui.api.API;

import java.net.URI;

public interface UriLoader {
	String[] getSchemes();
	
	boolean accept(API api, URI uri);
	
	boolean load(API api, URI uri);
}


================================================
FILE: app/build.gradle
================================================
apply plugin: 'java'

dependencies {
    provided 'com.yuvimasory:orange-extensions:1.3.0'   // OSX support
    compile project(':api')
    runtime project(':services')
}

version = parent.version


================================================
FILE: app/src/main/java/org/jd/gui/App.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui;

import org.jd.gui.controller.MainController;
import org.jd.gui.model.configuration.Configuration;
import org.jd.gui.service.configuration.ConfigurationPersister;
import org.jd.gui.service.configuration.ConfigurationPersisterService;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.util.net.InterProcessCommunicationUtil;

import javax.swing.*;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class App {
    protected static final String SINGLE_INSTANCE = "UIMainWindowPreferencesProvider.singleInstance";

    protected static MainController controller;

    public static void main(String[] args) {
		if (checkHelpFlag(args)) {
			JOptionPane.showMessageDialog(null, "Usage: jd-gui [option] [input-file] ...\n\nOption:\n -h Show this help message and exit", Constants.APP_NAME, JOptionPane.INFORMATION_MESSAGE);
		} else {
            // Load preferences
            ConfigurationPersister persister = ConfigurationPersisterService.getInstance().get();
            Configuration configuration = persister.load();
            Runtime.getRuntime().addShutdownHook(new Thread(() -> persister.save(configuration)));

            if ("true".equals(configuration.getPreferences().get(SINGLE_INSTANCE))) {
                InterProcessCommunicationUtil ipc = new InterProcessCommunicationUtil();
                try {
                    ipc.listen(receivedArgs -> controller.openFiles(newList(receivedArgs)));
                } catch (Exception notTheFirstInstanceException) {
                    // Send args to main windows and exit
                    ipc.send(args);
                    System.exit(0);
                }
            }

            // Create SwingBuilder, set look and feel
            try {
                UIManager.setLookAndFeel(configuration.getLookAndFeel());
            } catch (Exception e) {
                configuration.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                try {
                    UIManager.setLookAndFeel(configuration.getLookAndFeel());
                } catch (Exception ee) {
                    assert ExceptionUtil.printStackTrace(ee);
                }
           }

            // Create main controller and show main frame
            controller = new MainController(configuration);
            controller.show(newList(args));
		}
	}

    protected static boolean checkHelpFlag(String[] args) {
        if (args != null) {
            for (String arg : args) {
                if ("-h".equals(arg)) {
                    return true;
                }
            }
        }
        return false;
    }

    protected static List<File> newList(String[] paths) {
        if (paths == null) {
            return Collections.emptyList();
        } else {
            ArrayList<File> files = new ArrayList<>(paths.length);
            for (String path : paths) {
                files.add(new File(path));
            }
            return files;
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/Constants.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui;

public class Constants {
	public static final String APP_NAME = "JD-GUI";

	public static final int DEFAULT_WIDTH = 600;
	public static final int DEFAULT_HEIGHT = 400;

	public static final int MINIMAL_WIDTH = 500;
	public static final int MINIMAL_HEIGHT = 160;

	public static final String CONFIG_FILENAME = "jd-gui.cfg";

	public static final int MAX_RECENT_FILES = 10;
	public static final int RECENT_FILE_MAX_LENGTH = 200;
}


================================================
FILE: app/src/main/java/org/jd/gui/OsxApp.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui;

import com.apple.eawt.Application;

public class OsxApp extends App {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        // Create an instance of the mac OSX Application class
        Application application = Application.getApplication();

        App.main(args);

        // Add an handle invoked when the application is asked to open a list of files
        application.setOpenFileHandler(e -> controller.openFiles(e.getFiles()));

        // Add an handle invoked when the application is asked to quit
        application.setQuitHandler((e, r) -> System.exit(0));
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/AboutController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.view.AboutView;

import javax.swing.*;

public class AboutController {
    protected AboutView aboutView;

    public AboutController(JFrame mainFrame) {
        // Create UI
        aboutView = new AboutView(mainFrame);
    }

    public void show() {
        // Show
        aboutView.show();
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/GoToController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.feature.LineNumberNavigable;
import org.jd.gui.model.configuration.Configuration;
import org.jd.gui.view.GoToView;

import javax.swing.*;
import java.util.function.IntConsumer;

public class GoToController {
    protected GoToView goToView;

    public GoToController(Configuration configuration, JFrame mainFrame) {
        // Create UI
        goToView = new GoToView(configuration, mainFrame);
    }

    public void show(LineNumberNavigable navigator, IntConsumer okCallback) {
        // Show
        goToView.show(navigator, okCallback);
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/MainController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.*;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;
import org.jd.gui.model.configuration.Configuration;
import org.jd.gui.model.history.History;
import org.jd.gui.service.actions.ContextualActionsFactoryService;
import org.jd.gui.service.container.ContainerFactoryService;
import org.jd.gui.service.fileloader.FileLoaderService;
import org.jd.gui.service.indexer.IndexerService;
import org.jd.gui.service.mainpanel.PanelFactoryService;
import org.jd.gui.service.pastehandler.PasteHandlerService;
import org.jd.gui.service.platform.PlatformService;
import org.jd.gui.service.preferencespanel.PreferencesPanelService;
import org.jd.gui.service.sourceloader.SourceLoaderService;
import org.jd.gui.service.sourcesaver.SourceSaverService;
import org.jd.gui.service.treenode.TreeNodeFactoryService;
import org.jd.gui.service.type.TypeFactoryService;
import org.jd.gui.service.uriloader.UriLoaderService;
import org.jd.gui.spi.*;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.util.net.UriUtil;
import org.jd.gui.util.swing.SwingUtil;
import org.jd.gui.view.MainView;

import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.filechooser.FileSystemView;
import java.awt.*;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URI;
import java.nio.file.Path;
import java.util.*;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class MainController implements API {
    protected Configuration configuration;
    protected MainView mainView;

    protected GoToController goToController;
    protected OpenTypeController openTypeController;
    protected OpenTypeHierarchyController openTypeHierarchyController;
    protected PreferencesController preferencesController;
    protected SearchInConstantPoolsController searchInConstantPoolsController;
    protected SaveAllSourcesController saveAllSourcesController;
    protected SelectLocationController selectLocationController;
    protected AboutController aboutController;
    protected SourceLoaderService sourceLoaderService;

    protected History history = new History();
    protected JComponent currentPage = null;
    protected ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
    protected ArrayList<IndexesChangeListener> containerChangeListeners = new ArrayList<>();

    @SuppressWarnings("unchecked")
    public MainController(Configuration configuration) {
        this.configuration = configuration;

        SwingUtil.invokeLater(() -> {
            if (PlatformService.getInstance().isLinux()) {
                // Fix for GTKLookAndFeel
                SwingUtil.installGtkPopupBugWorkaround();
            }

            // Create main frame
            mainView = new MainView(
                configuration, this, history,
                e -> onOpen(),
                e -> onClose(),
                e -> onSaveSource(),
                e -> onSaveAllSources(),
                e -> System.exit(0),
                e -> onCopy(),
                e -> onPaste(),
                e -> onSelectAll(),
                e -> onFind(),
                e -> onFindPrevious(),
                e -> onFindNext(),
                e -> onFindCriteriaChanged(),
                () -> onFindCriteriaChanged(),
                e -> onOpenType(),
                e -> onOpenTypeHierarchy(),
                e -> onGoTo(),
                e -> openURI(history.backward()),
                e -> openURI(history.forward()),
                e -> onSearch(),
                e -> onJdWebSite(),
                e -> onJdGuiIssues(),
                e -> onJdCoreIssues(),
                e -> onPreferences(),
                e -> onAbout(),
                () -> panelClosed(),
                page -> onCurrentPageChanged((JComponent)page),
                file -> openFile((File)file));
        });
	}

	// --- Show GUI --- //
    @SuppressWarnings("unchecked")
	public void show(List<File> files) {
        SwingUtil.invokeLater(() -> {
            // Show main frame
            mainView.show(configuration.getMainWindowLocation(), configuration.getMainWindowSize(), configuration.isMainWindowMaximize());
            if (!files.isEmpty()) {
                openFiles(files);
            }
        });

        // Background initializations
        executor.schedule(() -> {
            // Background service initialization
            UriLoaderService.getInstance();
            FileLoaderService.getInstance();
            ContainerFactoryService.getInstance();
            IndexerService.getInstance();
            TreeNodeFactoryService.getInstance();
            TypeFactoryService.getInstance();

            SwingUtil.invokeLater(() -> {
                // Populate recent files menu
                mainView.updateRecentFilesMenu(configuration.getRecentFiles());
                // Background controller creation
                JFrame mainFrame = mainView.getMainFrame();
                saveAllSourcesController = new SaveAllSourcesController(MainController.this, mainFrame);
                containerChangeListeners.add(openTypeController = new OpenTypeController(MainController.this, executor, mainFrame));
                containerChangeListeners.add(openTypeHierarchyController = new OpenTypeHierarchyController(MainController.this, executor, mainFrame));
                goToController = new GoToController(configuration, mainFrame);
                containerChangeListeners.add(searchInConstantPoolsController = new SearchInConstantPoolsController(MainController.this, executor, mainFrame));
                preferencesController = new PreferencesController(configuration, mainFrame, PreferencesPanelService.getInstance().getProviders());
                selectLocationController = new SelectLocationController(MainController.this, mainFrame);
                aboutController = new AboutController(mainFrame);
                sourceLoaderService = new SourceLoaderService();
                // Add listeners
                mainFrame.addComponentListener(new MainFrameListener(configuration));
                // Set drop files transfer handler
                mainFrame.setTransferHandler(new FilesTransferHandler());
                // Background class loading
                new JFileChooser().addChoosableFileFilter(new FileNameExtensionFilter("", "dummy"));
                FileSystemView.getFileSystemView().isFileSystemRoot(new File("dummy"));
                new JLayer();
            });
        }, 400, TimeUnit.MILLISECONDS);

        PasteHandlerService.getInstance();
        PreferencesPanelService.getInstance();
        ContextualActionsFactoryService.getInstance();
        SourceSaverService.getInstance();
    }

	// --- Actions --- //
    protected void onOpen() {
        Map<String, FileLoader> loaders = FileLoaderService.getInstance().getMapProviders();
        StringBuilder sb = new StringBuilder();
        ArrayList<String> extensions = new ArrayList<>(loaders.keySet());

        extensions.sort(null);

        for (String extension : extensions) {
            sb.append("*.").append(extension).append(", ");
        }

        sb.setLength(sb.length()-2);

        String description = sb.toString();
        String[] array = extensions.toArray(new String[0]);
        JFileChooser chooser = new JFileChooser();

        chooser.removeChoosableFileFilter(chooser.getFileFilter());
        chooser.addChoosableFileFilter(new FileNameExtensionFilter("All files (" + description + ")", array));

        for (String extension : extensions) {
            FileLoader loader = loaders.get(extension);
            chooser.addChoosableFileFilter(new FileNameExtensionFilter(loader.getDescription(), loader.getExtensions()));
        }

        chooser.setCurrentDirectory(configuration.getRecentLoadDirectory());

        if (chooser.showOpenDialog(mainView.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
            configuration.setRecentLoadDirectory(chooser.getCurrentDirectory());
            openFile(chooser.getSelectedFile());
        }
	}

    protected void onClose() {
        mainView.closeCurrentTab();
    }

    protected void onSaveSource() {
        if (currentPage instanceof ContentSavable) {
            JFileChooser chooser = new JFileChooser();
            JFrame mainFrame = mainView.getMainFrame();

            chooser.setSelectedFile(new File(configuration.getRecentSaveDirectory(), ((ContentSavable)currentPage).getFileName()));

            if (chooser.showSaveDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
                File selectedFile = chooser.getSelectedFile();

                configuration.setRecentSaveDirectory(chooser.getCurrentDirectory());

                if (selectedFile.exists()) {
                    String title = "Are you sure?";
                    String message = "The file '" + selectedFile.getAbsolutePath() + "' already isContainsIn.\n Do you want to replace the existing file?";

                    if (JOptionPane.showConfirmDialog(mainFrame, message, title, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                        save(selectedFile);
                    }
                } else {
                    save(selectedFile);
                }
            }
        }
    }

    protected void save(File selectedFile) {
        try (OutputStream os = new FileOutputStream(selectedFile)) {
            ((ContentSavable)currentPage).save(this, os);
        } catch (IOException e) {
            assert ExceptionUtil.printStackTrace(e);
        }
    }

    protected void onSaveAllSources() {
        if (! saveAllSourcesController.isActivated()) {
            JComponent currentPanel = mainView.getSelectedMainPanel();

            if (currentPanel instanceof SourcesSavable) {
                SourcesSavable sourcesSavable = (SourcesSavable)currentPanel;
                JFileChooser chooser = new JFileChooser();
                JFrame mainFrame = mainView.getMainFrame();

                chooser.setSelectedFile(new File(configuration.getRecentSaveDirectory(), sourcesSavable.getSourceFileName()));

                if (chooser.showSaveDialog(mainFrame) == JFileChooser.APPROVE_OPTION) {
                    File selectedFile = chooser.getSelectedFile();

                    configuration.setRecentSaveDirectory(chooser.getCurrentDirectory());

                    if (selectedFile.exists()) {
                        String title = "Are you sure?";
                        String message = "The file '" + selectedFile.getAbsolutePath() + "' already isContainsIn.\n Do you want to replace the existing file?";

                        if (JOptionPane.showConfirmDialog(mainFrame, message, title, JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                            saveAllSourcesController.show(executor, sourcesSavable, selectedFile);
                        }
                    } else {
                        saveAllSourcesController.show(executor, sourcesSavable, selectedFile);
                    }
                }
            }
        }
    }

    protected void onCopy() {
        if (currentPage instanceof ContentCopyable) {
            ((ContentCopyable)currentPage).copy();
        }
    }

    protected void onPaste() {
        try {
            Transferable transferable = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(null);

            if ((transferable != null) && transferable.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                Object obj = transferable.getTransferData(DataFlavor.stringFlavor);
                PasteHandler pasteHandler = PasteHandlerService.getInstance().get(obj);

                if (pasteHandler != null) {
                    pasteHandler.paste(this, obj);
                }
            }
        } catch (Exception e) {
            assert ExceptionUtil.printStackTrace(e);
        }
    }

    protected void onSelectAll() {
        if (currentPage instanceof ContentSelectable) {
            ((ContentSelectable)currentPage).selectAll();
        }
    }

    protected void onFind() {
        if (currentPage instanceof ContentSearchable) {
            mainView.showFindPanel();
        }
    }

    protected void onFindCriteriaChanged() {
        if (currentPage instanceof ContentSearchable) {
            mainView.setFindBackgroundColor(((ContentSearchable)currentPage).highlightText(mainView.getFindText(), mainView.getFindCaseSensitive()));
        }
    }

    protected void onFindNext() {
        if (currentPage instanceof ContentSearchable) {
            ((ContentSearchable)currentPage).findNext(mainView.getFindText(), mainView.getFindCaseSensitive());
        }
    }

    protected void onOpenType() {
        openTypeController.show(getCollectionOfFutureIndexes(), uri -> openURI(uri));
    }

    protected void onOpenTypeHierarchy() {
        if (currentPage instanceof FocusedTypeGettable) {
            FocusedTypeGettable ftg = (FocusedTypeGettable)currentPage;
            openTypeHierarchyController.show(getCollectionOfFutureIndexes(), ftg.getEntry(), ftg.getFocusedTypeName(), uri -> openURI(uri));
        }
    }

    protected void onGoTo() {
        if (currentPage instanceof LineNumberNavigable) {
            LineNumberNavigable lnn = (LineNumberNavigable)currentPage;
            goToController.show(lnn, lineNumber -> lnn.goToLineNumber(lineNumber));
        }
    }

    protected void onSearch() {
        searchInConstantPoolsController.show(getCollectionOfFutureIndexes(), uri -> openURI(uri));
    }

    protected void onFindPrevious() {
        if (currentPage instanceof ContentSearchable) {
            ContentSearchable cs = (ContentSearchable)currentPage;
            cs.findPrevious(mainView.getFindText(), mainView.getFindCaseSensitive());
        }
    }

    protected void onJdWebSite() {
        if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
            if (desktop.isSupported(Desktop.Action.BROWSE)) {
                try {
                    desktop.browse(URI.create("http://java-decompiler.github.io"));
                } catch (IOException e) {
                    assert ExceptionUtil.printStackTrace(e);
                }
            }
        }
    }

    protected void onJdGuiIssues() {
        if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
            if (desktop.isSupported(Desktop.Action.BROWSE)) {
                try {
                    desktop.browse(URI.create("https://github.com/java-decompiler/jd-gui/issues"));
                } catch (IOException e) {
                    assert ExceptionUtil.printStackTrace(e);
                }
            }
        }
    }

    protected void onJdCoreIssues() {
        if (Desktop.isDesktopSupported()) {
            Desktop desktop = Desktop.getDesktop();
            if (desktop.isSupported(Desktop.Action.BROWSE)) {
                try {
                    desktop.browse(URI.create("https://github.com/java-decompiler/jd-core/issues"));
                } catch (IOException e) {
                    assert ExceptionUtil.printStackTrace(e);
                }
            }
        }
    }

    @SuppressWarnings("unchecked")
    protected void onPreferences() {
        preferencesController.show(() -> {
            checkPreferencesChange(currentPage);
            mainView.preferencesChanged(getPreferences());
        });
    }

    protected void onAbout() {
        aboutController.show();
    }

    protected void onCurrentPageChanged(JComponent page) {
        currentPage = page;
        checkPreferencesChange(page);
        checkIndexesChange(page);
    }

    protected void checkPreferencesChange(JComponent page) {
        if (page instanceof PreferencesChangeListener) {
            Map<String, String> preferences = configuration.getPreferences();
            Integer currentHashcode = Integer.valueOf(preferences.hashCode());
            Integer lastHashcode = (Integer)page.getClientProperty("preferences-hashCode");

            if (!currentHashcode.equals(lastHashcode)) {
                ((PreferencesChangeListener)page).preferencesChanged(preferences);
                page.putClientProperty("preferences-hashCode", currentHashcode);
            }
        }
    }

    protected void checkIndexesChange(JComponent page) {
        if (page instanceof IndexesChangeListener) {
            Collection<Future<Indexes>> collectionOfFutureIndexes = getCollectionOfFutureIndexes();
            Integer currentHashcode = Integer.valueOf(collectionOfFutureIndexes.hashCode());
            Integer lastHashcode = (Integer)page.getClientProperty("collectionOfFutureIndexes-hashCode");

            if (!currentHashcode.equals(lastHashcode)) {
                ((IndexesChangeListener)page).indexesChanged(collectionOfFutureIndexes);
                page.putClientProperty("collectionOfFutureIndexes-hashCode", currentHashcode);
            }
        }
    }

    // --- Operations --- //
    public void openFile(File file) {
        openFiles(Collections.singletonList(file));
    }

    @SuppressWarnings("unchecked")
    public void openFiles(List<File> files) {
        ArrayList<String> errors = new ArrayList<>();

        for (File file : files) {
            // Check input file
            if (file.exists()) {
                FileLoader loader = getFileLoader(file);
                if ((loader != null) && !loader.accept(this, file)) {
                    errors.add("Invalid input fileloader: '" + file.getAbsolutePath() + "'");
                }
            } else {
                errors.add("File not found: '" + file.getAbsolutePath() + "'");
            }
        }

        if (errors.isEmpty()) {
            for (File file : files) {
                if (openURI(file.toURI())) {
                    configuration.addRecentFile(file);
                    mainView.updateRecentFilesMenu(configuration.getRecentFiles());
                }
            }
        } else {
            StringBuilder messages = new StringBuilder();
            int index = 0;

            for (String error : errors) {
                if (index > 0) {
                    messages.append('\n');
                }
                if (index >= 20) {
                    messages.append("...");
                    break;
                }
                messages.append(error);
                index++;
            }

            JOptionPane.showMessageDialog(mainView.getMainFrame(), messages.toString(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }

    // --- Drop files transfer handler --- //
    protected class FilesTransferHandler extends TransferHandler {
        @Override
        public boolean canImport(TransferHandler.TransferSupport info) {
            return info.isDataFlavorSupported(DataFlavor.javaFileListFlavor);
        }

        @Override
        @SuppressWarnings("unchecked")
        public boolean importData(TransferHandler.TransferSupport info) {
            if (info.isDrop() && info.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                try {
                    openFiles((List<File>)info.getTransferable().getTransferData(DataFlavor.javaFileListFlavor));
                    return true;
                } catch (Exception e) {
                    assert ExceptionUtil.printStackTrace(e);
                }
            }
            return false;
        }
    }

    // --- ComponentListener --- //
    protected class MainFrameListener extends ComponentAdapter {
        protected Configuration configuration;

        public MainFrameListener(Configuration configuration) {
            this.configuration = configuration;
        }

        @Override
        public void componentMoved(ComponentEvent e) {
            JFrame mainFrame = mainView.getMainFrame();

            if ((mainFrame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
                configuration.setMainWindowMaximize(true);
            } else {
                configuration.setMainWindowLocation(mainFrame.getLocation());
                configuration.setMainWindowMaximize(false);
            }
        }

        @Override
        public void componentResized(ComponentEvent e) {
            JFrame mainFrame = mainView.getMainFrame();

            if ((mainFrame.getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) {
                configuration.setMainWindowMaximize(true);
            } else {
                configuration.setMainWindowSize(mainFrame.getSize());
                configuration.setMainWindowMaximize(false);
            }
        }
    }

    protected void panelClosed() {
        SwingUtil.invokeLater(() -> {
            // Fire 'indexesChanged' event
            Collection<Future<Indexes>> collectionOfFutureIndexes = getCollectionOfFutureIndexes();
            for (IndexesChangeListener listener : containerChangeListeners) {
                listener.indexesChanged(collectionOfFutureIndexes);
            }
            if (currentPage instanceof IndexesChangeListener) {
                ((IndexesChangeListener)currentPage).indexesChanged(collectionOfFutureIndexes);
            }
        });
    }

    // --- API --- //
    @Override
    @SuppressWarnings("unchecked")
    public boolean openURI(URI uri) {
        if (uri != null) {
            boolean success = mainView.openUri(uri);

            if (success == false) {
                UriLoader uriLoader = getUriLoader(uri);
                if (uriLoader != null) {
                    success = uriLoader.load(this, uri);
                }
            }

            if (success) {
                addURI(uri);
            }

            return success;
        }

        return false;
    }

    @Override
    public boolean openURI(int x, int y, Collection<Container.Entry> entries, String query, String fragment) {
        if (entries != null) {
            if (entries.size() == 1) {
                // Open the single entry uri
                Container.Entry entry = entries.iterator().next();
                return openURI(UriUtil.createURI(this, getCollectionOfFutureIndexes(), entry, query, fragment));
            } else {
                // Multiple entries -> Open a "Select location" popup
                Collection<Future<Indexes>> collectionOfFutureIndexes = getCollectionOfFutureIndexes();
                selectLocationController.show(
                    new Point(x+(16+2), y+2),
                    entries,
                    entry -> openURI(UriUtil.createURI(this, collectionOfFutureIndexes, entry, query, fragment)), // entry selected closure
                    () -> {});                                                                                    // popup close closure
                return true;
            }
        }

        return false;
    }

    @Override
    public void addURI(URI uri) {
        history.add(uri);
        SwingUtil.invokeLater(() -> {
            mainView.updateHistoryActions();
        });
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T extends JComponent & UriGettable> void addPanel(String title, Icon icon, String tip, T component) {
        mainView.addMainPanel(title, icon, tip, component);

        if (component instanceof ContentIndexable) {
            Future<Indexes> futureIndexes = executor.submit(() -> {
                Indexes indexes = ((ContentIndexable)component).index(this);

                SwingUtil.invokeLater(() -> {
                    // Fire 'indexesChanged' event
                    Collection<Future<Indexes>> collectionOfFutureIndexes = getCollectionOfFutureIndexes();
                    for (IndexesChangeListener listener : containerChangeListeners) {
                        listener.indexesChanged(collectionOfFutureIndexes);
                    }
                    if (currentPage instanceof IndexesChangeListener) {
                        ((IndexesChangeListener) currentPage).indexesChanged(collectionOfFutureIndexes);
                    }
                });

                return indexes;
            });

            component.putClientProperty("indexes", futureIndexes);
        }
    }

    @Override public Collection<Action> getContextualActions(Container.Entry entry, String fragment) { return ContextualActionsFactoryService.getInstance().get(this, entry, fragment); }

    @Override public FileLoader getFileLoader(File file) { return FileLoaderService.getInstance().get(this, file); }

    @Override public UriLoader getUriLoader(URI uri) { return UriLoaderService.getInstance().get(this, uri); }

    @Override public PanelFactory getMainPanelFactory(Container container) { return PanelFactoryService.getInstance().get(container); }

    @Override public ContainerFactory getContainerFactory(Path rootPath) { return ContainerFactoryService.getInstance().get(this, rootPath); }

    @Override public TreeNodeFactory getTreeNodeFactory(Container.Entry entry) { return TreeNodeFactoryService.getInstance().get(entry); }

    @Override public TypeFactory getTypeFactory(Container.Entry entry) { return TypeFactoryService.getInstance().get(entry); }

    @Override public Indexer getIndexer(Container.Entry entry) { return IndexerService.getInstance().get(entry); }

    @Override public SourceSaver getSourceSaver(Container.Entry entry) { return SourceSaverService.getInstance().get(entry); }

    @Override public Map<String, String> getPreferences() { return configuration.getPreferences(); }

    @Override
    @SuppressWarnings("unchecked")
    public Collection<Future<Indexes>> getCollectionOfFutureIndexes() {
        List<JComponent> mainPanels = mainView.getMainPanels();
        ArrayList<Future<Indexes>> list = new ArrayList<Future<Indexes>>(mainPanels.size()) {
            @Override
            public int hashCode() {
                int hashCode = 1;

                try {
                    for (Future<Indexes> futureIndexes : this) {
                        hashCode *= 31;

                        if (futureIndexes.isDone()) {
                            hashCode += futureIndexes.get().hashCode();
                        }
                    }
                } catch (Exception e) {
                    assert ExceptionUtil.printStackTrace(e);
                }

                return hashCode;
            }
        };

        for (JComponent panel : mainPanels) {
            Future<Indexes> futureIndexes = (Future<Indexes>)panel.getClientProperty("indexes");
            if (futureIndexes != null) {
                list.add(futureIndexes);
            }
        }

        return list;
    }

    @Override
    public String getSource(Container.Entry entry) {
        return sourceLoaderService.getSource(this, entry);
    }

    @Override
    public void loadSource(Container.Entry entry, LoadSourceListener listener) {
        executor.execute(() -> {
            String source = sourceLoaderService.loadSource(this, entry);

            if ((source != null) && !source.isEmpty()) {
                listener.sourceLoaded(source);
            }
        });
    }

    @Override
    public File loadSourceFile(Container.Entry entry) {
        return sourceLoaderService.getSourceFile(this, entry);
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/OpenTypeController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.IndexesChangeListener;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.util.net.UriUtil;
import org.jd.gui.view.OpenTypeView;

import javax.swing.*;
import java.awt.*;
import java.net.URI;
import java.util.*;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Consumer;
import java.util.regex.Pattern;

public class OpenTypeController implements IndexesChangeListener {
    protected static final int CACHE_MAX_ENTRIES = 5*20;

    protected API api;
    protected ScheduledExecutorService executor;
    protected Collection<Future<Indexes>> collectionOfFutureIndexes;
    protected Consumer<URI> openCallback;

    protected JFrame mainFrame;
    protected OpenTypeView openTypeView;
    protected SelectLocationController selectLocationController;

    protected long indexesHashCode = 0L;
    protected Map<String, Map<String, Collection>> cache;

    public OpenTypeController(API api, ScheduledExecutorService executor, JFrame mainFrame) {
        this.api = api;
        this.executor = executor;
        this.mainFrame = mainFrame;
        // Create UI
        openTypeView = new OpenTypeView(api, mainFrame, this::updateList, this::onTypeSelected);
        selectLocationController = new SelectLocationController(api, mainFrame);
        // Create result cache
        cache = new LinkedHashMap<String, Map<String, Collection>>(CACHE_MAX_ENTRIES*3/2, 0.7f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<String, Map<String, Collection>> eldest) {
                return size() > CACHE_MAX_ENTRIES;
            }
        };
    }

    public void show(Collection<Future<Indexes>> collectionOfFutureIndexes, Consumer<URI> openCallback) {
        // Init attributes
        this.collectionOfFutureIndexes = collectionOfFutureIndexes;
        this.openCallback = openCallback;
        // Refresh view
        long hashCode = collectionOfFutureIndexes.hashCode();
        if (hashCode != indexesHashCode) {
            // List of indexes has changed -> Refresh result list
            updateList(openTypeView.getPattern());
            indexesHashCode = hashCode;
        }
        // Show
        openTypeView.show();
    }

    @SuppressWarnings("unchecked")
    protected void updateList(String pattern) {
        int patternLength = pattern.length();

        if (patternLength == 0) {
            // Display
            openTypeView.updateList(Collections.emptyMap());
        } else {
            executor.execute(() -> {
                // Waiting the end of indexation...
                openTypeView.showWaitCursor();

                Pattern regExpPattern = createRegExpPattern(pattern);
                Map<String, Collection<Container.Entry>> result = new HashMap<>();

                try {
                    for (Future<Indexes> futureIndexes : collectionOfFutureIndexes) {
                        if (futureIndexes.isDone()) {
                            Indexes indexes = futureIndexes.get();
                            String key = String.valueOf(indexes.hashCode()) + "***" + pattern;
                            Map<String, Collection> matchingEntries = cache.get(key);

                            if (matchingEntries != null) {
                                // Merge 'result' and 'matchingEntries'
                                for (Map.Entry<String, Collection> mapEntry : matchingEntries.entrySet()) {
                                    Collection<Container.Entry> collection = result.get(mapEntry.getKey());
                                    if (collection == null) {
                                        result.put(mapEntry.getKey(), collection = new HashSet<>());
                                    }
                                    collection.addAll(mapEntry.getValue());
                                }
                            } else {
                                // Waiting the end of indexation...
                                Map<String, Collection> index = indexes.getIndex("typeDeclarations");

                                if ((index != null) && !index.isEmpty()) {
                                    matchingEntries = new HashMap<>();

                                    // Filter
                                    if (patternLength == 1) {
                                        match(pattern.charAt(0), index, matchingEntries);
                                    } else {
                                        String lastKey = key.substring(0, patternLength - 1);
                                        Map<String, Collection> lastResult = cache.get(lastKey);

                                        if (lastResult != null) {
                                            match(regExpPattern, lastResult, matchingEntries);
                                        } else {
                                            match(regExpPattern, index, matchingEntries);
                                        }
                                    }

                                    // Store 'matchingEntries'
                                    cache.put(key, matchingEntries);

                                    // Merge 'result' and 'matchingEntries'
                                    for (Map.Entry<String, Collection> mapEntry : matchingEntries.entrySet()) {
                                        Collection<Container.Entry> collection = result.get(mapEntry.getKey());
                                        if (collection == null) {
                                            result.put(mapEntry.getKey(), collection = new HashSet<>());
                                        }
                                        collection.addAll(mapEntry.getValue());
                                    }
                                }
                            }
                        }
                    }
                } catch (Exception e) {
                    assert ExceptionUtil.printStackTrace(e);
                }

                SwingUtilities.invokeLater(() -> {
                    openTypeView.hideWaitCursor();
                    // Display
                    openTypeView.updateList(result);
                });
            });
        }
    }

    @SuppressWarnings("unchecked")
    protected static void match(char c, Map<String, Collection> index, Map<String, Collection> result) {
        // Filter
        if (Character.isLowerCase(c)) {
            char upperCase = Character.toUpperCase(c);

            for (Map.Entry<String, Collection> mapEntry : index.entrySet()) {
                String typeName = mapEntry.getKey();
                Collection<Container.Entry> entries = mapEntry.getValue();
                // Search last package separator
                int lastPackageSeparatorIndex = typeName.lastIndexOf('/') + 1;
                int lastTypeNameSeparatorIndex = typeName.lastIndexOf('$') + 1;
                int lastIndex = Math.max(lastPackageSeparatorIndex, lastTypeNameSeparatorIndex);

                if (lastIndex < typeName.length()) {
                    char first = typeName.charAt(lastIndex);

                    if ((first == c) || (first == upperCase)) {
                        add(result, typeName, entries);
                    }
                }
            }
        } else {
            for (Map.Entry<String, Collection> mapEntry : index.entrySet()) {
                String typeName = mapEntry.getKey();
                Collection<Container.Entry> entries = mapEntry.getValue();
                // Search last package separator
                int lastPackageSeparatorIndex = typeName.lastIndexOf('/') + 1;
                int lastTypeNameSeparatorIndex = typeName.lastIndexOf('$') + 1;
                int lastIndex = Math.max(lastPackageSeparatorIndex, lastTypeNameSeparatorIndex);

                if ((lastIndex < typeName.length()) && (typeName.charAt(lastIndex) == c)) {
                    add(result, typeName, entries);
                }
            }
        }
    }

    /**
     * Create a regular expression to match package, type and inner type name.
     *
     * Rules:
     *  '*'        matches 0 ou N characters
     *  '?'        matches 1 character
     *  lower case matches insensitive case
     *  upper case matches upper case
     */
    protected static Pattern createRegExpPattern(String pattern) {
        // Create regular expression
        int patternLength = pattern.length();
        StringBuilder sbPattern = new StringBuilder(patternLength * 4);

        for (int i=0; i<patternLength; i++) {
            char c = pattern.charAt(i);

            if (Character.isUpperCase(c)) {
                if (i > 1) {
                    sbPattern.append(".*");
                }
                sbPattern.append(c);
            } else if (Character.isLowerCase(c)) {
                sbPattern.append('[').append(c).append(Character.toUpperCase(c)).append(']');
            } else if (c == '*') {
                sbPattern.append(".*");
            } else if (c == '?') {
                sbPattern.append(".");
            } else {
                sbPattern.append(c);
            }
        }

        sbPattern.append(".*");

        return Pattern.compile(sbPattern.toString());
    }

    @SuppressWarnings("unchecked")
    protected static void match(Pattern regExpPattern, Map<String, Collection> index, Map<String, Collection> result) {
        for (Map.Entry<String, Collection> mapEntry : index.entrySet()) {
            String typeName = mapEntry.getKey();
            Collection<Container.Entry> entries = mapEntry.getValue();
            // Search last package separator
            int lastPackageSeparatorIndex = typeName.lastIndexOf('/') + 1;
            int lastTypeNameSeparatorIndex = typeName.lastIndexOf('$') + 1;
            int lastIndex = Math.max(lastPackageSeparatorIndex, lastTypeNameSeparatorIndex);

            if (regExpPattern.matcher(typeName.substring(lastIndex)).matches()) {
                add(result, typeName, entries);
            }
        }
    }

    @SuppressWarnings("unchecked")
    protected static void add(Map<String, Collection> map, String key, Collection value) {
        Collection<Container.Entry> collection = map.get(key);

        if (collection == null) {
            map.put(key, collection = new HashSet<>());
        }

        collection.addAll(value);
    }

    protected void onTypeSelected(Point leftBottom, Collection<Container.Entry> entries, String typeName) {
        if (entries.size() == 1) {
            // Open the single entry uri
            openCallback.accept(UriUtil.createURI(api, collectionOfFutureIndexes, entries.iterator().next(), null, typeName));
        } else {
            // Multiple entries -> Open a "Select location" popup
            selectLocationController.show(
                new Point(leftBottom.x+(16+2), leftBottom.y+2),
                entries,
                (entry) -> openCallback.accept(UriUtil.createURI(api, collectionOfFutureIndexes, entry, null, typeName)), // entry selected callback
                () -> openTypeView.focus());                                                                              // popup close callback
        }
    }

    // --- IndexesChangeListener --- //
    public void indexesChanged(Collection<Future<Indexes>> collectionOfFutureIndexes) {
        if (openTypeView.isVisible()) {
            // Update the list of containers
            this.collectionOfFutureIndexes = collectionOfFutureIndexes;
            // And refresh
            updateList(openTypeView.getPattern());
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/OpenTypeHierarchyController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.IndexesChangeListener;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;
import org.jd.gui.util.net.UriUtil;
import org.jd.gui.view.OpenTypeHierarchyView;

import javax.swing.*;
import java.awt.*;
import java.net.URI;
import java.util.Collection;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.Consumer;

public class OpenTypeHierarchyController implements IndexesChangeListener {
    protected API api;
    private ScheduledExecutorService executor;

    protected JFrame mainFrame;
    protected OpenTypeHierarchyView openTypeHierarchyView;
    protected SelectLocationController selectLocationController;

    protected Collection<Future<Indexes>> collectionOfFutureIndexes;
    protected Consumer<URI> openCallback;

    public OpenTypeHierarchyController(API api, ScheduledExecutorService executor, JFrame mainFrame) {
        this.api = api;
        this.executor = executor;
        this.mainFrame = mainFrame;
        // Create UI
        openTypeHierarchyView = new OpenTypeHierarchyView(api, mainFrame, this::onTypeSelected);
        selectLocationController = new SelectLocationController(api, mainFrame);
    }

    public void show(Collection<Future<Indexes>> collectionOfFutureIndexes, Container.Entry entry, String typeName, Consumer<URI> openCallback) {
        // Init attributes
        this.collectionOfFutureIndexes = collectionOfFutureIndexes;
        this.openCallback = openCallback;
        executor.execute(() -> {
            // Waiting the end of indexation...
            openTypeHierarchyView.showWaitCursor();
            SwingUtilities.invokeLater(() -> {
                openTypeHierarchyView.hideWaitCursor();
                // Show
                openTypeHierarchyView.show(collectionOfFutureIndexes, entry, typeName);
            });
        });
    }

    protected void onTypeSelected(Point leftBottom, Collection<Container.Entry> entries, String typeName) {
        if (entries.size() == 1) {
            // Open the single entry uri
            openCallback.accept(UriUtil.createURI(api, collectionOfFutureIndexes, entries.iterator().next(), null, typeName));
        } else {
            // Multiple entries -> Open a "Select location" popup
            selectLocationController.show(
                new Point(leftBottom.x+(16+2), leftBottom.y+2),
                entries,
                (entry) -> openCallback.accept(UriUtil.createURI(api, collectionOfFutureIndexes, entry, null, typeName)), // entry selected
                () -> openTypeHierarchyView.focus());                                                               // popup closeClosure
        }
    }

    // --- IndexesChangeListener --- //
    public void indexesChanged(Collection<Future<Indexes>> collectionOfFutureIndexes) {
        if (openTypeHierarchyView.isVisible()) {
            // Update the list of containers
            this.collectionOfFutureIndexes = collectionOfFutureIndexes;
            // And refresh
            openTypeHierarchyView.updateTree(collectionOfFutureIndexes);
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/PreferencesController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.model.configuration.Configuration;
import org.jd.gui.spi.PreferencesPanel;
import org.jd.gui.view.PreferencesView;

import javax.swing.*;
import java.util.Collection;

public class PreferencesController {
    protected PreferencesView preferencesView;

    public PreferencesController(Configuration configuration, JFrame mainFrame, Collection<PreferencesPanel> panels) {
        // Create UI
        preferencesView = new PreferencesView(configuration, mainFrame, panels);
    }

    public void show(Runnable okCallback) {
        // Show
        preferencesView.show(okCallback);
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/SaveAllSourcesController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.SourcesSavable;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.view.SaveAllSourcesView;

import javax.swing.*;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.ScheduledExecutorService;

public class SaveAllSourcesController implements SourcesSavable.Controller, SourcesSavable.Listener {
    protected API api;
    protected SaveAllSourcesView saveAllSourcesView;
    protected boolean cancel;
    protected int counter;
    protected int mask;

    public SaveAllSourcesController(API api, JFrame mainFrame) {
        this.api = api;
        // Create UI
        this.saveAllSourcesView = new SaveAllSourcesView(mainFrame, this::onCanceled);
    }

    public void show(ScheduledExecutorService executor, SourcesSavable savable, File file) {
        // Show
        this.saveAllSourcesView.show(file);
        // Execute background task
        executor.execute(() -> {
            int fileCount = savable.getFileCount();

            saveAllSourcesView.updateProgressBar(0);
            saveAllSourcesView.setMaxValue(fileCount);

            cancel = false;
            counter = 0;
            mask = 2;

            while (fileCount > 64) {
                fileCount >>= 1;
                mask <<= 1;
            }

            mask--;

            try {
                Path path = Paths.get(file.toURI());
                Files.deleteIfExists(path);

                try {
                    savable.save(api, this, this, path);
                } catch (Exception e) {
                    assert ExceptionUtil.printStackTrace(e);
                    saveAllSourcesView.showActionFailedDialog();
                    cancel = true;
                }

                if (cancel) {
                    Files.deleteIfExists(path);
                }
            } catch (Throwable t) {
                assert ExceptionUtil.printStackTrace(t);
            }

            saveAllSourcesView.hide();
        });
    }

    public boolean isActivated() { return saveAllSourcesView.isVisible(); }

    protected void onCanceled() { cancel = true; }

    // --- SourcesSavable.Controller --- //
    @Override public boolean isCancelled() { return cancel; }

    // --- SourcesSavable.Listener --- //
    @Override
    public void pathSaved(Path path) {
        if (((counter++) & mask) == 0) {
            saveAllSourcesView.updateProgressBar(counter);
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/SearchInConstantPoolsController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.IndexesChangeListener;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;
import org.jd.gui.api.model.Type;
import org.jd.gui.model.container.DelegatingFilterContainer;
import org.jd.gui.service.type.TypeFactoryService;
import org.jd.gui.spi.TypeFactory;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.util.function.TriConsumer;
import org.jd.gui.view.SearchInConstantPoolsView;

import javax.swing.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.*;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.regex.Pattern;

public class SearchInConstantPoolsController implements IndexesChangeListener {
    protected static final int CACHE_MAX_ENTRIES = 5*20*9;

    protected API api;
    protected ScheduledExecutorService executor;

    protected JFrame mainFrame;
    protected SearchInConstantPoolsView searchInConstantPoolsView;
    protected Map<String, Map<String, Collection>> cache;
    protected Set<DelegatingFilterContainer> delegatingFilterContainers = new HashSet<>();
    protected Collection<Future<Indexes>> collectionOfFutureIndexes;
    protected Consumer<URI> openCallback;
    protected long indexesHashCode = 0L;

    @SuppressWarnings("unchecked")
    public SearchInConstantPoolsController(API api, ScheduledExecutorService executor, JFrame mainFrame) {
        this.api = api;
        this.executor = executor;
        this.mainFrame = mainFrame;
        // Create UI
        this.searchInConstantPoolsView = new SearchInConstantPoolsView(
            api, mainFrame,
            new BiConsumer<String, Integer>() {
                @Override public void accept(String pattern, Integer flags) { updateTree(pattern, flags); }
            },
            new TriConsumer<URI, String, Integer>() {
                @Override public void accept(URI uri, String pattern, Integer flags) { onTypeSelected(uri, pattern, flags); }
            }
        );
        // Create result cache
        this.cache = new LinkedHashMap<String, Map<String, Collection>>(CACHE_MAX_ENTRIES*3/2, 0.7f, true) {
            @Override
            protected boolean removeEldestEntry(Map.Entry<String, Map<String, Collection>> eldest) {
                return size() > CACHE_MAX_ENTRIES;
            }
        };
    }

    public void show(Collection<Future<Indexes>> collectionOfFutureIndexes, Consumer<URI> openCallback) {
        // Init attributes
        this.collectionOfFutureIndexes = collectionOfFutureIndexes;
        this.openCallback = openCallback;
        // Refresh view
        long hashCode = collectionOfFutureIndexes.hashCode();
        if (hashCode != indexesHashCode) {
            // List of indexes has changed
            updateTree(searchInConstantPoolsView.getPattern(), searchInConstantPoolsView.getFlags());
            indexesHashCode = hashCode;
        }
        // Show
        searchInConstantPoolsView.show();
    }

    @SuppressWarnings("unchecked")
    protected void updateTree(String pattern, int flags) {
        delegatingFilterContainers.clear();

        executor.execute(() -> {
            // Waiting the end of indexation...
            searchInConstantPoolsView.showWaitCursor();

            int matchingTypeCount = 0;
            int patternLength = pattern.length();

            if (patternLength > 0) {
                try {
                    for (Future<Indexes> futureIndexes : collectionOfFutureIndexes) {
                        if (futureIndexes.isDone()) {
                            Indexes indexes = futureIndexes.get();
                            HashSet<Container.Entry> matchingEntries = new HashSet<>();
                            // Find matched entries
                            filter(indexes, pattern, flags, matchingEntries);

                            if (!matchingEntries.isEmpty()) {
                                // Search root container with first matching entry
                                Container.Entry parentEntry = matchingEntries.iterator().next();
                                Container container = null;

                                while (parentEntry.getContainer().getRoot() != null) {
                                    container = parentEntry.getContainer();
                                    parentEntry = container.getRoot().getParent();
                                }

                                // TODO In a future release, display matching strings, types, inner-types, fields and methods, not only matching files
                                matchingEntries = getOuterEntries(matchingEntries);

                                matchingTypeCount += matchingEntries.size();

                                // Create a filtered container
                                delegatingFilterContainers.add(new DelegatingFilterContainer(container, matchingEntries));
                            }
                        }
                    }
                } catch (Exception e) {
                    assert ExceptionUtil.printStackTrace(e);
                }
            }

            final int count = matchingTypeCount;

            searchInConstantPoolsView.hideWaitCursor();
            searchInConstantPoolsView.updateTree(delegatingFilterContainers, count);
        });
    }

    protected HashSet<Container.Entry> getOuterEntries(Set<Container.Entry> matchingEntries) {
        HashMap<Container.Entry, Container.Entry> innerTypeEntryToOuterTypeEntry = new HashMap<>();
        HashSet<Container.Entry> matchingOuterEntriesSet = new HashSet<>();

        for (Container.Entry entry : matchingEntries) {
            TypeFactory typeFactory = TypeFactoryService.getInstance().get(entry);

            if (typeFactory != null) {
                Type type = typeFactory.make(api, entry, null);

                if ((type != null) && (type.getOuterName() != null)) {
                    Container.Entry outerTypeEntry = innerTypeEntryToOuterTypeEntry.get(entry);

                    if (outerTypeEntry == null) {
                        HashMap<String, Container.Entry> typeNameToEntry = new HashMap<>();
                        HashMap<String, String> innerTypeNameToOuterTypeName = new HashMap<>();

                        // Populate "typeNameToEntry" and "innerTypeNameToOuterTypeName"
                        for (Container.Entry e : entry.getParent().getChildren()) {
                            typeFactory = TypeFactoryService.getInstance().get(e);

                            if (typeFactory != null) {
                                type = typeFactory.make(api, e, null);

                                if (type != null) {
                                    typeNameToEntry.put(type.getName(), e);
                                    if (type.getOuterName() != null) {
                                        innerTypeNameToOuterTypeName.put(type.getName(), type.getOuterName());
                                    }
                                }
                            }
                        }

                        // Search outer type entries and populate "innerTypeEntryToOuterTypeEntry"
                        for (Map.Entry<String, String> e : innerTypeNameToOuterTypeName.entrySet()) {
                            Container.Entry innerTypeEntry = typeNameToEntry.get(e.getKey());

                            if (innerTypeEntry != null) {
                                String outerTypeName = e.getValue();

                                for (;;) {
                                    String typeName = innerTypeNameToOuterTypeName.get(outerTypeName);
                                    if (typeName != null) {
                                        outerTypeName = typeName;
                                    } else {
                                        break;
                                    }
                                }

                                outerTypeEntry = typeNameToEntry.get(outerTypeName);

                                if (outerTypeEntry != null) {
                                    innerTypeEntryToOuterTypeEntry.put(innerTypeEntry, outerTypeEntry);
                                }
                            }
                        }

                        // Get outer type entry
                        outerTypeEntry = innerTypeEntryToOuterTypeEntry.get(entry);

                        if (outerTypeEntry == null) {
                            outerTypeEntry = entry;
                        }
                    }

                    matchingOuterEntriesSet.add(outerTypeEntry);
                } else{
                    matchingOuterEntriesSet.add(entry);
                }
            }
        }

        return matchingOuterEntriesSet;
    }

    protected void filter(Indexes indexes, String pattern, int flags, Set<Container.Entry> matchingEntries) {
        boolean declarations = ((flags & SearchInConstantPoolsView.SEARCH_DECLARATION) != 0);
        boolean references = ((flags & SearchInConstantPoolsView.SEARCH_REFERENCE) != 0);

        if ((flags & SearchInConstantPoolsView.SEARCH_TYPE) != 0) {
            if (declarations)
                match(indexes, "typeDeclarations", pattern,
                      SearchInConstantPoolsController::matchTypeEntriesWithChar,
                      SearchInConstantPoolsController::matchTypeEntriesWithString, matchingEntries);
            if (references)
                match(indexes, "typeReferences", pattern,
                      SearchInConstantPoolsController::matchTypeEntriesWithChar,
                      SearchInConstantPoolsController::matchTypeEntriesWithString, matchingEntries);
        }

        if ((flags & SearchInConstantPoolsView.SEARCH_CONSTRUCTOR) != 0) {
            if (declarations)
                match(indexes, "constructorDeclarations", pattern,
                      SearchInConstantPoolsController::matchTypeEntriesWithChar,
                      SearchInConstantPoolsController::matchTypeEntriesWithString, matchingEntries);
            if (references)
                match(indexes, "constructorReferences", pattern,
                      SearchInConstantPoolsController::matchTypeEntriesWithChar,
                      SearchInConstantPoolsController::matchTypeEntriesWithString, matchingEntries);
        }

        if ((flags & SearchInConstantPoolsView.SEARCH_METHOD) != 0) {
            if (declarations)
                match(indexes, "methodDeclarations", pattern,
                      SearchInConstantPoolsController::matchWithChar,
                      SearchInConstantPoolsController::matchWithString, matchingEntries);
            if (references)
                match(indexes, "methodReferences", pattern,
                      SearchInConstantPoolsController::matchWithChar,
                      SearchInConstantPoolsController::matchWithString, matchingEntries);
        }

        if ((flags & SearchInConstantPoolsView.SEARCH_FIELD) != 0) {
            if (declarations)
                match(indexes, "fieldDeclarations", pattern,
                      SearchInConstantPoolsController::matchWithChar,
                      SearchInConstantPoolsController::matchWithString, matchingEntries);
            if (references)
                match(indexes, "fieldReferences", pattern,
                      SearchInConstantPoolsController::matchWithChar,
                      SearchInConstantPoolsController::matchWithString, matchingEntries);
        }

        if ((flags & SearchInConstantPoolsView.SEARCH_STRING) != 0) {
            if (declarations || references)
                match(indexes, "strings", pattern,
                      SearchInConstantPoolsController::matchWithChar,
                      SearchInConstantPoolsController::matchWithString, matchingEntries);
        }

        if ((flags & SearchInConstantPoolsView.SEARCH_MODULE) != 0) {
            if (declarations)
                match(indexes, "javaModuleDeclarations", pattern,
                        SearchInConstantPoolsController::matchWithChar,
                        SearchInConstantPoolsController::matchWithString, matchingEntries);
            if (references)
                match(indexes, "javaModuleReferences", pattern,
                        SearchInConstantPoolsController::matchWithChar,
                        SearchInConstantPoolsController::matchWithString, matchingEntries);
        }
    }

    @SuppressWarnings("unchecked")
    protected void match(Indexes indexes, String indexName, String pattern,
                         BiFunction<Character, Map<String, Collection>, Map<String, Collection>> matchWithCharFunction,
                         BiFunction<String, Map<String, Collection>, Map<String, Collection>> matchWithStringFunction,
                         Set<Container.Entry> matchingEntries) {
        int patternLength = pattern.length();

        if (patternLength > 0) {
            String key = String.valueOf(indexes.hashCode()) + "***" + indexName + "***" + pattern;
            Map<String, Collection> matchedEntries = cache.get(key);

            if (matchedEntries == null) {
                Map<String, Collection> index = indexes.getIndex(indexName);

                if (index != null) {
                    if (patternLength == 1) {
                        matchedEntries = matchWithCharFunction.apply(pattern.charAt(0), index);
                    } else {
                        String lastKey = key.substring(0, key.length() - 1);
                        Map<String, Collection> lastMatchedTypes = cache.get(lastKey);
                        if (lastMatchedTypes != null) {
                            matchedEntries = matchWithStringFunction.apply(pattern, lastMatchedTypes);
                        } else {
                            matchedEntries = matchWithStringFunction.apply(pattern, index);
                        }
                    }
                }

                // Cache matchingEntries
                cache.put(key, matchedEntries);
            }

            if (matchedEntries != null) {
                for (Collection<Container.Entry> entries : matchedEntries.values()) {
                    matchingEntries.addAll(entries);
                }
            }
        }
    }

    protected static Map<String, Collection> matchTypeEntriesWithChar(char c, Map<String, Collection> index) {
        if ((c == '*') || (c == '?')) {
            return index;
        } else {
            Map<String, Collection> map = new HashMap<>();

            for (String typeName : index.keySet()) {
                // Search last package separator
                int lastPackageSeparatorIndex = typeName.lastIndexOf('/') + 1;
                int lastTypeNameSeparatorIndex = typeName.lastIndexOf('$') + 1;
                int lastIndex = Math.max(lastPackageSeparatorIndex, lastTypeNameSeparatorIndex);

                if ((lastIndex < typeName.length()) && (typeName.charAt(lastIndex) == c)) {
                    map.put(typeName, index.get(typeName));
                }
            }

            return map;
        }
    }

    protected static Map<String, Collection> matchTypeEntriesWithString(String pattern, Map<String, Collection> index) {
        Pattern p = createPattern(pattern);
        Map<String, Collection> map = new HashMap<>();

        for (String typeName : index.keySet()) {
            // Search last package separator
            int lastPackageSeparatorIndex = typeName.lastIndexOf('/') + 1;
            int lastTypeNameSeparatorIndex = typeName.lastIndexOf('$') + 1;
            int lastIndex = Math.max(lastPackageSeparatorIndex, lastTypeNameSeparatorIndex);

            if (p.matcher(typeName.substring(lastIndex)).matches()) {
                map.put(typeName, index.get(typeName));
            }
        }

        return map;
    }

    protected static Map<String, Collection> matchWithChar(char c, Map<String, Collection> index) {
        if ((c == '*') || (c == '?')) {
            return index;
        } else {
            Map<String, Collection> map = new HashMap<>();

            for (String key : index.keySet()) {
                if (!key.isEmpty() && (key.charAt(0) == c)) {
                    map.put(key, index.get(key));
                }
            }

            return map;
        }
    }

    protected static Map<String, Collection> matchWithString(String pattern, Map<String, Collection> index) {
        Pattern p = createPattern(pattern);
        Map<String, Collection> map = new HashMap<>();

        for (String key : index.keySet()) {
            if (p.matcher(key).matches()) {
                map.put(key, index.get(key));
            }
        }

        return map;
    }

    /**
     * Create a simple regular expression
     *
     * Rules:
     *  '*'        matchTypeEntries 0 ou N characters
     *  '?'        matchTypeEntries 1 character
     */
    protected static Pattern createPattern(String pattern) {
        int patternLength = pattern.length();
        StringBuilder sbPattern = new StringBuilder(patternLength * 2);

        for (int i = 0; i < patternLength; i++) {
            char c = pattern.charAt(i);

            if (c == '*') {
                sbPattern.append(".*");
            } else if (c == '?') {
                sbPattern.append('.');
            } else if (c == '.') {
                sbPattern.append("\\.");
            } else {
                sbPattern.append(c);
            }
        }

        sbPattern.append(".*");

        return Pattern.compile(sbPattern.toString());
    }

    protected void onTypeSelected(URI uri, String pattern, int flags) {
        // Open the single entry uri
        Container.Entry entry = null;

        for (DelegatingFilterContainer container : delegatingFilterContainers) {
            entry = container.getEntry(uri);
            if (entry != null)
                break;
        }

        if (entry != null) {
            StringBuilder sbPattern = new StringBuilder(200 + pattern.length());

            sbPattern.append("highlightPattern=");
            sbPattern.append(pattern);
            sbPattern.append("&highlightFlags=");

            if ((flags & SearchInConstantPoolsView.SEARCH_DECLARATION) != 0)
                sbPattern.append('d');
            if ((flags & SearchInConstantPoolsView.SEARCH_REFERENCE) != 0)
                sbPattern.append('r');
            if ((flags & SearchInConstantPoolsView.SEARCH_TYPE) != 0)
                sbPattern.append('t');
            if ((flags & SearchInConstantPoolsView.SEARCH_CONSTRUCTOR) != 0)
                sbPattern.append('c');
            if ((flags & SearchInConstantPoolsView.SEARCH_METHOD) != 0)
                sbPattern.append('m');
            if ((flags & SearchInConstantPoolsView.SEARCH_FIELD) != 0)
                sbPattern.append('f');
            if ((flags & SearchInConstantPoolsView.SEARCH_STRING) != 0)
                sbPattern.append('s');
            if ((flags & SearchInConstantPoolsView.SEARCH_MODULE) != 0)
                sbPattern.append('M');

            // TODO In a future release, add 'highlightScope' to display search results in correct type and inner-type
            // def type = TypeFactoryService.instance.get(entry)?.make(api, entry, null)
            // if (type) {
            //     sbPattern.append('&highlightScope=')
            //     sbPattern.append(type.name)
            //
            //     def query = sbPattern.toString()
            //     def outerPath = UriUtil.getOuterPath(collectionOfFutureIndexes, entry, type)
            //
            //     openClosure(new URI(entry.uri.scheme, entry.uri.host, outerPath, query, null))
            // } else {
                String query = sbPattern.toString();
                URI u = entry.getUri();

                try {
                    openCallback.accept(new URI(u.getScheme(), u.getHost(), u.getPath(), query, null));
                } catch (URISyntaxException e) {
                    assert ExceptionUtil.printStackTrace(e);
                }
            // }
        }
    }

    // --- IndexesChangeListener --- //
    public void indexesChanged(Collection<Future<Indexes>> collectionOfFutureIndexes) {
        if (searchInConstantPoolsView.isVisible()) {
            // Update the list of containers
            this.collectionOfFutureIndexes = collectionOfFutureIndexes;
            // And refresh
            updateTree(searchInConstantPoolsView.getPattern(), searchInConstantPoolsView.getFlags());
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/controller/SelectLocationController.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.controller;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Type;
import org.jd.gui.model.container.DelegatingFilterContainer;
import org.jd.gui.service.type.TypeFactoryService;
import org.jd.gui.spi.TypeFactory;
import org.jd.gui.view.SelectLocationView;

import javax.swing.*;
import java.awt.*;
import java.net.URI;
import java.util.*;
import java.util.function.Consumer;

public class SelectLocationController {
    protected static final ContainerEntryComparator CONTAINER_ENTRY_COMPARATOR = new ContainerEntryComparator();

    protected API api;
    protected SelectLocationView selectLocationView;

    public SelectLocationController(API api, JFrame mainFrame) {
        this.api = api;
        // Create UI
        selectLocationView = new SelectLocationView(api, mainFrame);
    }

    @SuppressWarnings("unchecked")
    public void show(Point location, Collection<Container.Entry> entries, Consumer<Container.Entry> selectedLocationCallback, Runnable closeCallback) {
        // Show UI
        HashMap<Container, ArrayList<Container.Entry>> map = new HashMap<>();

        for (Container.Entry entry : entries) {
            Container container = entry.getContainer();

            // Search root container
            while (true) {
                Container parentContainer = container.getRoot().getParent().getContainer();
                if (parentContainer.getRoot() == null) {
                    break;
                } else {
                    container = parentContainer;
                }
            }

            ArrayList<Container.Entry> list = map.get(container);

            if (list == null) {
                map.put(container, list=new ArrayList<>());
            }

            list.add(entry);
        }

        HashSet<DelegatingFilterContainer> delegatingFilterContainers = new HashSet<>();

        for (Map.Entry<Container, ArrayList<Container.Entry>> mapEntry : map.entrySet()) {
            Container container = mapEntry.getKey();
            // Create a filtered container
            // TODO In a future release, display matching types and inner-types, not only matching files
            delegatingFilterContainers.add(new DelegatingFilterContainer(container, getOuterEntries(mapEntry.getValue())));
        }

        Consumer<URI> selectedEntryCallback = uri -> onLocationSelected(delegatingFilterContainers, uri, selectedLocationCallback);

        selectLocationView.show(location, delegatingFilterContainers, entries.size(), selectedEntryCallback, closeCallback);
    }

    protected Collection<Container.Entry> getOuterEntries(Collection<Container.Entry> entries) {
        HashMap<Container.Entry, Container.Entry> innerTypeEntryToOuterTypeEntry = new HashMap<>();
        HashSet<Container.Entry> outerEntriesSet = new HashSet<>();

        for (Container.Entry entry : entries) {
            Container.Entry outerTypeEntry = null;
            TypeFactory factory = TypeFactoryService.getInstance().get(entry);

            if (factory != null) {
                Type type = factory.make(api, entry, null);

                if ((type != null) && (type.getOuterName() != null)) {
                    outerTypeEntry = innerTypeEntryToOuterTypeEntry.get(entry);

                    if (outerTypeEntry == null) {
                        HashMap<String, Container.Entry> typeNameToEntry = new HashMap<>();
                        HashMap<String, String> innerTypeNameToOuterTypeName = new HashMap<>();

                        // Populate "typeNameToEntry" and "innerTypeNameToOuterTypeName"
                        for (Container.Entry e : entry.getParent().getChildren()) {
                            factory = TypeFactoryService.getInstance().get(e);

                            if (factory != null) {
                                type = factory.make(api, e, null);

                                if (type != null) {
                                    typeNameToEntry.put(type.getName(), e);
                                    if (type.getOuterName() != null) {
                                        innerTypeNameToOuterTypeName.put(type.getName(), type.getOuterName());
                                    }
                                }
                            }
                        }

                        // Search outer type entries and populate "innerTypeEntryToOuterTypeEntry"
                        for (Map.Entry<String, String> e : innerTypeNameToOuterTypeName.entrySet()) {
                            Container.Entry innerTypeEntry = typeNameToEntry.get(e.getKey());

                            if (innerTypeEntry != null) {
                                String outerTypeName = e.getValue();

                                for (;;) {
                                    String typeName = innerTypeNameToOuterTypeName.get(outerTypeName);
                                    if (typeName != null) {
                                        outerTypeName = typeName;
                                    } else {
                                        break;
                                    }
                                }

                                outerTypeEntry = typeNameToEntry.get(outerTypeName);

                                if (outerTypeEntry != null) {
                                    innerTypeEntryToOuterTypeEntry.put(innerTypeEntry, outerTypeEntry);
                                }
                            }
                        }

                        // Get outer type entry
                        outerTypeEntry = innerTypeEntryToOuterTypeEntry.get(entry);
                    }
                }
            }

            if (outerTypeEntry != null) {
                outerEntriesSet.add(outerTypeEntry);
            } else {
                outerEntriesSet.add(entry);
            }
        }

        // Return outer type entries sorted by path
        ArrayList<Container.Entry> result = new ArrayList<>(outerEntriesSet);

        result.sort(CONTAINER_ENTRY_COMPARATOR);

        return result;
    }

    protected void onLocationSelected(Set<DelegatingFilterContainer> delegatingFilterContainers, URI uri, Consumer<Container.Entry> selectedLocationCallback) {
        // Open the single entry uri
        Container.Entry entry = null;

        for (DelegatingFilterContainer container : delegatingFilterContainers) {
            entry = container.getEntry(uri);
            if (entry != null) {
                break;
            }
        }

        if (entry != null) {
            selectedLocationCallback.accept(entry);
        }
    }

    protected static class ContainerEntryComparator implements Comparator<Container.Entry> {
        @Override
        public int compare(Container.Entry e1, Container.Entry e2) {
            return e1.getPath().compareTo(e2.getPath());
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/model/configuration/Configuration.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.model.configuration;

import org.jd.gui.Constants;

import java.awt.*;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Configuration {
	protected Point mainWindowLocation;
    protected Dimension mainWindowSize;
    protected boolean mainWindowMaximize;
    protected String lookAndFeel;

    protected List<File> recentFiles = new ArrayList<>();

    protected File recentLoadDirectory;
    protected File recentSaveDirectory;

    protected Map<String, String> preferences = new HashMap<>();

    public Point getMainWindowLocation() {
        return mainWindowLocation;
    }

    public Dimension getMainWindowSize() {
        return mainWindowSize;
    }

    public boolean isMainWindowMaximize() {
        return mainWindowMaximize;
    }

    public String getLookAndFeel() {
        return lookAndFeel;
    }

    public List<File> getRecentFiles() {
        return recentFiles;
    }

    public File getRecentLoadDirectory() {
        return recentLoadDirectory;
    }

    public File getRecentSaveDirectory() {
        return recentSaveDirectory;
    }

    public Map<String, String> getPreferences() {
        return preferences;
    }

    public void setMainWindowLocation(Point mainWindowLocation) {
        this.mainWindowLocation = mainWindowLocation;
    }

    public void setMainWindowSize(Dimension mainWindowSize) {
        this.mainWindowSize = mainWindowSize;
    }

    public void setMainWindowMaximize(boolean mainWindowMaximize) {
        this.mainWindowMaximize = mainWindowMaximize;
    }

    public void setLookAndFeel(String lookAndFeel) {
        this.lookAndFeel = lookAndFeel;
    }

    public void setRecentFiles(List<File> recentFiles) {
        this.recentFiles = recentFiles;
    }

    public void setRecentLoadDirectory(File recentLoadDirectory) {
        this.recentLoadDirectory = recentLoadDirectory;
    }

    public void setRecentSaveDirectory(File recentSaveDirectory) {
        this.recentSaveDirectory = recentSaveDirectory;
    }

    public void setPreferences(Map<String, String> preferences) {
        this.preferences = preferences;
    }

    public void addRecentFile(File file) {
        recentFiles.remove(file);
        recentFiles.add(0, file);
        if (recentFiles.size() > Constants.MAX_RECENT_FILES) {
            recentFiles.remove(Constants.MAX_RECENT_FILES);
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/model/container/DelegatingFilterContainer.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.model.container;

import org.jd.gui.api.model.Container;

import java.io.InputStream;
import java.net.URI;
import java.util.*;

public class DelegatingFilterContainer implements Container {
    protected static final URI DEFAULT_ROOT_URI = URI.create("file:.");

    protected Container container;
    protected DelegatedEntry root;

    protected Set<URI> validEntries = new HashSet<>();
    protected Map<URI, DelegatedEntry> uriToDelegatedEntry = new HashMap<>();
    protected Map<URI, DelegatedContainer> uriToDelegatedContainer = new HashMap<>();

    public DelegatingFilterContainer(Container container, Collection<Entry> entries) {
        this.container = container;
        this.root = getDelegatedEntry(container.getRoot());

        for (Entry entry : entries) {
            while ((entry != null) && !validEntries.contains(entry.getUri())) {
                validEntries.add(entry.getUri());
                entry = entry.getParent();
            }
        }
    }

    @Override public String getType() { return container.getType(); }
    @Override public Container.Entry getRoot() { return root; }

    public Container.Entry getEntry(URI uri) { return uriToDelegatedEntry.get(uri); }
    public Set<URI> getUris() { return validEntries; }

    protected DelegatedEntry getDelegatedEntry(Container.Entry entry) {
        URI uri = entry.getUri();
        DelegatedEntry delegatedEntry = uriToDelegatedEntry.get(uri);
        if (delegatedEntry == null) {
            uriToDelegatedEntry.put(uri, delegatedEntry =new DelegatedEntry(entry));
        }
        return delegatedEntry;
    }

    protected DelegatedContainer getDelegatedContainer(Container container) {
        Entry root = container.getRoot();
        URI uri = (root == null) ? DEFAULT_ROOT_URI : root.getUri();
        DelegatedContainer delegatedContainer = uriToDelegatedContainer.get(uri);
        if (delegatedContainer == null) {
            uriToDelegatedContainer.put(uri, delegatedContainer =new DelegatedContainer(container));
        }
        return delegatedContainer;
    }

    protected class DelegatedEntry implements Entry, Comparable<DelegatedEntry> {
        protected Entry entry;
        protected Collection<Entry> children;

        public DelegatedEntry(Entry entry) {
            this.entry = entry;
        }

        @Override public Container getContainer() { return getDelegatedContainer(entry.getContainer()); }
        @Override public Entry getParent() { return getDelegatedEntry(entry.getParent()); }
        @Override public URI getUri() { return entry.getUri(); }
        @Override public String getPath() { return entry.getPath(); }
        @Override public boolean isDirectory() { return entry.isDirectory(); }
        @Override public long length() { return entry.length(); }
        @Override public InputStream getInputStream() { return entry.getInputStream(); }

        @Override
        public Collection<Entry> getChildren() {
            if (children == null) {
                children = new ArrayList<>();
                for (Entry child : entry.getChildren()) {
                    if (validEntries.contains(child.getUri())) {
                        children.add(getDelegatedEntry(child));
                    }
                }
            }
            return children;
        }

        @Override
        public int compareTo(DelegatedEntry other) {
            if (entry.isDirectory()) {
                if (!other.isDirectory()) {
                    return -1;
                }
            } else {
                if (other.isDirectory()) {
                    return 1;
                }
            }
            return entry.getPath().compareTo(other.getPath());
        }
    }

    protected class DelegatedContainer implements Container {
        protected Container container;

        public DelegatedContainer(Container container) {
            this.container = container;
        }

        @Override public String getType() { return container.getType(); }
        @Override public Entry getRoot() { return getDelegatedEntry(container.getRoot()); }
    }
}

================================================
FILE: app/src/main/java/org/jd/gui/model/history/History.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.model.history;

import java.net.URI;
import java.util.ArrayList;

public class History {
    protected URI            current = null;
    protected ArrayList<URI> backward = new ArrayList<>();
    protected ArrayList<URI> forward = new ArrayList<>();

    public void add(URI uri) {
        if (current == null) {
            // Init history
            forward.clear();
            current = uri;
            return;
        }

        if (current.equals(uri)) {
            // Already stored -> Nothing to do
            return;
        }

        if (uri.getPath().toString().equals(current.getPath().toString())) {
            if ((uri.getFragment() == null) && (uri.getQuery() == null)) {
                // Ignore
            } else if ((current.getFragment() == null) && (current.getQuery() == null)) {
                // Replace current URI
                current = uri;
            } else {
                // Store URI
                forward.clear();
                backward.add(current);
                current = uri;
            }
            return;
        }

        if (uri.toString().startsWith(current.toString())) {
            // Replace current URI
            current = uri;
            return;
        }

        if (current.toString().startsWith(uri.toString())) {
            // Parent URI -> Nothing to do
            return;
        }

        // Store URI
        forward.clear();
        backward.add(current);
        current = uri;
    }

    public URI backward() {
        if (! backward.isEmpty()) {
            forward.add(current);
            int size = backward.size();
            current = backward.remove(size-1);
        }
        return current;
    }

    public URI forward() {
        if (! forward.isEmpty()) {
            backward.add(current);
            int size = forward.size();
            current = forward.remove(size-1);
        }
        return current;
    }

    public boolean canBackward() { return !backward.isEmpty(); }
    public boolean canForward() { return !forward.isEmpty(); }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/actions/ContextualActionsFactoryService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.actions;

import org.jd.gui.api.API;
import org.jd.gui.api.model.Container;
import org.jd.gui.service.extension.ExtensionService;
import org.jd.gui.spi.ContextualActionsFactory;

import javax.swing.*;
import java.util.*;

public class ContextualActionsFactoryService {
    protected static final ContextualActionsFactoryService CONTEXTUAL_ACTIONS_FACTORY_SERVICE = new ContextualActionsFactoryService();

    public static ContextualActionsFactoryService getInstance() { return CONTEXTUAL_ACTIONS_FACTORY_SERVICE; }

    protected static final ActionNameComparator COMPARATOR = new ActionNameComparator();

    protected final Collection<ContextualActionsFactory> providers = ExtensionService.getInstance().load(ContextualActionsFactory.class);

    public Collection<Action> get(API api, Container.Entry entry, String fragment) {
        HashMap<String, ArrayList<Action>> mapActions = new HashMap<>();

        for (ContextualActionsFactory provider : providers) {
            Collection<Action> actions = provider.make(api, entry, fragment);

            for (Action action : actions) {
                String groupName = (String)action.getValue(ContextualActionsFactory.GROUP_NAME);
                ArrayList<Action> list = mapActions.get(groupName);

                if (list == null) {
                    mapActions.put(groupName, list=new ArrayList<>());
                }

                list.add(action);
            }
        }

        if (!mapActions.isEmpty()) {
            ArrayList<Action> result = new ArrayList<>();

            // Sort by group names
            ArrayList<String> groupNames = new ArrayList<>(mapActions.keySet());
            Collections.sort(groupNames);

            for (String groupName : groupNames) {
                if (! result.isEmpty()) {
                    // Add 'null' to mark a separator
                    result.add(null);
                }
                // Sort by names
                ArrayList<Action> actions = mapActions.get(groupName);
                Collections.sort(actions, COMPARATOR);
                result.addAll(actions);
            }

            return result;
        } else {
            return Collections.emptyList();
        }
    }

    protected static class ActionNameComparator implements Comparator<Action> {
        @Override
        public int compare(Action a1, Action a2) {
            String n1 = (String)a1.getValue(Action.NAME);
            if (n1 == null) {
                n1 = "";
            }

            String n2 = (String)a2.getValue(Action.NAME);
            if (n2 == null) {
                n2 = "";
            }

            return n1.compareTo(n2);
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/configuration/ConfigurationPersister.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.configuration;

import org.jd.gui.model.configuration.Configuration;

public interface ConfigurationPersister {
    Configuration load();

    void save(Configuration configuration);
}


================================================
FILE: app/src/main/java/org/jd/gui/service/configuration/ConfigurationPersisterService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.configuration;

public class ConfigurationPersisterService {
    protected static final ConfigurationPersisterService CONFIGURATION_PERSISTER_SERVICE = new ConfigurationPersisterService();

    protected ConfigurationPersister provider = new ConfigurationXmlPersisterProvider();

    public static ConfigurationPersisterService getInstance() { return CONFIGURATION_PERSISTER_SERVICE; }

    protected ConfigurationPersisterService() {}

    public ConfigurationPersister get() {
        return provider;
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.configuration;

import org.jd.gui.Constants;
import org.jd.gui.model.configuration.Configuration;
import org.jd.gui.service.platform.PlatformService;
import org.jd.gui.util.exception.ExceptionUtil;

import javax.swing.*;
import javax.xml.stream.*;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.*;
import java.util.List;
import java.util.jar.Manifest;

public class ConfigurationXmlPersisterProvider implements ConfigurationPersister {
    protected static final String ERROR_BACKGROUND_COLOR = "JdGuiPreferences.errorBackgroundColor";
    protected static final String JD_CORE_VERSION = "JdGuiPreferences.jdCoreVersion";

    protected static final File FILE = getConfigFile();

    protected static File getConfigFile() {
        String configFilePath = System.getProperty(Constants.CONFIG_FILENAME);

        if (configFilePath != null) {
            File configFile = new File(configFilePath);
            if (configFile.exists()) {
                return configFile;
            }
        }

        if (PlatformService.getInstance().isLinux()) {
            // See: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
            String xdgConfigHome = System.getenv("XDG_CONFIG_HOME");
            if (xdgConfigHome != null) {
                File xdgConfigHomeFile = new File(xdgConfigHome);
                if (xdgConfigHomeFile.exists()) {
                    return new File(xdgConfigHomeFile, Constants.CONFIG_FILENAME);
                }
            }

            File userConfigFile = new File(System.getProperty("user.home"), ".config");
            if (userConfigFile.exists()) {
                return new File(userConfigFile, Constants.CONFIG_FILENAME);
            }
        } else if (PlatformService.getInstance().isWindows()) {
            // See: http://blogs.msdn.com/b/patricka/archive/2010/03/18/where-should-i-store-my-data-and-configuration-files-if-i-target-multiple-os-versions.aspx
            String roamingConfigHome = System.getenv("APPDATA");
            if (roamingConfigHome != null) {
                File roamingConfigHomeFile = new File(roamingConfigHome);
                if (roamingConfigHomeFile.exists()) {
                    return new File(roamingConfigHomeFile, Constants.CONFIG_FILENAME);
                }
            }
        }

        return new File(Constants.CONFIG_FILENAME);
    }

    @Override
    public Configuration load() {
        // Default values
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

        int w = (screenSize.width>Constants.DEFAULT_WIDTH) ? Constants.DEFAULT_WIDTH : screenSize.width;
        int h = (screenSize.height>Constants.DEFAULT_HEIGHT) ? Constants.DEFAULT_HEIGHT : screenSize.height;
        int x = (screenSize.width-w)/2;
        int y = (screenSize.height-h)/2;

        Configuration config = new Configuration();
        config.setMainWindowLocation(new Point(x, y));
        config.setMainWindowSize(new Dimension(w, h));
        config.setMainWindowMaximize(false);

        String defaultLaf = System.getProperty("swing.defaultlaf");

        config.setLookAndFeel((defaultLaf != null) ? defaultLaf : UIManager.getSystemLookAndFeelClassName());

        File recentSaveDirectory = new File(System.getProperty("user.dir"));

        config.setRecentLoadDirectory(recentSaveDirectory);
        config.setRecentSaveDirectory(recentSaveDirectory);

        if (FILE.exists()) {
            try (FileInputStream fis = new FileInputStream(FILE)) {
                XMLStreamReader reader = XMLInputFactory.newInstance().createXMLStreamReader(fis);

                // Load values
                String name = "";
                Stack<String> names = new Stack<>();
                List<File> recentFiles = new ArrayList<>();
                boolean maximize = false;
                Map<String, String> preferences = config.getPreferences();

                while (reader.hasNext()) {
                    switch (reader.next()) {
                        case XMLStreamConstants.START_ELEMENT:
                            names.push(name);
                            name += '/' + reader.getLocalName();
                            switch (name) {
                                case "/configuration/gui/mainWindow/location":
                                    x = Integer.parseInt(reader.getAttributeValue(null, "x"));
                                    y = Integer.parseInt(reader.getAttributeValue(null, "y"));
                                    break;
                                case "/configuration/gui/mainWindow/size":
                                    w = Integer.parseInt(reader.getAttributeValue(null, "w"));
                                    h = Integer.parseInt(reader.getAttributeValue(null, "h"));
                                    break;
                            }
                            break;
                        case XMLStreamConstants.END_ELEMENT:
                            name = names.pop();
                            break;
                        case XMLStreamConstants.CHARACTERS:
                            switch (name) {
                                case "/configuration/recentFilePaths/filePath":
                                    File file = new File(reader.getText().trim());
                                    if (file.exists()) {
                                        recentFiles.add(file);
                                    }
                                    break;
                                case "/configuration/recentDirectories/loadPath":
                                    file = new File(reader.getText().trim());
                                    if (file.exists()) {
                                        config.setRecentLoadDirectory(file);
                                    }
                                    break;
                                case "/configuration/recentDirectories/savePath":
                                    file = new File(reader.getText().trim());
                                    if (file.exists()) {
                                        config.setRecentSaveDirectory(file);
                                    }
                                    break;
                                case "/configuration/gui/lookAndFeel":
                                    config.setLookAndFeel(reader.getText().trim());
                                    break;
                                case "/configuration/gui/mainWindow/maximize":
                                    maximize = Boolean.parseBoolean(reader.getText().trim());
                                    break;
                                default:
                                    if (name.startsWith("/configuration/preferences/")) {
                                        String key = name.substring("/configuration/preferences/".length());
                                        preferences.put(key, reader.getText().trim());
                                    }
                                    break;
                            }
                            break;
                    }
                }

                if (recentFiles.size() > Constants.MAX_RECENT_FILES) {
                    // Truncate
                    recentFiles = recentFiles.subList(0, Constants.MAX_RECENT_FILES);
                }
                config.setRecentFiles(recentFiles);

                if ((x >= 0) && (y >= 0) && (x + w < screenSize.width) && (y + h < screenSize.height)) {
                    // Update preferences
                    config.setMainWindowLocation(new Point(x, y));
                    config.setMainWindowSize(new Dimension(w, h));
                    config.setMainWindowMaximize(maximize);
                }

                reader.close();
            } catch (Exception e) {
                assert ExceptionUtil.printStackTrace(e);
            }
        }

        if (! config.getPreferences().containsKey(ERROR_BACKGROUND_COLOR)) {
            config.getPreferences().put(ERROR_BACKGROUND_COLOR, "0xFF6666");
        }

        config.getPreferences().put(JD_CORE_VERSION, getJdCoreVersion());

        return config;
    }

    protected String getJdCoreVersion() {
        try {
            Enumeration<URL> enumeration = ConfigurationXmlPersisterProvider.class.getClassLoader().getResources("META-INF/MANIFEST.MF");

            while (enumeration.hasMoreElements()) {
                try (InputStream is = enumeration.nextElement().openStream()) {
                    String attribute = new Manifest(is).getMainAttributes().getValue("JD-Core-Version");
                    if (attribute != null) {
                        return attribute;
                    }
                }
            }
        } catch (IOException e) {
            assert ExceptionUtil.printStackTrace(e);
        }

        return "SNAPSHOT";
    }

    @Override
    public void save(Configuration configuration) {
        Point l = configuration.getMainWindowLocation();
        Dimension s = configuration.getMainWindowSize();

        try (FileOutputStream fos = new FileOutputStream(FILE)) {
            XMLStreamWriter writer = XMLOutputFactory.newInstance().createXMLStreamWriter(fos);

            // Save values
            writer.writeStartDocument();
            writer.writeCharacters("\n");
            writer.writeStartElement("configuration");
            writer.writeCharacters("\n\t");

            writer.writeStartElement("gui");
            writer.writeCharacters("\n\t\t");
                writer.writeStartElement("mainWindow");
                writer.writeCharacters("\n\t\t\t");
                    writer.writeStartElement("location");
                        writer.writeAttribute("x", String.valueOf(l.x));
                        writer.writeAttribute("y", String.valueOf(l.y));
                    writer.writeEndElement();
                    writer.writeCharacters("\n\t\t\t");
                    writer.writeStartElement("size");
                        writer.writeAttribute("w", String.valueOf(s.width));
                        writer.writeAttribute("h", String.valueOf(s.height));
                    writer.writeEndElement();
                    writer.writeCharacters("\n\t\t\t");
                    writer.writeStartElement("maximize");
                        writer.writeCharacters(String.valueOf(configuration.isMainWindowMaximize()));
                    writer.writeEndElement();
                    writer.writeCharacters("\n\t\t");
                writer.writeEndElement();
                writer.writeCharacters("\n\t\t");
                writer.writeStartElement("lookAndFeel");
                    writer.writeCharacters(configuration.getLookAndFeel());
                writer.writeEndElement();
                writer.writeCharacters("\n\t");
            writer.writeEndElement();
            writer.writeCharacters("\n\t");

            writer.writeStartElement("recentFilePaths");

            for (File recentFile : configuration.getRecentFiles()) {
                writer.writeCharacters("\n\t\t");
                writer.writeStartElement("filePath");
                    writer.writeCharacters(recentFile.getAbsolutePath());
                writer.writeEndElement();
            }

            writer.writeCharacters("\n\t");
            writer.writeEndElement();
            writer.writeCharacters("\n\t");

            writer.writeStartElement("recentDirectories");
            writer.writeCharacters("\n\t\t");
                writer.writeStartElement("loadPath");
                    writer.writeCharacters(configuration.getRecentLoadDirectory().getAbsolutePath());
                writer.writeEndElement();
                writer.writeCharacters("\n\t\t");
                writer.writeStartElement("savePath");
                    writer.writeCharacters(configuration.getRecentSaveDirectory().getAbsolutePath());
                writer.writeEndElement();
                writer.writeCharacters("\n\t");
            writer.writeEndElement();
            writer.writeCharacters("\n\t");

            writer.writeStartElement("preferences");

            for (Map.Entry<String, String> preference : configuration.getPreferences().entrySet()) {
                writer.writeCharacters("\n\t\t");
                writer.writeStartElement(preference.getKey());
                    writer.writeCharacters(preference.getValue());
                writer.writeEndElement();
            }

            writer.writeCharacters("\n\t");
            writer.writeEndElement();
            writer.writeCharacters("\n");

            writer.writeEndElement();
            writer.writeEndDocument();
            writer.close();
        } catch (Exception e) {
            assert ExceptionUtil.printStackTrace(e);
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/container/ContainerFactoryService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.container;

import org.jd.gui.api.API;
import org.jd.gui.service.extension.ExtensionService;
import org.jd.gui.spi.ContainerFactory;

import java.nio.file.Path;
import java.util.Collection;

public class ContainerFactoryService {
    protected static final ContainerFactoryService CONTAINER_FACTORY_SERVICE = new ContainerFactoryService();

    public static ContainerFactoryService getInstance() { return CONTAINER_FACTORY_SERVICE; }

    protected final Collection<ContainerFactory> providers = ExtensionService.getInstance().load(ContainerFactory.class);

    public ContainerFactory get(API api, Path rootPath) {
        for (ContainerFactory containerFactory : providers) {
            if (containerFactory.accept(api, rootPath)) {
                return containerFactory;
            }
        }

        return null;
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/extension/ExtensionService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.extension;

import org.jd.gui.util.exception.ExceptionUtil;

import java.io.File;
import java.net.URI;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.*;

public class ExtensionService {
    protected static final ExtensionService EXTENSION_SERVICE = new ExtensionService();
    protected static final UrlComparator URL_COMPARATOR = new UrlComparator();

    protected ClassLoader extensionClassLoader;

    public static ExtensionService getInstance() {
        return EXTENSION_SERVICE;
    }

    protected ExtensionService() {
        try {
            URI jarUri = ExtensionService.class.getProtectionDomain().getCodeSource().getLocation().toURI();
            File baseDirectory = new File(jarUri).getParentFile();
            File extDirectory = new File(baseDirectory, "ext");

            if (extDirectory.exists() && extDirectory.isDirectory()) {
                ArrayList<URL> urls = new ArrayList<>();

                searchJarAndMetaInf(urls, extDirectory);

                if (!urls.isEmpty()) {
                    URL[] array = urls.toArray(new URL[urls.size()]);
                    Arrays.sort(array, URL_COMPARATOR);
                    extensionClassLoader = new URLClassLoader(array, ExtensionService.class.getClassLoader());
                }
            }
        } catch (Exception e) {
            assert ExceptionUtil.printStackTrace(e);
        }

        extensionClassLoader = ExtensionService.class.getClassLoader();
    }

    protected void searchJarAndMetaInf(List<URL> urls, File directory) throws Exception {
        File metaInf = new File(directory, "META-INF");

        if (metaInf.exists() && metaInf.isDirectory()) {
            urls.add(directory.toURI().toURL());
        } else {
            for (File child : directory.listFiles()) {
                if (child.isDirectory()) {
                    searchJarAndMetaInf(urls, child);
                } else if (child.getName().toLowerCase().endsWith(".jar")) {
                    urls.add(new URL("jar", "", child.toURI().toURL().toString() + "!/"));
                }
            }
        }
    }

    public <T> Collection<T> load(Class<T> service) {
        ArrayList<T> list = new ArrayList<>();
        Iterator<T> iterator = ServiceLoader.load(service, extensionClassLoader).iterator();

        while (iterator.hasNext()) {
            list.add(iterator.next());
        }

        return list;
    }

    protected static class UrlComparator implements Comparator<URL> {
        @Override
        public int compare(URL url1, URL url2) {
            return url1.getPath().compareTo(url2.getPath());
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/fileloader/FileLoaderService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.fileloader;

import org.jd.gui.api.API;
import org.jd.gui.service.extension.ExtensionService;
import org.jd.gui.spi.FileLoader;

import java.io.File;
import java.util.Collection;
import java.util.HashMap;

public class FileLoaderService {
    protected static final FileLoaderService FILE_LOADER_SERVICE = new FileLoaderService();

    public static FileLoaderService getInstance() { return FILE_LOADER_SERVICE; }

    protected final Collection<FileLoader> providers = ExtensionService.getInstance().load(FileLoader.class);

    protected HashMap<String, FileLoader> mapProviders = new HashMap<>();

    protected FileLoaderService() {
        for (FileLoader provider : providers) {
            for (String extension : provider.getExtensions()) {
                mapProviders.put(extension, provider);
            }
        }
    }

    public FileLoader get(API api, File file) {
        String name = file.getName();
        int lastDot = name.lastIndexOf('.');
        String extension = name.substring(lastDot+1);
        FileLoader provider = mapProviders.get(extension);
        return provider;
    }

    public HashMap<String, FileLoader> getMapProviders() {
        return mapProviders;
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/indexer/IndexerService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.indexer;

import org.jd.gui.api.model.Container;
import org.jd.gui.service.extension.ExtensionService;
import org.jd.gui.spi.Indexer;

import java.util.Collection;
import java.util.HashMap;

public class IndexerService {
    protected static final IndexerService INDEXER_SERVICE = new IndexerService();

    public static IndexerService getInstance() { return INDEXER_SERVICE; }

    protected HashMap<String, Indexers> mapProviders = new HashMap<>();

    protected IndexerService() {
        Collection<Indexer> providers = ExtensionService.getInstance().load(Indexer.class);

        for (Indexer provider : providers) {
            for (String selector : provider.getSelectors()) {
                Indexers indexers = mapProviders.get(selector);

                if (indexers == null) {
                    mapProviders.put(selector, indexers=new Indexers());
                }

                indexers.add(provider);
            }
        }
    }

    public Indexer get(Container.Entry entry) {
        Indexer indexer = get(entry.getContainer().getType(), entry);
        return (indexer != null) ? indexer : get("*", entry);
    }

    protected Indexer get(String containerType, Container.Entry entry) {
        String path = entry.getPath();
        String type = entry.isDirectory() ? "dir" : "file";
        String prefix = containerType + ':' + type;
        Indexer indexer = null;
        Indexers indexers = mapProviders.get(prefix + ':' + path);

        if (indexers != null) {
            indexer = indexers.match(path);
        }

        if (indexer == null) {
            int lastSlashIndex = path.lastIndexOf('/');
            String name = path.substring(lastSlashIndex+1);

            indexers = mapProviders.get(prefix + ":*/" + name);
            if (indexers != null) {
                indexer = indexers.match(path);
            }

            if (indexer == null) {
                int index = name.lastIndexOf('.');

                if (index != -1) {
                    String extension = name.substring(index + 1);

                    indexers = mapProviders.get(prefix + ":*." + extension);
                    if (indexers != null) {
                        indexer = indexers.match(path);
                    }
                }

                if (indexer == null) {
                    indexers = mapProviders.get(prefix + ":*");
                    if (indexers != null) {
                        indexer = indexers.match(path);
                    }
                }
            }
        }

        return indexer;
    }

    protected static class Indexers {
        protected HashMap<String, Indexer> indexers = new HashMap<>();
        protected Indexer defaultIndexer;

        public void add(Indexer indexer) {
            if (indexer.getPathPattern() != null) {
                indexers.put(indexer.getPathPattern().pattern(), indexer);
            } else {
                defaultIndexer = indexer;
            }
        }

        public Indexer match(String path) {
            for (Indexer indexer : indexers.values()) {
                if (indexer.getPathPattern().matcher(path).matches()) {
                    return indexer;
                }
            }
            return defaultIndexer;
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/mainpanel/ContainerPanelFactoryProvider.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.mainpanel;

import org.jd.gui.api.API;
import org.jd.gui.api.feature.ContentIndexable;
import org.jd.gui.api.feature.SourcesSavable;
import org.jd.gui.api.feature.UriGettable;
import org.jd.gui.api.model.Container;
import org.jd.gui.api.model.Indexes;
import org.jd.gui.spi.Indexer;
import org.jd.gui.spi.PanelFactory;
import org.jd.gui.spi.SourceSaver;
import org.jd.gui.spi.TreeNodeFactory;
import org.jd.gui.util.exception.ExceptionUtil;
import org.jd.gui.view.component.panel.TreeTabbedPanel;

import javax.swing.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.*;

public class ContainerPanelFactoryProvider implements PanelFactory {
    protected static final String[] TYPES = { "default" };

	@Override public String[] getTypes() { return TYPES; }

    @Override
    @SuppressWarnings("unchecked")
    public <T extends JComponent & UriGettable> T make(API api, Container container) {
        return (T)new ContainerPanel(api, container);
	}

    protected class ContainerPanel extends TreeTabbedPanel implements ContentIndexable, SourcesSavable {
        protected Container.Entry entry;

        public ContainerPanel(API api, Container container) {
            super(api, container.getRoot().getParent().getUri());

            this.entry = container.getRoot().getParent();

            DefaultMutableTreeNode root = new DefaultMutableTreeNode();

            for (Container.Entry entry : container.getRoot().getChildren()) {
                TreeNodeFactory factory = api.getTreeNodeFactory(entry);
                if (factory != null) {
                    root.add(factory.make(api, entry));
                }
            }

            tree.setModel(new DefaultTreeModel(root));
        }

        // --- ContentIndexable --- //
        @Override
        public Indexes index(API api) {
            HashMap<String, Map<String, Collection>> map = new HashMap<>();
            DelegatedMapMapWithDefault mapWithDefault = new DelegatedMapMapWithDefault(map);

            // Index populating value automatically
            Indexes indexesWithDefault = name -> mapWithDefault.get(name);

            // Index entry
            Indexer indexer = api.getIndexer(entry);

            if (indexer != null) {
                indexer.index(api, entry, indexesWithDefault);
            }

            // To prevent memory leaks, return an index without the 'populate' behaviour
            return name -> map.get(name);
        }

        // --- SourcesSavable --- //
        @Override
        public String getSourceFileName() {
            SourceSaver saver = api.getSourceSaver(entry);

            if (saver != null) {
                String path = saver.getSourcePath(entry);
                int index = path.lastIndexOf('/');
                return path.substring(index+1);
            } else {
                return null;
            }
        }

        @Override
        public int getFileCount() {
            SourceSaver saver = api.getSourceSaver(entry);
            return (saver != null) ? saver.getFileCount(api, entry) : 0;
        }

        @Override
        public void save(API api, Controller controller, Listener listener, Path path) {
            try {
                Path parentPath = path.getParent();

                if ((parentPath != null) && !Files.exists(parentPath)) {
                    Files.createDirectories(parentPath);
                }

                URI uri = path.toUri();
                URI archiveUri = new URI("jar:" + uri.getScheme(), uri.getHost(), uri.getPath() + "!/", null);

                try (FileSystem archiveFs = FileSystems.newFileSystem(archiveUri, Collections.singletonMap("create", "true"))) {
                    Path archiveRootPath = archiveFs.getPath("/");
                    SourceSaver saver = api.getSourceSaver(entry);

                    if (saver != null) {
                        saver.saveContent(
                            api,
                            () -> controller.isCancelled(),
                            (p) -> listener. pathSaved(p),
                            archiveRootPath, archiveRootPath, entry);
                    }
                }
            } catch (URISyntaxException|IOException e) {
                assert ExceptionUtil.printStackTrace(e);
            }
        }
    }

    protected static class DelegatedMap<K, V> implements Map<K, V> {
        protected Map<K, V> map;

        public DelegatedMap(Map<K, V> map) { this.map = map; }

        @Override public int size() { return map.size(); }
        @Override public boolean isEmpty() { return map.isEmpty(); }
        @Override public boolean containsKey(Object o) { return map.containsKey(o); }
        @Override public boolean containsValue(Object o) { return map.containsValue(o); }
        @Override public V get(Object o) { return map.get(o); }
        @Override public V put(K k, V v) { return map.put(k, v); }
        @Override public V remove(Object o) { return map.remove(o); }
        @Override public void putAll(Map<? extends K, ? extends V> map) { this.map.putAll(map); }
        @Override public void clear() { map.clear(); }
        @Override public Set<K> keySet() { return map.keySet(); }
        @Override public Collection<V> values() { return map.values(); }
        @Override public Set<Entry<K, V>> entrySet() { return map.entrySet(); }
        @Override public boolean equals(Object o) { return map.equals(o); }
        @Override public int hashCode() { return map.hashCode(); }
    }

    protected static class DelegatedMapWithDefault extends DelegatedMap<String, Collection> {
        public DelegatedMapWithDefault(Map<String, Collection> map) { super(map); }

        @Override public Collection get(Object o) {
            Collection value = map.get(o);
            if (value == null) {
                String key = o.toString();
                map.put(key, value=new ArrayList());
            }
            return value;
        }
    }

    protected static class DelegatedMapMapWithDefault extends DelegatedMap<String, Map<String, Collection>> {
	    protected HashMap<String, Map<String, Collection>> wrappers = new HashMap<>();

        public DelegatedMapMapWithDefault(Map<String, Map<String, Collection>> map) { super(map); }

        @Override public Map<String, Collection> get(Object o) {
            Map<String, Collection> value = wrappers.get(o);

            if (value == null) {
                String key = o.toString();
                HashMap<String, Collection> m = new HashMap<>();
                map.put(key, m);
                wrappers.put(key, value=new DelegatedMapWithDefault(m));
            }

            return value;
        }
    }
}


================================================
FILE: app/src/main/java/org/jd/gui/service/mainpanel/PanelFactoryService.java
================================================
/*
 * Copyright (c) 2008-2019 Emmanuel Dupuy.
 * This project is distributed under the GPLv3 license.
 * This is a Copyleft license that gives the user the right to use,
 * copy and modify the code freely for non-commercial purposes.
 */

package org.jd.gui.service.mainpanel;

import org.jd.gui.api.model.Container;
import org.jd.gui.service.extension.ExtensionService;
import org.jd.gui.spi.PanelFactory;

import java.util.Collection;
import java.util.HashMap;

public class PanelFactoryService {
    protected static final PanelFactoryService PANEL_FACTORY_SERVICE = new PanelFactoryService();

    public static PanelFactoryService getInstance() { return PANEL_FACTORY_SERVICE; }

    protected HashMap<String, PanelFactory> mapProviders = new HashMap<>();

    protected PanelFactoryService() {
        Collection<PanelFactory> providers = ExtensionService.getInstance().load(PanelFactory.class);

        for (Pan
Download .txt
gitextract_0mx2o5ea/

├── .gitattributes
├── .gitignore
├── LICENSE
├── NOTICE
├── README.md
├── api/
│   ├── build.gradle
│   └── src/
│       └── main/
│           └── java/
│               └── org/
│                   └── jd/
│                       └── gui/
│                           ├── api/
│                           │   ├── API.java
│                           │   ├── feature/
│                           │   │   ├── ContainerEntryGettable.java
│                           │   │   ├── ContentCopyable.java
│                           │   │   ├── ContentIndexable.java
│                           │   │   ├── ContentSavable.java
│                           │   │   ├── ContentSearchable.java
│                           │   │   ├── ContentSelectable.java
│                           │   │   ├── FocusedTypeGettable.java
│                           │   │   ├── IndexesChangeListener.java
│                           │   │   ├── LineNumberNavigable.java
│                           │   │   ├── PageChangeListener.java
│                           │   │   ├── PageChangeable.java
│                           │   │   ├── PageClosable.java
│                           │   │   ├── PageCreator.java
│                           │   │   ├── PreferencesChangeListener.java
│                           │   │   ├── SourcesSavable.java
│                           │   │   ├── TreeNodeExpandable.java
│                           │   │   ├── UriGettable.java
│                           │   │   └── UriOpenable.java
│                           │   └── model/
│                           │       ├── Container.java
│                           │       ├── Indexes.java
│                           │       ├── TreeNodeData.java
│                           │       └── Type.java
│                           └── spi/
│                               ├── ContainerFactory.java
│                               ├── ContextualActionsFactory.java
│                               ├── FileLoader.java
│                               ├── Indexer.java
│                               ├── PanelFactory.java
│                               ├── PasteHandler.java
│                               ├── PreferencesPanel.java
│                               ├── SourceLoader.java
│                               ├── SourceSaver.java
│                               ├── TreeNodeFactory.java
│                               ├── TypeFactory.java
│                               └── UriLoader.java
├── app/
│   ├── build.gradle
│   └── src/
│       └── main/
│           ├── java/
│           │   └── org/
│           │       └── jd/
│           │           └── gui/
│           │               ├── App.java
│           │               ├── Constants.java
│           │               ├── OsxApp.java
│           │               ├── controller/
│           │               │   ├── AboutController.java
│           │               │   ├── GoToController.java
│           │               │   ├── MainController.java
│           │               │   ├── OpenTypeController.java
│           │               │   ├── OpenTypeHierarchyController.java
│           │               │   ├── PreferencesController.java
│           │               │   ├── SaveAllSourcesController.java
│           │               │   ├── SearchInConstantPoolsController.java
│           │               │   └── SelectLocationController.java
│           │               ├── model/
│           │               │   ├── configuration/
│           │               │   │   └── Configuration.java
│           │               │   ├── container/
│           │               │   │   └── DelegatingFilterContainer.java
│           │               │   └── history/
│           │               │       └── History.java
│           │               ├── service/
│           │               │   ├── actions/
│           │               │   │   └── ContextualActionsFactoryService.java
│           │               │   ├── configuration/
│           │               │   │   ├── ConfigurationPersister.java
│           │               │   │   ├── ConfigurationPersisterService.java
│           │               │   │   └── ConfigurationXmlPersisterProvider.java
│           │               │   ├── container/
│           │               │   │   └── ContainerFactoryService.java
│           │               │   ├── extension/
│           │               │   │   └── ExtensionService.java
│           │               │   ├── fileloader/
│           │               │   │   └── FileLoaderService.java
│           │               │   ├── indexer/
│           │               │   │   └── IndexerService.java
│           │               │   ├── mainpanel/
│           │               │   │   ├── ContainerPanelFactoryProvider.java
│           │               │   │   └── PanelFactoryService.java
│           │               │   ├── pastehandler/
│           │               │   │   └── PasteHandlerService.java
│           │               │   ├── platform/
│           │               │   │   └── PlatformService.java
│           │               │   ├── preferencespanel/
│           │               │   │   ├── PreferencesPanelService.java
│           │               │   │   ├── UISingleInstancePreferencesProvider.java
│           │               │   │   └── UITabsPreferencesProvider.java
│           │               │   ├── sourceloader/
│           │               │   │   └── SourceLoaderService.java
│           │               │   ├── sourcesaver/
│           │               │   │   └── SourceSaverService.java
│           │               │   ├── treenode/
│           │               │   │   └── TreeNodeFactoryService.java
│           │               │   ├── type/
│           │               │   │   └── TypeFactoryService.java
│           │               │   └── uriloader/
│           │               │       └── UriLoaderService.java
│           │               ├── util/
│           │               │   ├── exception/
│           │               │   │   └── ExceptionUtil.java
│           │               │   ├── function/
│           │               │   │   └── TriConsumer.java
│           │               │   ├── net/
│           │               │   │   ├── InterProcessCommunicationUtil.java
│           │               │   │   └── UriUtil.java
│           │               │   └── swing/
│           │               │       └── SwingUtil.java
│           │               └── view/
│           │                   ├── AboutView.java
│           │                   ├── GoToView.java
│           │                   ├── MainView.java
│           │                   ├── OpenTypeHierarchyView.java
│           │                   ├── OpenTypeView.java
│           │                   ├── PreferencesView.java
│           │                   ├── SaveAllSourcesView.java
│           │                   ├── SearchInConstantPoolsView.java
│           │                   ├── SelectLocationView.java
│           │                   ├── bean/
│           │                   │   └── OpenTypeListCellBean.java
│           │                   ├── component/
│           │                   │   ├── IconButton.java
│           │                   │   ├── List.java
│           │                   │   ├── Tree.java
│           │                   │   └── panel/
│           │                   │       ├── MainTabbedPanel.java
│           │                   │       ├── TabbedPanel.java
│           │                   │       └── TreeTabbedPanel.java
│           │                   └── renderer/
│           │                       ├── OpenTypeListCellRenderer.java
│           │                       └── TreeNodeRenderer.java
│           └── resources/
│               └── META-INF/
│                   └── services/
│                       ├── org.jd.gui.spi.PanelFactory
│                       └── org.jd.gui.spi.PreferencesPanel
├── build.gradle
├── gradle/
│   └── wrapper/
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── services/
│   ├── build.gradle
│   └── src/
│       ├── main/
│       │   ├── antlr/
│       │   │   └── Java.g4
│       │   ├── java/
│       │   │   └── org/
│       │   │       ├── fife/
│       │   │       │   └── ui/
│       │   │       │       └── rtextarea/
│       │   │       │           └── Marker.java
│       │   │       └── jd/
│       │   │           └── gui/
│       │   │               ├── model/
│       │   │               │   └── container/
│       │   │               │       ├── ContainerEntryComparator.java
│       │   │               │       ├── EarContainer.java
│       │   │               │       ├── GenericContainer.java
│       │   │               │       ├── JarContainer.java
│       │   │               │       ├── JavaModuleContainer.java
│       │   │               │       ├── KarContainer.java
│       │   │               │       └── WarContainer.java
│       │   │               ├── service/
│       │   │               │   ├── actions/
│       │   │               │   │   ├── CopyQualifiedNameContextualActionsFactory.java
│       │   │               │   │   └── InvalidFormatException.java
│       │   │               │   ├── container/
│       │   │               │   │   ├── EarContainerFactoryProvider.java
│       │   │               │   │   ├── GenericContainerFactoryProvider.java
│       │   │               │   │   ├── JarContainerFactoryProvider.java
│       │   │               │   │   ├── JavaModuleContainerFactoryProvider.java
│       │   │               │   │   ├── KarContainerFactoryProvider.java
│       │   │               │   │   └── WarContainerFactoryProvider.java
│       │   │               │   ├── fileloader/
│       │   │               │   │   ├── AarFileLoaderProvider.java
│       │   │               │   │   ├── AbstractFileLoaderProvider.java
│       │   │               │   │   ├── AbstractTypeFileLoaderProvider.java
│       │   │               │   │   ├── ClassFileLoaderProvider.java
│       │   │               │   │   ├── EarFileLoaderProvider.java
│       │   │               │   │   ├── JarFileLoaderProvider.java
│       │   │               │   │   ├── JavaFileLoaderProvider.java
│       │   │               │   │   ├── JavaModuleFileLoaderProvider.java
│       │   │               │   │   ├── KarFileLoaderProvider.java
│       │   │               │   │   ├── LogFileLoaderProvider.java
│       │   │               │   │   ├── WarFileLoaderProvider.java
│       │   │               │   │   └── ZipFileLoaderProvider.java
│       │   │               │   ├── indexer/
│       │   │               │   │   ├── AbstractIndexerProvider.java
│       │   │               │   │   ├── ClassFileIndexerProvider.java
│       │   │               │   │   ├── DirectoryIndexerProvider.java
│       │   │               │   │   ├── EjbJarXmlFileIndexerProvider.java
│       │   │               │   │   ├── JavaFileIndexerProvider.java
│       │   │               │   │   ├── JavaModuleFileIndexerProvider.java
│       │   │               │   │   ├── JavaModuleInfoFileIndexerProvider.java
│       │   │               │   │   ├── MetainfServiceFileIndexerProvider.java
│       │   │               │   │   ├── TextFileIndexerProvider.java
│       │   │               │   │   ├── WebXmlFileIndexerProvider.java
│       │   │               │   │   ├── XmlBasedFileIndexerProvider.java
│       │   │               │   │   ├── XmlFileIndexerProvider.java
│       │   │               │   │   └── ZipFileIndexerProvider.java
│       │   │               │   ├── pastehandler/
│       │   │               │   │   └── LogPasteHandler.java
│       │   │               │   ├── preferencespanel/
│       │   │               │   │   ├── ClassFileDecompilerPreferencesProvider.java
│       │   │               │   │   ├── ClassFileSaverPreferencesProvider.java
│       │   │               │   │   ├── DirectoryIndexerPreferencesProvider.java
│       │   │               │   │   ├── MavenOrgSourceLoaderPreferencesProvider.java
│       │   │               │   │   └── ViewerPreferencesProvider.java
│       │   │               │   ├── sourceloader/
│       │   │               │   │   └── MavenOrgSourceLoaderProvider.java
│       │   │               │   ├── sourcesaver/
│       │   │               │   │   ├── AbstractSourceSaverProvider.java
│       │   │               │   │   ├── ClassFileSourceSaverProvider.java
│       │   │               │   │   ├── DirectorySourceSaverProvider.java
│       │   │               │   │   ├── FileSourceSaverProvider.java
│       │   │               │   │   ├── PackageSourceSaverProvider.java
│       │   │               │   │   └── ZipFileSourceSaverProvider.java
│       │   │               │   ├── treenode/
│       │   │               │   │   ├── AbstractTreeNodeFactoryProvider.java
│       │   │               │   │   ├── AbstractTypeFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ClassFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ClassesDirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── CssFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── DirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── DtdFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── EarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── EjbJarXmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── FileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── HtmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ImageFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavaFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavaModuleFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavaModulePackageTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JavascriptFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JsonFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── JspFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── KarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ManifestFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── MetainfDirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── MetainfServiceFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── ModuleInfoFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── PackageTreeNodeFactoryProvider.java
│       │   │               │   │   ├── PropertiesFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── SpiFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── SqlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── TextFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WarFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WarPackageTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WebXmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── WebinfLibDirectoryTreeNodeFactoryProvider.java
│       │   │               │   │   ├── XmlBasedFileTreeNodeFactoryProvider.java
│       │   │               │   │   ├── XmlFileTreeNodeFactoryProvider.java
│       │   │               │   │   └── ZipFileTreeNodeFactoryProvider.java
│       │   │               │   ├── type/
│       │   │               │   │   ├── AbstractTypeFactoryProvider.java
│       │   │               │   │   ├── ClassFileTypeFactoryProvider.java
│       │   │               │   │   └── JavaFileTypeFactoryProvider.java
│       │   │               │   └── uriloader/
│       │   │               │       └── FileUriLoaderProvider.java
│       │   │               ├── util/
│       │   │               │   ├── container/
│       │   │               │   │   └── JarContainerEntryUtil.java
│       │   │               │   ├── decompiler/
│       │   │               │   │   ├── ClassPathLoader.java
│       │   │               │   │   ├── ContainerLoader.java
│       │   │               │   │   ├── LineNumberStringBuilderPrinter.java
│       │   │               │   │   ├── NopPrinter.java
│       │   │               │   │   └── StringBuilderPrinter.java
│       │   │               │   ├── exception/
│       │   │               │   │   └── ExceptionUtil.java
│       │   │               │   ├── index/
│       │   │               │   │   └── IndexesUtil.java
│       │   │               │   ├── io/
│       │   │               │   │   ├── NewlineOutputStream.java
│       │   │               │   │   └── TextReader.java
│       │   │               │   ├── matcher/
│       │   │               │   │   └── DescriptorMatcher.java
│       │   │               │   ├── parser/
│       │   │               │   │   └── antlr/
│       │   │               │   │       ├── ANTLRJavaParser.java
│       │   │               │   │       └── AbstractJavaListener.java
│       │   │               │   └── xml/
│       │   │               │       └── AbstractXmlPathFinder.java
│       │   │               └── view/
│       │   │                   ├── component/
│       │   │                   │   ├── AbstractTextPage.java
│       │   │                   │   ├── ClassFilePage.java
│       │   │                   │   ├── CustomLineNumbersPage.java
│       │   │                   │   ├── DynamicPage.java
│       │   │                   │   ├── EjbJarXmlFilePage.java
│       │   │                   │   ├── HyperlinkPage.java
│       │   │                   │   ├── JavaFilePage.java
│       │   │                   │   ├── LogPage.java
│       │   │                   │   ├── ManifestFilePage.java
│       │   │                   │   ├── ModuleInfoFilePage.java
│       │   │                   │   ├── OneTypeReferencePerLinePage.java
│       │   │                   │   ├── RoundMarkErrorStrip.java
│       │   │                   │   ├── TextPage.java
│       │   │                   │   ├── TypePage.java
│       │   │                   │   ├── TypeReferencePage.java
│       │   │                   │   ├── WebXmlFilePage.java
│       │   │                   │   └── XmlFilePage.java
│       │   │                   └── data/
│       │   │                       └── TreeNodeBean.java
│       │   └── resources/
│       │       ├── META-INF/
│       │       │   └── services/
│       │       │       ├── org.jd.gui.spi.ContainerFactory
│       │       │       ├── org.jd.gui.spi.ContextualActionsFactory
│       │       │       ├── org.jd.gui.spi.FileLoader
│       │       │       ├── org.jd.gui.spi.Indexer
│       │       │       ├── org.jd.gui.spi.PasteHandler
│       │       │       ├── org.jd.gui.spi.PreferencesPanel
│       │       │       ├── org.jd.gui.spi.SourceLoader
│       │       │       ├── org.jd.gui.spi.SourceSaver
│       │       │       ├── org.jd.gui.spi.TreeNodeFactory
│       │       │       ├── org.jd.gui.spi.TypeFactory
│       │       │       └── org.jd.gui.spi.UriLoader
│       │       └── rsyntaxtextarea/
│       │           ├── RSyntaxTextArea_License.txt
│       │           └── themes/
│       │               └── eclipse.xml
│       └── test/
│           └── java/
│               └── org/
│                   └── jd/
│                       └── gui/
│                           ├── util/
│                           │   └── matcher/
│                           │       └── DescriptorMatcherTest.java
│                           └── view/
│                               └── component/
│                                   ├── ClassFilePageTest.java
│                                   └── JavaFilePageTest.java
├── settings.gradle
└── src/
    ├── linux/
    │   └── resources/
    │       └── jd-gui.desktop
    ├── osx/
    │   ├── dist/
    │   │   └── JD-GUI.app/
    │   │       └── Contents/
    │   │           └── Resources/
    │   │               └── jd-gui.icns
    │   └── resources/
    │       ├── Info.plist
    │       └── universalJavaApplicationStub.sh
    └── proguard/
        └── resources/
            └── proguard.config.txt
Download .txt
SYMBOL INDEX (1839 symbols across 222 files)

FILE: api/src/main/java/org/jd/gui/api/API.java
  type API (line 23) | public interface API {
    method openURI (line 24) | boolean openURI(URI uri);
    method openURI (line 26) | boolean openURI(int x, int y, Collection<Container.Entry> entries, Str...
    method addURI (line 28) | void addURI(URI uri);
    method addPanel (line 30) | <T extends JComponent & UriGettable> void addPanel(String title, Icon ...
    method getContextualActions (line 32) | Collection<Action> getContextualActions(Container.Entry entry, String ...
    method getUriLoader (line 34) | UriLoader getUriLoader(URI uri);
    method getFileLoader (line 36) | FileLoader getFileLoader(File file);
    method getContainerFactory (line 38) | ContainerFactory getContainerFactory(Path rootPath);
    method getMainPanelFactory (line 40) | PanelFactory getMainPanelFactory(Container container);
    method getTreeNodeFactory (line 42) | TreeNodeFactory getTreeNodeFactory(Container.Entry entry);
    method getTypeFactory (line 44) | TypeFactory getTypeFactory(Container.Entry entry);
    method getIndexer (line 46) | Indexer getIndexer(Container.Entry entry);
    method getSourceSaver (line 48) | SourceSaver getSourceSaver(Container.Entry entry);
    method getPreferences (line 50) | Map<String, String> getPreferences();
    method getCollectionOfFutureIndexes (line 52) | Collection<Future<Indexes>> getCollectionOfFutureIndexes();
    type LoadSourceListener (line 54) | interface LoadSourceListener {
      method sourceLoaded (line 55) | void sourceLoaded(String source);
    method getSource (line 58) | String getSource(Container.Entry entry);
    method loadSource (line 60) | void loadSource(Container.Entry entry, LoadSourceListener listener);
    method loadSourceFile (line 62) | File loadSourceFile(Container.Entry entry);

FILE: api/src/main/java/org/jd/gui/api/feature/ContainerEntryGettable.java
  type ContainerEntryGettable (line 12) | public interface ContainerEntryGettable {
    method getEntry (line 13) | Container.Entry getEntry();

FILE: api/src/main/java/org/jd/gui/api/feature/ContentCopyable.java
  type ContentCopyable (line 10) | public interface ContentCopyable {
    method copy (line 11) | void copy();

FILE: api/src/main/java/org/jd/gui/api/feature/ContentIndexable.java
  type ContentIndexable (line 13) | public interface ContentIndexable {
    method index (line 14) | Indexes index(API api);

FILE: api/src/main/java/org/jd/gui/api/feature/ContentSavable.java
  type ContentSavable (line 14) | public interface ContentSavable {
    method getFileName (line 15) | String getFileName();
    method save (line 17) | void save(API api, OutputStream os);

FILE: api/src/main/java/org/jd/gui/api/feature/ContentSearchable.java
  type ContentSearchable (line 10) | public interface ContentSearchable {
    method highlightText (line 11) | boolean highlightText(String text, boolean caseSensitive);
    method findNext (line 13) | void findNext(String text, boolean caseSensitive);
    method findPrevious (line 15) | void findPrevious(String text, boolean caseSensitive);

FILE: api/src/main/java/org/jd/gui/api/feature/ContentSelectable.java
  type ContentSelectable (line 10) | public interface ContentSelectable {
    method selectAll (line 11) | void selectAll();

FILE: api/src/main/java/org/jd/gui/api/feature/FocusedTypeGettable.java
  type FocusedTypeGettable (line 10) | public interface FocusedTypeGettable extends ContainerEntryGettable {
    method getFocusedTypeName (line 11) | String getFocusedTypeName();

FILE: api/src/main/java/org/jd/gui/api/feature/IndexesChangeListener.java
  type IndexesChangeListener (line 15) | public interface IndexesChangeListener {
    method indexesChanged (line 16) | void indexesChanged(Collection<Future<Indexes>> collectionOfFutureInde...

FILE: api/src/main/java/org/jd/gui/api/feature/LineNumberNavigable.java
  type LineNumberNavigable (line 10) | public interface LineNumberNavigable {
    method getMaximumLineNumber (line 11) | int getMaximumLineNumber();
    method goToLineNumber (line 13) | void goToLineNumber(int lineNumber);
    method checkLineNumber (line 15) | boolean checkLineNumber(int lineNumber);

FILE: api/src/main/java/org/jd/gui/api/feature/PageChangeListener.java
  type PageChangeListener (line 12) | public interface PageChangeListener {
    method pageChanged (line 13) | <T extends JComponent & UriGettable> void pageChanged(T page);

FILE: api/src/main/java/org/jd/gui/api/feature/PageChangeable.java
  type PageChangeable (line 10) | public interface PageChangeable {
    method addPageChangeListener (line 11) | void addPageChangeListener(PageChangeListener listener);

FILE: api/src/main/java/org/jd/gui/api/feature/PageClosable.java
  type PageClosable (line 10) | public interface PageClosable {
    method closePage (line 11) | boolean closePage();

FILE: api/src/main/java/org/jd/gui/api/feature/PageCreator.java
  type PageCreator (line 14) | public interface PageCreator {
    method createPage (line 15) | <T extends JComponent & UriGettable> T createPage(API api);

FILE: api/src/main/java/org/jd/gui/api/feature/PreferencesChangeListener.java
  type PreferencesChangeListener (line 12) | public interface PreferencesChangeListener {
    method preferencesChanged (line 13) | void preferencesChanged(Map<String, String> preferences);

FILE: api/src/main/java/org/jd/gui/api/feature/SourcesSavable.java
  type SourcesSavable (line 14) | public interface SourcesSavable {
    method getSourceFileName (line 15) | String getSourceFileName();
    method getFileCount (line 17) | int getFileCount();
    method save (line 19) | void save(API api, Controller controller, Listener listener, Path path);
    type Controller (line 21) | interface Controller {
      method isCancelled (line 22) | boolean isCancelled();
    type Listener (line 25) | interface Listener {
      method pathSaved (line 26) | void pathSaved(Path path);

FILE: api/src/main/java/org/jd/gui/api/feature/TreeNodeExpandable.java
  type TreeNodeExpandable (line 12) | public interface TreeNodeExpandable {
    method populateTreeNode (line 13) | void populateTreeNode(API api);

FILE: api/src/main/java/org/jd/gui/api/feature/UriGettable.java
  type UriGettable (line 12) | public interface UriGettable {
    method getUri (line 13) | URI getUri();

FILE: api/src/main/java/org/jd/gui/api/feature/UriOpenable.java
  type UriOpenable (line 64) | public interface UriOpenable {
    method openUri (line 65) | boolean openUri(URI uri);

FILE: api/src/main/java/org/jd/gui/api/model/Container.java
  type Container (line 14) | public interface Container {
    method getType (line 15) | String getType();
    method getRoot (line 17) | Entry getRoot();
    type Entry (line 22) | interface Entry {
      method getContainer (line 23) | Container getContainer();
      method getParent (line 25) | Entry getParent();
      method getUri (line 27) | URI getUri();
      method getPath (line 29) | String getPath();
      method isDirectory (line 31) | boolean isDirectory();
      method length (line 33) | long length();
      method getInputStream (line 35) | InputStream getInputStream();
      method getChildren (line 37) | Collection<Entry> getChildren();

FILE: api/src/main/java/org/jd/gui/api/model/Indexes.java
  type Indexes (line 66) | public interface Indexes {
    method getIndex (line 67) | Map<String, Collection> getIndex(String name);

FILE: api/src/main/java/org/jd/gui/api/model/TreeNodeData.java
  type TreeNodeData (line 12) | public interface TreeNodeData {
    method getLabel (line 13) | String getLabel();
    method getTip (line 15) | String getTip();
    method getIcon (line 17) | Icon getIcon();
    method getOpenIcon (line 19) | Icon getOpenIcon();

FILE: api/src/main/java/org/jd/gui/api/model/Type.java
  type Type (line 13) | public interface Type {
    method getFlags (line 25) | int getFlags();
    method getName (line 27) | String getName();
    method getSuperName (line 29) | String getSuperName();
    method getOuterName (line 31) | String getOuterName();
    method getDisplayTypeName (line 33) | String getDisplayTypeName();
    method getDisplayInnerTypeName (line 35) | String getDisplayInnerTypeName();
    method getDisplayPackageName (line 37) | String getDisplayPackageName();
    method getIcon (line 39) | Icon getIcon();
    method getInnerTypes (line 41) | Collection<Type> getInnerTypes();
    method getFields (line 43) | Collection<Field> getFields();
    method getMethods (line 45) | Collection<Method> getMethods();
    type Field (line 47) | interface Field {
      method getFlags (line 48) | int getFlags();
      method getName (line 50) | String getName();
      method getDescriptor (line 52) | String getDescriptor();
      method getDisplayName (line 54) | String getDisplayName();
      method getIcon (line 56) | Icon getIcon();
    type Method (line 59) | interface Method {
      method getFlags (line 60) | int getFlags();
      method getName (line 62) | String getName();
      method getDescriptor (line 64) | String getDescriptor();
      method getDisplayName (line 66) | String getDisplayName();
      method getIcon (line 68) | Icon getIcon();

FILE: api/src/main/java/org/jd/gui/spi/ContainerFactory.java
  type ContainerFactory (line 15) | public interface ContainerFactory {
    method getType (line 16) | String getType();
    method accept (line 18) | boolean accept(API api, Path rootPath);
    method make (line 20) | Container make(API api, Container.Entry parentEntry, Path rootPath);

FILE: api/src/main/java/org/jd/gui/spi/ContextualActionsFactory.java
  type ContextualActionsFactory (line 16) | public interface ContextualActionsFactory {
    method make (line 26) | Collection<Action> make(API api, Container.Entry entry, String fragment);

FILE: api/src/main/java/org/jd/gui/spi/FileLoader.java
  type FileLoader (line 14) | public interface FileLoader {
    method getExtensions (line 15) | String[] getExtensions();
    method getDescription (line 17) | String getDescription();
    method accept (line 19) | boolean accept(API api, File file);
    method load (line 21) | boolean load(API api, File file);

FILE: api/src/main/java/org/jd/gui/spi/Indexer.java
  type Indexer (line 16) | public interface Indexer {
    method getSelectors (line 17) | String[] getSelectors();
    method getPathPattern (line 19) | Pattern getPathPattern();
    method index (line 21) | void index(API api, Container.Entry entry, Indexes indexes);

FILE: api/src/main/java/org/jd/gui/spi/PanelFactory.java
  type PanelFactory (line 16) | public interface PanelFactory {
    method getTypes (line 17) | String[] getTypes();
    method make (line 19) | <T extends JComponent & UriGettable> T make(API api, Container contain...

FILE: api/src/main/java/org/jd/gui/spi/PasteHandler.java
  type PasteHandler (line 12) | public interface PasteHandler {
    method accept (line 13) | boolean accept(Object obj);
    method paste (line 15) | void paste(API api, Object obj);

FILE: api/src/main/java/org/jd/gui/spi/PreferencesPanel.java
  type PreferencesPanel (line 14) | public interface PreferencesPanel {
    method getPreferencesGroupTitle (line 15) | String getPreferencesGroupTitle();
    method getPreferencesPanelTitle (line 17) | String getPreferencesPanelTitle();
    method getPanel (line 19) | JComponent getPanel();
    method init (line 21) | void init(Color errorBackgroundColor);
    method isActivated (line 23) | boolean isActivated();
    method loadPreferences (line 25) | void loadPreferences(Map<String, String> preferences);
    method savePreferences (line 27) | void savePreferences(Map<String, String> preferences);
    method arePreferencesValid (line 29) | boolean arePreferencesValid();
    method addPreferencesChangeListener (line 31) | void addPreferencesChangeListener(PreferencesPanelChangeListener liste...
    type PreferencesPanelChangeListener (line 33) | interface PreferencesPanelChangeListener {
      method preferencesPanelChanged (line 34) | void preferencesPanelChanged(PreferencesPanel source);

FILE: api/src/main/java/org/jd/gui/spi/SourceLoader.java
  type SourceLoader (line 15) | public interface SourceLoader {
    method getSource (line 16) | String getSource(API api, Container.Entry entry);
    method loadSource (line 18) | String loadSource(API api, Container.Entry entry);
    method loadSourceFile (line 20) | File loadSourceFile(API api, Container.Entry entry);

FILE: api/src/main/java/org/jd/gui/spi/SourceSaver.java
  type SourceSaver (line 16) | public interface SourceSaver {
    method getSelectors (line 17) | String[] getSelectors();
    method getPathPattern (line 19) | Pattern getPathPattern();
    method getSourcePath (line 21) | String getSourcePath(Container.Entry entry);
    method getFileCount (line 23) | int getFileCount(API api, Container.Entry entry);
    method save (line 28) | void save(API api, Controller controller, Listener listener, Path root...
    method saveContent (line 37) | void saveContent(API api, Controller controller, Listener listener, Pa...
    type Controller (line 39) | interface Controller {
      method isCancelled (line 40) | boolean isCancelled();
    type Listener (line 43) | interface Listener {
      method pathSaved (line 44) | void pathSaved(Path path);

FILE: api/src/main/java/org/jd/gui/spi/TreeNodeFactory.java
  type TreeNodeFactory (line 18) | public interface TreeNodeFactory {
    method getSelectors (line 19) | String[] getSelectors();
    method getPathPattern (line 21) | Pattern getPathPattern();
    method make (line 23) | <T extends DefaultMutableTreeNode & ContainerEntryGettable & UriGettab...

FILE: api/src/main/java/org/jd/gui/spi/TypeFactory.java
  type TypeFactory (line 17) | public interface TypeFactory {
    method getSelectors (line 18) | String[] getSelectors();
    method getPathPattern (line 20) | Pattern getPathPattern();
    method make (line 25) | Collection<Type> make(API api, Container.Entry entry);
    method make (line 32) | Type make(API api, Container.Entry entry, String fragment);

FILE: api/src/main/java/org/jd/gui/spi/UriLoader.java
  type UriLoader (line 14) | public interface UriLoader {
    method getSchemes (line 15) | String[] getSchemes();
    method accept (line 17) | boolean accept(API api, URI uri);
    method load (line 19) | boolean load(API api, URI uri);

FILE: app/src/main/java/org/jd/gui/App.java
  class App (line 23) | public class App {
    method main (line 28) | public static void main(String[] args) {
    method checkHelpFlag (line 66) | protected static boolean checkHelpFlag(String[] args) {
    method newList (line 77) | protected static List<File> newList(String[] paths) {

FILE: app/src/main/java/org/jd/gui/Constants.java
  class Constants (line 10) | public class Constants {

FILE: app/src/main/java/org/jd/gui/OsxApp.java
  class OsxApp (line 12) | public class OsxApp extends App {
    method main (line 14) | @SuppressWarnings("unchecked")

FILE: app/src/main/java/org/jd/gui/controller/AboutController.java
  class AboutController (line 14) | public class AboutController {
    method AboutController (line 17) | public AboutController(JFrame mainFrame) {
    method show (line 22) | public void show() {

FILE: app/src/main/java/org/jd/gui/controller/GoToController.java
  class GoToController (line 17) | public class GoToController {
    method GoToController (line 20) | public GoToController(Configuration configuration, JFrame mainFrame) {
    method show (line 25) | public void show(LineNumberNavigable navigator, IntConsumer okCallback) {

FILE: app/src/main/java/org/jd/gui/controller/MainController.java
  class MainController (line 56) | public class MainController implements API {
    method MainController (line 75) | @SuppressWarnings("unchecked")
    method show (line 119) | @SuppressWarnings("unchecked")
    method onOpen (line 171) | protected void onOpen() {
    method onClose (line 204) | protected void onClose() {
    method onSaveSource (line 208) | protected void onSaveSource() {
    method save (line 234) | protected void save(File selectedFile) {
    method onSaveAllSources (line 242) | protected void onSaveAllSources() {
    method onCopy (line 273) | protected void onCopy() {
    method onPaste (line 279) | protected void onPaste() {
    method onSelectAll (line 296) | protected void onSelectAll() {
    method onFind (line 302) | protected void onFind() {
    method onFindCriteriaChanged (line 308) | protected void onFindCriteriaChanged() {
    method onFindNext (line 314) | protected void onFindNext() {
    method onOpenType (line 320) | protected void onOpenType() {
    method onOpenTypeHierarchy (line 324) | protected void onOpenTypeHierarchy() {
    method onGoTo (line 331) | protected void onGoTo() {
    method onSearch (line 338) | protected void onSearch() {
    method onFindPrevious (line 342) | protected void onFindPrevious() {
    method onJdWebSite (line 349) | protected void onJdWebSite() {
    method onJdGuiIssues (line 362) | protected void onJdGuiIssues() {
    method onJdCoreIssues (line 375) | protected void onJdCoreIssues() {
    method onPreferences (line 388) | @SuppressWarnings("unchecked")
    method onAbout (line 396) | protected void onAbout() {
    method onCurrentPageChanged (line 400) | protected void onCurrentPageChanged(JComponent page) {
    method checkPreferencesChange (line 406) | protected void checkPreferencesChange(JComponent page) {
    method checkIndexesChange (line 419) | protected void checkIndexesChange(JComponent page) {
    method openFile (line 433) | public void openFile(File file) {
    method openFiles (line 437) | @SuppressWarnings("unchecked")
    class FilesTransferHandler (line 481) | protected class FilesTransferHandler extends TransferHandler {
      method canImport (line 482) | @Override
      method importData (line 487) | @Override
    class MainFrameListener (line 503) | protected class MainFrameListener extends ComponentAdapter {
      method MainFrameListener (line 506) | public MainFrameListener(Configuration configuration) {
      method componentMoved (line 510) | @Override
      method componentResized (line 522) | @Override
    method panelClosed (line 535) | protected void panelClosed() {
    method openURI (line 549) | @Override
    method openURI (line 572) | @Override
    method addURI (line 594) | @Override
    method addPanel (line 602) | @Override
    method getContextualActions (line 629) | @Override public Collection<Action> getContextualActions(Container.Ent...
    method getFileLoader (line 631) | @Override public FileLoader getFileLoader(File file) { return FileLoad...
    method getUriLoader (line 633) | @Override public UriLoader getUriLoader(URI uri) { return UriLoaderSer...
    method getMainPanelFactory (line 635) | @Override public PanelFactory getMainPanelFactory(Container container)...
    method getContainerFactory (line 637) | @Override public ContainerFactory getContainerFactory(Path rootPath) {...
    method getTreeNodeFactory (line 639) | @Override public TreeNodeFactory getTreeNodeFactory(Container.Entry en...
    method getTypeFactory (line 641) | @Override public TypeFactory getTypeFactory(Container.Entry entry) { r...
    method getIndexer (line 643) | @Override public Indexer getIndexer(Container.Entry entry) { return In...
    method getSourceSaver (line 645) | @Override public SourceSaver getSourceSaver(Container.Entry entry) { r...
    method getPreferences (line 647) | @Override public Map<String, String> getPreferences() { return configu...
    method getCollectionOfFutureIndexes (line 649) | @Override
    method getSource (line 684) | @Override
    method loadSource (line 689) | @Override
    method loadSourceFile (line 700) | @Override

FILE: app/src/main/java/org/jd/gui/controller/OpenTypeController.java
  class OpenTypeController (line 27) | public class OpenTypeController implements IndexesChangeListener {
    method OpenTypeController (line 42) | public OpenTypeController(API api, ScheduledExecutorService executor, ...
    method show (line 58) | public void show(Collection<Future<Indexes>> collectionOfFutureIndexes...
    method updateList (line 73) | @SuppressWarnings("unchecked")
    method match (line 153) | @SuppressWarnings("unchecked")
    method createRegExpPattern (line 200) | protected static Pattern createRegExpPattern(String pattern) {
    method match (line 229) | @SuppressWarnings("unchecked")
    method add (line 245) | @SuppressWarnings("unchecked")
    method onTypeSelected (line 256) | protected void onTypeSelected(Point leftBottom, Collection<Container.E...
    method indexesChanged (line 271) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...

FILE: app/src/main/java/org/jd/gui/controller/OpenTypeHierarchyController.java
  class OpenTypeHierarchyController (line 25) | public class OpenTypeHierarchyController implements IndexesChangeListener {
    method OpenTypeHierarchyController (line 36) | public OpenTypeHierarchyController(API api, ScheduledExecutorService e...
    method show (line 45) | public void show(Collection<Future<Indexes>> collectionOfFutureIndexes...
    method onTypeSelected (line 60) | protected void onTypeSelected(Point leftBottom, Collection<Container.E...
    method indexesChanged (line 75) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...

FILE: app/src/main/java/org/jd/gui/controller/PreferencesController.java
  class PreferencesController (line 17) | public class PreferencesController {
    method PreferencesController (line 20) | public PreferencesController(Configuration configuration, JFrame mainF...
    method show (line 25) | public void show(Runnable okCallback) {

FILE: app/src/main/java/org/jd/gui/controller/SaveAllSourcesController.java
  class SaveAllSourcesController (line 22) | public class SaveAllSourcesController implements SourcesSavable.Controll...
    method SaveAllSourcesController (line 29) | public SaveAllSourcesController(API api, JFrame mainFrame) {
    method show (line 35) | public void show(ScheduledExecutorService executor, SourcesSavable sav...
    method isActivated (line 79) | public boolean isActivated() { return saveAllSourcesView.isVisible(); }
    method onCanceled (line 81) | protected void onCanceled() { cancel = true; }
    method isCancelled (line 84) | @Override public boolean isCancelled() { return cancel; }
    method pathSaved (line 87) | @Override

FILE: app/src/main/java/org/jd/gui/controller/SearchInConstantPoolsController.java
  class SearchInConstantPoolsController (line 33) | public class SearchInConstantPoolsController implements IndexesChangeLis...
    method SearchInConstantPoolsController (line 47) | @SuppressWarnings("unchecked")
    method show (line 71) | public void show(Collection<Future<Indexes>> collectionOfFutureIndexes...
    method updateTree (line 86) | @SuppressWarnings("unchecked")
    method getOuterEntries (line 138) | protected HashSet<Container.Entry> getOuterEntries(Set<Container.Entry...
    method filter (line 213) | protected void filter(Indexes indexes, String pattern, int flags, Set<...
    method match (line 280) | @SuppressWarnings("unchecked")
    method matchTypeEntriesWithChar (line 320) | protected static Map<String, Collection> matchTypeEntriesWithChar(char...
    method matchTypeEntriesWithString (line 341) | protected static Map<String, Collection> matchTypeEntriesWithString(St...
    method matchWithChar (line 359) | protected static Map<String, Collection> matchWithChar(char c, Map<Str...
    method matchWithString (line 375) | protected static Map<String, Collection> matchWithString(String patter...
    method createPattern (line 395) | protected static Pattern createPattern(String pattern) {
    method onTypeSelected (line 418) | protected void onTypeSelected(URI uri, String pattern, int flags) {
    method indexesChanged (line 476) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...

FILE: app/src/main/java/org/jd/gui/controller/SelectLocationController.java
  class SelectLocationController (line 24) | public class SelectLocationController {
    method SelectLocationController (line 30) | public SelectLocationController(API api, JFrame mainFrame) {
    method show (line 36) | @SuppressWarnings("unchecked")
    method getOuterEntries (line 77) | protected Collection<Container.Entry> getOuterEntries(Collection<Conta...
    method onLocationSelected (line 156) | protected void onLocationSelected(Set<DelegatingFilterContainer> deleg...
    class ContainerEntryComparator (line 172) | protected static class ContainerEntryComparator implements Comparator<...
      method compare (line 173) | @Override

FILE: app/src/main/java/org/jd/gui/model/configuration/Configuration.java
  class Configuration (line 19) | public class Configuration {
    method getMainWindowLocation (line 32) | public Point getMainWindowLocation() {
    method getMainWindowSize (line 36) | public Dimension getMainWindowSize() {
    method isMainWindowMaximize (line 40) | public boolean isMainWindowMaximize() {
    method getLookAndFeel (line 44) | public String getLookAndFeel() {
    method getRecentFiles (line 48) | public List<File> getRecentFiles() {
    method getRecentLoadDirectory (line 52) | public File getRecentLoadDirectory() {
    method getRecentSaveDirectory (line 56) | public File getRecentSaveDirectory() {
    method getPreferences (line 60) | public Map<String, String> getPreferences() {
    method setMainWindowLocation (line 64) | public void setMainWindowLocation(Point mainWindowLocation) {
    method setMainWindowSize (line 68) | public void setMainWindowSize(Dimension mainWindowSize) {
    method setMainWindowMaximize (line 72) | public void setMainWindowMaximize(boolean mainWindowMaximize) {
    method setLookAndFeel (line 76) | public void setLookAndFeel(String lookAndFeel) {
    method setRecentFiles (line 80) | public void setRecentFiles(List<File> recentFiles) {
    method setRecentLoadDirectory (line 84) | public void setRecentLoadDirectory(File recentLoadDirectory) {
    method setRecentSaveDirectory (line 88) | public void setRecentSaveDirectory(File recentSaveDirectory) {
    method setPreferences (line 92) | public void setPreferences(Map<String, String> preferences) {
    method addRecentFile (line 96) | public void addRecentFile(File file) {

FILE: app/src/main/java/org/jd/gui/model/container/DelegatingFilterContainer.java
  class DelegatingFilterContainer (line 16) | public class DelegatingFilterContainer implements Container {
    method DelegatingFilterContainer (line 26) | public DelegatingFilterContainer(Container container, Collection<Entry...
    method getType (line 38) | @Override public String getType() { return container.getType(); }
    method getRoot (line 39) | @Override public Container.Entry getRoot() { return root; }
    method getEntry (line 41) | public Container.Entry getEntry(URI uri) { return uriToDelegatedEntry....
    method getUris (line 42) | public Set<URI> getUris() { return validEntries; }
    method getDelegatedEntry (line 44) | protected DelegatedEntry getDelegatedEntry(Container.Entry entry) {
    method getDelegatedContainer (line 53) | protected DelegatedContainer getDelegatedContainer(Container container) {
    class DelegatedEntry (line 63) | protected class DelegatedEntry implements Entry, Comparable<DelegatedE...
      method DelegatedEntry (line 67) | public DelegatedEntry(Entry entry) {
      method getContainer (line 71) | @Override public Container getContainer() { return getDelegatedConta...
      method getParent (line 72) | @Override public Entry getParent() { return getDelegatedEntry(entry....
      method getUri (line 73) | @Override public URI getUri() { return entry.getUri(); }
      method getPath (line 74) | @Override public String getPath() { return entry.getPath(); }
      method isDirectory (line 75) | @Override public boolean isDirectory() { return entry.isDirectory(); }
      method length (line 76) | @Override public long length() { return entry.length(); }
      method getInputStream (line 77) | @Override public InputStream getInputStream() { return entry.getInpu...
      method getChildren (line 79) | @Override
      method compareTo (line 92) | @Override
    class DelegatedContainer (line 107) | protected class DelegatedContainer implements Container {
      method DelegatedContainer (line 110) | public DelegatedContainer(Container container) {
      method getType (line 114) | @Override public String getType() { return container.getType(); }
      method getRoot (line 115) | @Override public Entry getRoot() { return getDelegatedEntry(containe...

FILE: app/src/main/java/org/jd/gui/model/history/History.java
  class History (line 13) | public class History {
    method add (line 18) | public void add(URI uri) {
    method backward (line 63) | public URI backward() {
    method forward (line 72) | public URI forward() {
    method canBackward (line 81) | public boolean canBackward() { return !backward.isEmpty(); }
    method canForward (line 82) | public boolean canForward() { return !forward.isEmpty(); }

FILE: app/src/main/java/org/jd/gui/service/actions/ContextualActionsFactoryService.java
  class ContextualActionsFactoryService (line 18) | public class ContextualActionsFactoryService {
    method getInstance (line 21) | public static ContextualActionsFactoryService getInstance() { return C...
    method get (line 27) | public Collection<Action> get(API api, Container.Entry entry, String f...
    class ActionNameComparator (line 69) | protected static class ActionNameComparator implements Comparator<Acti...
      method compare (line 70) | @Override

FILE: app/src/main/java/org/jd/gui/service/configuration/ConfigurationPersister.java
  type ConfigurationPersister (line 12) | public interface ConfigurationPersister {
    method load (line 13) | Configuration load();
    method save (line 15) | void save(Configuration configuration);

FILE: app/src/main/java/org/jd/gui/service/configuration/ConfigurationPersisterService.java
  class ConfigurationPersisterService (line 10) | public class ConfigurationPersisterService {
    method getInstance (line 15) | public static ConfigurationPersisterService getInstance() { return CON...
    method ConfigurationPersisterService (line 17) | protected ConfigurationPersisterService() {}
    method get (line 19) | public ConfigurationPersister get() {

FILE: app/src/main/java/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java
  class ConfigurationXmlPersisterProvider (line 24) | public class ConfigurationXmlPersisterProvider implements ConfigurationP...
    method getConfigFile (line 30) | protected static File getConfigFile() {
    method load (line 68) | @Override
    method getJdCoreVersion (line 187) | protected String getJdCoreVersion() {
    method save (line 206) | @Override

FILE: app/src/main/java/org/jd/gui/service/container/ContainerFactoryService.java
  class ContainerFactoryService (line 17) | public class ContainerFactoryService {
    method getInstance (line 20) | public static ContainerFactoryService getInstance() { return CONTAINER...
    method get (line 24) | public ContainerFactory get(API api, Path rootPath) {

FILE: app/src/main/java/org/jd/gui/service/extension/ExtensionService.java
  class ExtensionService (line 18) | public class ExtensionService {
    method getInstance (line 24) | public static ExtensionService getInstance() {
    method ExtensionService (line 28) | protected ExtensionService() {
    method searchJarAndMetaInf (line 52) | protected void searchJarAndMetaInf(List<URL> urls, File directory) thr...
    method load (line 68) | public <T> Collection<T> load(Class<T> service) {
    class UrlComparator (line 79) | protected static class UrlComparator implements Comparator<URL> {
      method compare (line 80) | @Override

FILE: app/src/main/java/org/jd/gui/service/fileloader/FileLoaderService.java
  class FileLoaderService (line 18) | public class FileLoaderService {
    method getInstance (line 21) | public static FileLoaderService getInstance() { return FILE_LOADER_SER...
    method FileLoaderService (line 27) | protected FileLoaderService() {
    method get (line 35) | public FileLoader get(API api, File file) {
    method getMapProviders (line 43) | public HashMap<String, FileLoader> getMapProviders() {

FILE: app/src/main/java/org/jd/gui/service/indexer/IndexerService.java
  class IndexerService (line 17) | public class IndexerService {
    method getInstance (line 20) | public static IndexerService getInstance() { return INDEXER_SERVICE; }
    method IndexerService (line 24) | protected IndexerService() {
    method get (line 40) | public Indexer get(Container.Entry entry) {
    method get (line 45) | protected Indexer get(String containerType, Container.Entry entry) {
    class Indexers (line 89) | protected static class Indexers {
      method add (line 93) | public void add(Indexer indexer) {
      method match (line 101) | public Indexer match(String path) {

FILE: app/src/main/java/org/jd/gui/service/mainpanel/ContainerPanelFactoryProvider.java
  class ContainerPanelFactoryProvider (line 35) | public class ContainerPanelFactoryProvider implements PanelFactory {
    method getTypes (line 38) | @Override public String[] getTypes() { return TYPES; }
    method make (line 40) | @Override
    class ContainerPanel (line 46) | protected class ContainerPanel extends TreeTabbedPanel implements Cont...
      method ContainerPanel (line 49) | public ContainerPanel(API api, Container container) {
      method index (line 67) | @Override
      method getSourceFileName (line 87) | @Override
      method getFileCount (line 100) | @Override
      method save (line 106) | @Override
    class DelegatedMap (line 136) | protected static class DelegatedMap<K, V> implements Map<K, V> {
      method DelegatedMap (line 139) | public DelegatedMap(Map<K, V> map) { this.map = map; }
      method size (line 141) | @Override public int size() { return map.size(); }
      method isEmpty (line 142) | @Override public boolean isEmpty() { return map.isEmpty(); }
      method containsKey (line 143) | @Override public boolean containsKey(Object o) { return map.contains...
      method containsValue (line 144) | @Override public boolean containsValue(Object o) { return map.contai...
      method get (line 145) | @Override public V get(Object o) { return map.get(o); }
      method put (line 146) | @Override public V put(K k, V v) { return map.put(k, v); }
      method remove (line 147) | @Override public V remove(Object o) { return map.remove(o); }
      method putAll (line 148) | @Override public void putAll(Map<? extends K, ? extends V> map) { th...
      method clear (line 149) | @Override public void clear() { map.clear(); }
      method keySet (line 150) | @Override public Set<K> keySet() { return map.keySet(); }
      method values (line 151) | @Override public Collection<V> values() { return map.values(); }
      method entrySet (line 152) | @Override public Set<Entry<K, V>> entrySet() { return map.entrySet(); }
      method equals (line 153) | @Override public boolean equals(Object o) { return map.equals(o); }
      method hashCode (line 154) | @Override public int hashCode() { return map.hashCode(); }
    class DelegatedMapWithDefault (line 157) | protected static class DelegatedMapWithDefault extends DelegatedMap<St...
      method DelegatedMapWithDefault (line 158) | public DelegatedMapWithDefault(Map<String, Collection> map) { super(...
      method get (line 160) | @Override public Collection get(Object o) {
    class DelegatedMapMapWithDefault (line 170) | protected static class DelegatedMapMapWithDefault extends DelegatedMap...
      method DelegatedMapMapWithDefault (line 173) | public DelegatedMapMapWithDefault(Map<String, Map<String, Collection...
      method get (line 175) | @Override public Map<String, Collection> get(Object o) {

FILE: app/src/main/java/org/jd/gui/service/mainpanel/PanelFactoryService.java
  class PanelFactoryService (line 17) | public class PanelFactoryService {
    method getInstance (line 20) | public static PanelFactoryService getInstance() { return PANEL_FACTORY...
    method PanelFactoryService (line 24) | protected PanelFactoryService() {
    method get (line 34) | public PanelFactory get(Container container) {

FILE: app/src/main/java/org/jd/gui/service/pastehandler/PasteHandlerService.java
  class PasteHandlerService (line 15) | public class PasteHandlerService {
    method getInstance (line 18) | public static PasteHandlerService getInstance() { return PASTE_HANDLER...
    method get (line 22) | public PasteHandler get(Object obj) {

FILE: app/src/main/java/org/jd/gui/service/platform/PlatformService.java
  class PlatformService (line 10) | public class PlatformService {
    type OS (line 13) | public enum OS { Linux, MacOSX, Windows }
    method PlatformService (line 17) | protected PlatformService() {
    method getInstance (line 29) | public static PlatformService getInstance() { return PLATFORM_SERVICE; }
    method getOs (line 31) | public OS getOs() { return os; }
    method isLinux (line 33) | public boolean isLinux() { return os == OS.Linux; }
    method isMac (line 34) | public boolean isMac() { return os == OS.MacOSX; }
    method isWindows (line 35) | public boolean isWindows() { return os == OS.Windows; }

FILE: app/src/main/java/org/jd/gui/service/preferencespanel/PreferencesPanelService.java
  class PreferencesPanelService (line 17) | public class PreferencesPanelService {
    method getInstance (line 20) | public static PreferencesPanelService getInstance() { return PREFERENC...
    method PreferencesPanelService (line 24) | protected PreferencesPanelService() {
    method getProviders (line 43) | public Collection<PreferencesPanel> getProviders() {

FILE: app/src/main/java/org/jd/gui/service/preferencespanel/UISingleInstancePreferencesProvider.java
  class UISingleInstancePreferencesProvider (line 20) | public class UISingleInstancePreferencesProvider extends JPanel implemen...
    method UISingleInstancePreferencesProvider (line 25) | public UISingleInstancePreferencesProvider() {
    method getPreferencesGroupTitle (line 34) | @Override public String getPreferencesGroupTitle() { return "User Inte...
    method getPreferencesPanelTitle (line 35) | @Override public String getPreferencesPanelTitle() { return "Main wind...
    method getPanel (line 36) | @Override public JComponent getPanel() { return this; }
    method init (line 38) | @Override public void init(Color errorBackgroundColor) {}
    method isActivated (line 40) | @Override public boolean isActivated() { return !PlatformService.getIn...
    method loadPreferences (line 42) | @Override
    method savePreferences (line 47) | @Override
    method arePreferencesValid (line 52) | @Override public boolean arePreferencesValid() { return true; }
    method addPreferencesChangeListener (line 54) | @Override public void addPreferencesChangeListener(PreferencesPanel.Pr...

FILE: app/src/main/java/org/jd/gui/service/preferencespanel/UITabsPreferencesProvider.java
  class UITabsPreferencesProvider (line 21) | public class UITabsPreferencesProvider extends JPanel implements Prefere...
    method UITabsPreferencesProvider (line 26) | public UITabsPreferencesProvider() {
    method getPreferencesGroupTitle (line 35) | @Override public String getPreferencesGroupTitle() { return "User Inte...
    method getPreferencesPanelTitle (line 36) | @Override public String getPreferencesPanelTitle() { return "Tabs"; }
    method getPanel (line 37) | @Override public JComponent getPanel() { return this; }
    method init (line 39) | @Override public void init(Color errorBackgroundColor) {}
    method isActivated (line 41) | @Override public boolean isActivated() { return !PlatformService.getIn...
    method loadPreferences (line 43) | @Override public void loadPreferences(Map<String, String> preferences) {
    method savePreferences (line 47) | @Override public void savePreferences(Map<String, String> preferences) {
    method arePreferencesValid (line 51) | @Override public boolean arePreferencesValid() { return true; }
    method addPreferencesChangeListener (line 53) | @Override public void addPreferencesChangeListener(PreferencesPanel.Pr...

FILE: app/src/main/java/org/jd/gui/service/sourceloader/SourceLoaderService.java
  class SourceLoaderService (line 18) | public class SourceLoaderService {
    method getInstance (line 21) | public static SourceLoaderService getInstance() { return SOURCE_LOADER...
    method getSource (line 25) | public String getSource(API api, Container.Entry entry) {
    method loadSource (line 37) | public String loadSource(API api, Container.Entry entry) {
    method getSourceFile (line 49) | public File getSourceFile(API api, Container.Entry entry) {

FILE: app/src/main/java/org/jd/gui/service/sourcesaver/SourceSaverService.java
  class SourceSaverService (line 17) | public class SourceSaverService {
    method getInstance (line 20) | public static SourceSaverService getInstance() { return SOURCE_SAVER_S...
    method SourceSaverService (line 24) | protected SourceSaverService() {
    method get (line 40) | public SourceSaver get(Container.Entry entry) {
    method get (line 45) | protected SourceSaver get(String containerType, Container.Entry entry) {
    class SourceSavers (line 89) | protected static class SourceSavers {
      method add (line 93) | void add(SourceSaver saver) {
      method match (line 101) | SourceSaver match(String path) {

FILE: app/src/main/java/org/jd/gui/service/treenode/TreeNodeFactoryService.java
  class TreeNodeFactoryService (line 17) | public class TreeNodeFactoryService {
    method getInstance (line 20) | public static TreeNodeFactoryService getInstance() { return TREE_NODE_...
    method TreeNodeFactoryService (line 24) | protected TreeNodeFactoryService() {
    method get (line 40) | public TreeNodeFactory get(Container.Entry entry) {
    method get (line 45) | protected TreeNodeFactory get(String containerType, Container.Entry en...
    class TreeNodeFactories (line 89) | protected static class TreeNodeFactories {
      method add (line 93) | public void add(TreeNodeFactory factory) {
      method match (line 101) | public TreeNodeFactory match(String path) {

FILE: app/src/main/java/org/jd/gui/service/type/TypeFactoryService.java
  class TypeFactoryService (line 20) | public class TypeFactoryService {
    method getInstance (line 25) | public static TypeFactoryService getInstance() {
    method TypeFactoryService (line 29) | protected TypeFactoryService() {
    method get (line 47) | public TypeFactory get(Container.Entry entry) {
    method get (line 52) | public TypeFactory get(String containerType, Container.Entry entry) {
    class TypeFactories (line 97) | protected static class TypeFactories {
      method add (line 101) | public void add(TypeFactory factory) {
      method match (line 111) | public TypeFactory match(String path) {

FILE: app/src/main/java/org/jd/gui/service/uriloader/UriLoaderService.java
  class UriLoaderService (line 18) | public class UriLoaderService {
    method getInstance (line 21) | public static UriLoaderService getInstance() { return URI_LOADER_SERVI...
    method UriLoaderService (line 25) | protected UriLoaderService() {
    method get (line 35) | public UriLoader get(API api, URI uri) {

FILE: app/src/main/java/org/jd/gui/util/exception/ExceptionUtil.java
  class ExceptionUtil (line 10) | public class ExceptionUtil {
    method printStackTrace (line 11) | public static boolean printStackTrace(Throwable throwable) {

FILE: app/src/main/java/org/jd/gui/util/function/TriConsumer.java
  type TriConsumer (line 12) | @FunctionalInterface
    method accept (line 14) | void accept(T t, U u, V v);
    method andThen (line 16) | default TriConsumer<T, U, V> andThen(TriConsumer<? super T, ? super U,...

FILE: app/src/main/java/org/jd/gui/util/net/InterProcessCommunicationUtil.java
  class InterProcessCommunicationUtil (line 20) | public class InterProcessCommunicationUtil {
    method listen (line 23) | public static void listen(final Consumer<String[]> consumer) throws Ex...
    method send (line 45) | public static void send(String[] args) {

FILE: app/src/main/java/org/jd/gui/util/net/UriUtil.java
  class UriUtil (line 23) | public class UriUtil {
    method createURI (line 28) | public static URI createURI(API api, Collection<Future<Indexes>> colle...
    method getOuterPath (line 50) | @SuppressWarnings("unchecked")

FILE: app/src/main/java/org/jd/gui/util/swing/SwingUtil.java
  class SwingUtil (line 22) | public class SwingUtil {
    method installGtkPopupBugWorkaround (line 57) | public static void installGtkPopupBugWorkaround() {
    method fixGtkThickness (line 100) | private static void fixGtkThickness(Object style, String fieldName) th...
    method getGtkStyle (line 122) | private static Object getGtkStyle(Object styleFactory, JComponent comp...
    method invokeLater (line 138) | public static void invokeLater(Runnable runnable) {
    method getImage (line 146) | public static Image getImage(String iconPath) {
    method newImageIcon (line 150) | public static ImageIcon newImageIcon(String iconPath) {
    method newAction (line 154) | public static Action newAction(String name, boolean enable, ActionList...
    method newAction (line 165) | public static Action newAction(String name, ImageIcon icon, boolean en...
    method newAction (line 171) | public static Action newAction(ImageIcon icon, boolean enable, ActionL...
    method newAction (line 177) | public static Action newAction(String name, ImageIcon icon, boolean en...
    method newAction (line 183) | public static Action newAction(String name, boolean enable, String sho...

FILE: app/src/main/java/org/jd/gui/view/AboutView.java
  class AboutView (line 24) | public class AboutView {
    method AboutView (line 28) | public AboutView(JFrame mainFrame) {
    method show (line 128) | public void show() {

FILE: app/src/main/java/org/jd/gui/view/GoToView.java
  class GoToView (line 23) | public class GoToView {
    method GoToView (line 32) | public GoToView(Configuration configuration, JFrame mainFrame) {
    method show (line 150) | public void show(LineNumberNavigable navigator, IntConsumer okCallback) {

FILE: app/src/main/java/org/jd/gui/view/MainView.java
  class MainView (line 40) | @SuppressWarnings("unchecked")
    method MainView (line 57) | public MainView(
    method show (line 339) | public void show(Point location, Dimension size, boolean maximize) {
    method getMainFrame (line 349) | public JFrame getMainFrame() {
    method showFindPanel (line 353) | public void showFindPanel() {
    method setFindBackgroundColor (line 360) | public void setFindBackgroundColor(boolean wasFound) {
    method addMainPanel (line 366) | public <T extends JComponent & UriGettable> void addMainPanel(String t...
    method getMainPanels (line 372) | public <T extends JComponent & UriGettable> List<T> getMainPanels() {
    method getSelectedMainPanel (line 376) | public <T extends JComponent & UriGettable> T getSelectedMainPanel() {
    method closeCurrentTab (line 380) | public void closeCurrentTab() {
    method updateRecentFilesMenu (line 393) | public void updateRecentFilesMenu(List<File> files) {
    method getFindText (line 405) | public String getFindText() {
    method getFindCaseSensitive (line 416) | public boolean getFindCaseSensitive() { return findCaseSensitive.isSel...
    method updateHistoryActions (line 418) | public void updateHistoryActions() {
    method reduceRecentFilePath (line 426) | static String reduceRecentFilePath(String path) {
    method openUri (line 441) | @Override
    method preferencesChanged (line 454) | @Override

FILE: app/src/main/java/org/jd/gui/view/OpenTypeHierarchyView.java
  class OpenTypeHierarchyView (line 33) | public class OpenTypeHierarchyView {
    method OpenTypeHierarchyView (line 47) | public OpenTypeHierarchyView(API api, JFrame mainFrame, TriConsumer<Po...
    method show (line 146) | public void show(Collection<Future<Indexes>> collectionOfFutureIndexes...
    method isVisible (line 155) | public boolean isVisible() { return openTypeHierarchyDialog.isVisible(...
    method showWaitCursor (line 157) | public void showWaitCursor() {
    method hideWaitCursor (line 161) | public void hideWaitCursor() {
    method updateTree (line 165) | public void updateTree(Collection<Future<Indexes>> collectionOfFutureI...
    method updateTree (line 174) | protected void updateTree(Container.Entry entry, String typeName) {
    method createTreeNode (line 215) | protected TreeNode createTreeNode(Container.Entry entry, String typeNa...
    method createParentTreeNode (line 235) | protected TreeNode createParentTreeNode(TreeNode treeNode) {
    method populateTreeNode (line 296) | protected void populateTreeNode(TreeNode superTreeNode, TreeNode activ...
    method focus (line 352) | public void focus() {
    method onTypeSelected (line 356) | protected void onTypeSelected() {
    method getSubTypeNames (line 368) | @SuppressWarnings("unchecked")
    method getEntries (line 395) | @SuppressWarnings("unchecked")
    class TreeNode (line 422) | protected static class TreeNode extends DefaultMutableTreeNode {
      method TreeNode (line 427) | TreeNode(Container.Entry entry, String typeName, List<Container.Entr...
    class TreeNodeBean (line 436) | protected static class TreeNodeBean implements TreeNodeData {
      method TreeNodeBean (line 442) | TreeNodeBean(Type type) {
      method TreeNodeBean (line 447) | TreeNodeBean(String label, Icon icon) {
      method getLabel (line 452) | @Override public String getLabel() { return label; }
      method getTip (line 453) | @Override public String getTip() { return tip; }
      method getIcon (line 454) | @Override public Icon getIcon() { return icon; }
      method getOpenIcon (line 455) | @Override public Icon getOpenIcon() { return openIcon; }
    class TreeNodeComparator (line 458) | protected static class TreeNodeComparator implements Comparator<TreeNo...
      method compare (line 459) | @Override

FILE: app/src/main/java/org/jd/gui/view/OpenTypeView.java
  class OpenTypeView (line 31) | public class OpenTypeView {
    method OpenTypeView (line 42) | @SuppressWarnings("unchecked")
    method show (line 172) | public void show() {
    method isVisible (line 182) | public boolean isVisible() { return openTypeDialog.isVisible(); }
    method getPattern (line 184) | public String getPattern() { return openTypeEnterTextField.getText(); }
    method showWaitCursor (line 186) | public void showWaitCursor() {
    method hideWaitCursor (line 190) | public void hideWaitCursor() {
    method updateList (line 194) | @SuppressWarnings("unchecked")
    method focus (line 236) | public void focus() {
    method onTypeSelected (line 242) | protected void onTypeSelected(TriConsumer<Point, Collection<Container....
    class TypeNameComparator (line 256) | protected static class TypeNameComparator implements Comparator<String> {
      method compare (line 257) | @Override

FILE: app/src/main/java/org/jd/gui/view/PreferencesView.java
  class PreferencesView (line 20) | public class PreferencesView implements PreferencesPanel.PreferencesPane...
    method PreferencesView (line 30) | public PreferencesView(Configuration configuration, JFrame mainFrame, ...
    method show (line 154) | public void show(Runnable okCallback) {
    method preferencesPanelChanged (line 168) | public void preferencesPanelChanged(PreferencesPanel source) {
    class PreferencesPanelComparator (line 188) | protected static class PreferencesPanelComparator implements Comparato...
      method compare (line 189) | @Override

FILE: app/src/main/java/org/jd/gui/view/SaveAllSourcesView.java
  class SaveAllSourcesView (line 19) | public class SaveAllSourcesView {
    method SaveAllSourcesView (line 24) | public SaveAllSourcesView(JFrame mainFrame, Runnable cancelCallback) {
    method show (line 76) | public void show(File file) {
    method isVisible (line 90) | public boolean isVisible() { return saveAllSourcesDialog.isVisible(); }
    method setMaxValue (line 92) | public void setMaxValue(int maxValue) {
    method updateProgressBar (line 103) | public void updateProgressBar(int value) {
    method hide (line 109) | public void hide() {
    method showActionFailedDialog (line 115) | public void showActionFailedDialog() {

FILE: app/src/main/java/org/jd/gui/view/SearchInConstantPoolsView.java
  class SearchInConstantPoolsView (line 36) | public class SearchInConstantPoolsView<T extends DefaultMutableTreeNode ...
    method SearchInConstantPoolsView (line 65) | @SuppressWarnings("unchecked")
    method populate (line 295) | @SuppressWarnings("unchecked")
    method populate (line 311) | @SuppressWarnings("unchecked")
    method show (line 327) | public void show() {
    method isVisible (line 336) | public boolean isVisible() { return searchInConstantPoolsDialog.isVisi...
    method getPattern (line 338) | public String getPattern() { return searchInConstantPoolsEnterTextFiel...
    method getFlags (line 340) | public int getFlags() {
    method showWaitCursor (line 363) | public void showWaitCursor() {
    method hideWaitCursor (line 367) | public void hideWaitCursor() {
    method updateTree (line 371) | @SuppressWarnings("unchecked")
    class ContainerComparator (line 428) | protected static class ContainerComparator implements Comparator<Conta...
      method compare (line 429) | @Override

FILE: app/src/main/java/org/jd/gui/view/SelectLocationView.java
  class SelectLocationView (line 34) | public class SelectLocationView<T extends DefaultMutableTreeNode & Conta...
    method SelectLocationView (line 46) | @SuppressWarnings("unchecked")
    method show (line 101) | @SuppressWarnings("unchecked")
    method populate (line 168) | @SuppressWarnings("unchecked")
    method onSelectedEntry (line 187) | @SuppressWarnings("unchecked")
    class DelegatingFilterContainerComparator (line 197) | protected static class DelegatingFilterContainerComparator implements ...
      method compare (line 198) | @Override

FILE: app/src/main/java/org/jd/gui/view/bean/OpenTypeListCellBean.java
  class OpenTypeListCellBean (line 15) | public class OpenTypeListCellBean {
    method OpenTypeListCellBean (line 22) | public OpenTypeListCellBean(String label, Collection<Container.Entry> ...
    method OpenTypeListCellBean (line 28) | public OpenTypeListCellBean(String label, String packag, Icon icon, Co...

FILE: app/src/main/java/org/jd/gui/view/component/IconButton.java
  class IconButton (line 13) | public class IconButton extends JButton {
    method IconButton (line 16) | public IconButton(String text, Action action) {
    method IconButton (line 24) | public IconButton(Action action) {

FILE: app/src/main/java/org/jd/gui/view/component/List.java
  class List (line 17) | public class List extends JList {
    method List (line 19) | @SuppressWarnings("unchecked")
    class Renderer (line 36) | protected class Renderer implements ListCellRenderer {
      method Renderer (line 44) | public Renderer() {
      method getListCellRendererComponent (line 66) | @Override

FILE: app/src/main/java/org/jd/gui/view/component/Tree.java
  class Tree (line 14) | public class Tree extends JTree {
    method Tree (line 15) | public Tree() {
    method fireVisibleDataPropertyChange (line 29) | public void fireVisibleDataPropertyChange() {

FILE: app/src/main/java/org/jd/gui/view/component/panel/MainTabbedPanel.java
  class MainTabbedPanel (line 21) | @SuppressWarnings("unchecked")
    method MainTabbedPanel (line 27) | public MainTabbedPanel(API api) {
    method create (line 31) | @Override
    method getFileManagerLabel (line 101) | protected String getFileManagerLabel() {
    method newLabel (line 112) | protected JLabel newLabel(String text, Color fontColor) {
    method addPage (line 118) | @Override
    method getPages (line 126) | public List<T> getPages() {
    method getPageChangedListeners (line 135) | public ArrayList<PageChangeListener> getPageChangedListeners() {
    method openUri (line 140) | @Override
    method pageChanged (line 166) | @Override
    method preferencesChanged (line 186) | @Override

FILE: app/src/main/java/org/jd/gui/view/component/panel/TabbedPanel.java
  class TabbedPanel (line 25) | public class TabbedPanel<T extends JComponent & UriGettable> extends JPa...
    method TabbedPanel (line 36) | public TabbedPanel(API api) {
    method create (line 41) | protected void create() {
    method createTabPanel (line 47) | protected JTabbedPane createTabPanel() {
    method darker (line 74) | protected static Color darker(Color c) {
    method addPage (line 82) | public void addPage(String title, Icon icon, String tip, T page) {
    method setSelectedIndex (line 110) | protected void setSelectedIndex(int index) {
    method showPage (line 126) | @SuppressWarnings("unchecked")
    class PopupTabMenu (line 143) | protected class PopupTabMenu extends JPopupMenu {
      method PopupTabMenu (line 144) | public PopupTabMenu(Component component) {
    method getTabbedPane (line 197) | public JTabbedPane getTabbedPane() {
    class SubMenuItemActionListener (line 201) | protected class SubMenuItemActionListener implements ActionListener {
      method SubMenuItemActionListener (line 204) | public SubMenuItemActionListener(int index) {
      method actionPerformed (line 208) | @Override
    method removeComponent (line 216) | public void removeComponent(Component component) {
    method removeOtherComponents (line 223) | protected void removeOtherComponents(Component component) {
    method removeAllComponents (line 236) | protected void removeAllComponents() {
    method preferencesChanged (line 244) | @Override

FILE: app/src/main/java/org/jd/gui/view/component/panel/TreeTabbedPanel.java
  class TreeTabbedPanel (line 34) | public class TreeTabbedPanel<T extends DefaultMutableTreeNode & Containe...
    method TreeTabbedPanel (line 45) | @SuppressWarnings("unchecked")
    method createHashCode (line 119) | protected static int createHashCode(Enumeration enumeration) {
    method treeNodeChanged (line 135) | @SuppressWarnings("unchecked")
    method showPage (line 168) | @SuppressWarnings("unchecked")
    method pageChanged (line 195) | @SuppressWarnings("unchecked")
    method getUri (line 226) | @Override public URI getUri() { return uri; }
    method openUri (line 229) | @Override
    method searchTreeNode (line 273) | @SuppressWarnings("unchecked")
    method addPageChangeListener (line 315) | @Override
    method closePage (line 321) | @Override
    method preferencesChanged (line 334) | @Override

FILE: app/src/main/java/org/jd/gui/view/renderer/OpenTypeListCellRenderer.java
  class OpenTypeListCellRenderer (line 15) | public class OpenTypeListCellRenderer implements ListCellRenderer<OpenTy...
    method OpenTypeListCellRenderer (line 26) | public OpenTypeListCellRenderer() {
    method infoColor (line 40) | static protected Color infoColor(Color c) {
    method getListCellRendererComponent (line 56) | @Override

FILE: app/src/main/java/org/jd/gui/view/renderer/TreeNodeRenderer.java
  class TreeNodeRenderer (line 17) | public class TreeNodeRenderer implements TreeCellRenderer {
    method TreeNodeRenderer (line 28) | public TreeNodeRenderer() {
    method getTreeCellRendererComponent (line 55) | @Override

FILE: services/src/main/java/org/fife/ui/rtextarea/Marker.java
  class Marker (line 21) | public class Marker {
    method markAll (line 22) | public static void markAll(RTextArea textArea, List<DocumentRange> ran...
    method clearMarkAllHighlights (line 26) | public static void clearMarkAllHighlights(RTextArea textArea) {

FILE: services/src/main/java/org/jd/gui/model/container/ContainerEntryComparator.java
  class ContainerEntryComparator (line 17) | public class ContainerEntryComparator implements Comparator<Container.En...
    method compare (line 20) | public int compare(Container.Entry e1, Container.Entry e2) {

FILE: services/src/main/java/org/jd/gui/model/container/EarContainer.java
  class EarContainer (line 15) | public class EarContainer extends GenericContainer {
    method EarContainer (line 16) | public EarContainer(API api, Container.Entry parentEntry, Path rootPat...
    method getType (line 20) | public String getType() { return "ear"; }

FILE: services/src/main/java/org/jd/gui/model/container/GenericContainer.java
  class GenericContainer (line 26) | public class GenericContainer implements Container {
    method GenericContainer (line 35) | public GenericContainer(API api, Container.Entry parentEntry, Path roo...
    method getType (line 51) | public String getType() { return "generic"; }
    method getRoot (line 52) | public Container.Entry getRoot() { return root; }
    class Entry (line 54) | protected class Entry implements Container.Entry {
      method Entry (line 62) | public Entry(Container.Entry parent, Path fsPath, URI uri) {
      method newChildEntry (line 71) | public Entry newChildEntry(Path fsPath) { return new Entry(this, fsP...
      method getContainer (line 73) | public Container getContainer() { return GenericContainer.this; }
      method getParent (line 74) | public Container.Entry getParent() { return parent; }
      method getUri (line 76) | public URI getUri() {
      method getPath (line 88) | public String getPath() {
      method isDirectory (line 108) | public boolean isDirectory() {
      method length (line 115) | public long length() {
      method getInputStream (line 124) | public InputStream getInputStream() {
      method getChildren (line 133) | public Collection<Container.Entry> getChildren() {
      method loadChildrenFromDirectoryEntry (line 148) | protected Collection<Container.Entry> loadChildrenFromDirectoryEntry...
      method loadChildrenFromFileEntry (line 164) | protected Collection<Container.Entry> loadChildrenFromFileEntry() th...

FILE: services/src/main/java/org/jd/gui/model/container/JarContainer.java
  class JarContainer (line 15) | public class JarContainer extends GenericContainer {
    method JarContainer (line 16) | public JarContainer(API api, Container.Entry parentEntry, Path rootPat...
    method getType (line 20) | public String getType() { return "jar"; }

FILE: services/src/main/java/org/jd/gui/model/container/JavaModuleContainer.java
  class JavaModuleContainer (line 15) | public class JavaModuleContainer extends GenericContainer {
    method JavaModuleContainer (line 16) | public JavaModuleContainer(API api, Container.Entry parentEntry, Path ...
    method getType (line 20) | public String getType() { return "jmod"; }

FILE: services/src/main/java/org/jd/gui/model/container/KarContainer.java
  class KarContainer (line 15) | public class KarContainer extends GenericContainer {
    method KarContainer (line 16) | public KarContainer(API api, Container.Entry parentEntry, Path rootPat...
    method getType (line 20) | public String getType() { return "kar"; }

FILE: services/src/main/java/org/jd/gui/model/container/WarContainer.java
  class WarContainer (line 15) | public class WarContainer extends GenericContainer {
    method WarContainer (line 16) | public WarContainer(API api, Container.Entry parentEntry, Path rootPat...
    method getType (line 20) | public String getType() { return "war"; }

FILE: services/src/main/java/org/jd/gui/service/actions/CopyQualifiedNameContextualActionsFactory.java
  class CopyQualifiedNameContextualActionsFactory (line 23) | public class CopyQualifiedNameContextualActionsFactory implements Contex...
    method make (line 25) | public Collection<Action> make(API api, Container.Entry entry, String ...
    class CopyQualifiedNameAction (line 29) | public static class CopyQualifiedNameAction extends AbstractAction {
      method CopyQualifiedNameAction (line 36) | public CopyQualifiedNameAction(API api, Container.Entry entry, Strin...
      method actionPerformed (line 46) | public void actionPerformed(ActionEvent e) {

FILE: services/src/main/java/org/jd/gui/service/actions/InvalidFormatException.java
  class InvalidFormatException (line 10) | public class InvalidFormatException extends RuntimeException{
    method InvalidFormatException (line 11) | public InvalidFormatException(String message) { super(message); }

FILE: services/src/main/java/org/jd/gui/service/container/EarContainerFactoryProvider.java
  class EarContainerFactoryProvider (line 20) | public class EarContainerFactoryProvider implements ContainerFactory {
    method getType (line 21) | @Override
    method accept (line 24) | @Override
    method make (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/container/GenericContainerFactoryProvider.java
  class GenericContainerFactoryProvider (line 17) | public class GenericContainerFactoryProvider implements ContainerFactory {
    method getType (line 18) | @Override
    method accept (line 21) | @Override
    method make (line 24) | @Override

FILE: services/src/main/java/org/jd/gui/service/container/JarContainerFactoryProvider.java
  class JarContainerFactoryProvider (line 20) | public class JarContainerFactoryProvider implements ContainerFactory {
    method getType (line 21) | @Override
    method accept (line 24) | @Override
    method make (line 40) | @Override

FILE: services/src/main/java/org/jd/gui/service/container/JavaModuleContainerFactoryProvider.java
  class JavaModuleContainerFactoryProvider (line 20) | public class JavaModuleContainerFactoryProvider implements ContainerFact...
    method getType (line 21) | @Override
    method accept (line 24) | @Override
    method make (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/container/KarContainerFactoryProvider.java
  class KarContainerFactoryProvider (line 20) | public class KarContainerFactoryProvider implements ContainerFactory {
    method getType (line 21) | @Override
    method accept (line 24) | @Override
    method make (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/container/WarContainerFactoryProvider.java
  class WarContainerFactoryProvider (line 20) | public class WarContainerFactoryProvider implements ContainerFactory {
    method getType (line 21) | @Override
    method accept (line 24) | @Override
    method make (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/AarFileLoaderProvider.java
  class AarFileLoaderProvider (line 14) | public class AarFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 17) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 18) | @Override public String getDescription() { return "Android archive fil...
    method accept (line 20) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/AbstractFileLoaderProvider.java
  class AbstractFileLoaderProvider (line 27) | public abstract class AbstractFileLoaderProvider implements FileLoader {
    method load (line 28) | protected <T extends JComponent & UriGettable> T load(API api, File fi...
    class ContainerEntry (line 59) | protected static class ContainerEntry implements Container.Entry {
      method getType (line 61) | @Override public String getType() { return "generic"; }
      method getRoot (line 62) | @Override public Container.Entry getRoot() { return null; }
      method ContainerEntry (line 70) | public ContainerEntry(File file) {
      method getContainer (line 80) | @Override public Container getContainer() { return PARENT_CONTAINER; }
      method getParent (line 81) | @Override public Container.Entry getParent() { return null; }
      method getUri (line 82) | @Override public URI getUri() { return uri; }
      method getPath (line 83) | @Override public String getPath() { return path; }
      method isDirectory (line 84) | @Override public boolean isDirectory() { return file.isDirectory(); }
      method length (line 85) | @Override public long length() { return file.length(); }
      method getChildren (line 86) | @Override public Collection<Container.Entry> getChildren() { return ...
      method getInputStream (line 88) | @Override
      method setChildren (line 98) | public void setChildren(Collection<Container.Entry> children) {

FILE: services/src/main/java/org/jd/gui/service/fileloader/AbstractTypeFileLoaderProvider.java
  class AbstractTypeFileLoaderProvider (line 20) | public abstract class AbstractTypeFileLoaderProvider extends AbstractFil...
    method load (line 21) | protected boolean load(API api, File file, String pathInFile) {

FILE: services/src/main/java/org/jd/gui/service/fileloader/ClassFileLoaderProvider.java
  class ClassFileLoaderProvider (line 19) | public class ClassFileLoaderProvider extends AbstractTypeFileLoaderProvi...
    method getExtensions (line 22) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 23) | @Override public String getDescription() { return "Class files (*.clas...
    method accept (line 25) | @Override
    method load (line 30) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/EarFileLoaderProvider.java
  class EarFileLoaderProvider (line 14) | public class EarFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 17) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 18) | @Override public String getDescription() { return "Enterprise applicat...
    method accept (line 20) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/JarFileLoaderProvider.java
  class JarFileLoaderProvider (line 14) | public class JarFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 17) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 18) | @Override public String getDescription() { return "Java archive files ...
    method accept (line 20) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/JavaFileLoaderProvider.java
  class JavaFileLoaderProvider (line 17) | public class JavaFileLoaderProvider extends AbstractTypeFileLoaderProvid...
    method getExtensions (line 20) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 21) | @Override public String getDescription() { return "Java files (*.java)...
    method accept (line 23) | @Override
    method load (line 28) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/JavaModuleFileLoaderProvider.java
  class JavaModuleFileLoaderProvider (line 14) | public class JavaModuleFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 17) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 18) | @Override public String getDescription() { return "Java module files (...
    method accept (line 20) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/KarFileLoaderProvider.java
  class KarFileLoaderProvider (line 14) | public class KarFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 17) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 18) | @Override public String getDescription() { return "Karaf archive files...
    method accept (line 20) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/LogFileLoaderProvider.java
  class LogFileLoaderProvider (line 16) | public class LogFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 19) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 20) | @Override public String getDescription() { return "Log files (*.log)"; }
    method accept (line 22) | @Override
    method load (line 27) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/WarFileLoaderProvider.java
  class WarFileLoaderProvider (line 14) | public class WarFileLoaderProvider extends ZipFileLoaderProvider {
    method getExtensions (line 17) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 18) | @Override public String getDescription() { return "Web application arc...
    method accept (line 20) | @Override

FILE: services/src/main/java/org/jd/gui/service/fileloader/ZipFileLoaderProvider.java
  class ZipFileLoaderProvider (line 24) | public class ZipFileLoaderProvider extends AbstractFileLoaderProvider {
    method getExtensions (line 27) | @Override public String[] getExtensions() { return EXTENSIONS; }
    method getDescription (line 28) | @Override public String getDescription() { return "Zip files (*.zip)"; }
    method accept (line 30) | @Override
    method load (line 35) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/AbstractIndexerProvider.java
  class AbstractIndexerProvider (line 20) | public abstract class AbstractIndexerProvider implements Indexer {
    method AbstractIndexerProvider (line 27) | public AbstractIndexerProvider() {
    method init (line 42) | protected void init(Properties properties) {
    method appendSelectors (line 56) | protected String[] appendSelectors(String selector) {
    method appendSelectors (line 68) | protected String[] appendSelectors(String... selectors) {
    method getPathPattern (line 80) | @Override public Pattern getPathPattern() { return externalPathPattern; }
    method addToIndexes (line 82) | @SuppressWarnings("unchecked")

FILE: services/src/main/java/org/jd/gui/service/indexer/ClassFileIndexerProvider.java
  class ClassFileIndexerProvider (line 29) | public class ClassFileIndexerProvider extends AbstractIndexerProvider {
    method getSelectors (line 45) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getPathPattern (line 47) | @Override
    method index (line 56) | @Override
    class ClassIndexer (line 160) | protected class ClassIndexer extends ClassVisitor {
      method ClassIndexer (line 167) | public ClassIndexer() { super(Opcodes.ASM7); }
      method visit (line 169) | @Override
      method visitAnnotation (line 185) | @Override
      method visitTypeAnnotation (line 191) | @Override
      method visitField (line 197) | @Override
      method visitMethod (line 204) | @Override
    class SignatureIndexer (line 223) | protected class SignatureIndexer extends SignatureVisitor {
      method SignatureIndexer (line 224) | SignatureIndexer() { super(Opcodes.ASM7); }
      method visitClassType (line 226) | @Override public void visitClassType(String name) { typeReferenceSet...
    class AnnotationIndexer (line 229) | protected class AnnotationIndexer extends AnnotationVisitor {
      method AnnotationIndexer (line 230) | public AnnotationIndexer() { super(Opcodes.ASM7); }
      method visitEnum (line 232) | @Override public void visitEnum(String name, String desc, String val...
      method visitAnnotation (line 234) | @Override
    class FieldIndexer (line 241) | protected class FieldIndexer extends FieldVisitor {
      method FieldIndexer (line 244) | public FieldIndexer(AnnotationIndexer annotationIndexer) {
      method visitAnnotation (line 249) | @Override
      method visitTypeAnnotation (line 255) | @Override
    class MethodIndexer (line 262) | protected class MethodIndexer extends MethodVisitor {
      method MethodIndexer (line 265) | public MethodIndexer(AnnotationIndexer annotationIndexer) {
      method visitAnnotation (line 270) | @Override
      method visitTypeAnnotation (line 276) | @Override
      method visitParameterAnnotation (line 282) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/DirectoryIndexerProvider.java
  class DirectoryIndexerProvider (line 15) | public class DirectoryIndexerProvider extends AbstractIndexerProvider {
    method getSelectors (line 17) | @Override public String[] getSelectors() { return appendSelectors("*:d...
    method index (line 19) | @Override
    method index (line 31) | public void index(API api, Container.Entry entry, Indexes indexes, int...

FILE: services/src/main/java/org/jd/gui/service/indexer/EjbJarXmlFileIndexerProvider.java
  class EjbJarXmlFileIndexerProvider (line 20) | public class EjbJarXmlFileIndexerProvider extends XmlBasedFileIndexerPro...
    method getSelectors (line 22) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 24) | @Override
    class EjbJarXmlPathFinder (line 31) | public static class EjbJarXmlPathFinder extends AbstractXmlPathFinder {
      method EjbJarXmlPathFinder (line 35) | public EjbJarXmlPathFinder(Container.Entry entry, Indexes indexes) {
      method handle (line 69) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/JavaFileIndexerProvider.java
  class JavaFileIndexerProvider (line 29) | public class JavaFileIndexerProvider extends AbstractIndexerProvider {
    method getSelectors (line 36) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 38) | @Override
    class Listener (line 71) | protected static class Listener extends AbstractJavaListener {
      method Listener (line 86) | public Listener(Container.Entry entry) {
      method getTypeDeclarationSet (line 90) | public HashSet<String> getTypeDeclarationSet() { return typeDeclarat...
      method getConstructorDeclarationSet (line 91) | public HashSet<String> getConstructorDeclarationSet() { return const...
      method getMethodDeclarationSet (line 92) | public HashSet<String> getMethodDeclarationSet() { return methodDecl...
      method getFieldDeclarationSet (line 93) | public HashSet<String> getFieldDeclarationSet() { return fieldDeclar...
      method getTypeReferenceSet (line 94) | public HashSet<String> getTypeReferenceSet() { return typeReferenceS...
      method getConstructorReferenceSet (line 95) | public HashSet<String> getConstructorReferenceSet() { return constru...
      method getMethodReferenceSet (line 96) | public HashSet<String> getMethodReferenceSet() { return methodRefere...
      method getFieldReferenceSet (line 97) | public HashSet<String> getFieldReferenceSet() { return fieldReferenc...
      method getStringSet (line 98) | public HashSet<String> getStringSet() { return stringSet; }
      method getSuperTypeNamesMap (line 99) | public HashMap<String, HashSet<String>> getSuperTypeNamesMap() { ret...
      method enterPackageDeclaration (line 103) | public void enterPackageDeclaration(JavaParser.PackageDeclarationCon...
      method enterClassDeclaration (line 111) | public void enterClassDeclaration(JavaParser.ClassDeclarationContext...
      method exitClassDeclaration (line 112) | public void exitClassDeclaration(JavaParser.ClassDeclarationContext ...
      method enterEnumDeclaration (line 114) | public void enterEnumDeclaration(JavaParser.EnumDeclarationContext c...
      method exitEnumDeclaration (line 115) | public void exitEnumDeclaration(JavaParser.EnumDeclarationContext ct...
      method enterInterfaceDeclaration (line 117) | public void enterInterfaceDeclaration(JavaParser.InterfaceDeclaratio...
      method exitInterfaceDeclaration (line 118) | public void exitInterfaceDeclaration(JavaParser.InterfaceDeclaration...
      method enterAnnotationTypeDeclaration (line 120) | public void enterAnnotationTypeDeclaration(JavaParser.AnnotationType...
      method exitAnnotationTypeDeclaration (line 121) | public void exitAnnotationTypeDeclaration(JavaParser.AnnotationTypeD...
      method enterTypeDeclaration (line 123) | protected void enterTypeDeclaration(ParserRuleContext ctx) {
      method exitTypeDeclaration (line 169) | protected void exitTypeDeclaration() {
      method enterType (line 183) | public void enterType(JavaParser.TypeContext ctx) {
      method enterConstDeclaration (line 195) | public void enterConstDeclaration(JavaParser.ConstDeclarationContext...
      method enterFieldDeclaration (line 202) | public void enterFieldDeclaration(JavaParser.FieldDeclarationContext...
      method enterMethodDeclaration (line 213) | public void enterMethodDeclaration(JavaParser.MethodDeclarationConte...
      method enterInterfaceMethodDeclaration (line 222) | public void enterInterfaceMethodDeclaration(JavaParser.InterfaceMeth...
      method enterConstructorDeclaration (line 231) | public void enterConstructorDeclaration(JavaParser.ConstructorDeclar...
      method enterCreatedName (line 236) | public void enterCreatedName(JavaParser.CreatedNameContext ctx) {
      method enterExpression (line 243) | public void enterExpression(JavaParser.ExpressionContext ctx) {
      method getToken (line 286) | protected TerminalNode getToken(List<ParseTree> children, int i, int...
      method getRightTerminalNode (line 298) | protected TerminalNode getRightTerminalNode(ParseTree pt) {
      method enterLiteral (line 320) | public void enterLiteral(JavaParser.LiteralContext ctx) {

FILE: services/src/main/java/org/jd/gui/service/indexer/JavaModuleFileIndexerProvider.java
  class JavaModuleFileIndexerProvider (line 18) | public class JavaModuleFileIndexerProvider extends AbstractIndexerProvid...
    method getSelectors (line 20) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 22) | @Override
    method index (line 35) | @SuppressWarnings("unchecked")

FILE: services/src/main/java/org/jd/gui/service/indexer/JavaModuleInfoFileIndexerProvider.java
  class JavaModuleInfoFileIndexerProvider (line 24) | public class JavaModuleInfoFileIndexerProvider extends AbstractIndexerPr...
    method getSelectors (line 31) | @Override public String[] getSelectors() { return appendSelectors("jmo...
    method index (line 33) | @Override
    class ClassIndexer (line 55) | protected class ClassIndexer extends ClassVisitor {
      method ClassIndexer (line 58) | public ClassIndexer() { super(Opcodes.ASM7); }
      method visitModule (line 60) | @Override
    class ModuleIndexer (line 67) | protected class ModuleIndexer extends ModuleVisitor {
      method ModuleIndexer (line 68) | public ModuleIndexer() { super(Opcodes.ASM7); }
      method visitMainClass (line 70) | @Override public void visitMainClass(final String mainClass) { typeR...
      method visitRequire (line 71) | @Override public void visitRequire(final String module, final int ac...
      method visitUse (line 72) | @Override public void visitUse(final String service) { typeReference...
      method visitExport (line 74) | @Override
      method visitOpen (line 83) | @Override
      method visitProvide (line 92) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/MetainfServiceFileIndexerProvider.java
  class MetainfServiceFileIndexerProvider (line 22) | public class MetainfServiceFileIndexerProvider extends AbstractIndexerPr...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getPathPattern (line 26) | @Override public Pattern getPathPattern() { return (externalPathPatter...
    method index (line 28) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/TextFileIndexerProvider.java
  class TextFileIndexerProvider (line 15) | public class TextFileIndexerProvider extends AbstractIndexerProvider {
    method getSelectors (line 17) | @Override public String[] getSelectors() {
    method index (line 24) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/WebXmlFileIndexerProvider.java
  class WebXmlFileIndexerProvider (line 20) | public class WebXmlFileIndexerProvider extends XmlBasedFileIndexerProvid...
    method getSelectors (line 22) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 24) | @Override
    class WebXmlPathFinder (line 31) | protected static class WebXmlPathFinder extends AbstractXmlPathFinder {
      method WebXmlPathFinder (line 35) | public WebXmlPathFinder(Container.Entry entry, Indexes indexes) {
      method handle (line 45) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/XmlBasedFileIndexerProvider.java
  class XmlBasedFileIndexerProvider (line 23) | public class XmlBasedFileIndexerProvider extends AbstractIndexerProvider {
    method XmlBasedFileIndexerProvider (line 26) | public XmlBasedFileIndexerProvider() {
    method getSelectors (line 31) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 33) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/XmlFileIndexerProvider.java
  class XmlFileIndexerProvider (line 23) | public class XmlFileIndexerProvider extends AbstractIndexerProvider {
    method XmlFileIndexerProvider (line 26) | public XmlFileIndexerProvider() {
    method getSelectors (line 31) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 33) | @Override

FILE: services/src/main/java/org/jd/gui/service/indexer/ZipFileIndexerProvider.java
  class ZipFileIndexerProvider (line 15) | public class ZipFileIndexerProvider extends AbstractIndexerProvider {
    method getSelectors (line 17) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method index (line 19) | @Override

FILE: services/src/main/java/org/jd/gui/service/pastehandler/LogPasteHandler.java
  class LogPasteHandler (line 16) | public class LogPasteHandler implements PasteHandler {
    method accept (line 19) | public boolean accept(Object obj) { return obj instanceof String; }
    method paste (line 21) | public void paste(API api, Object obj) {

FILE: services/src/main/java/org/jd/gui/service/preferencespanel/ClassFileDecompilerPreferencesProvider.java
  class ClassFileDecompilerPreferencesProvider (line 16) | public class ClassFileDecompilerPreferencesProvider extends JPanel imple...
    method ClassFileDecompilerPreferencesProvider (line 24) | public ClassFileDecompilerPreferencesProvider() {
    method getPreferencesGroupTitle (line 35) | @Override public String getPreferencesGroupTitle() { return "Decompile...
    method getPreferencesPanelTitle (line 36) | @Override public String getPreferencesPanelTitle() { return "Class fil...
    method getPanel (line 37) | @Override public JComponent getPanel() { return this; }
    method init (line 39) | @Override public void init(Color errorBackgroundColor) {}
    method isActivated (line 41) | @Override public boolean isActivated() { return true; }
    method loadPreferences (line 43) | @Override
    method savePreferences (line 49) | @Override
    method arePreferencesValid (line 55) | @Override public boolean arePreferencesValid() { return true; }
    method addPreferencesChangeListener (line 57) | @Override public void addPreferencesChangeListener(PreferencesPanel.Pr...

FILE: services/src/main/java/org/jd/gui/service/preferencespanel/ClassFileSaverPreferencesProvider.java
  class ClassFileSaverPreferencesProvider (line 16) | public class ClassFileSaverPreferencesProvider extends JPanel implements...
    method ClassFileSaverPreferencesProvider (line 23) | public ClassFileSaverPreferencesProvider() {
    method getPreferencesGroupTitle (line 34) | @Override public String getPreferencesGroupTitle() { return "Source Sa...
    method getPreferencesPanelTitle (line 35) | @Override public String getPreferencesPanelTitle() { return "Class fil...
    method getPanel (line 36) | @Override public JComponent getPanel() { return this; }
    method init (line 38) | @Override public void init(Color errorBackgroundColor) {}
    method isActivated (line 40) | @Override public boolean isActivated() { return true; }
    method loadPreferences (line 42) | @Override
    method savePreferences (line 48) | @Override
    method arePreferencesValid (line 54) | @Override public boolean arePreferencesValid() { return true; }
    method addPreferencesChangeListener (line 56) | @Override public void addPreferencesChangeListener(PreferencesPanel.Pr...

FILE: services/src/main/java/org/jd/gui/service/preferencespanel/DirectoryIndexerPreferencesProvider.java
  class DirectoryIndexerPreferencesProvider (line 19) | public class DirectoryIndexerPreferencesProvider extends JPanel implemen...
    method DirectoryIndexerPreferencesProvider (line 28) | public DirectoryIndexerPreferencesProvider() {
    method getPreferencesGroupTitle (line 41) | @Override public String getPreferencesGroupTitle() { return "Indexer"; }
    method getPreferencesPanelTitle (line 42) | @Override public String getPreferencesPanelTitle() { return "Directory...
    method getPanel (line 43) | @Override public JComponent getPanel() { return this; }
    method init (line 45) | @Override public void init(Color errorBackgroundColor) {
    method isActivated (line 49) | @Override public boolean isActivated() { return true; }
    method loadPreferences (line 51) | @Override public void loadPreferences(Map<String, String> preferences) {
    method savePreferences (line 58) | @Override
    method arePreferencesValid (line 63) | @Override
    method addPreferencesChangeListener (line 74) | @Override
    method insertUpdate (line 80) | @Override public void insertUpdate(DocumentEvent e) { onTextChange(); }
    method removeUpdate (line 81) | @Override public void removeUpdate(DocumentEvent e) { onTextChange(); }
    method changedUpdate (line 82) | @Override public void changedUpdate(DocumentEvent e) { onTextChange(); }
    method onTextChange (line 84) | public void onTextChange() {

FILE: services/src/main/java/org/jd/gui/service/preferencespanel/MavenOrgSourceLoaderPreferencesProvider.java
  class MavenOrgSourceLoaderPreferencesProvider (line 21) | public class MavenOrgSourceLoaderPreferencesProvider extends JPanel impl...
    method MavenOrgSourceLoaderPreferencesProvider (line 39) | public MavenOrgSourceLoaderPreferencesProvider() {
    method getPreferencesGroupTitle (line 80) | @Override public String getPreferencesGroupTitle() { return "Source lo...
    method getPreferencesPanelTitle (line 81) | @Override public String getPreferencesPanelTitle() { return "maven.org...
    method getPanel (line 82) | @Override public JComponent getPanel() { return this; }
    method init (line 84) | @Override
    method isActivated (line 89) | @Override public boolean isActivated() { return true; }
    method loadPreferences (line 91) | @Override
    method savePreferences (line 104) | @Override
    method arePreferencesValid (line 110) | @Override public boolean arePreferencesValid() {
    method addPreferencesChangeListener (line 114) | @Override public void addPreferencesChangeListener(PreferencesPanelCha...
    method insertUpdate (line 120) | @Override public void insertUpdate(DocumentEvent e) { onTextChange(); }
    method removeUpdate (line 121) | @Override public void removeUpdate(DocumentEvent e) { onTextChange(); }
    method changedUpdate (line 122) | @Override public void changedUpdate(DocumentEvent e) { onTextChange(); }
    method onTextChange (line 124) | protected void onTextChange() {
    method actionPerformed (line 133) | @Override

FILE: services/src/main/java/org/jd/gui/service/preferencespanel/ViewerPreferencesProvider.java
  class ViewerPreferencesProvider (line 22) | public class ViewerPreferencesProvider extends JPanel implements Prefere...
    method ViewerPreferencesProvider (line 32) | public ViewerPreferencesProvider() {
    method getPreferencesGroupTitle (line 45) | @Override public String getPreferencesGroupTitle() { return "Viewer"; }
    method getPreferencesPanelTitle (line 46) | @Override public String getPreferencesPanelTitle() { return "Appearanc...
    method getPanel (line 47) | @Override public JComponent getPanel() { return this; }
    method init (line 49) | @Override public void init(Color errorBackgroundColor) {
    method isActivated (line 53) | @Override public boolean isActivated() { return true; }
    method loadPreferences (line 55) | @Override
    method savePreferences (line 77) | @Override
    method arePreferencesValid (line 82) | @Override
    method addPreferencesChangeListener (line 93) | @Override
    method insertUpdate (line 99) | @Override public void insertUpdate(DocumentEvent e) { onTextChange(); }
    method removeUpdate (line 100) | @Override public void removeUpdate(DocumentEvent e) { onTextChange(); }
    method changedUpdate (line 101) | @Override public void changedUpdate(DocumentEvent e) { onTextChange(); }
    method onTextChange (line 103) | public void onTextChange() {

FILE: services/src/main/java/org/jd/gui/service/sourceloader/MavenOrgSourceLoaderProvider.java
  class MavenOrgSourceLoaderProvider (line 27) | public class MavenOrgSourceLoaderProvider implements SourceLoader {
    method getSource (line 37) | @Override
    method loadSource (line 54) | @Override
    method loadSourceFile (line 71) | @Override
    method isActivated (line 76) | private static boolean isActivated(API api) {
    method searchSource (line 80) | protected String searchSource(Container.Entry entry, File sourceJarFil...
    method downloadSourceJarFile (line 115) | protected File downloadSourceJarFile(Container.Entry entry) {
    method getPomProperties (line 230) | private static Properties getPomProperties(Container.Entry parent) {
    method hexa (line 268) | private static char hexa(int i) { return (char)( (i <= 9) ? ('0' + i) ...
    method accepted (line 270) | protected boolean accepted(String filters, String path) {

FILE: services/src/main/java/org/jd/gui/service/sourcesaver/AbstractSourceSaverProvider.java
  class AbstractSourceSaverProvider (line 20) | public abstract class AbstractSourceSaverProvider implements SourceSaver {
    method AbstractSourceSaverProvider (line 27) | public AbstractSourceSaverProvider() {
    method init (line 42) | protected void init(Properties properties) {
    method appendSelectors (line 56) | protected String[] appendSelectors(String selector) {
    method appendSelectors (line 68) | protected String[] appendSelectors(String... selectors) {
    method getPathPattern (line 80) | public Pattern getPathPattern() { return externalPathPattern; }

FILE: services/src/main/java/org/jd/gui/service/sourcesaver/ClassFileSourceSaverProvider.java
  class ClassFileSourceSaverProvider (line 25) | public class ClassFileSourceSaverProvider extends AbstractSourceSaverPro...
    method getSelectors (line 37) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getSourcePath (line 39) | @Override
    method getFileCount (line 47) | @Override
    method save (line 56) | @Override
    method saveContent (line 64) | @Override
    method getPreferenceValue (line 147) | protected static boolean getPreferenceValue(Map<String, String> prefer...

FILE: services/src/main/java/org/jd/gui/service/sourcesaver/DirectorySourceSaverProvider.java
  class DirectorySourceSaverProvider (line 20) | public class DirectorySourceSaverProvider extends AbstractSourceSaverPro...
    method getSelectors (line 22) | @Override public String[] getSelectors() { return appendSelectors("*:d...
    method getSourcePath (line 24) | @Override public String getSourcePath(Container.Entry entry) { return ...
    method getFileCount (line 26) | @Override public int getFileCount(API api, Container.Entry entry) { re...
    method getFileCount (line 28) | protected int getFileCount(API api, Collection<Container.Entry> entrie...
    method save (line 42) | @Override
    method saveContent (line 54) | @Override
    method getChildren (line 69) | protected Collection<Container.Entry> getChildren(Container.Entry entr...

FILE: services/src/main/java/org/jd/gui/service/sourcesaver/FileSourceSaverProvider.java
  class FileSourceSaverProvider (line 23) | public class FileSourceSaverProvider extends AbstractSourceSaverProvider {
    method getSelectors (line 25) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getSourcePath (line 27) | @Override public String getSourcePath(Container.Entry entry) { return ...
    method getFileCount (line 29) | @Override public int getFileCount(API api, Container.Entry entry) { re...
    method save (line 31) | @Override
    method saveContent (line 36) | @Override

FILE: services/src/main/java/org/jd/gui/service/sourcesaver/PackageSourceSaverProvider.java
  class PackageSourceSaverProvider (line 15) | public class PackageSourceSaverProvider extends DirectorySourceSaverProv...
    method getSelectors (line 17) | @Override public String[] getSelectors() { return appendSelectors("jar...
    method getChildren (line 19) | @Override

FILE: services/src/main/java/org/jd/gui/service/sourcesaver/ZipFileSourceSaverProvider.java
  class ZipFileSourceSaverProvider (line 23) | public class ZipFileSourceSaverProvider extends DirectorySourceSaverProv...
    method getSelectors (line 25) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method save (line 27) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/AbstractTreeNodeFactoryProvider.java
  class AbstractTreeNodeFactoryProvider (line 20) | public abstract class AbstractTreeNodeFactoryProvider implements TreeNod...
    method AbstractTreeNodeFactoryProvider (line 27) | public AbstractTreeNodeFactoryProvider() {
    method init (line 42) | protected void init(Properties properties) {
    method appendSelectors (line 56) | protected String[] appendSelectors(String selector) {
    method appendSelectors (line 68) | protected String[] appendSelectors(String... selectors) {
    method getPathPattern (line 80) | @Override public Pattern getPathPattern() { return externalPathPattern; }

FILE: services/src/main/java/org/jd/gui/service/treenode/AbstractTypeFileTreeNodeFactoryProvider.java
  class AbstractTypeFileTreeNodeFactoryProvider (line 29) | public abstract class AbstractTypeFileTreeNodeFactoryProvider extends Ab...
    class BaseTreeNode (line 33) | public static class BaseTreeNode extends DefaultMutableTreeNode implem...
      method BaseTreeNode (line 38) | public BaseTreeNode(Container.Entry entry, String fragment, Object u...
      method getEntry (line 56) | @Override public Container.Entry getEntry() { return entry; }
      method getUri (line 59) | @Override public URI getUri() { return uri; }
      method createPage (line 62) | @Override
    class FileTreeNode (line 70) | protected static class FileTreeNode extends BaseTreeNode implements Tr...
      method FileTreeNode (line 73) | public FileTreeNode(Container.Entry entry, Object userObject, PageAn...
      method FileTreeNode (line 77) | public FileTreeNode(Container.Entry entry, String fragment, Object u...
      method populateTreeNode (line 85) | @Override
    class TypeTreeNode (line 105) | protected static class TypeTreeNode extends BaseTreeNode implements Tr...
      method TypeTreeNode (line 109) | public TypeTreeNode(Container.Entry entry, Type type, Object userObj...
      method populateTreeNode (line 118) | @Override
    class FieldOrMethodTreeNode (line 180) | protected static class FieldOrMethodTreeNode extends BaseTreeNode {
      method FieldOrMethodTreeNode (line 181) | public FieldOrMethodTreeNode(Container.Entry entry, String fragment,...
    class FieldOrMethodBean (line 186) | protected static class FieldOrMethodBean {
      method FieldOrMethodBean (line 190) | public FieldOrMethodBean(String fragment, String label, Icon icon) {
    type PageAndTipFactory (line 197) | protected interface PageAndTipFactory {
      method makePage (line 198) | <T extends JComponent & UriGettable> T makePage(API api, Container.E...
      method makeTip (line 199) | String makeTip(API api, Container.Entry entry);
    class TypeComparator (line 202) | protected static class TypeComparator implements Comparator<Type> {
      method compare (line 203) | @Override
    class FieldOrMethodBeanComparator (line 209) | protected static class FieldOrMethodBeanComparator implements Comparat...
      method compare (line 210) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/ClassFileTreeNodeFactoryProvider.java
  class ClassFileTreeNodeFactoryProvider (line 26) | public class ClassFileTreeNodeFactoryProvider extends AbstractTypeFileTr...
    method getSelectors (line 39) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getPathPattern (line 41) | @Override
    method make (line 50) | @Override
    class Factory (line 58) | protected static class Factory implements AbstractTypeFileTreeNodeFact...
      method makePage (line 59) | @Override
      method makeTip (line 65) | @Override
      method readUnsignedShort (line 101) | protected int readUnsignedShort(InputStream is) throws IOException {

FILE: services/src/main/java/org/jd/gui/service/treenode/ClassesDirectoryTreeNodeFactoryProvider.java
  class ClassesDirectoryTreeNodeFactoryProvider (line 12) | public class ClassesDirectoryTreeNodeFactoryProvider extends DirectoryTr...
    method getSelectors (line 15) | @Override public String[] getSelectors() {
    method getIcon (line 32) | @Override public ImageIcon getIcon() { return ICON; }
    method getOpenIcon (line 33) | @Override public ImageIcon getOpenIcon() { return null; }

FILE: services/src/main/java/org/jd/gui/service/treenode/CssFileTreeNodeFactoryProvider.java
  class CssFileTreeNodeFactoryProvider (line 21) | public class CssFileTreeNodeFactoryProvider extends TextFileTreeNodeFact...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/DirectoryTreeNodeFactoryProvider.java
  class DirectoryTreeNodeFactoryProvider (line 25) | public class DirectoryTreeNodeFactoryProvider extends AbstractTreeNodeFa...
    method getSelectors (line 29) | @Override public String[] getSelectors() { return appendSelectors("*:d...
    method make (line 31) | @Override
    method getIcon (line 57) | public ImageIcon getIcon() { return ICON; }
    method getOpenIcon (line 58) | public ImageIcon getOpenIcon() { return OPEN_ICON; }
    class TreeNode (line 60) | protected static class TreeNode extends DefaultMutableTreeNode impleme...
      method TreeNode (line 64) | public TreeNode(Container.Entry entry, Object userObject) {
      method getEntry (line 71) | @Override public Container.Entry getEntry() { return entry; }
      method getUri (line 74) | @Override public URI getUri() { return entry.getUri(); }
      method populateTreeNode (line 77) | @Override
      method getChildren (line 103) | public Collection<Container.Entry> getChildren() { return entry.getC...

FILE: services/src/main/java/org/jd/gui/service/treenode/DtdFileTreeNodeFactoryProvider.java
  class DtdFileTreeNodeFactoryProvider (line 21) | public class DtdFileTreeNodeFactoryProvider extends TextFileTreeNodeFact...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/EarFileTreeNodeFactoryProvider.java
  class EarFileTreeNodeFactoryProvider (line 20) | public class EarFileTreeNodeFactoryProvider extends ZipFileTreeNodeFacto...
    method getSelectors (line 23) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 25) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/EjbJarXmlFileTreeNodeFactoryProvider.java
  class EjbJarXmlFileTreeNodeFactoryProvider (line 22) | public class EjbJarXmlFileTreeNodeFactoryProvider extends FileTreeNodeFa...
    method getSelectors (line 25) | @Override public String[] getSelectors() { return appendSelectors("jar...
    method make (line 27) | @Override
    class TreeNode (line 34) | protected static class TreeNode extends FileTreeNodeFactoryProvider.Tr...
      method TreeNode (line 35) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 38) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/FileTreeNodeFactoryProvider.java
  class FileTreeNodeFactoryProvider (line 21) | public class FileTreeNodeFactoryProvider extends AbstractTreeNodeFactory...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends DefaultMutableTreeNode impleme...
      method TreeNode (line 38) | public TreeNode(Container.Entry entry, Object userObject) {
      method getEntry (line 44) | @Override public Container.Entry getEntry() { return entry; }
      method getUri (line 47) | @Override public URI getUri() { return entry.getUri(); }

FILE: services/src/main/java/org/jd/gui/service/treenode/HtmlFileTreeNodeFactoryProvider.java
  class HtmlFileTreeNodeFactoryProvider (line 21) | public class HtmlFileTreeNodeFactoryProvider extends TextFileTreeNodeFac...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/ImageFileTreeNodeFactoryProvider.java
  class ImageFileTreeNodeFactoryProvider (line 25) | public class ImageFileTreeNodeFactoryProvider extends FileTreeNodeFactor...
    method getSelectors (line 28) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 30) | @Override
    class TreeNode (line 39) | protected static class TreeNode extends FileTreeNodeFactoryProvider.Tr...
      method TreeNode (line 40) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 43) | @Override
    class ImagePage (line 50) | protected static class ImagePage extends JPanel implements UriGettable {
      method ImagePage (line 53) | public ImagePage(Container.Entry entry) {
      method getUri (line 71) | @Override public URI getUri() { return entry.getUri(); }

FILE: services/src/main/java/org/jd/gui/service/treenode/JarFileTreeNodeFactoryProvider.java
  class JarFileTreeNodeFactoryProvider (line 22) | public class JarFileTreeNodeFactoryProvider extends ZipFileTreeNodeFacto...
    method getSelectors (line 26) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 28) | @Override
    method isAEjbModule (line 41) | protected static boolean isAEjbModule(Container.Entry entry) {
    class TreeNode (line 68) | protected static class TreeNode extends ZipFileTreeNodeFactoryProvider...
      method TreeNode (line 69) | public TreeNode(Container.Entry entry, Object userObject) {
      method getChildren (line 73) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/JavaFileTreeNodeFactoryProvider.java
  class JavaFileTreeNodeFactoryProvider (line 21) | public class JavaFileTreeNodeFactoryProvider extends AbstractTypeFileTre...
    method getSelectors (line 25) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 27) | @Override
    class Factory (line 36) | protected static class Factory implements AbstractTypeFileTreeNodeFact...
      method makePage (line 38) | @Override
      method makeTip (line 44) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/JavaModuleFileTreeNodeFactoryProvider.java
  class JavaModuleFileTreeNodeFactoryProvider (line 19) | public class JavaModuleFileTreeNodeFactoryProvider extends ZipFileTreeNo...
    method getSelectors (line 20) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 22) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/JavaModulePackageTreeNodeFactoryProvider.java
  class JavaModulePackageTreeNodeFactoryProvider (line 12) | public class JavaModulePackageTreeNodeFactoryProvider extends PackageTre...
    method getSelectors (line 14) | @Override public String[] getSelectors() { return appendSelectors("jmo...
    method getPathPattern (line 16) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/JavascriptFileTreeNodeFactoryProvider.java
  class JavascriptFileTreeNodeFactoryProvider (line 21) | public class JavascriptFileTreeNodeFactoryProvider extends TextFileTreeN...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @SuppressWarnings("unchecked")
    class TreeNode (line 34) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 35) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 38) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/JsonFileTreeNodeFactoryProvider.java
  class JsonFileTreeNodeFactoryProvider (line 21) | public class JsonFileTreeNodeFactoryProvider extends TextFileTreeNodeFac...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/JspFileTreeNodeFactoryProvider.java
  class JspFileTreeNodeFactoryProvider (line 21) | public class JspFileTreeNodeFactoryProvider extends TextFileTreeNodeFact...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/KarFileTreeNodeFactoryProvider.java
  class KarFileTreeNodeFactoryProvider (line 19) | public class KarFileTreeNodeFactoryProvider extends ZipFileTreeNodeFacto...
    method getSelectors (line 20) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 22) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/ManifestFileTreeNodeFactoryProvider.java
  class ManifestFileTreeNodeFactoryProvider (line 22) | public class ManifestFileTreeNodeFactoryProvider extends FileTreeNodeFac...
    method getSelectors (line 25) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 27) | @Override
    class TreeNode (line 34) | protected static class TreeNode extends FileTreeNodeFactoryProvider.Tr...
      method TreeNode (line 35) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 38) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/MetainfDirectoryTreeNodeFactoryProvider.java
  class MetainfDirectoryTreeNodeFactoryProvider (line 13) | public class MetainfDirectoryTreeNodeFactoryProvider extends DirectoryTr...
    method getSelectors (line 16) | @Override public String[] getSelectors() {
    method getIcon (line 25) | @Override public ImageIcon getIcon() { return ICON; }
    method getOpenIcon (line 26) | @Override public ImageIcon getOpenIcon() { return null; }

FILE: services/src/main/java/org/jd/gui/service/treenode/MetainfServiceFileTreeNodeFactoryProvider.java
  class MetainfServiceFileTreeNodeFactoryProvider (line 23) | public class MetainfServiceFileTreeNodeFactoryProvider extends FileTreeN...
    method getSelectors (line 26) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getPathPattern (line 28) | @Override
    method make (line 37) | @SuppressWarnings("unchecked")
    class TreeNode (line 45) | protected static class TreeNode extends FileTreeNodeFactoryProvider.Tr...
      method TreeNode (line 46) | public TreeNode(Container.Entry entry, Object userObject) {
      method createPage (line 51) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/ModuleInfoFileTreeNodeFactoryProvider.java
  class ModuleInfoFileTreeNodeFactoryProvider (line 26) | public class ModuleInfoFileTreeNodeFactoryProvider extends ClassFileTree...
    method getSelectors (line 39) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method getPathPattern (line 41) | @Override public Pattern getPathPattern() { return externalPathPattern; }
    method make (line 43) | @Override
    class ModuleInfoFileTreeNode (line 51) | protected static class ModuleInfoFileTreeNode extends FileTreeNode {
      method ModuleInfoFileTreeNode (line 52) | public ModuleInfoFileTreeNode(Container.Entry entry, Object userObje...
      method populateTreeNode (line 57) | @Override
    class Factory (line 77) | protected static class Factory implements AbstractTypeFileTreeNodeFact...
      method makePage (line 79) | @Override
      method makeTip (line 85) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/PackageTreeNodeFactoryProvider.java
  class PackageTreeNodeFactoryProvider (line 23) | public class PackageTreeNodeFactoryProvider extends DirectoryTreeNodeFac...
    method getSelectors (line 26) | @Override public String[] getSelectors() { return appendSelectors("jar...
    method getPathPattern (line 28) | @Override
    method make (line 37) | @Override
    method getIcon (line 63) | @Override public ImageIcon getIcon() { return ICON; }
    method getOpenIcon (line 64) | @Override public ImageIcon getOpenIcon() { return null; }
    class TreeNode (line 66) | protected static class TreeNode extends DirectoryTreeNodeFactoryProvid...
      method TreeNode (line 67) | public TreeNode(Container.Entry entry, Object userObject) {
      method getChildren (line 71) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/PropertiesFileTreeNodeFactoryProvider.java
  class PropertiesFileTreeNodeFactoryProvider (line 21) | public class PropertiesFileTreeNodeFactoryProvider extends TextFileTreeN...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/SpiFileTreeNodeFactoryProvider.java
  class SpiFileTreeNodeFactoryProvider (line 12) | public class SpiFileTreeNodeFactoryProvider extends TextFileTreeNodeFact...
    method getSelectors (line 13) | @Override public String[] getSelectors() {
    method getPathPattern (line 17) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/SqlFileTreeNodeFactoryProvider.java
  class SqlFileTreeNodeFactoryProvider (line 21) | public class SqlFileTreeNodeFactoryProvider extends TextFileTreeNodeFact...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/TextFileTreeNodeFactoryProvider.java
  class TextFileTreeNodeFactoryProvider (line 29) | public class TextFileTreeNodeFactoryProvider extends FileTreeNodeFactory...
    method getSelectors (line 42) | @Override public String[] getSelectors() {
    method make (line 46) | @Override
    class TreeNode (line 55) | protected static class TreeNode extends FileTreeNodeFactoryProvider.Tr...
      method TreeNode (line 56) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 59) | @Override
    class Page (line 66) | protected static class Page extends TextPage implements UriGettable {
      method Page (line 69) | public Page(Container.Entry entry) {
      method getUri (line 75) | @Override public URI getUri() { return entry.getUri(); }
      method getFileName (line 78) | public String getFileName() {

FILE: services/src/main/java/org/jd/gui/service/treenode/WarFileTreeNodeFactoryProvider.java
  class WarFileTreeNodeFactoryProvider (line 20) | public class WarFileTreeNodeFactoryProvider extends ZipFileTreeNodeFacto...
    method getSelectors (line 23) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 25) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/WarPackageTreeNodeFactoryProvider.java
  class WarPackageTreeNodeFactoryProvider (line 12) | public class WarPackageTreeNodeFactoryProvider extends PackageTreeNodeFa...
    method getSelectors (line 14) | @Override public String[] getSelectors() { return appendSelectors("war...
    method getPathPattern (line 16) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/WebXmlFileTreeNodeFactoryProvider.java
  class WebXmlFileTreeNodeFactoryProvider (line 22) | public class WebXmlFileTreeNodeFactoryProvider extends FileTreeNodeFacto...
    method getSelectors (line 25) | @Override public String[] getSelectors() { return appendSelectors("war...
    method make (line 27) | @Override
    class TreeNode (line 34) | protected static class TreeNode extends FileTreeNodeFactoryProvider.Tr...
      method TreeNode (line 35) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 38) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/WebinfLibDirectoryTreeNodeFactoryProvider.java
  class WebinfLibDirectoryTreeNodeFactoryProvider (line 12) | public class WebinfLibDirectoryTreeNodeFactoryProvider extends Directory...
    method getSelectors (line 15) | @Override public String[] getSelectors() { return appendSelectors("war...
    method getIcon (line 16) | @Override public ImageIcon getIcon() { return ICON; }
    method getOpenIcon (line 17) | @Override public ImageIcon getOpenIcon() { return null; }

FILE: services/src/main/java/org/jd/gui/service/treenode/XmlBasedFileTreeNodeFactoryProvider.java
  class XmlBasedFileTreeNodeFactoryProvider (line 21) | public class XmlBasedFileTreeNodeFactoryProvider extends TextFileTreeNod...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | static class TreeNode extends TextFileTreeNodeFactoryProvider.TreeNode {
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/XmlFileTreeNodeFactoryProvider.java
  class XmlFileTreeNodeFactoryProvider (line 21) | public class XmlFileTreeNodeFactoryProvider extends TextFileTreeNodeFact...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 35) | protected static class TreeNode extends TextFileTreeNodeFactoryProvide...
      method TreeNode (line 36) | public TreeNode(Container.Entry entry, Object userObject) { super(en...
      method createPage (line 39) | @Override

FILE: services/src/main/java/org/jd/gui/service/treenode/ZipFileTreeNodeFactoryProvider.java
  class ZipFileTreeNodeFactoryProvider (line 21) | public class ZipFileTreeNodeFactoryProvider extends DirectoryTreeNodeFac...
    method getSelectors (line 24) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 26) | @Override
    class TreeNode (line 38) | protected static class TreeNode extends DirectoryTreeNodeFactoryProvid...
      method TreeNode (line 39) | public TreeNode(Container.Entry entry, Object userObject) {
      method populateTreeNode (line 44) | public void populateTreeNode(API api) {

FILE: services/src/main/java/org/jd/gui/service/type/AbstractTypeFactoryProvider.java
  class AbstractTypeFactoryProvider (line 23) | public abstract class AbstractTypeFactoryProvider implements TypeFactory {
    method AbstractTypeFactoryProvider (line 30) | public AbstractTypeFactoryProvider() {
    method init (line 45) | protected void init(Properties properties) {
    method appendSelectors (line 53) | protected String[] appendSelectors(String selector) {
    method appendSelectors (line 65) | protected String[] appendSelectors(String... selectors) {
    method getPathPattern (line 77) | public Pattern getPathPattern() { return externalPathPattern; }
    method writeSignature (line 80) | protected static int writeSignature(StringBuilder sb, String descripto...
    method writeMethodSignature (line 191) | protected static void writeMethodSignature(
    method getTypeIcon (line 273) | protected static ImageIcon getTypeIcon(int access) {
    method getFieldIcon (line 284) | protected static ImageIcon getFieldIcon(int access) {
    method getMethodIcon (line 288) | protected static ImageIcon getMethodIcon(int access) {
    method accessToIndex (line 292) | protected static int accessToIndex(int access) {
    method mergeIcons (line 315) | protected static ImageIcon mergeIcons(ImageIcon background, ImageIcon ...
    method mergeIcons (line 333) | protected static ImageIcon[] mergeIcons(ImageIcon[] backgrounds, Image...
    class Cache (line 423) | protected static class Cache<K, V> extends LinkedHashMap<K, V> {
      method Cache (line 426) | public Cache() {
      method removeEldestEntry (line 430) | @Override

FILE: services/src/main/java/org/jd/gui/service/type/ClassFileTypeFactoryProvider.java
  class ClassFileTypeFactoryProvider (line 25) | public class ClassFileTypeFactoryProvider extends AbstractTypeFactoryPro...
    method getSelectors (line 39) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 41) | @Override
    method make (line 46) | @Override
    class JavaType (line 122) | static class JavaType implements Type {
      method JavaType (line 137) | @SuppressWarnings("unchecked")
      method getDisplayTypeName (line 243) | @SuppressWarnings("unchecked")
      method getEntry (line 272) | protected Container.Entry getEntry(String typeName) {
      method getFlags (line 284) | @Override public int getFlags() { return access; }
      method getName (line 285) | @Override public String getName() { return name; }
      method getSuperName (line 286) | @Override public String getSuperName() { return superName; }
      method getOuterName (line 287) | @Override public String getOuterName() { return outerName; }
      method getDisplayPackageName (line 288) | @Override public String getDisplayPackageName() { return displayPack...
      method getDisplayTypeName (line 289) | @Override public String getDisplayTypeName() { return displayTypeNam...
      method getDisplayInnerTypeName (line 290) | @Override public String getDisplayInnerTypeName() { return displayIn...
      method getIcon (line 291) | @Override public Icon getIcon() { return getTypeIcon(access); }
      method getInnerTypes (line 292) | @Override public List<Type> getInnerTypes() { return innerTypes; }
      method getFields (line 293) | @Override public List<Type.Field> getFields() { return fields; }
      method getMethods (line 294) | @Override public List<Type.Method> getMethods() { return methods; }
    class InnerClassVisitor (line 297) | protected static class InnerClassVisitor extends ClassVisitor {
      method InnerClassVisitor (line 302) | public InnerClassVisitor(String name) {
      method visitInnerClass (line 307) | @Override
      method getOuterName (line 316) | public String getOuterName() {
      method getInnerName (line 320) | public String getInnerName() {

FILE: services/src/main/java/org/jd/gui/service/type/JavaFileTypeFactoryProvider.java
  class JavaFileTypeFactoryProvider (line 28) | public class JavaFileTypeFactoryProvider extends AbstractTypeFactoryProv...
    method getSelectors (line 38) | @Override public String[] getSelectors() { return appendSelectors("*:f...
    method make (line 40) | @Override
    method make (line 51) | @Override
    method getListener (line 74) | protected Listener getListener(Container.Entry entry) {
    class JavaType (line 94) | protected static class JavaType implements Type {
      method JavaType (line 110) | public JavaType(
      method getFlags (line 125) | public int getFlags() { return access; }
      method getName (line 126) | public String getName() { return name; }
      method getSuperName (line 127) | public String getSuperName() { return superName; }
      method getOuterName (line 128) | public String getOuterName() { return outerName; }
      method getDisplayTypeName (line 129) | public String getDisplayTypeName() { return displayTypeName; }
      method getDisplayInnerTypeName (line 130) | public String getDisplayInnerTypeName() { return displayInnerTypeNam...
      method getDisplayPackageName (line 131) | public String getDisplayPackageName() { return displayPackageName; }
      method getIcon (line 132) | public Icon getIcon() { return getTypeIcon(access); }
      method getOuterType (line 133) | public JavaType getOuterType() { return outerType; }
      method getInnerTypes (line 134) | public Collection<Type> getInnerTypes() { return innerTypes; }
      method getFields (line 135) | public Collection<Field> getFields() { return fields; }
      method getMethods (line 136) | public Collection<Method> getMethods() { return methods; }
    class JavaField (line 139) | protected static class JavaField implements Type.Field {
      method JavaField (line 144) | public JavaField(int access, String name, String descriptor) {
      method getFlags (line 150) | public int getFlags() { return access; }
      method getName (line 151) | public String getName() { return name; }
      method getDescriptor (line 152) | public String getDescriptor() { return descriptor; }
      method getIcon (line 153) | public Icon getIcon() { return getFieldIcon(access); }
      method getDisplayName (line 155) | public String getDisplayName() {
    class JavaMethod (line 163) | protected static class JavaMethod implements Type.Method {
      method JavaMethod (line 169) | public JavaMethod(JavaType type, int access, String name, String des...
      method getFlags (line 176) | public int getFlags() { return access; }
      method getName (line 177) | public String getName() { return name; }
      method getDescriptor (line 178) | public String getDescriptor() { return descriptor; }
      method getIcon (line 179) | public Icon getIcon() { return getMethodIcon(access); }
      method getDisplayName (line 181) | public String getDisplayName() {
    class Listener (line 194) | protected static class Listener extends AbstractJavaListener {
      method Listener (line 203) | public Listener(Container.Entry entry) {
      method getMainType (line 207) | public Type getMainType() {
      method getType (line 210) | public Type getType(String typeName) {
      method getRootTypes (line 213) | public ArrayList<Type> getRootTypes() {
      method enterPackageDeclaration (line 219) | public void enterPackageDeclaration(JavaParser.PackageDeclarationCon...
      method enterClassDeclaration (line 224) | public void enterClassDeclaration(JavaParser.ClassDeclarationContext...
      method exitClassDeclaration (line 225) | public void exitClassDeclaration(JavaParser.ClassDeclarationContext ...
      method enterEnumDeclaration (line 227) | public void enterEnumDeclaration(JavaParser.EnumDeclarationContext c...
      method exitEnumDeclaration (line 228) | public void exitEnumDeclaration(JavaParser.EnumDeclarationContext ct...
      method enterInterfaceDeclaration (line 230) | public void enterInterfaceDeclaration(JavaParser.InterfaceDeclaratio...
      method exitInterfaceDeclaration (line 231) | public void exitInterfaceDeclaration(JavaParser.InterfaceDeclaration...
      method enterAnnotationTypeDeclaration (line 233) | public void enterAnnotationTypeDeclaration(JavaParser.AnnotationType...
      method exitAnnotationTypeDeclaration (line 234) | public void exitAnnotationTypeDeclaration(JavaParser.AnnotationTypeD...
      method enterTypeDeclaration (line 236) | protected void enterTypeDeclaration(ParserRuleContext ctx, int acces...
      method exitTypeDeclaration (line 292) | protected void exitTypeDeclaration() {
      method enterClassBodyDeclaration (line 296) | public void enterClassBodyDeclaration(JavaParser.ClassBodyDeclaratio...
      method enterConstDeclaration (line 308) | public void enterConstDeclaration(JavaParser.ConstDeclarationContext...
      method enterFieldDeclaration (line 322) | public void enterFieldDeclaration(JavaParser.FieldDeclarationContext...
      method enterMethodDeclaration (line 337) | public void enterMethodDeclaration(JavaParser.MethodDeclarationConte...
      method enterInterfaceMethodDeclaration (line 341) | public void enterInterfaceMethodDeclaration(JavaParser.InterfaceMeth...
      method enterMethodDeclaration (line 345) | public void enterMethodDeclaration(
      method enterConstructorDeclaration (line 358) | public void enterConstructorDeclaration(JavaParser.ConstructorDeclar...
      method createParamDescriptors (line 366) | protected String createParamDescriptors(JavaParser.FormalParameterLi...
      method getTypeDeclarationContextAccessFlag (line 382) | protected int getTypeDeclarationContextAccessFlag(ParserRuleContext ...
      method getMemberDeclarationContextAccessFlag (line 392) | protected int getMemberDeclarationContextAccessFlag(ParserRuleContex...
      method getClassBodyDeclarationAccessFlag (line 405) | protected int getClassBodyDeclarationAccessFlag(ParserRuleContext ct...
      method getAccessFlag (line 423) | protected int getAccessFlag(JavaParser.ClassOrInterfaceModifierConte...

FILE: services/src/main/java/org/jd/gui/service/uriloader/FileUriLoaderProvider.java
  class FileUriLoaderProvider (line 17) | public class FileUriLoaderProvider implements UriLoader {
    method getSchemes (line 20) | public String[] getSchemes() { return SCHEMES; }
    method accept (line 22) | public boolean accept(API api, URI uri) { return "file".equals(uri.get...
    method load (line 24) | public boolean load(API api, URI uri) {

FILE: services/src/main/java/org/jd/gui/util/container/JarContainerEntryUtil.java
  class JarContainerEntryUtil (line 23) | public class JarContainerEntryUtil {
    method removeInnerTypeEntries (line 24) | public static Collection<Container.Entry> removeInnerTypeEntries(Colle...
    method populateInnerTypePaths (line 93) | protected static void populateInnerTypePaths(final HashSet<String> inn...

FILE: services/src/main/java/org/jd/gui/util/decompiler/ClassPathLoader.java
  class ClassPathLoader (line 17) | public class ClassPathLoader implements Loader {
    method canLoad (line 20) | @Override
    method load (line 25) | @Override

FILE: services/src/main/java/org/jd/gui/util/decompiler/ContainerLoader.java
  class ContainerLoader (line 18) | public class ContainerLoader implements Loader {
    method ContainerLoader (line 22) | public ContainerLoader() { this.entry = null; }
    method ContainerLoader (line 23) | public ContainerLoader(Container.Entry entry) {
    method setEntry (line 27) | public void setEntry(Container.Entry e) { this.entry = e; }
    method getEntry (line 29) | protected Container.Entry getEntry(String internalPath) {
    method canLoad (line 44) | @Override
    method load (line 49) | @Override

FILE: services/src/main/java/org/jd/gui/util/decompiler/LineNumberStringBuilderPrinter.java
  class LineNumberStringBuilderPrinter (line 10) | public class LineNumberStringBuilderPrinter extends StringBuilderPrinter {
    method setShowLineNumbers (line 20) | public void setShowLineNumbers(boolean showLineNumbers) { this.showLin...
    method printDigit (line 22) | protected int printDigit(int dcv, int lineNumber, int divisor, int lef...
    method start (line 37) | @Override
    method startLine (line 70) | @Override public void startLine(int lineNumber) {
    method extraLine (line 93) | @Override public void extraLine(int count) {

FILE: services/src/main/java/org/jd/gui/util/decompiler/NopPrinter.java
  class NopPrinter (line 12) | public class NopPrinter implements Printer {
    method start (line 13) | @Override public void start(int maxLineNumber, int majorVersion, int m...
    method end (line 14) | @Override public void end() {}
    method printText (line 16) | @Override public void printText(String text) {}
    method printNumericConstant (line 17) | @Override public void printNumericConstant(String constant) {}
    method printStringConstant (line 18) | @Override public void printStringConstant(String constant, String owne...
    method printKeyword (line 19) | @Override public void printKeyword(String keyword) {}
    method printDeclaration (line 21) | @Override public void printDeclaration(int flags, String internalTypeN...
    method printReference (line 22) | @Override public void printReference(int flags, String internalTypeNam...
    method indent (line 24) | @Override public void indent() {}
    method unindent (line 25) | @Override public void unindent() {}
    method startLine (line 27) | @Override public void startLine(int lineNumber) {}
    method endLine (line 28) | @Override public void endLine() {}
    method extraLine (line 29) | @Override public void extraLine(int count) {}
    method startMarker (line 31) | @Override public void startMarker(int type) {}
    method endMarker (line 32) | @Override public void endMarker(int type) {}

FILE: services/src/main/java/org/jd/gui/util/decompiler/StringBuilderPrinter.java
  class StringBuilderPrinter (line 12) | public class StringBuilderPrinter implements Printer {
    method setUnicodeEscape (line 25) | public void setUnicodeEscape(boolean unicodeEscape) { this.unicodeEsca...
    method setRealignmentLineNumber (line 26) | public void setRealignmentLineNumber(boolean realignmentLineNumber) { ...
    method getMajorVersion (line 28) | public int getMajorVersion() { return majorVersion; }
    method getMinorVersion (line 29) | public int getMinorVersion() { return minorVersion; }
    method getStringBuffer (line 30) | public StringBuilder getStringBuffer() { return stringBuffer; }
    method escape (line 32) | protected void escape(String s) {
    method start (line 68) | @Override
    method end (line 76) | @Override public void end() {}
    method printText (line 78) | @Override public void printText(String text) { escape(text); }
    method printNumericConstant (line 79) | @Override public void printNumericConstant(String constant) { escape(c...
    method printStringConstant (line 80) | @Override public void printStringConstant(String constant, String owne...
    method printKeyword (line 81) | @Override public void printKeyword(String keyword) { stringBuffer.appe...
    method printDeclaration (line 83) | @Override public void printDeclaration(int type, String internalTypeNa...
    method printReference (line 84) | @Override public void printReference(int type, String internalTypeName...
    method indent (line 86) | @Override public void indent() { indentationCount++; }
    method unindent (line 87) | @Override public void unindent() { if (indentationCount > 0) indentati...
    method startLine (line 89) | @Override public void startLine(int lineNumber) { for (int i=0; i<inde...
    method endLine (line 90) | @Override public void endLine() { stringBuffer.append(NEWLINE); }
    method extraLine (line 91) | @Override public void extraLine(int count) { if (realignmentLineNumber...
    method startMarker (line 93) | @Override public void startMarker(int type) {}
    method endMarker (line 94) | @Override public void endMarker(int type) {}

FILE: services/src/main/java/org/jd/gui/util/exception/ExceptionUtil.java
  class ExceptionUtil (line 10) | public class ExceptionUtil {
    method printStackTrace (line 11) | public static boolean printStackTrace(Throwable throwable) {

FILE: services/src/main/java/org/jd/gui/util/index/IndexesUtil.java
  class IndexesUtil (line 20) | public class IndexesUtil {
    method containsInternalTypeName (line 21) | public static boolean containsInternalTypeName(Collection<Future<Index...
    method findInternalTypeName (line 25) | @SuppressWarnings("unchecked")
    method contains (line 30) | public static boolean contains(Collection<Future<Indexes>> collectionO...
    method find (line 47) | @SuppressWarnings("unchecked")

FILE: services/src/main/java/org/jd/gui/util/io/NewlineOutputStream.java
  class NewlineOutputStream (line 15) | public class NewlineOutputStream extends FilterOutputStream {
    method NewlineOutputStream (line 18) | public NewlineOutputStream(OutputStream os) {
    method write (line 31) | public void write(int b) throws IOException {
    method write (line 39) | public void write(byte b[]) throws IOException {
    method write (line 43) | public void write(byte b[], int off, int len) throws IOException {

FILE: services/src/main/java/org/jd/gui/util/io/TextReader.java
  class TextReader (line 14) | public class TextReader {
    method getText (line 16) | public static String getText(File file) {
    method getText (line 25) | public static String getText(InputStream is) {

FILE: services/src/main/java/org/jd/gui/util/matcher/DescriptorMatcher.java
  class DescriptorMatcher (line 13) | public class DescriptorMatcher {
    method matchFieldDescriptors (line 15) | public static boolean matchFieldDescriptors(String d1, String d2) {
    method matchDescriptors (line 19) | protected static boolean matchDescriptors(CharBuffer cb1, CharBuffer c...
    method matchMethodDescriptors (line 39) | public static boolean matchMethodDescriptors(String d1, String d2) {
    class CharBuffer (line 69) | protected static class CharBuffer {
      method CharBuffer (line 74) | public CharBuffer(String s) {
      method read (line 80) | public char read() {
      method unread (line 87) | public boolean unread() {
      method get (line 96) | public char get() {
      method skipType (line 103) | public boolean skipType() {
      method compareTypeWith (line 123) | public boolean compareTypeWith(CharBuffer other) {
      method searchEndOfType (line 177) | protected boolean searchEndOfType() {
      method toString (line 185) | public String toString() {

FILE: services/src/main/java/org/jd/gui/util/parser/antlr/ANTLRJavaParser.java
  class ANTLRJavaParser (line 16) | public class ANTLRJavaParser {
    method parse (line 17) | public static void parse(CharStream input, JavaListener listener) {

FILE: services/src/main/java/org/jd/gui/util/parser/antlr/AbstractJavaListener.java
  class AbstractJavaListener (line 19) | public abstract class AbstractJavaListener extends JavaBaseListener {
    method AbstractJavaListener (line 26) | public AbstractJavaListener(Container.Entry entry) {
    method enterPackageDeclaration (line 30) | public void enterPackageDeclaration(JavaParser.PackageDeclarationConte...
    method enterImportDeclaration (line 34) | public void enterImportDeclaration(JavaParser.ImportDeclarationContext...
    method concatIdentifiers (line 43) | protected String concatIdentifiers(List<TerminalNode> identifiers) {
    method resolveInternalTypeName (line 63) | protected String resolveInternalTypeName(List<TerminalNode> identifier...
    method createDescriptor (line 132) | protected String createDescriptor(JavaParser.TypeContext typeContext, ...
    method countDimension (line 178) | protected int countDimension(List<ParseTree> children) {

FILE: services/src/main/java/org/jd/gui/util/xml/AbstractXmlPathFinder.java
  class AbstractXmlPathFinder (line 20) | public abstract class AbstractXmlPathFinder {
    method AbstractXmlPathFinder (line 24) | public AbstractXmlPathFinder(Collection<String> paths) {
    method find (line 42) | public void find(String text) {
    method handle (line 91) | public abstract void handle(String path, String text, int position);

FILE: services/src/main/java/org/jd/gui/view/component/AbstractTextPage.java
  class AbstractTextPage (line 33) | public class AbstractTextPage extends JPanel implements LineNumberNaviga...
    method AbstractTextPage (line 51) | public AbstractTextPage() {
    method newSyntaxTextArea (line 142) | protected RSyntaxTextArea newSyntaxTextArea() { return new RSyntaxText...
    method getText (line 144) | public String getText() { return textArea.getText(); }
    method getScrollPane (line 146) | public JScrollPane getScrollPane() {
    method setText (line 150) | public void setText(String text) {
    method getSyntaxStyle (line 155) | public String getSyntaxStyle() { return SyntaxConstants.SYNTAX_STYLE_N...
    method setCaretPositionAndCenter (line 161) | public void setCaretPositionAndCenter(DocumentRange range) {
    method setCaretPositionAndCenter (line 198) | protected void setCaretPositionAndCenter(int start, int end, Rectangle...
    method getMaximumLineNumber (line 237) | public int getMaximumLineNumber() {
    method goToLineNumber (line 246) | public void goToLineNumber(int lineNumber) {
    method checkLineNumber (line 254) | public boolean checkLineNumber(int lineNumber) { return true; }
    method highlightText (line 257) | public boolean highlightText(String text, boolean caseSensitive) {
    method findNext (line 276) | public void findNext(String text, boolean caseSensitive) {
    method findPrevious (line 290) | public void findPrevious(String text, boolean caseSensitive) {
    method newSearchContext (line 304) | protected SearchContext newSearchContext(String searchFor, boolean mat...
    method openUri (line 314) | public boolean openUri(URI uri) {
    method parseQuery (line 365) | protected Map<String, String> parseQuery(String query) {
    method createRegExp (line 395) | public static String createRegExp(String pattern) {
    method preferencesChanged (line 417) | public void preferencesChanged(Map<String, String> preferences) {

FILE: services/src/main/java/org/jd/gui/view/component/ClassFilePage.java
  class ClassFilePage (line 27) | public class ClassFilePage extends TypePage {
    method ClassFilePage (line 48) | public ClassFilePage(API api, Container.Entry entry) {
    method decompile (line 57) | public void decompile(Map<String, String> preferences) {
    method getPreferenceValue (line 98) | protected static boolean getPreferenceValue(Map<String, String> prefer...
    method getSyntaxStyle (line 103) | @Override
    method getFileName (line 107) | @Override
    method save (line 114) | @Override
    method getMaximumLineNumber (line 195) | @Override
    method goToLineNumber (line 198) | @Override
    method checkLineNumber (line 212) | @Override
    method preferencesChanged (line 216) | @Override
    class ClassFilePrinter (line 228) | public class ClassFilePrinter extends StringBuilderPrinter {
      method start (line 234) | @Override
      method end (line 245) | @Override
      method printStringConstant (line 251) | @Override
      method printDeclaration (line 260) | @Override
      method printReference (line 282) | @Override
      method startLine (line 302) | @Override
      method endLine (line 307) | @Override
      method extraLine (line 312) | @Override
      method newReferenceData (line 321) | public TypePage.ReferenceData newReferenceData(String internalName, ...

FILE: services/src/main/java/org/jd/gui/view/component/CustomLineNumbersPage.java
  class CustomLineNumbersPage (line 30) | public abstract class CustomLineNumbersPage extends HyperlinkPage {
    method setErrorForeground (line 34) | public void setErrorForeground(Color color) {
    method setShowMisalignment (line 38) | public void setShowMisalignment(boolean b) {
    method setMaxLineNumber (line 48) | protected void setMaxLineNumber(int maxLineNumber) {
    method initLineNumbers (line 62) | protected void initLineNumbers() {
    method setLineNumber (line 83) | protected void setLineNumber(int textAreaLineNumber, int originalLineN...
    method clearLineNumbers (line 90) | protected void clearLineNumbers() {
    method getMaximumSourceLineNumber (line 96) | protected int getMaximumSourceLineNumber() { return maxLineNumber; }
    method getTextAreaLineNumber (line 98) | protected int getTextAreaLineNumber(int originalLineNumber) {
    method newSyntaxTextArea (line 116) | @Override protected RSyntaxTextArea newSyntaxTextArea() { return new S...
    class SourceSyntaxTextArea (line 118) | public class SourceSyntaxTextArea extends HyperlinkSyntaxTextArea {
      method createRTextAreaUI (line 119) | @Override protected RTextAreaUI createRTextAreaUI() { return new Sou...
    class SourceSyntaxTextAreaUI (line 125) | public class SourceSyntaxTextAreaUI extends RSyntaxTextAreaUI {
      method SourceSyntaxTextAreaUI (line 126) | public SourceSyntaxTextAreaUI(JComponent rSyntaxTextArea) { super(rS...
      method getEditorKit (line 127) | @Override public EditorKit getEditorKit(JTextComponent tc) { return ...
      method getVisibleEditorRect (line 128) | @Override public Rectangle getVisibleEditorRect() { return super.get...
    class SourceSyntaxTextAreaEditorKit (line 131) | public class SourceSyntaxTextAreaEditorKit extends RSyntaxTextAreaEdit...
      method createLineNumberList (line 132) | @Override public LineNumberList createLineNumberList(RTextArea textA...
    class SourceLineNumberList (line 138) | public class SourceLineNumberList extends LineNumberList {
      method SourceLineNumberList (line 145) | public SourceLineNumberList(RTextArea textArea) {
      method init (line 150) | @Override
      method paintComponent (line 161) | @Override
      method paintLineNumber (line 278) | protected void paintLineNumber(Graphics g, FontMetrics metrics, int ...
      method getRhsBorderWidth (line 295) | public int getRhsBorderWidth() { return ((RSyntaxTextArea)rTextArea)...
      method getPreferredSize (line 297) | @Override

FILE: services/src/main/java/org/jd/gui/view/component/DynamicPage.java
  class DynamicPage (line 25) | public class DynamicPage
    method DynamicPage (line 37) | public DynamicPage(API api, Container.Entry entry) {
    method copy (line 56) | @Override public void copy() { page.copy(); }
    method getFileName (line 59) | @Override public String getFileName() { return page.getFileName(); }
    method save (line 60) | @Override public void save(API api, OutputStream outputStream) { page....
    method highlightText (line 63) | @Override public boolean highlightText(String text, boolean caseSensit...
    method findNext (line 64) | @Override public void findNext(String text, boolean caseSensitive) { p...
    method findPrevious (line 65) | @Override public void findPrevious(String text, boolean caseSensitive)...
    method selectAll (line 68) | @Override public void selectAll() { page.selectAll(); }
    method getFocusedTypeName (line 71) | @Override public String getFocusedTypeName() { return page.getFocusedT...
    method getEntry (line 74) | @Override public Container.Entry getEntry() { return entry; }
    method indexesChanged (line 77) | @Override public void indexesChanged(Collection<Future<Indexes>> colle...
    method getMaximumLineNumber (line 82) | @Override public int getMaximumLineNumber() { return page.getMaximumLi...
    method goToLineNumber (line 83) | @Override public void goToLineNumber(int lineNumber) { page.goToLineNu...
    method checkLineNumber (line 84) | @Override public boolean checkLineNumber(int lineNumber) { return page...
    method preferencesChanged (line 87) | @Override public void preferencesChanged(Map<String, String> preferenc...
    method getUri (line 90) | @Override public URI getUri() { return entry.getUri(); }
    method openUri (line 93) | @Override public boolean openUri(URI uri) { return page.openUri(lastOp...
    method sourceLoaded (line 96) | @Override public void sourceLoaded(String source) {
    class DelegatedEntry (line 115) | protected static class DelegatedEntry implements Container.Entry {
      method DelegatedEntry (line 119) | DelegatedEntry(Container.Entry entry, String source) {
      method getContainer (line 124) | @Override public Container getContainer() { return entry.getContaine...
      method getParent (line 125) | @Override public Container.Entry getParent() { return entry.getParen...
      method getUri (line 126) | @Override public URI getUri() { return entry.getUri(); }
      method getPath (line 127) | @Override public String getPath() { return entry.getPath(); }
      method isDirectory (line 128) | @Override public boolean isDirectory() { return entry.isDirectory(); }
      method length (line 129) | @Override public long length() { return entry.length(); }
      method getInputStream (line 130) | @Override public InputStream getInputStream() { return new ByteArray...
      method getChildren (line 131) | @Override public Collection<Container.Entry> getChildren() { return ...

FILE: services/src/main/java/org/jd/gui/view/component/EjbJarXmlFilePage.java
  class EjbJarXmlFilePage (line 28) | public class EjbJarXmlFilePage extends TypeReferencePage implements UriG...
    method EjbJarXmlFilePage (line 33) | public EjbJarXmlFilePage(API api, Container.Entry entry) {
    method getSyntaxStyle (line 44) | public String getSyntaxStyle() { return SyntaxConstants.SYNTAX_STYLE_X...
    method isHyperlinkEnabled (line 46) | protected boolean isHyperlinkEnabled(HyperlinkData hyperlinkData) { re...
    method openHyperlink (line 48) | protected void openHyperlink(int x, int y, HyperlinkData hyperlinkData) {
    method getUri (line 83) | public URI getUri() { return entry.getUri(); }
    method getFileName (line 86) | public String getFileName() {
    method indexesChanged (line 93) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...
    class PathFinder (line 145) | public class PathFinder extends AbstractXmlPathFinder {
      method PathFinder (line 146) | public PathFinder() {
      method handle (line 150) | public void handle(String path, String text, int position) {

FILE: services/src/main/java/org/jd/gui/view/component/HyperlinkPage.java
  class HyperlinkPage (line 19) | public abstract class HyperlinkPage extends TextPage {
    method HyperlinkPage (line 25) | public HyperlinkPage() {
    method newSyntaxTextArea (line 79) | protected RSyntaxTextArea newSyntaxTextArea() { return new HyperlinkSy...
    method addHyperlink (line 81) | public void addHyperlink(HyperlinkData hyperlinkData) {
    method clearHyperlinks (line 85) | public void clearHyperlinks() {
    method isHyperlinkEnabled (line 89) | protected abstract boolean isHyperlinkEnabled(HyperlinkData hyperlinkD...
    method openHyperlink (line 91) | protected abstract void openHyperlink(int x, int y, HyperlinkData hype...
    class HyperlinkData (line 93) | public static class HyperlinkData {
      method HyperlinkData (line 97) | public HyperlinkData(int startPosition, int endPosition) {
    class HyperlinkSyntaxTextArea (line 103) | public class HyperlinkSyntaxTextArea extends RSyntaxTextArea {
      method getUnderlineForToken (line 107) | @Override

FILE: services/src/main/java/org/jd/gui/view/component/JavaFilePage.java
  class JavaFilePage (line 29) | public class JavaFilePage extends TypePage {
    method JavaFilePage (line 31) | public JavaFilePage(API api, Container.Entry entry) {
    method getSyntaxStyle (line 47) | public String getSyntaxStyle() { return SyntaxConstants.SYNTAX_STYLE_J...
    method getFileName (line 50) | public String getFileName() {
    class DeclarationListener (line 56) | public class DeclarationListener extends AbstractJavaListener {
      method DeclarationListener (line 60) | public DeclarationListener(Container.Entry entry) { super(entry); }
      method getNameToInternalTypeName (line 62) | public HashMap<String, String> getNameToInternalTypeName() { return ...
      method enterPackageDeclaration (line 65) | public void enterPackageDeclaration(JavaParser.PackageDeclarationCon...
      method enterImportDeclaration (line 73) | public void enterImportDeclaration(JavaParser.ImportDeclarationConte...
      method enterClassDeclaration (line 81) | public void enterClassDeclaration(JavaParser.ClassDeclarationContext...
      method exitClassDeclaration (line 82) | public void exitClassDeclaration(JavaParser.ClassDeclarationContext ...
      method enterEnumDeclaration (line 84) | public void enterEnumDeclaration(JavaParser.EnumDeclarationContext c...
      method exitEnumDeclaration (line 85) | public void exitEnumDeclaration(JavaParser.EnumDeclarationContext ct...
      method enterInterfaceDeclaration (line 87) | public void enterInterfaceDeclaration(JavaParser.InterfaceDeclaratio...
      method exitInterfaceDeclaration (line 88) | public void exitInterfaceDeclaration(JavaParser.InterfaceDeclaration...
      method enterAnnotationTypeDeclaration (line 90) | public void enterAnnotationTypeDeclaration(JavaParser.AnnotationType...
      method exitAnnotationTypeDeclaration (line 91) | public void exitAnnotationTypeDeclaration(JavaParser.AnnotationTypeD...
      method enterTypeDeclaration (line 93) | public void enterTypeDeclaration(ParserRuleContext ctx) {
      method exitTypeDeclaration (line 118) | public void exitTypeDeclaration() {
      method enterClassBodyDeclaration (line 134) | public void enterClassBodyDeclaration(JavaParser.ClassBodyDeclaratio...
      method enterConstDeclaration (line 150) | public void enterConstDeclaration(JavaParser.ConstDeclarationContext...
      method enterFieldDeclaration (line 164) | public void enterFieldDeclaration(JavaParser.FieldDeclarationContext...
      method enterMethodDeclaration (line 180) | public void enterMethodDeclaration(JavaParser.MethodDeclarationConte...
      method enterInterfaceMethodDeclaration (line 184) | public void enterInterfaceMethodDeclaration(JavaParser.InterfaceMeth...
      method enterMethodDeclaration (line 188) | public void enterMethodDeclaration(
      method enterConstructorDeclaration (line 201) | public void enterConstructorDeclaration(JavaParser.ConstructorDeclar...
      method createParamDescriptors (line 211) | public String createParamDescriptors(JavaParser.FormalParameterListC...
    class ReferenceListener (line 230) | public class ReferenceListener extends AbstractJavaListener {
      method ReferenceListener (line 236) | public ReferenceListener(Container.Entry entry) { super(entry); }
      method init (line 238) | public void init(DeclarationListener declarationListener) {
      method enterPackageDeclaration (line 243) | public void enterPackageDeclaration(JavaParser.PackageDeclarationCon...
      method enterImportDeclaration (line 251) | public void enterImportDeclaration(JavaParser.ImportDeclarationConte...
      method enterClassDeclaration (line 259) | public void enterClassDeclaration(JavaParser.ClassDeclarationContext...
      method exitClassDeclaration (line 260) | public void exitClassDeclaration(JavaParser.ClassDeclarationContext ...
      method enterEnumDeclaration (line 262) | public void enterEnumDeclaration(JavaParser.EnumDeclarationContext c...
      method exitEnumDeclaration (line 263) | public void exitEnumDeclaration(JavaParser.EnumDeclarationContext ct...
      method enterInterfaceDeclaration (line 265) | public void enterInterfaceDeclaration(JavaParser.InterfaceDeclaratio...
      method exitInterfaceDeclaration (line 266) | public void exitInterfaceDeclaration(JavaParser.InterfaceDeclaration...
      method enterAnnotationTypeDeclaration (line 268) | public void enterAnnotationTypeDeclaration(JavaParser.AnnotationType...
      method exitAnnotationTypeDeclaration (line 269) | public void exitAnnotationTypeDeclaration(JavaParser.AnnotationTypeD...
      method enterTypeDeclaration (line 271) | public void enterTypeDeclaration(ParserRuleContext ctx) {
      method exitTypeDeclaration (line 287) | public void exitTypeDeclaration() {
      method enterFormalParameters (line 303) | public void enterFormalParameters(JavaParser.FormalParametersContext...
      method enterType (line 320) | public void enterType(JavaParser.TypeContext ctx) {
      method enterLocalVariableDeclaration (line 334) | public void enterLocalVariableDeclaration(JavaParser.LocalVariableDe...
      method enterCreator (line 347) | public void enterCreator(JavaParser.CreatorContext ctx) {
      method enterInnerCreator (line 351) | public void enterInnerCreator(JavaParser.InnerCreatorContext ctx) {
      method enterNewExpression (line 355) | public void enterNewExpression(List<TerminalNode> identifiers, JavaP...
      method enterExpression (line 374) | public void enterExpression(JavaParser.ExpressionContext ctx) {
      method enterCallMethodExpression (line 448) | public void enterCallMethodExpression(JavaParser.ExpressionContext c...
      method getParametersDescriptor (line 527) | public StringBuilder getParametersDescriptor(JavaParser.ExpressionLi...
      method isAField (line 534) | public boolean isAField(JavaParser.ExpressionContext ctx) {
      method getInternalTypeName (line 560) | public String getInternalTypeName(ParseTree pt) {
      method searchInternalTypeNameForThisFieldName (line 619) | public String searchInternalTypeNameForThisFieldName(String internal...
      method searchInternalTypeNameForThisMethodName (line 643) | public String searchInternalTypeNameForThisMethodName(String interna...
      method getToken (line 666) | public TerminalNode getToken(List<ParseTree> children, int type, int...
      method enterBlock (line 678) | public void enterBlock(JavaParser.BlockContext ctx) {
      method exitBlock (line 682) | public void exitBlock(JavaParser.BlockContext ctx) {
      method newReferenceData (line 686) | public TypePage.ReferenceData newReferenceData(String internalName, ...
      method enterLiteral (line 700) | public void enterLiteral(JavaParser.LiteralContext ctx) {
    class Context (line 712) | public static class Context {
      method Context (line 717) | public Context(Context outerContext) {
      method getDescriptor (line 725) | public String getDescriptor(String name) {
    class TypeDeclarationData (line 736) | public static class TypeDeclarationData extends TypePage.DeclarationDa...
      method TypeDeclarationData (line 739) | public TypeDeclarationData(int startPosition, int length, String typ...

FILE: services/src/main/java/org/jd/gui/view/component/LogPage.java
  class LogPage (line 26) | public class LogPage extends HyperlinkPage implements UriGettable, Index...
    method LogPage (line 31) | public LogPage(API api, URI uri, String content) {
    method parseLine (line 49) | protected void parseLine(String content, int index, int eol) {
    method isHyperlinkEnabled (line 61) | protected boolean isHyperlinkEnabled(HyperlinkData hyperlinkData) { re...
    method openHyperlink (line 63) | protected void openHyperlink(int x, int y, HyperlinkData hyperlinkData) {
    method getUri (line 102) | public URI getUri() { return uri; }
    method getFileName (line 105) | public String getFileName() {
    method indexesChanged (line 112) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...
    class LogHyperlinkData (line 137) | public static class LogHyperlinkData extends HyperlinkData {
      method LogHyperlinkData (line 140) | public LogHyperlinkData(int startPosition, int endPosition) {

FILE: services/src/main/java/org/jd/gui/view/component/ManifestFilePage.java
  class ManifestFilePage (line 26) | public class ManifestFilePage extends HyperlinkPage implements UriGettab...
    method ManifestFilePage (line 31) | public ManifestFilePage(API api, Container.Entry entry) {
    method skipSeparators (line 64) | public int skipSeparators(String text, int index) {
    method searchEndIndexOfValue (line 80) | public int searchEndIndexOfValue(String text, int startLineIndex, int ...
    method isHyperlinkEnabled (line 118) | protected boolean isHyperlinkEnabled(HyperlinkData hyperlinkData) { re...
    method openHyperlink (line 120) | protected void openHyperlink(int x, int y, HyperlinkData hyperlinkData) {
    method getUri (line 156) | public URI getUri() { return entry.getUri(); }
    method getFileName (line 159) | public String getFileName() {
    method indexesChanged (line 166) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...
    method getValue (line 190) | public static String getValue(String text, int startPosition, int endP...
    class ManifestHyperlinkData (line 200) | public static class ManifestHyperlinkData extends HyperlinkData {
      method ManifestHyperlinkData (line 204) | ManifestHyperlinkData(int startPosition, int endPosition, String fra...

FILE: services/src/main/java/org/jd/gui/view/component/ModuleInfoFilePage.java
  class ModuleInfoFilePage (line 34) | public class ModuleInfoFilePage extends ClassFilePage {
    method ModuleInfoFilePage (line 43) | public ModuleInfoFilePage(API api, Container.Entry entry) {
    method decompile (line 47) | @Override
    method getSyntaxStyle (line 78) | @Override
    method openHyperlink (line 81) | @Override
    method openUri (line 137) | @Override
    method indexesChanged (line 206) | @Override
    class ModuleInfoReferenceData (line 259) | protected static class ModuleInfoReferenceData extends ReferenceData {
      method ModuleInfoReferenceData (line 262) | public ModuleInfoReferenceData(int type, String typeName, String nam...
    class ModuleInfoFilePrinter (line 268) | public class ModuleInfoFilePrinter extends StringBuilderPrinter {
      method start (line 271) | @Override
      method end (line 274) | @Override
      method printDeclaration (line 280) | @Override
      method printReference (line 286) | @Override
    class ModuleInfoTokenMaker (line 303) | public static class ModuleInfoTokenMaker extends AbstractTokenMaker {
      method getWordsToHighlight (line 304) | @Override
      method addToken (line 322) | @Override
      method getTokenList (line 334) | @Override

FILE: services/src/main/java/org/jd/gui/view/component/OneTypeReferencePerLinePage.java
  class OneTypeReferencePerLinePage (line 28) | public class OneTypeReferencePerLinePage extends TypeReferencePage imple...
    method OneTypeReferencePerLinePage (line 33) | public OneTypeReferencePerLinePage(API api, Container.Entry entry) {
    method isHyperlinkEnabled (line 65) | protected boolean isHyperlinkEnabled(HyperlinkData hyperlinkData) { re...
    method openHyperlink (line 67) | protected void openHyperlink(int x, int y, HyperlinkData hyperlinkData) {
    method getUri (line 102) | public URI getUri() { return entry.getUri(); }
    method getFileName (line 105) | public String getFileName() {
    method indexesChanged (line 112) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...

FILE: services/src/main/java/org/jd/gui/view/component/RoundMarkErrorStrip.java
  class RoundMarkErrorStrip (line 83) | public class RoundMarkErrorStrip extends JComponent {
    method RoundMarkErrorStrip (line 160) | public RoundMarkErrorStrip(RSyntaxTextArea textArea) {
    method addNotify (line 178) | @Override
    method doLayout (line 197) | @Override
    method getBrighterColor (line 213) | private Color getBrighterColor(Color c) {
    method getDarkerColor (line 239) | private Color getDarkerColor(Color c) {
    method getCaretMarkerColor (line 263) | public Color getCaretMarkerColor() {
    method getFollowCaret (line 274) | public boolean getFollowCaret() {
    method getPreferredSize (line 282) | @Override
    method getLevelThreshold (line 297) | public ParserNotice.Level getLevelThreshold() {
    method getShowMarkAll (line 308) | public boolean getShowMarkAll() {
    method getShowMarkedOccurrences (line 319) | public boolean getShowMarkedOccurrences() {
    method getToolTipText (line 327) | @Override
    method lineToY (line 347) | private int lineToY(int line) {
    method paintComponent (line 359) | @Override
    method possiblyBrighter (line 375) | private static final int possiblyBrighter(int i) {
    method possiblyDarker (line 389) | private static final int possiblyDarker(int i) {
    method refreshMarkers (line 397) | private void refreshMarkers() {
    method addMarkersForRanges (line 444) | private void addMarkersForRanges(List<DocumentRange> ranges,
    method removeNotify (line 474) | @Override
    method setCaretMarkerColor (line 495) | public void setCaretMarkerColor(Color color) {
    method setFollowCaret (line 509) | public void setFollowCaret(boolean follow) {
    method setLevelThreshold (line 532) | public void setLevelThreshold(ParserNotice.Level level) {
    method setShowMarkAll (line 546) | public void setShowMarkAll(boolean show) {
    method setShowMarkedOccurrences (line 562) | public void setShowMarkedOccurrences(boolean show) {
    method yToLine (line 580) | private final int yToLine(int y) {
    class Listener (line 594) | private class Listener extends MouseAdapter
      method caretUpdate (line 599) | public void caretUpdate(CaretEvent e) {
      method mouseClicked (line 613) | @Override
      method propertyChange (line 634) | public void propertyChange(PropertyChangeEvent e) {
    class MarkedOccurrenceNotice (line 677) | private class MarkedOccurrenceNotice implements ParserNotice {
      method MarkedOccurrenceNotice (line 682) | public MarkedOccurrenceNotice(DocumentRange range, Color color) {
      method compareTo (line 687) | public int compareTo(ParserNotice other) {
      method containsPosition (line 691) | public boolean containsPosition(int pos) {
      method equals (line 695) | @Override
      method getColor (line 704) | public Color getColor() {
      method getKnowsOffsetAndLength (line 711) | public boolean getKnowsOffsetAndLength() {
      method getLength (line 715) | public int getLength() {
      method getLevel (line 719) | public Level getLevel() {
      method getLine (line 723) | public int getLine() {
      method getMessage (line 731) | public String getMessage() {
      method getOffset (line 744) | public int getOffset() {
      method getParser (line 748) | public Parser getParser() {
      method getShowInEditor (line 752) | public boolean getShowInEditor() {
      method getToolTipText (line 756) | public String getToolTipText() {
      method hashCode (line 760) | @Override
    class Marker (line 771) | private class Marker extends JComponent {
      method Marker (line 775) | public Marker(ParserNotice notice) {
      method addNotice (line 783) | public void addNotice(ParserNotice notice) {
      method containsMarkedOccurence (line 787) | public boolean containsMarkedOccurence() {
      method getColor (line 798) | public Color getColor() {
      method getPreferredSize (line 811) | @Override
      method getToolTipText (line 817) | @Override
      method mouseClicked (line 842) | protected void mouseClicked(MouseEvent e) {
      method paintComponent (line 861) | @Override
      method removeNotify (line 895) | @Override
      method updateLocation (line 902) | public void updateLocation() {

FILE: services/src/main/java/org/jd/gui/view/component/TextPage.java
  class TextPage (line 22) | public class TextPage extends AbstractTextPage implements ContentCopyabl...
    method copy (line 25) | @Override
    method selectAll (line 35) | @Override
    method getFileName (line 41) | @Override
    method save (line 44) | @Override

FILE: services/src/main/java/org/jd/gui/view/component/TypePage.java
  class TypePage (line 33) | public abstract class TypePage extends CustomLineNumbersPage implements ...
    method TypePage (line 43) | public TypePage(API api, Container.Entry entry) {
    method isHyperlinkEnabled (line 49) | @Override
    method openHyperlink (line 54) | @Override
    method getUri (line 105) | @Override public URI getUri() { return entry.getUri(); }
    method openUri (line 111) | @Override
    method matchFragmentAndAddDocumentRange (line 161) | public static void matchFragmentAndAddDocumentRange(String fragment, H...
    method matchQueryAndAddDocumentRange (line 228) | public static void matchQueryAndAddDocumentRange(
    method matchScope (line 297) | public static boolean matchScope(String scope, String type) {
    method matchAndAddDocumentRange (line 305) | public static void matchAndAddDocumentRange(Pattern pattern, String te...
    method getMostInnerTypeName (line 311) | public static String getMostInnerTypeName(String typeName) {
    method getFocusedTypeName (line 319) | @Override public String getFocusedTypeName() {
    method getEntry (line 332) | @Override public Container.Entry getEntry() { return entry; }
    method indexesChanged (line 335) | @Override
    method searchTypeHavingMember (line 391) | @SuppressWarnings("unchecked")
    method searchTypeHavingMember (line 427) | protected String searchTypeHavingMember(String typeName, String name, ...
    class StringData (line 461) | public static class StringData {
      method StringData (line 467) | public StringData(int startPosition, int length, String text, String...
    class DeclarationData (line 475) | public static class DeclarationData {
      method DeclarationData (line 485) | public DeclarationData(int startPosition, int length, String typeNam...
      method isAType (line 493) | public boolean isAType() { return name == null; }
      method isAField (line 494) | public boolean isAField() { return (descriptor != null) && descripto...
      method isAMethod (line 495) | public boolean isAMethod() { return (descriptor != null) && descript...
      method isAConstructor (line 496) | public boolean isAConstructor() { return "<init>".equals(name); }
    class HyperlinkReferenceData (line 499) | public static class HyperlinkReferenceData extends HyperlinkData {
      method HyperlinkReferenceData (line 502) | public HyperlinkReferenceData(int startPosition, int length, Referen...
    class ReferenceData (line 508) | protected static class ReferenceData {
      method ReferenceData (line 528) | public ReferenceData(String typeName, String name, String descriptor...
      method isAType (line 535) | boolean isAType() { return name == null; }
      method isAField (line 536) | boolean isAField() { return (descriptor != null) && descriptor.charA...
      method isAMethod (line 537) | boolean isAMethod() { return (descriptor != null) && descriptor.char...
      method isAConstructor (line 538) | boolean isAConstructor() { return "<init>".equals(name); }

FILE: services/src/main/java/org/jd/gui/view/component/TypeReferencePage.java
  class TypeReferencePage (line 23) | public abstract class TypeReferencePage extends HyperlinkPage {
    method openUri (line 26) | public boolean openUri(URI uri) {
    method getMostInnerTypeName (line 99) | public String getMostInnerTypeName(String typeName) {
    class TypeHyperlinkData (line 106) | public static class TypeHyperlinkData extends HyperlinkData {
      method TypeHyperlinkData (line 110) | TypeHyperlinkData(int startPosition, int endPosition, String interna...

FILE: services/src/main/java/org/jd/gui/view/component/WebXmlFilePage.java
  class WebXmlFilePage (line 28) | public class WebXmlFilePage extends TypeReferencePage implements UriGett...
    method WebXmlFilePage (line 33) | public WebXmlFilePage(API api, Container.Entry entry) {
    method getSyntaxStyle (line 44) | public String getSyntaxStyle() { return SyntaxConstants.SYNTAX_STYLE_X...
    method isHyperlinkEnabled (line 46) | protected boolean isHyperlinkEnabled(HyperlinkData hyperlinkData) { re...
    method openHyperlink (line 48) | protected void openHyperlink(int x, int y, HyperlinkData hyperlinkData) {
    method searchEntry (line 91) | public static Container.Entry searchEntry(Container.Entry parent, Stri...
    method recursiveSearchEntry (line 97) | public static Container.Entry recursiveSearchEntry(Container.Entry par...
    method getUri (line 122) | public URI getUri() { return entry.getUri(); }
    method getFileName (line 125) | public String getFileName() {
    method indexesChanged (line 132) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...
    class PathHyperlinkData (line 161) | public static class PathHyperlinkData extends TypeHyperlinkData {
      method PathHyperlinkData (line 165) | PathHyperlinkData(int startPosition, int endPosition, String path) {
    class PathFinder (line 192) | public class PathFinder extends AbstractXmlPathFinder {
      method PathFinder (line 193) | public PathFinder() {
      method handle (line 197) | public void handle(String path, String text, int position) {

FILE: services/src/main/java/org/jd/gui/view/component/XmlFilePage.java
  class XmlFilePage (line 31) | public class XmlFilePage extends TypeReferencePage implements UriGettabl...
    method XmlFilePage (line 36) | public XmlFilePage(API api, Container.Entry entry) {
    method getSyntaxStyle (line 61) | public String getSyntaxStyle() { return SyntaxConstants.SYNTAX_STYLE_X...
    method isHyperlinkEnabled (line 63) | protected boolean isHyperlinkEnabled(HyperlinkData hyperlinkData) { re...
    method openHyperlink (line 65) | protected void openHyperlink(int x, int y, HyperlinkData hyperlinkData) {
    method getUri (line 100) | public URI getUri() { return entry.getUri(); }
    method getFileName (line 103) | public String getFileName() {
    method indexesChanged (line 110) | public void indexesChanged(Collection<Future<Indexes>> collectionOfFut...

FILE: services/src/main/java/org/jd/gui/view/data/TreeNodeBean.java
  class TreeNodeBean (line 14) | public class TreeNodeBean implements TreeNodeData {
    method TreeNodeBean (line 20) | public TreeNodeBean(String label, Icon icon) {
    method TreeNodeBean (line 25) | public TreeNodeBean(String label, String tip, Icon icon) {
    method TreeNodeBean (line 31) | public TreeNodeBean(String label, Icon icon, Icon openIcon) {
    method TreeNodeBean (line 37) | public TreeNodeBean(String label, String tip, Icon icon, Icon openIcon) {
    method setLabel (line 44) | public void setLabel(String label) {
    method setTip (line 48) | public void setTip(String tip) {
    method setIcon (line 52) | public void setIcon(Icon icon) {
    method setOpenIcon (line 56) | public void setOpenIcon(Icon openIcon) {
    method getLabel (line 60) | @Override
    method getTip (line 66) | @Override
    method getIcon (line 71) | @Override
    method getOpenIcon (line 76) | @Override

FILE: services/src/test/java/org/jd/gui/util/matcher/DescriptorMatcherTest.java
  class DescriptorMatcherTest (line 6) | public class DescriptorMatcherTest extends TestCase {
    method testMatchFieldDescriptors (line 7) | public void testMatchFieldDescriptors() {
    method testMatchMethodDescriptors (line 41) | public void testMatchMethodDescriptors() {

FILE: services/src/test/java/org/jd/gui/view/component/ClassFilePageTest.java
  class ClassFilePageTest (line 11) | public class ClassFilePageTest extends TestCase {
    method initDeclarations (line 13) | public HashMap<String, TypePage.DeclarationData> initDeclarations() {
    method initHyperlinks (line 46) | public TreeMap<Integer, HyperlinkPage.HyperlinkData> initHyperlinks() {
    method initStrings (line 55) | public ArrayList<TypePage.StringData> initStrings() {
    method testMatchFragmentAndAddDocumentRange (line 63) | public void testMatchFragmentAndAddDocumentRange() {
    method testMatchQueryAndAddDocumentRange (line 96) | public void testMatchQueryAndAddDocumentRange() {
    method testMatchScope (line 122) | public void testMatchScope() {

FILE: services/src/test/java/org/jd/gui/view/component/JavaFilePageTest.java
  class JavaFilePageTest (line 7) | public class JavaFilePageTest extends TestCase {
    method initDeclarations (line 9) | public HashMap<String, TypePage.DeclarationData> initDeclarations() {
    method testMatchFragmentAndAddDocumentRange (line 52) | public void testMatchFragmentAndAddDocumentRange() {}
    method testMatchQueryAndAddDocumentRange (line 54) | public void testMatchQueryAndAddDocumentRange() {}
    method testMatchScope (line 56) | public void testMatchScope() {}
Condensed preview — 257 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,024K chars).
[
  {
    "path": ".gitattributes",
    "chars": 493,
    "preview": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n# Declare OSX files that will alwa"
  },
  {
    "path": ".gitignore",
    "chars": 274,
    "preview": "# Java\n*.class\n\n# JD\ndebug*\n\n# JD-GUI\nsrc-generated/\njd-gui.cfg\n\n# Idea\n.idea/\nout/\n*.ipr\n*.iml\n*.iws\n\n# Eclipse\n.settin"
  },
  {
    "path": "LICENSE",
    "chars": 35160,
    "preview": "                     GNU GENERAL PUBLIC LICENSE\n\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Fre"
  },
  {
    "path": "NOTICE",
    "chars": 293,
    "preview": "JD-GUI license - GPLv3\n\nLibraries used:\n\nGroovy - Apache License 2.0\nGradle - Apache License 2.0\nJD-Core Java Release - "
  },
  {
    "path": "README.md",
    "chars": 2481,
    "preview": "# JD-GUI\n\nJD-GUI, a standalone graphical utility that displays Java sources from CLASS files.\n\n![](https://raw.githubuse"
  },
  {
    "path": "api/build.gradle",
    "chars": 40,
    "preview": "apply plugin: 'java'\n\nversion = '1.0.0'\n"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/API.java",
    "chars": 1750,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/ContainerEntryGettable.java",
    "chars": 388,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/ContentCopyable.java",
    "chars": 326,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/ContentIndexable.java",
    "chars": 403,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/ContentSavable.java",
    "chars": 434,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/ContentSearchable.java",
    "chars": 490,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/ContentSelectable.java",
    "chars": 333,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/FocusedTypeGettable.java",
    "chars": 377,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/IndexesChangeListener.java",
    "chars": 499,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/LineNumberNavigable.java",
    "chars": 433,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/PageChangeListener.java",
    "chars": 402,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/PageChangeable.java",
    "chars": 369,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/PageClosable.java",
    "chars": 331,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/PageCreator.java",
    "chars": 420,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/PreferencesChangeListener.java",
    "chars": 404,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/SourcesSavable.java",
    "chars": 631,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/TreeNodeExpandable.java",
    "chars": 376,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/UriGettable.java",
    "chars": 345,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/feature/UriOpenable.java",
    "chars": 3195,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/model/Container.java",
    "chars": 743,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/model/Indexes.java",
    "chars": 2325,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/model/TreeNodeData.java",
    "chars": 417,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/api/model/Type.java",
    "chars": 1313,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/ContainerFactory.java",
    "chars": 538,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/ContextualActionsFactory.java",
    "chars": 821,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/FileLoader.java",
    "chars": 477,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/Indexer.java",
    "chars": 556,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/PanelFactory.java",
    "chars": 531,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/PasteHandler.java",
    "chars": 396,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/PreferencesPanel.java",
    "chars": 899,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/SourceLoader.java",
    "chars": 555,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/SourceSaver.java",
    "chars": 1228,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/TreeNodeFactory.java",
    "chars": 725,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/TypeFactory.java",
    "chars": 906,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "api/src/main/java/org/jd/gui/spi/UriLoader.java",
    "chars": 441,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/build.gradle",
    "chars": 197,
    "preview": "apply plugin: 'java'\n\ndependencies {\n    provided 'com.yuvimasory:orange-extensions:1.3.0'   // OSX support\n    compile "
  },
  {
    "path": "app/src/main/java/org/jd/gui/App.java",
    "chars": 3277,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/Constants.java",
    "chars": 689,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/OsxApp.java",
    "chars": 874,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/AboutController.java",
    "chars": 592,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/GoToController.java",
    "chars": 845,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/MainController.java",
    "chars": 27969,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/OpenTypeController.java",
    "chars": 12051,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/OpenTypeHierarchyController.java",
    "chars": 3446,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/PreferencesController.java",
    "chars": 880,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/SaveAllSourcesController.java",
    "chars": 2800,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/SearchInConstantPoolsController.java",
    "chars": 20987,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/controller/SelectLocationController.java",
    "chars": 7157,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/model/configuration/Configuration.java",
    "chars": 2696,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/model/container/DelegatingFilterContainer.java",
    "chars": 4366,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/model/history/History.java",
    "chars": 2311,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/actions/ContextualActionsFactoryService.java",
    "chars": 2943,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/configuration/ConfigurationPersister.java",
    "chars": 451,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/configuration/ConfigurationPersisterService.java",
    "chars": 778,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java",
    "chars": 13131,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/container/ContainerFactoryService.java",
    "chars": 1098,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/extension/ExtensionService.java",
    "chars": 2909,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/fileloader/FileLoaderService.java",
    "chars": 1473,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/indexer/IndexerService.java",
    "chars": 3538,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/mainpanel/ContainerPanelFactoryProvider.java",
    "chars": 7206,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/mainpanel/PanelFactoryService.java",
    "chars": 1291,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/pastehandler/PasteHandlerService.java",
    "chars": 956,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/platform/PlatformService.java",
    "chars": 977,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/preferencespanel/PreferencesPanelService.java",
    "chars": 1485,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/preferencespanel/UISingleInstancePreferencesProvider.java",
    "chars": 1971,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/preferencespanel/UITabsPreferencesProvider.java",
    "chars": 1922,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/sourceloader/SourceLoaderService.java",
    "chars": 1740,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/sourcesaver/SourceSaverService.java",
    "chars": 3546,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/treenode/TreeNodeFactoryService.java",
    "chars": 3764,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/type/TypeFactoryService.java",
    "chars": 3928,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/service/uriloader/UriLoaderService.java",
    "chars": 1307,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/util/exception/ExceptionUtil.java",
    "chars": 435,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/util/function/TriConsumer.java",
    "chars": 643,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/util/net/InterProcessCommunicationUtil.java",
    "chars": 1895,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/util/net/UriUtil.java",
    "chars": 2795,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/util/swing/SwingUtil.java",
    "chars": 7755,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/AboutView.java",
    "chars": 5425,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/GoToView.java",
    "chars": 6798,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/MainView.java",
    "chars": 22129,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/OpenTypeHierarchyView.java",
    "chars": 19544,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/OpenTypeView.java",
    "chars": 11472,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/PreferencesView.java",
    "chars": 8153,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/SaveAllSourcesView.java",
    "chars": 4458,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/SearchInConstantPoolsView.java",
    "chars": 19654,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/SelectLocationView.java",
    "chars": 7912,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/bean/OpenTypeListCellBean.java",
    "chars": 1037,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/component/IconButton.java",
    "chars": 654,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/component/List.java",
    "chars": 3303,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/component/Tree.java",
    "chars": 1156,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/component/panel/MainTabbedPanel.java",
    "chars": 6450,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/component/panel/TabbedPanel.java",
    "chars": 9376,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/component/panel/TreeTabbedPanel.java",
    "chars": 12399,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/renderer/OpenTypeListCellRenderer.java",
    "chars": 3162,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/java/org/jd/gui/view/renderer/TreeNodeRenderer.java",
    "chars": 3130,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "app/src/main/resources/META-INF/services/org.jd.gui.spi.PanelFactory",
    "chars": 59,
    "preview": "org.jd.gui.service.mainpanel.ContainerPanelFactoryProvider\n"
  },
  {
    "path": "app/src/main/resources/META-INF/services/org.jd.gui.spi.PreferencesPanel",
    "chars": 134,
    "preview": "org.jd.gui.service.preferencespanel.UISingleInstancePreferencesProvider\norg.jd.gui.service.preferencespanel.UITabsPrefer"
  },
  {
    "path": "build.gradle",
    "chars": 5972,
    "preview": "buildscript {\n    repositories {\n        jcenter()\n    }\n    dependencies {\n        classpath 'com.netflix.nebula:gradle"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "chars": 232,
    "preview": "#Sat Mar 02 11:11:32 CET 2019\ndistributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_"
  },
  {
    "path": "gradlew",
    "chars": 5080,
    "preview": "#!/usr/bin/env bash\n\n##############################################################################\n##\n##  Gradle start "
  },
  {
    "path": "gradlew.bat",
    "chars": 2404,
    "preview": "@if \"%DEBUG%\" == \"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@r"
  },
  {
    "path": "services/build.gradle",
    "chars": 1660,
    "preview": "apply plugin: 'java'\n\ndependencies {\n    compile 'com.fifesoft:rsyntaxtextarea:3.0.4'\n    compile 'org.ow2.asm:asm:7.1'\n"
  },
  {
    "path": "services/src/main/antlr/Java.g4",
    "chars": 20981,
    "preview": "/*\n [The \"BSD licence\"]\n Copyright (c) 2013 Terence Parr, Sam Harwell\n All rights reserved.\n\n Redistribution and use in "
  },
  {
    "path": "services/src/main/java/org/fife/ui/rtextarea/Marker.java",
    "chars": 830,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/ContainerEntryComparator.java",
    "chars": 910,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/EarContainer.java",
    "chars": 601,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/GenericContainer.java",
    "chars": 6942,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/JarContainer.java",
    "chars": 601,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/JavaModuleContainer.java",
    "chars": 616,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/KarContainer.java",
    "chars": 601,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/model/container/WarContainer.java",
    "chars": 601,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/actions/CopyQualifiedNameContextualActionsFactory.java",
    "chars": 4623,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/actions/InvalidFormatException.java",
    "chars": 410,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/container/EarContainerFactoryProvider.java",
    "chars": 1495,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/container/GenericContainerFactoryProvider.java",
    "chars": 856,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/container/JarContainerFactoryProvider.java",
    "chars": 1560,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/container/JavaModuleContainerFactoryProvider.java",
    "chars": 1485,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/container/KarContainerFactoryProvider.java",
    "chars": 1467,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/container/WarContainerFactoryProvider.java",
    "chars": 1461,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/AarFileLoaderProvider.java",
    "chars": 801,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/AbstractFileLoaderProvider.java",
    "chars": 3872,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/AbstractTypeFileLoaderProvider.java",
    "chars": 2371,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/ClassFileLoaderProvider.java",
    "chars": 1482,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/EarFileLoaderProvider.java",
    "chars": 816,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/JarFileLoaderProvider.java",
    "chars": 798,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/JavaFileLoaderProvider.java",
    "chars": 1499,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/JavaModuleFileLoaderProvider.java",
    "chars": 807,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/KarFileLoaderProvider.java",
    "chars": 799,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/LogFileLoaderProvider.java",
    "chars": 1098,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/WarFileLoaderProvider.java",
    "chars": 809,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/fileloader/ZipFileLoaderProvider.java",
    "chars": 2058,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/AbstractIndexerProvider.java",
    "chars": 2935,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/ClassFileIndexerProvider.java",
    "chars": 11729,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/DirectoryIndexerProvider.java",
    "chars": 1427,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/EjbJarXmlFileIndexerProvider.java",
    "chars": 3196,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/JavaFileIndexerProvider.java",
    "chars": 14695,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/JavaModuleFileIndexerProvider.java",
    "chars": 1897,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/JavaModuleInfoFileIndexerProvider.java",
    "chars": 3836,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/MetainfServiceFileIndexerProvider.java",
    "chars": 1693,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/TextFileIndexerProvider.java",
    "chars": 1104,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/WebXmlFileIndexerProvider.java",
    "chars": 1677,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/XmlBasedFileIndexerProvider.java",
    "chars": 4621,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/XmlFileIndexerProvider.java",
    "chars": 5361,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/indexer/ZipFileIndexerProvider.java",
    "chars": 1086,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/pastehandler/LogPasteHandler.java",
    "chars": 877,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/preferencespanel/ClassFileDecompilerPreferencesProvider.java",
    "chars": 2434,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/preferencespanel/ClassFileSaverPreferencesProvider.java",
    "chars": 2226,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/preferencespanel/DirectoryIndexerPreferencesProvider.java",
    "chars": 3379,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/preferencespanel/MavenOrgSourceLoaderPreferencesProvider.java",
    "chars": 5482,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/preferencespanel/ViewerPreferencesProvider.java",
    "chars": 3968,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourceloader/MavenOrgSourceLoaderProvider.java",
    "chars": 12242,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourcesaver/AbstractSourceSaverProvider.java",
    "chars": 2560,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourcesaver/ClassFileSourceSaverProvider.java",
    "chars": 6431,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourcesaver/DirectorySourceSaverProvider.java",
    "chars": 2363,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourcesaver/FileSourceSaverProvider.java",
    "chars": 1946,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourcesaver/PackageSourceSaverProvider.java",
    "chars": 782,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/sourcesaver/ZipFileSourceSaverProvider.java",
    "chars": 2442,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/AbstractTreeNodeFactoryProvider.java",
    "chars": 2583,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/AbstractTypeFileTreeNodeFactoryProvider.java",
    "chars": 8240,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/ClassFileTreeNodeFactoryProvider.java",
    "chars": 3914,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/ClassesDirectoryTreeNodeFactoryProvider.java",
    "chars": 1384,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/CssFileTreeNodeFactoryProvider.java",
    "chars": 2027,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/DirectoryTreeNodeFactoryProvider.java",
    "chars": 3997,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/DtdFileTreeNodeFactoryProvider.java",
    "chars": 1991,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/EarFileTreeNodeFactoryProvider.java",
    "chars": 1478,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/EjbJarXmlFileTreeNodeFactoryProvider.java",
    "chars": 1822,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/FileTreeNodeFactoryProvider.java",
    "chars": 1922,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/HtmlFileTreeNodeFactoryProvider.java",
    "chars": 2014,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/ImageFileTreeNodeFactoryProvider.java",
    "chars": 2790,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JarFileTreeNodeFactoryProvider.java",
    "chars": 2976,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JavaFileTreeNodeFactoryProvider.java",
    "chars": 2226,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JavaModuleFileTreeNodeFactoryProvider.java",
    "chars": 1304,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JavaModulePackageTreeNodeFactoryProvider.java",
    "chars": 729,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JavascriptFileTreeNodeFactoryProvider.java",
    "chars": 1996,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JsonFileTreeNodeFactoryProvider.java",
    "chars": 1996,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/JspFileTreeNodeFactoryProvider.java",
    "chars": 2010,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/KarFileTreeNodeFactoryProvider.java",
    "chars": 1296,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/ManifestFileTreeNodeFactoryProvider.java",
    "chars": 1822,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/MetainfDirectoryTreeNodeFactoryProvider.java",
    "chars": 1011,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/MetainfServiceFileTreeNodeFactoryProvider.java",
    "chars": 2223,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/ModuleInfoFileTreeNodeFactoryProvider.java",
    "chars": 3623,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/PackageTreeNodeFactoryProvider.java",
    "chars": 2872,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/PropertiesFileTreeNodeFactoryProvider.java",
    "chars": 2062,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/SpiFileTreeNodeFactoryProvider.java",
    "chars": 735,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/SqlFileTreeNodeFactoryProvider.java",
    "chars": 1990,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/TextFileTreeNodeFactoryProvider.java",
    "chars": 3233,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/WarFileTreeNodeFactoryProvider.java",
    "chars": 1478,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/WarPackageTreeNodeFactoryProvider.java",
    "chars": 731,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/WebXmlFileTreeNodeFactoryProvider.java",
    "chars": 1804,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/WebinfLibDirectoryTreeNodeFactoryProvider.java",
    "chars": 798,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/XmlBasedFileTreeNodeFactoryProvider.java",
    "chars": 2057,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/XmlFileTreeNodeFactoryProvider.java",
    "chars": 1847,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/treenode/ZipFileTreeNodeFactoryProvider.java",
    "chars": 2232,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/type/AbstractTypeFactoryProvider.java",
    "chars": 18840,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  },
  {
    "path": "services/src/main/java/org/jd/gui/service/type/ClassFileTypeFactoryProvider.java",
    "chars": 13915,
    "preview": "/*\n * Copyright (c) 2008-2019 Emmanuel Dupuy.\n * This project is distributed under the GPLv3 license.\n * This is a Copyl"
  }
]

// ... and 57 more files (download for full content)

About this extraction

This page contains the full source code of the java-decompiler/jd-gui GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 257 files (945.3 KB), approximately 208.6k tokens, and a symbol index with 1839 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!