From 72fde57836b2d0172f39c043dd932a70a93146ab Mon Sep 17 00:00:00 2001 From: Jacocococo Date: Thu, 25 Mar 2021 19:29:34 +0100 Subject: [PATCH] Initial beta changes (again) --- .classpath | 18 +- .project | 34 +- .../services/org.jd.gui.spi.ContainerFactory | 7 + .../org.jd.gui.spi.ContextualActionsFactory | 1 + .../services/org.jd.gui.spi.FileLoader | 10 + .../META-INF/services/org.jd.gui.spi.Indexer | 12 + .../services/org.jd.gui.spi.PanelFactory | 1 + .../services/org.jd.gui.spi.PasteHandler | 1 + .../services/org.jd.gui.spi.PreferencesPanel | 7 + .../services/org.jd.gui.spi.SourceLoader | 1 + .../services/org.jd.gui.spi.SourceSaver | 5 + .../services/org.jd.gui.spi.TreeNodeFactory | 34 ++ .../services/org.jd.gui.spi.TypeFactory | 2 + .../services/org.jd.gui.spi.UriLoader | 1 + resources/org/jd/gui/images/abstract_ovr.png | Bin 0 -> 187 bytes .../org/jd/gui/images/annotation_obj.png | Bin 0 -> 3021 bytes .../org/jd/gui/images/archivefolder_obj.png | Bin 0 -> 3017 bytes resources/org/jd/gui/images/ascii_obj.png | Bin 0 -> 713 bytes resources/org/jd/gui/images/backward_nav.png | Bin 0 -> 469 bytes .../org/jd/gui/images/class_default_obj.png | Bin 0 -> 3275 bytes resources/org/jd/gui/images/class_obj.png | Bin 0 -> 3147 bytes .../org/jd/gui/images/class_private_obj.png | Bin 0 -> 3273 bytes .../org/jd/gui/images/class_protected_obj.png | Bin 0 -> 3275 bytes resources/org/jd/gui/images/classf_obj.png | Bin 0 -> 522 bytes resources/org/jd/gui/images/close.gif | Bin 0 -> 88 bytes resources/org/jd/gui/images/close_active.gif | Bin 0 -> 88 bytes resources/org/jd/gui/images/constr_ovr.png | Bin 0 -> 180 bytes resources/org/jd/gui/images/copy.png | Bin 0 -> 413 bytes resources/org/jd/gui/images/cpyqual_menu.png | Bin 0 -> 526 bytes resources/org/jd/gui/images/css_obj.png | Bin 0 -> 2972 bytes resources/org/jd/gui/images/dtd_obj.gif | Bin 0 -> 351 bytes resources/org/jd/gui/images/ear_obj.gif | Bin 0 -> 592 bytes resources/org/jd/gui/images/ejbmodule_obj.gif | Bin 0 -> 1021 bytes resources/org/jd/gui/images/enum_obj.png | Bin 0 -> 3043 bytes .../org/jd/gui/images/field_default_obj.png | Bin 0 -> 218 bytes .../org/jd/gui/images/field_private_obj.png | Bin 0 -> 177 bytes .../org/jd/gui/images/field_protected_obj.png | Bin 0 -> 222 bytes .../org/jd/gui/images/field_public_obj.png | Bin 0 -> 221 bytes resources/org/jd/gui/images/file-image.gif | Bin 0 -> 597 bytes .../org/jd/gui/images/file_plain_obj.png | Bin 0 -> 317 bytes resources/org/jd/gui/images/final_ovr.png | Bin 0 -> 122 bytes resources/org/jd/gui/images/folder.gif | Bin 0 -> 219 bytes resources/org/jd/gui/images/folder_open.png | Bin 0 -> 310 bytes resources/org/jd/gui/images/forward_nav.png | Bin 0 -> 470 bytes .../org/jd/gui/images/generate_class.png | Bin 0 -> 297 bytes resources/org/jd/gui/images/generate_int.png | Bin 0 -> 2918 bytes resources/org/jd/gui/images/html_obj.gif | Bin 0 -> 364 bytes resources/org/jd/gui/images/inf_obj.png | Bin 0 -> 2954 bytes .../org/jd/gui/images/int_default_obj.png | Bin 0 -> 3272 bytes resources/org/jd/gui/images/int_obj.png | Bin 0 -> 3254 bytes .../org/jd/gui/images/int_private_obj.png | Bin 0 -> 3271 bytes .../org/jd/gui/images/int_protected_obj.png | Bin 0 -> 3275 bytes resources/org/jd/gui/images/jar_obj.png | Bin 0 -> 569 bytes resources/org/jd/gui/images/java_obj.png | Bin 0 -> 738 bytes resources/org/jd/gui/images/jcu_obj.png | Bin 0 -> 738 bytes resources/org/jd/gui/images/jd_icon_128.png | Bin 0 -> 14178 bytes resources/org/jd/gui/images/jd_icon_32.png | Bin 0 -> 2206 bytes resources/org/jd/gui/images/jd_icon_64.png | Bin 0 -> 5673 bytes resources/org/jd/gui/images/js_obj.png | Bin 0 -> 406 bytes resources/org/jd/gui/images/manifest_obj.png | Bin 0 -> 463 bytes resources/org/jd/gui/images/methdef_obj.png | Bin 0 -> 290 bytes resources/org/jd/gui/images/methpri_obj.png | Bin 0 -> 292 bytes resources/org/jd/gui/images/methpro_obj.png | Bin 0 -> 299 bytes resources/org/jd/gui/images/methpub_obj.png | Bin 0 -> 325 bytes resources/org/jd/gui/images/minus.png | Bin 0 -> 294 bytes resources/org/jd/gui/images/module_obj.png | Bin 0 -> 522 bytes resources/org/jd/gui/images/next_nav.png | Bin 0 -> 536 bytes resources/org/jd/gui/images/open.png | Bin 0 -> 498 bytes resources/org/jd/gui/images/open_type.png | Bin 0 -> 729 bytes resources/org/jd/gui/images/package_obj.png | Bin 0 -> 263 bytes .../org/jd/gui/images/packagefolder_obj.png | Bin 0 -> 421 bytes resources/org/jd/gui/images/packd_obj.png | Bin 0 -> 493 bytes resources/org/jd/gui/images/paste.png | Bin 0 -> 799 bytes resources/org/jd/gui/images/plus.png | Bin 0 -> 311 bytes resources/org/jd/gui/images/preferences.png | Bin 0 -> 330 bytes resources/org/jd/gui/images/prev_nav.png | Bin 0 -> 527 bytes resources/org/jd/gui/images/save.png | Bin 0 -> 808 bytes resources/org/jd/gui/images/save_all.png | Bin 0 -> 747 bytes resources/org/jd/gui/images/search_src.png | Bin 0 -> 508 bytes resources/org/jd/gui/images/sql_obj.png | Bin 0 -> 3043 bytes resources/org/jd/gui/images/static_ovr.png | Bin 0 -> 129 bytes .../org/jd/gui/images/th_showqualified.png | Bin 0 -> 390 bytes resources/org/jd/gui/images/war_obj.gif | Bin 0 -> 1014 bytes resources/org/jd/gui/images/xml_obj.gif | Bin 0 -> 357 bytes resources/org/jd/gui/images/zip_obj.png | Bin 0 -> 509 bytes .../jacoco/mcdata/DownloadLatestVersion.java | 39 ++ src/com/jacoco/mcdata/Gui.java | 377 ++++-------------- src/com/jacoco/mcdata/Main.java | 52 +-- src/com/jacoco/mcdata/Theme.java | 108 ++--- src/com/jacoco/mcdata/Utils.java | 90 +++++ .../mcdata/controller/ActionsController.java | 43 ++ .../controller/InitializationController.java | 112 ++++++ .../mcdata/controller/JDController.java | 33 ++ src/com/jacoco/mcdata/files/Config.java | 241 ++++++----- .../jacoco/mcdata/files/Deobfuscation.java | 299 +++++++------- .../jacoco/mcdata/files/ObfuscationMap.java | 134 +++---- src/com/jacoco/mcdata/files/OnExport.java | 14 +- .../jacoco/mcdata/{ => version}/Version.java | 122 +++--- .../jacoco/mcdata/{ => version}/Versions.java | 62 +-- src/com/jacoco/mcdata/view/ActionsView.java | 61 +++ .../mcdata/view/InitializationView.java | 95 +++++ src/com/jacoco/mcdata/view/JDView.java | 29 ++ src/com/jacoco/mcdata/view/View.java | 48 +++ src/org/jd/gui/Constants.java | 2 - src/org/jd/gui/JDGui.java | 78 ++-- src/org/jd/gui/controller/MainController.java | 147 ++++--- .../gui/service/ConfigurationPersister.java | 155 +++++++ ...QualifiedNameContextualActionsFactory.java | 2 +- .../configuration/ConfigurationPersister.java | 16 - .../ConfigurationPersisterService.java | 22 - .../ConfigurationXmlPersisterProvider.java | 293 -------------- .../DtdFileTreeNodeFactoryProvider.java | 2 +- .../type/AbstractTypeFactoryProvider.java | 52 +-- src/org/jd/gui/view/AboutView.java | 2 +- src/org/jd/gui/view/MainView.java | 150 +++++-- .../jd/gui/view/OpenTypeHierarchyView.java | 4 +- .../gui/view/component/AbstractTextPage.java | 4 +- .../view/component/panel/MainTabbedPanel.java | 11 +- .../gui/view/component/panel/TabbedPanel.java | 4 +- 119 files changed, 1702 insertions(+), 1335 deletions(-) create mode 100644 resources/META-INF/services/org.jd.gui.spi.ContainerFactory create mode 100644 resources/META-INF/services/org.jd.gui.spi.ContextualActionsFactory create mode 100644 resources/META-INF/services/org.jd.gui.spi.FileLoader create mode 100644 resources/META-INF/services/org.jd.gui.spi.Indexer create mode 100644 resources/META-INF/services/org.jd.gui.spi.PanelFactory create mode 100644 resources/META-INF/services/org.jd.gui.spi.PasteHandler create mode 100644 resources/META-INF/services/org.jd.gui.spi.PreferencesPanel create mode 100644 resources/META-INF/services/org.jd.gui.spi.SourceLoader create mode 100644 resources/META-INF/services/org.jd.gui.spi.SourceSaver create mode 100644 resources/META-INF/services/org.jd.gui.spi.TreeNodeFactory create mode 100644 resources/META-INF/services/org.jd.gui.spi.TypeFactory create mode 100644 resources/META-INF/services/org.jd.gui.spi.UriLoader create mode 100644 resources/org/jd/gui/images/abstract_ovr.png create mode 100644 resources/org/jd/gui/images/annotation_obj.png create mode 100644 resources/org/jd/gui/images/archivefolder_obj.png create mode 100644 resources/org/jd/gui/images/ascii_obj.png create mode 100644 resources/org/jd/gui/images/backward_nav.png create mode 100644 resources/org/jd/gui/images/class_default_obj.png create mode 100644 resources/org/jd/gui/images/class_obj.png create mode 100644 resources/org/jd/gui/images/class_private_obj.png create mode 100644 resources/org/jd/gui/images/class_protected_obj.png create mode 100644 resources/org/jd/gui/images/classf_obj.png create mode 100644 resources/org/jd/gui/images/close.gif create mode 100644 resources/org/jd/gui/images/close_active.gif create mode 100644 resources/org/jd/gui/images/constr_ovr.png create mode 100644 resources/org/jd/gui/images/copy.png create mode 100644 resources/org/jd/gui/images/cpyqual_menu.png create mode 100644 resources/org/jd/gui/images/css_obj.png create mode 100644 resources/org/jd/gui/images/dtd_obj.gif create mode 100644 resources/org/jd/gui/images/ear_obj.gif create mode 100644 resources/org/jd/gui/images/ejbmodule_obj.gif create mode 100644 resources/org/jd/gui/images/enum_obj.png create mode 100644 resources/org/jd/gui/images/field_default_obj.png create mode 100644 resources/org/jd/gui/images/field_private_obj.png create mode 100644 resources/org/jd/gui/images/field_protected_obj.png create mode 100644 resources/org/jd/gui/images/field_public_obj.png create mode 100644 resources/org/jd/gui/images/file-image.gif create mode 100644 resources/org/jd/gui/images/file_plain_obj.png create mode 100644 resources/org/jd/gui/images/final_ovr.png create mode 100644 resources/org/jd/gui/images/folder.gif create mode 100644 resources/org/jd/gui/images/folder_open.png create mode 100644 resources/org/jd/gui/images/forward_nav.png create mode 100644 resources/org/jd/gui/images/generate_class.png create mode 100644 resources/org/jd/gui/images/generate_int.png create mode 100644 resources/org/jd/gui/images/html_obj.gif create mode 100644 resources/org/jd/gui/images/inf_obj.png create mode 100644 resources/org/jd/gui/images/int_default_obj.png create mode 100644 resources/org/jd/gui/images/int_obj.png create mode 100644 resources/org/jd/gui/images/int_private_obj.png create mode 100644 resources/org/jd/gui/images/int_protected_obj.png create mode 100644 resources/org/jd/gui/images/jar_obj.png create mode 100644 resources/org/jd/gui/images/java_obj.png create mode 100644 resources/org/jd/gui/images/jcu_obj.png create mode 100644 resources/org/jd/gui/images/jd_icon_128.png create mode 100644 resources/org/jd/gui/images/jd_icon_32.png create mode 100644 resources/org/jd/gui/images/jd_icon_64.png create mode 100644 resources/org/jd/gui/images/js_obj.png create mode 100644 resources/org/jd/gui/images/manifest_obj.png create mode 100644 resources/org/jd/gui/images/methdef_obj.png create mode 100644 resources/org/jd/gui/images/methpri_obj.png create mode 100644 resources/org/jd/gui/images/methpro_obj.png create mode 100644 resources/org/jd/gui/images/methpub_obj.png create mode 100644 resources/org/jd/gui/images/minus.png create mode 100644 resources/org/jd/gui/images/module_obj.png create mode 100644 resources/org/jd/gui/images/next_nav.png create mode 100644 resources/org/jd/gui/images/open.png create mode 100644 resources/org/jd/gui/images/open_type.png create mode 100644 resources/org/jd/gui/images/package_obj.png create mode 100644 resources/org/jd/gui/images/packagefolder_obj.png create mode 100644 resources/org/jd/gui/images/packd_obj.png create mode 100644 resources/org/jd/gui/images/paste.png create mode 100644 resources/org/jd/gui/images/plus.png create mode 100644 resources/org/jd/gui/images/preferences.png create mode 100644 resources/org/jd/gui/images/prev_nav.png create mode 100644 resources/org/jd/gui/images/save.png create mode 100644 resources/org/jd/gui/images/save_all.png create mode 100644 resources/org/jd/gui/images/search_src.png create mode 100644 resources/org/jd/gui/images/sql_obj.png create mode 100644 resources/org/jd/gui/images/static_ovr.png create mode 100644 resources/org/jd/gui/images/th_showqualified.png create mode 100644 resources/org/jd/gui/images/war_obj.gif create mode 100644 resources/org/jd/gui/images/xml_obj.gif create mode 100644 resources/org/jd/gui/images/zip_obj.png create mode 100644 src/com/jacoco/mcdata/DownloadLatestVersion.java create mode 100644 src/com/jacoco/mcdata/Utils.java create mode 100644 src/com/jacoco/mcdata/controller/ActionsController.java create mode 100644 src/com/jacoco/mcdata/controller/InitializationController.java create mode 100644 src/com/jacoco/mcdata/controller/JDController.java rename src/com/jacoco/mcdata/{ => version}/Version.java (92%) rename src/com/jacoco/mcdata/{ => version}/Versions.java (90%) create mode 100644 src/com/jacoco/mcdata/view/ActionsView.java create mode 100644 src/com/jacoco/mcdata/view/InitializationView.java create mode 100644 src/com/jacoco/mcdata/view/JDView.java create mode 100644 src/com/jacoco/mcdata/view/View.java create mode 100644 src/org/jd/gui/service/ConfigurationPersister.java delete mode 100644 src/org/jd/gui/service/configuration/ConfigurationPersister.java delete mode 100644 src/org/jd/gui/service/configuration/ConfigurationPersisterService.java delete mode 100644 src/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java diff --git a/.classpath b/.classpath index e461bea..3178f7b 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,12 @@ - - - - - - + + + + + + + + + + + + diff --git a/.project b/.project index c1c4f42..48ebb36 100644 --- a/.project +++ b/.project @@ -1,17 +1,17 @@ - - - MCData - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - + + + MCData + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/resources/META-INF/services/org.jd.gui.spi.ContainerFactory b/resources/META-INF/services/org.jd.gui.spi.ContainerFactory new file mode 100644 index 0000000..de09b74 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.ContainerFactory @@ -0,0 +1,7 @@ +# Order is important : 'GenericContainerFactoryProvider' must be the last +org.jd.gui.service.container.KarContainerFactoryProvider +org.jd.gui.service.container.JavaModuleContainerFactoryProvider +org.jd.gui.service.container.EarContainerFactoryProvider +org.jd.gui.service.container.WarContainerFactoryProvider +org.jd.gui.service.container.JarContainerFactoryProvider +org.jd.gui.service.container.GenericContainerFactoryProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.ContextualActionsFactory b/resources/META-INF/services/org.jd.gui.spi.ContextualActionsFactory new file mode 100644 index 0000000..f2a8242 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.ContextualActionsFactory @@ -0,0 +1 @@ +org.jd.gui.service.actions.CopyQualifiedNameContextualActionsFactory diff --git a/resources/META-INF/services/org.jd.gui.spi.FileLoader b/resources/META-INF/services/org.jd.gui.spi.FileLoader new file mode 100644 index 0000000..8c2851b --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.FileLoader @@ -0,0 +1,10 @@ +org.jd.gui.service.fileloader.AarFileLoaderProvider +org.jd.gui.service.fileloader.ClassFileLoaderProvider +org.jd.gui.service.fileloader.EarFileLoaderProvider +org.jd.gui.service.fileloader.JarFileLoaderProvider +org.jd.gui.service.fileloader.JavaFileLoaderProvider +org.jd.gui.service.fileloader.JavaModuleFileLoaderProvider +org.jd.gui.service.fileloader.KarFileLoaderProvider +org.jd.gui.service.fileloader.LogFileLoaderProvider +org.jd.gui.service.fileloader.WarFileLoaderProvider +org.jd.gui.service.fileloader.ZipFileLoaderProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.Indexer b/resources/META-INF/services/org.jd.gui.spi.Indexer new file mode 100644 index 0000000..73259c4 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.Indexer @@ -0,0 +1,12 @@ +org.jd.gui.service.indexer.DirectoryIndexerProvider +org.jd.gui.service.indexer.ClassFileIndexerProvider +org.jd.gui.service.indexer.EjbJarXmlFileIndexerProvider +org.jd.gui.service.indexer.JavaFileIndexerProvider +org.jd.gui.service.indexer.JavaModuleFileIndexerProvider +org.jd.gui.service.indexer.JavaModuleInfoFileIndexerProvider +org.jd.gui.service.indexer.MetainfServiceFileIndexerProvider +org.jd.gui.service.indexer.TextFileIndexerProvider +org.jd.gui.service.indexer.WebXmlFileIndexerProvider +org.jd.gui.service.indexer.ZipFileIndexerProvider +org.jd.gui.service.indexer.XmlBasedFileIndexerProvider +org.jd.gui.service.indexer.XmlFileIndexerProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.PanelFactory b/resources/META-INF/services/org.jd.gui.spi.PanelFactory new file mode 100644 index 0000000..91df551 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.PanelFactory @@ -0,0 +1 @@ +org.jd.gui.service.mainpanel.ContainerPanelFactoryProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.PasteHandler b/resources/META-INF/services/org.jd.gui.spi.PasteHandler new file mode 100644 index 0000000..b6d3e57 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.PasteHandler @@ -0,0 +1 @@ +org.jd.gui.service.pastehandler.LogPasteHandler diff --git a/resources/META-INF/services/org.jd.gui.spi.PreferencesPanel b/resources/META-INF/services/org.jd.gui.spi.PreferencesPanel new file mode 100644 index 0000000..9ea918f --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.PreferencesPanel @@ -0,0 +1,7 @@ +org.jd.gui.service.preferencespanel.UISingleInstancePreferencesProvider +org.jd.gui.service.preferencespanel.UITabsPreferencesProvider +org.jd.gui.service.preferencespanel.DirectoryIndexerPreferencesProvider +org.jd.gui.service.preferencespanel.ClassFileSaverPreferencesProvider +org.jd.gui.service.preferencespanel.ClassFileDecompilerPreferencesProvider +org.jd.gui.service.preferencespanel.ViewerPreferencesProvider +org.jd.gui.service.preferencespanel.MavenOrgSourceLoaderPreferencesProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.SourceLoader b/resources/META-INF/services/org.jd.gui.spi.SourceLoader new file mode 100644 index 0000000..d9ed447 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.SourceLoader @@ -0,0 +1 @@ +org.jd.gui.service.sourceloader.MavenOrgSourceLoaderProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.SourceSaver b/resources/META-INF/services/org.jd.gui.spi.SourceSaver new file mode 100644 index 0000000..f2e0eb6 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.SourceSaver @@ -0,0 +1,5 @@ +org.jd.gui.service.sourcesaver.ClassFileSourceSaverProvider +org.jd.gui.service.sourcesaver.DirectorySourceSaverProvider +org.jd.gui.service.sourcesaver.FileSourceSaverProvider +org.jd.gui.service.sourcesaver.PackageSourceSaverProvider +org.jd.gui.service.sourcesaver.ZipFileSourceSaverProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.TreeNodeFactory b/resources/META-INF/services/org.jd.gui.spi.TreeNodeFactory new file mode 100644 index 0000000..6f02a5f --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.TreeNodeFactory @@ -0,0 +1,34 @@ +org.jd.gui.service.treenode.ClassesDirectoryTreeNodeFactoryProvider +org.jd.gui.service.treenode.ClassFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.CssFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.DirectoryTreeNodeFactoryProvider +org.jd.gui.service.treenode.DtdFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.EarFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.EjbJarXmlFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.FileTreeNodeFactoryProvider +org.jd.gui.service.treenode.HtmlFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.JarFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.JavaFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.JavascriptFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.JavaModuleFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.JavaModulePackageTreeNodeFactoryProvider +org.jd.gui.service.treenode.JsonFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.JspFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.KarFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.ManifestFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.MetainfDirectoryTreeNodeFactoryProvider +org.jd.gui.service.treenode.MetainfServiceFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.ModuleInfoFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.PackageTreeNodeFactoryProvider +org.jd.gui.service.treenode.PropertiesFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.SqlFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.SpiFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.TextFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.WarFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.WarPackageTreeNodeFactoryProvider +org.jd.gui.service.treenode.WebinfLibDirectoryTreeNodeFactoryProvider +org.jd.gui.service.treenode.WebXmlFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.XmlBasedFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.XmlFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.ZipFileTreeNodeFactoryProvider +org.jd.gui.service.treenode.ImageFileTreeNodeFactoryProvider \ No newline at end of file diff --git a/resources/META-INF/services/org.jd.gui.spi.TypeFactory b/resources/META-INF/services/org.jd.gui.spi.TypeFactory new file mode 100644 index 0000000..31797b0 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.TypeFactory @@ -0,0 +1,2 @@ +org.jd.gui.service.type.ClassFileTypeFactoryProvider +org.jd.gui.service.type.JavaFileTypeFactoryProvider diff --git a/resources/META-INF/services/org.jd.gui.spi.UriLoader b/resources/META-INF/services/org.jd.gui.spi.UriLoader new file mode 100644 index 0000000..8a74f94 --- /dev/null +++ b/resources/META-INF/services/org.jd.gui.spi.UriLoader @@ -0,0 +1 @@ +org.jd.gui.service.uriloader.FileUriLoaderProvider diff --git a/resources/org/jd/gui/images/abstract_ovr.png b/resources/org/jd/gui/images/abstract_ovr.png new file mode 100644 index 0000000000000000000000000000000000000000..658b8fde5f54835615deda6e1c66dc50c1e5142d GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!VDyjYyB_%0HK04TZfHCsE7VlN5u3x*0xc{95Kg&32(-Cfwl5<6Z4Ih+L^k;OpT1B~5HX4?T7 znw~C>Asp9}J-9i%6Ffo#ScTTC2~g^2)ND{xFi~hwG%zt}P&6?yVPIH(lw(Tn@pw6) OCI(MeKbLh*2~7Zr<2UdC literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/annotation_obj.png b/resources/org/jd/gui/images/annotation_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..38d5eab5af468ffd1394dd7c2b29c40649e7558a GIT binary patch literal 3021 zcmb_e`9BkmA0D|GIX|s@P>vkgm>iLEEtEFPZILtA-1|7@CTE)DidD`J6FKH+m?Pv$ zQe;SEnB3PKHSF8xfA~JH*YiBD=a={U_5Ajvn!}BOJm+};007X`#OU51Kl>lK&iqk% zWdRESfCu7bXlQO~XebpBTDhi@${ z9rm}+O?zwwA5KLSHh}>$2uU!6J(pD~|MCw`tk#%KqVZ_`34kLkmZcn^Vz*M+p}+Y~ zPX?m-7q)eP`}pxJAB)Lxhx^YJL`4D<@uk|b0{|F!&`U$ZweR%)x&$8*DNEZ>yHwsM zlLoq#nh&{c-W%kCLoNPW7$r7^9A0;mK=o2zSWFF~RS#3bB9fj;yYw3OvV-o!%TxRx z+p3v99~Rv~1)`zJ`TT%1nPy(C>M%ik%JW_UevIHw5Fnt81ks}LiUknasD>?NWe@jS z0(V$j!FMwJynR0wMFc^!v{>VcZ)W8TEH5)~0<-l9fT zm?{|D(ACWuq>cia*L#^-+qHYP=Lb@kwy#}B8WB8)NMtQ!TR6HV7T;YO9L}svWvZ+r z>|gj~%I_Bf)Q7lCz8A4BF5iePIm;pxZa%X=$Dkz$uv77Wm21~)9Tu{mFlqu)k1|J| zFvORI&Y5{|{{lVsq55!-#sXwmLTl2anCu&04b zFNF(;G~^THpvE6v6g0WgZLA@cXmagda-)=k2_%RYq+gyHD$kb|UsB44Y?en@a-}8S zHuTjKEmcGsBR2>VbfcW)^b14lJHA#_EIxVErEEZA7H=-X)CXz1v|Pt9|D zNlBmI**afWoqx_YtZk-B1C)yfOQ^+ydWK!z{Dg)37sjBowLJ!5eetCa&HZPSDoU%C6sT>TcVT&Z4A3 zkqBLsRRk)^uXz97bL%q2X+@$4uP8!()+RoOp2M0mq42l$szrg7HS)k5ZZ%sQi43<- zETUr&Uwyyod)HsAgNZotHffWrYH& z5%^+msV=0cPft%_OZUCjLN#(VSngv4x&*?3> z1u?4i%E6?=cioZpsi?l5Zr7Ln;fThHx66K?oFVRzT$@tLFi(}}nhiZHi=04KYA-zc z$=Hr+jdY$9?TCn!tQof-L`}_e9+Qs`j&ye^JBU5z4S?_uNpsQdtD{#{H0v}|ghWKg zMd)&q*GMu)`YC=XDrGvB(5ui!RSbAoz4|KJEobNTepOAf(xc!W9qBs3VnLu_L)CZd zEeBl*FG0Jr*BWnm+?^<>@)4bod!s8X3wocf4SIs(f9#ib+C_JrQ1x&nyS#RNXbY~6 zs$NDLhkzo|T>BN4%zCHa=k~$-rrvL);?qJ?AQ^?U)&Qjzi12k`Zy}n{iBN_NSSC@n zNp9g;X%=F~Ei9G%N+c({Iy=rXVLX03^D4fv-AgUfKiW_`yF;$sLQnL>Y@hp|L{wra z=m2B|@>erdLp(I~*dhKV?l*+GAr?u?k?s6VxTYE%8|Bd8&7atc{iX{=K-CMan%?N) zIjxRC*RjtZAAL;4#|)?qDt(M-mqp*P=?FS4Kdyfxfx`33@Eo!Cd_%weiZ=FL_S>3s z?r>$|5Q*#EJ}^1h5==79?meXgdh(iDmH4t=hjHi19sbSkb?V0X>5V#uXC=l9zA`B> zr@P@!Cw3Dl5v2!?$`7m^8#3w;B>%GRijv??+NlHMre&YaY-Lc5_Z#civq;_0*eIv% zqJ?+4=a&jf3J#M=$(s|{@n(t_B}cMPd_?QG@kV3Ep-&&>36KW}14?FW9Xja_IPx{e`+qeXZ6x@`DBAV@*tjhSA7aJeDRvTc%#r_SXha1c&T|z1uEsu z7X4^r@9>CmayRT*U={)Qx~;0~WAB%5LzFrHEJ92nF{5Ds-!_up-2e6iWpn>m`{!@F zM~wa7$9umR6U!@;KUbFy=zEOcf8PFoF~Ka<`E!v4a}RC-(4$R0{1akLjr1+gjXn7^ z$ltBP$2R)Z*~hM+TSi2fkL{FsAx_T7fZ8=f8_Y$!M#HArX=@f6U@p^l#xsun^qOHr z&H1wgZcy&7R+tMxWr00sW literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/archivefolder_obj.png b/resources/org/jd/gui/images/archivefolder_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..8d653f69d1f31a363cef2c946c4d31db01b18668 GIT binary patch literal 3017 zcmV;)3pVtLP)EX>4Tx07%E3mUmQC*A|D*y?1({%`nm#dXp|Nfb=dP9RyJrW(F9_0K*JTY>22p zL=h1IMUbF?0i&TvtcYSED5zi$NDxqBFp8+CWJcCXe0h2A<>mLsz2Dkr?{oLrd!Mx~ z03=TzE-wX^0w9?u;0Jm*(^rK@(6Rjh26%u0rT{Qm>8ZX!?!iDLFE@L0LWj&=4?(nOT_siPRbOditRHZrp6?S8AgejFG^6va$=5K z|`EW#NwP&*~x4%_lS6VhL9s-#7D#h8C*`Lh;NHnGf9}t74chfY%+(L z4giWIwhK6{coCb3n8XhbbP@4#0C1$ZFF5847I3lz;zPNlq-OKEaq$AWE=!MYYHiJ+ zdvY?9I0Av8Ka-Wn(gPeepdb@piwLhwjRWWeSr7baCBSDM=|pK0Q5^$>Pur z|2)M1IPkCYSQ^NQ`z*pYmq4Rp8z$= z2uR(a0_5jDfT9oq5_wSE_22vEgAWDbn-``!u{igi1^xT3aEbVl&W-yV=Mor9X9@Wk zi)-R*3DAH5Bmou30~MeFbb%o-16IHmI084Y0{DSo5DwM?7KjJQfDbZ3F4znTKoQsl z_JT@K1L{E|XaOfc2RIEbfXm=IxC!on2Vew@gXdrdyaDqN1YsdEM1kZXRY(gmfXpBU zWDmJPK2RVO4n;$85DyYUxzHA<2r7jtp<1XB`W89`U4X7a1JFHa6qn9`(3jA6(BtSg7z~Dn(ZN_@JTc*z z1k5^2G3EfK6>}alfEmNgVzF3xtO3>z>xX4x1=s@Ye(W*qIqV>I9QzhW#Hr%UaPGJW z91oX=E5|kA&f*4f6S#T26kZE&gZIO;@!9wid_BGke*-^`pC?EYbO?5YU_t_6Gogae zLbybDNO(mg64i;;!~i0fxQSRnJWjkq93{RZ$&mC(E~H43khGI@gmj*CkMxR6CTo)& z$q{4$c_+D%e3AT^{8oY@VI<)t!Is!4Q6EtGo7CCWGzL)D>rQ4^>|)NiQ$)EQYB*=4e!vRSfKvS(yRXb4T4=0!`QmC#Pm zhG_4XC@*nZ!dbFoNz0PKC3A9$a*lEwxk9;CxjS<2<>~Tn@`>`hkG4N# zKjNU~z;vi{c;cwx$aZXSoN&@}N^m;n^upQ1neW`@Jm+HLvfkyqE8^^jVTFG14;RpP@{Py@g^4IZC^Zz~o6W||E74S6BG%z=?H;57x71R{; zCfGT+B=|vyZiq0XJ5(|>GPE&tF3dHoG;Cy*@v8N!u7@jxbHh6$uo0mV4H2`e-B#~i zJsxQhSr9q2MrTddnyYIS)+Vhz6D1kNj5-;Ojt+}%ivGa#W7aWeW4vOjV`f+`tbMHK zY)5t(dx~SnDdkMW+QpW}PR7~A?TMR;cZe^KpXR!7E4eQdJQHdX<`Vr9k0dT6g(bBn zMJ7e%MIVY;#n-+v{i@=tg`KfG`%5fK4(`J2;_VvR?Xdf3sdQ;h>DV6M zJ?&-mvcj_0d!zPVEnik%vyZS(xNoGwr=oMe=Kfv#KUBt7-l=k~YOPkP-cdbwfPG-_ zpyR=o8s(azn)ipehwj#T)V9}Y*Oec}9L_lWv_7=H_iM)2jSUJ7MGYU1@Q#ce4LsV@ zXw}%*q|{W>3^xm#r;bG)yZMdlH=QkpEw!z*)}rI!xbXP1Z==5*I^lhy`y}IJ%XeDe zRku;v3frOf?DmPgz@Xmo#D^7KH*><&kZ}k0<(`u)y&d8oAIZHU3e|F(q&bit1 zspqFJ#9bKcj_Q7Jan;4!Jpn!am%J}sx$J)VVy{#0xhr;8PG7aTdg>bETE}(E>+O9O zeQiHj{Lt2K+24M{>PF{H>ziEz%LmR5It*U8<$CM#ZLizc@2tEtFcdO$cQ|r*xkvZnNio#z9&IX9*nWZp8u5o(}(f= zr{t&Q6RH!9lV+2rr`)G*K3n~4{CVp0`RRh6rGKt|q5I;yUmSnwn^`q8{*wQ4;n(6< z@~@7(UiP|s)_?Z#o8&k1bA@l^-yVI(c-Q+r?ES=i<_GMDijR69yFPh;dbp6hu<#rA zg!B8%JG^WF00C7=L_t(I%gvH8NJ3E*hQC)1k3gtR!lejWgjy0B8XH28!l|XgKnkKE zat?=RFp8SQpu)vT2;tFC&>$AHITk@f4HZEzl)OHk-3IOD%?!6X+vS|^-2Xr4z+Z>f zPSH`kPd2_Mqqh#{YE0zfex-0MdZ_^v+&hfQRRAuuO(59(OJ-?6evk9LS!q9>$yg#Q ztF|Spwk2bUtZcH7TldS6`7i*&6bK;@rb(~2pN&%wbD?p(J)HpDzf?KQoUpbK)Eo;H zY|w`R&^@5nyT1eQgjp)%*1G^OOJzlQZ3Y$~9$JjB1Ax2dw;!`E08!JfB#hl{0DQpB zwF>!w%*v4bvQVrj4UFUgf#tjXDG;JHjPAgWh1a58hbJ5*Kf~P$teo$8{r%(TpX93L?>_zd z^!4}8Uw?l5{2f=eIIV6)R@0i?mbHZ)8;d(P)lAw^H+fgjg2Nxa{BE4Sr)Adu&UptX zEbZ z?0U1=_2$!REFPTb-_&KWuETIuoAH%R8CN!C-r8GpbyMd5|NnuW8ls>%TT&h9bf=Oa zzhIz8C<6>GVxU-NU`+CMcd7T-U-%Tr;VkfoEC$jZVC;4>+YZQ>;_2cTB5^tP)N8Ru z2a&dilFvUEE;$_F(8dNPA5^uUWz_P;us~L~-N>)*ml<=PT)&ElN+c2D*>I M)78&qol`;+0Bn;cG5`Po literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/backward_nav.png b/resources/org/jd/gui/images/backward_nav.png new file mode 100644 index 0000000000000000000000000000000000000000..8b022d129468476c948288fcfd95f5040968b88d GIT binary patch literal 469 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*MEQC|NZ^!@AsSkem(p1 z>C`_UcI(f}6@T9D{QK$TU!eH6o4+6Q{CP6-_mi1_Uaa`@V&&hrJAdD8 z{sRqNFzi)^hC+0!Jpvq5xsli2D4!PSL=EAs@`mk6yb5?Y=k zuq<2P|Ns9$`>6uHK0CS|XplxpkY6y+SYiOfzEye>Ks}5}-tI2;cF6{%Kn`btM`SUO z_5fqIli7AaMwO?FV~E7%*8Z1#O$Iy-r!D5JiJ8kGC*$1q{(oDT%EXBR`a&Cg^S1@?G`njxg HN@xNA_?yv~ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/class_default_obj.png b/resources/org/jd/gui/images/class_default_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..078a1647ed305d9821b2bc1740fb142ca4be6c55 GIT binary patch literal 3275 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 F{{xPAHo^b^ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/class_obj.png b/resources/org/jd/gui/images/class_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..b58c84c7a70d81829070b4030a156d17f7567b8c GIT binary patch literal 3147 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 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/class_private_obj.png b/resources/org/jd/gui/images/class_private_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2298525ea090030036b5b95ff4c428a5ef999a GIT binary patch literal 3273 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 P|F@T^A=IEz50Ugg`~eSo literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/class_protected_obj.png b/resources/org/jd/gui/images/class_protected_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..678aa329aa1b9123a74c303615fe1d536062f50b GIT binary patch literal 3275 zcmb_eXFD4T0}ZWFgc@7qf)Y5 z<^TX2%v)F2)JRuXBrrI@!yDxe02mHD%ST&SOz`7AcA+s9ALKrRF}YAV>;Y8d#$}{{ z2eZICKrhEbR5C&9J~uamURF7lp{l~LG1=v&6v2th@T#ecTq=R!ra%55Dk5TgY3X>N zYi`eu={0@l~g8DvH+hLsG%| zDMhdcrhUOK8TO0+DU0TxLJn`Z3EB72O3bH*Q1Zvg;gLyMVlI6KeN5ng;5EqsPiz#8 z3Wq_v_CY8GToETA71GYG(iqN-PcH1^;tb{94F&{OlVK{$?EHbG%QW4N>S~Yuj-Xw} zS5V_je;>aO<&nV(xhjlt6`HwugNrSzQ0bvM6URG%C!QC7gM<85D@E;#?dyac4S9opB0{2#fv&a=EdLSPf8)hKSAZCc6E4Qb>gd#4l4x%(m#9E zi@+goY0A^~r%(9IeG)A4#-!_<>ukMKTkBfOLP?>`p}7Z^t483)wDvSShrPt3<)&f1 zB6&8QPvvA&o2Rl*G4I6Rsep99R$!341ii5U!uc537Chxnsvy~tEJ>bj241WW@ymL~ zm3gD^(Il_!0x4LKU5_ov)#!cB8}X3f)ZmO@!491cs}8l`?WNT{|GkvG&Ly=)Vd-+d z0}vyh0*Le0KW2qi)wiZ^k@(m_2&q}?_`HKW#=LRq8&+%P#gMBTiNuHDj;b?CG78`s z@Rku>2NE&Czu5oTmY;f>kS+|ljh%fMZ8N8%>Dc{%p2UE1@_wzP;w0C^*ENQb4)C7& z?5vwpk?Wk~+%iw#{xCQo^^wr~GqJfQ=<%-qg5v^0f?vW&;!uLi#NEWYaJeX~=)$Ka zpkJXuq0 zwrjd+(#n@#hY~`~JyU%}+uxV(t+*_ZW|t^3w6%G=pVQkC z3;Z;z)uTy=8TFB_sp$UR9@l3B5s22>mn;4sonh{WrRh07_h#DCsOdPWtvY(n~Iis8%ov80k>>~E*8UWrO!ls~|+oQMTl$(^3dH6tM zd~F7>V+HqgfC z#ub!77&tQ3bwGN_q;L9dem}f_>g{F zBo=b2auK_3;VG0-zPzW6Pva~S#^T4aZ{u6LycMGYVsurXQYE^~wLs@4hgbehv`?%8 zAAv2w0gAec2oEFAUD9vTVGG&~u}EHt>f&t6Xd|jw%c4WJeqw45+pd=b<*&a|_CXEL zsZfVpzkK@e_(KXlc2IFh=0jwcILg?X8hlZ6*8E(^9?uS8J7MbmhI;uGW#G5szdh$n zb){z@5;uB$^(6F`^n_Dw-%d~!&g*FniO-tVPL2OI=G^Mpplx28-fTMcstfgouTBch zsc*U;ka|cHkyS^IvX87BTQZvv<0dQzrGpG zAMK}Ub2d62Ff|v`yQaVLa2@Y(={?H`rz(ddc?q+==l9~<#C9V^QI1a`6s-~*z6d?t zTI{Nhgl&6%FNqDgc#%U7o}Zvu z@4d*NI3B%<9FINP#V;!Fha?6p%?U*hgioAmY@GK+EwgOkQZq5aof;9b7;+Y+Y3KU! z?Vs5kj9Z*(P7bL2(xIVQqW=&Sp06Xqz<+7o?YfMNjJ=px2!9r! zs?d&9libvlTph0}Y?D|LO3J6?8K8A=GCS%Fzc_~FQ8r-Zs*`YN3D# Z1AyW$2CHAllKbCQMtbo3L>;I2{{r{fA+i7f literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/classf_obj.png b/resources/org/jd/gui/images/classf_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..6393f818c17da3e6cdc1494871fbdfde2543dfad GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQnS8=1*_wT=-ICuBZep7+YZQ>=jq}YB5^tO>~+3F20W|*)^i!1xODF}@BMz}f4yX0@ItRU zzXhIq6gp_OcDxc_usd;f{e$Q!dORBbtC_DV`gZTV%5ZIh?DL!3BF=MMm~d&@U(d^- z%*!<0lkfJ{J=&e;f8Bk_(k%0@4eBxxj~c@dKW5@7V$)f^x$XC)wh0P34~v&7s&zzH z%(eK?q422c_}Rj?UEF`YCHJ&ia0{|54T|@gA^Gpedc9bnOBp;}{an^LB{Ts5iAomz literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/close.gif b/resources/org/jd/gui/images/close.gif new file mode 100644 index 0000000000000000000000000000000000000000..17b75735821ec641eeaa248a3ac831868fef802b GIT binary patch literal 88 zcmZ?wbhEHb6krfwn8?IXn4j_=3>X*~6o0ZXGB7YP=m6P3Spgthb4vfp(`y+7S@c=7 m8jfCy+pD{v+%!3JQjF`OlN^<+8I!&W%T7N0y)KA>!5RRu%^e8< literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/close_active.gif b/resources/org/jd/gui/images/close_active.gif new file mode 100644 index 0000000000000000000000000000000000000000..8816521a86318b71da5a47372efb18bf767f4e09 GIT binary patch literal 88 zcmZ?wbhEHb6krfwSjfbXnVI=#!Gix_p!k!8k&A(eL5BedK=KSsnp65$o?go!$fD1p m)o}Du++N)U<)+D*lVV&Ko#d!o&6xC6Sa$N^?{z^84AuZcbsts$ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/constr_ovr.png b/resources/org/jd/gui/images/constr_ovr.png new file mode 100644 index 0000000000000000000000000000000000000000..65964a92e80022db7a4b51b90f2209825a651123 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!VDyjYyB_zLiQ$MF*A~uJMrEL422WQ% Jmvv4FO#truIXVCU literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/copy.png b/resources/org/jd/gui/images/copy.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5451c368a2b6f30ac0488c91e0fcb974ae64ee GIT binary patch literal 413 zcmV;O0b>4%P)GhSsY`1|JW`SA7o z^7i}n`1|+y`3jhEB0d!JMQvg8b*k%9#0GdfeK~#9!WzSm^fnXGc z;T3Wwhfg|DLMJK|;{X3Jt(wLd@4kCx-E82mOH%_^S(bn7=1E;**|U=DDCR^@l8P54 z@0bVTu(!Jxj|@omLLr)Ovn&Tv!)Oy1lkuQ6OMu7`3el)afs?E2#A@M0z*!Rtk-7Q_ zh;7>@RtxP61RJp=*2O?*St@Zl>aVw}0PxF*Jk<*82mNm!0?rsrj|X~000000NkvXX Hu0mjfZ^+(@ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/cpyqual_menu.png b/resources/org/jd/gui/images/cpyqual_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..fab58422497981ea9bbb5d52d9f2304a39212f41 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*B?Lsq}Q%2@7en4>+i4M zfB*dT=f}_Ah3y+_C+%#Qy1RMC-mZCv%3Ef)&pD7%+>=t=J#p#r-0DeXEwjp7W;OIK zYV2M3;N_3c-+rf*^duK|r<8Q(R8J~zoz*sZ`Tdta?!EZ_{pX)#pj1isgI7Nuy!!s> z+wXT@etrG%`}XVad+&dlHEY7Gnf4j^S$666;Q6eJ%o?D}13 z1~iE=$=lt<-Y(go6v*K$@Q5r1(jH*!b~4)z$e8Qt;us=vIrjWXp(X&5%<&TsN07PBS)O z>d(q=Le1JM*L*#@IfQ570wdqWx7>LyW?U%NZV1zfNX+DWamMHF#nfwW%#?&bY*BCV zd3;Ig!yC?H=eG4;y>zdSQTUu*OzLa}1#=C#6+TwenokKGv-r*UEMD!`KBk+WfDUEw MboFyt=akR{0OGwNhX4Qo literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/css_obj.png b/resources/org/jd/gui/images/css_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..4caa409cdb4288ea619113dad80274997f3d41cd GIT binary patch literal 2972 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 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/ear_obj.gif b/resources/org/jd/gui/images/ear_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..4468d66ab66b55a14bc1abff6b7f8f0e47d5c7c0 GIT binary patch literal 592 zcmZ?wbhEHb6krfwc*el6?7;IMzy5yz`A0iqa@oW!d(J$({NUr`H$N`le)jJ3udhG; zeEjl5GyjNY?tabOeVQ5DH8ZzsrmoXUS*w+>L@RNLR?IAIAc~x<9oAbuX-nhGZ7s95 ztlWF;%$@fa9(=y^@bl@LudhA+eCyfQ$8WyBc>m+W*WYhH{rLR-Pt}x7&9k>nT(WEW zirsf!e0}}#$Ce{kuiSa^;=_-R-~WF2@?-I)1BWg@zIgx5+C3-N>^Ri8?``*y53|pF zUUTi+z6ZZPeEEL%<=;zkdDx`Ty6IKfhl8{`GnHy2{<_tABpJacWb-kJtNl&rsVvQ)ACe%{?=< z_RQ2ivD9K=tNw}Aey27ie!n;2$J3?1K3-YWsJdyQ@wO?Z+oqUrnrzutVDjruQ$dn- zVx;4=O8xc%lfoqH|Ns9pkPZ}ovM@3*yRAfX%SV&V(Ppp4p zXhM8ObZ>89QgTXaT1?RN9y11aPfs@nvxRxaGKRKZUPgv8#tXGr4IF)axK&uS7D_3w z>)Japa;b4FWMR`$W|CkQ6A={PV-RKvx`LbIH@M0T!P JvcQ4C8UTv^C_4ZE literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/ejbmodule_obj.gif b/resources/org/jd/gui/images/ejbmodule_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..f8b5c0a094b417d684064fcec0a9d6318a55aed7 GIT binary patch literal 1021 zcmZ?wbhEHb6krfw_|Cxa?$eLNhLw3;8(QYjY~ z@=2R|mL6%CzWL1Ux0fD#y8Q6dkqh_lzW8?c#n;DgzCU{X?djX^Pu_fc^YMG*j7^O* zHeR^@;nKrT7ax4Qc>mpvr(do=`F!))m&b3uz5e*)*!7pMKYoAr`NzkvKR z?>~OdSh@4kgExE6-1zwQ$LDW9u0MRfrx>vccvbANXz z>CMF{Z;x01{qt*ioA>h0fK@%g4>lK1$hPdwv}jE*YK%4PNi(ku)jqYLAlFm1&{w_C zSM$l@#CwZUlkDYE92E*Y)%ubwuFpugIVWXip-+~p#>51hDam#@o_bd&#qRA&Ue_3Z zyd|VGzT9z7 zHswXE%!yi_8a6$`XJ$;`w2+`_fdRjM{rdm^Kf@@XZwM&>!@ zI0ZjlT)g0*oE?jn$c<*UK3S`VKMI$U7dpv1wy;P}D)eybW)fAfFg(G^#Hzq*w4&i* zE02h(mH|U#Lj#Af){GSl1&t1j-OM~85)&UiGOkDn5Juiz@d1Q5%SSK_TJaF#Nh@KJ4cxG zQ480R8H~-X?8=ST_IMT@_m?wkQCjn0;^AYxQemea+-!F7pJU9VtdlXp(YcK+@&L!L XVwS$yQ@Czdyu9?xEbk5@BZD;nmNZ~E literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/enum_obj.png b/resources/org/jd/gui/images/enum_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..a9ecedf31e57a5d992db3d3f30e24c2befc78e18 GIT binary patch literal 3043 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 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/field_default_obj.png b/resources/org/jd/gui/images/field_default_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..becfe6b118bd7f5ec63412bee50aa6ff2ef72b31 GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDUbu3>W+_p;~W{za?0=4Yr zIt42{nm2DadH+8c09By_8JTXN5LZc%Uob=skYw0&M&~?GlrhQM-GyIb7sE{;hqJ&V zvKUBvfU(=jY&#%B*VDx@gyVYh3{F;_BStn0doq&(+%mIOTM{oOa;Ew4XK=6^t7&R# ePE0W3U|^_^_sE}m|GykiBZH@_pUXO@geCxhNkORq literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/field_private_obj.png b/resources/org/jd/gui/images/field_private_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..d3fa87ddd889b2ba20378660b660e65ee4f8e090 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPGa2=EDUz2W5lxV+(c$Atf202GFR zTyu-9Ko)CBkY6xJhT-=%zF?pLW0JSK3%gii$7>*mv%n*=7)X17vD?XPJ0L^R)5S4_ z<9c#IBNJPYBoB{{0NY~4DF<_SgbkA%gPpgWWY~OCZp*aa`;>u-89ZJ6T-G@yGywop C!88^C literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/field_protected_obj.png b/resources/org/jd/gui/images/field_protected_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..dc80489bc455b63fa58d6373c3a5f37a72cf49a0 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU-8V;L_YC#jGu79%%Wv*g z+SIGGyiR6SqwK0CxpnOd|L#rucRuGo7yxwu!MB5XSwM=fB*-rqA`T@PTo2qi0hD1( z@^*LOm)ON{6UgB#@Q5r1(jH*!b~4)z$k6q4aSY+Op1gybmFI|2#ljwL?gcz6gLfqy uyK0-h&A}yY{INU#c=6t=KI8l*FFO^GI+ZBxvX^Js literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/field_public_obj.png b/resources/org/jd/gui/images/field_public_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..40a5ef1c8e99b56f5a241662542972610ea853ef GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFP2=EDU6=?G{nUUeLu%veH{D~*l z$#n)5ZY=HG(fA(>fU3}dSbDQ9P>8D}$S)Y821qh&I-_$QD9V`R?e4-av5Vm*ki%Kv z5m^kRJ;2!QWVRiUVc_ZF7{YNqc?KsdkBiZq5QQGiN3HV`jveVS^E60yaqT{1rA@WVn(0xp*sE-*PsMV-s+Ga@>p~kh zgf(r9YTFv!zAd(MM|}6L#NIur6Az?J*q=W6P}-z}8B-2tO*@)1<9PP;V|lYq7R)(a zH1BN5g7amIE|xC5P_yEC-Kv|->+f}JdECAIS?|sl{kvaH+V^(i-ZxVYyq|O8`@*w- z7M%IL`24?}xBllUokD_CVzyvC?xwMF?l zi;A^&H5=?}Hn=oya&6e`-MY=Yb!%YPj-bvR;eETqdw0c7+#5G(Z_?EL>C+En%{r7e zcl0!ka^4xJ8BaZH?4b6xl+XgJJ~5gv2#fm6fywf|~*_^N&^o+Z zgPjOoRPbaC7GM`HtOxNXs0G-B4T$c}kBOr0;=~OYc#urO$Gn+|5fS)j#l^#MJ^4xN z4;JPt=rVZekdEb+p{i3d6n9^I?-Uhb#1XI!YHBpQ(4s5s(`hNo5`Z57P~`x1t2SR? zm&`=1L2dy=y8ljZ^xmI0bG?W}F>pZTk!w02vlm3wZOzF8$k7708h{vk05$^*@R0c| zpsPUu0DTrP&_Yf=3-X+Uszns}+8CCBn^+aVVqm*k228>SVE+BicL4?f<|L@;a3hO+ P00000NkvXXu0mjfhMj*& literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/final_ovr.png b/resources/org/jd/gui/images/final_ovr.png new file mode 100644 index 0000000000000000000000000000000000000000..f20a9c1e81cac70dd7d1e05a041a6d5f9246b1d9 GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H#0(@ovUsNgDV_kI5ZA?1v^A2Z1=lb6|Ns97 zC9lswamJD$zhDN3XE)M-92rj+#}JO|$p*6zC;V+c_=}-=CUeJ@v;>261||ldy(}+8 Td@QyC)iHRw`njxgN@xNAg{&kp literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/folder.gif b/resources/org/jd/gui/images/folder.gif new file mode 100644 index 0000000000000000000000000000000000000000..42e027c933103acb0bc3a6889b1ee253bdfa4657 GIT binary patch literal 219 zcmZ?wbhEHb6krfwIKsg2=fjTwU(ft}x$*zUL!a)i`2TwI|EEj--|GB-f7+YNbN*i} z{eQLg>4}NkYYq1|o9u5f+1+4#yxaU}r`gdi^F!@s8_V^#R2r-=)!$xYw6WY^bAj4_ zFkpZI#h)yU3=A?1Iv@d%oeZoI3hI3+ne)<@xV>1B`(fEuK?V+&Lu+13upU?-aN>~% z+leJYmV$v?7gmUP30m^pSR?jZz)|4A1_>U)M7|eWr0xntihbB2lP8!e@?(!&ykzXZ OhQ@l`mR1!-25SJE4`R#! literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/folder_open.png b/resources/org/jd/gui/images/folder_open.png new file mode 100644 index 0000000000000000000000000000000000000000..9759da4e201ada7fdd227639be4fc236daf3e2f5 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJdx@v7EBj4G0R}D3ChfORfI^%F z9+AZi404A+m@)4{sU1*|CEd~2k%3`jKlh(RRvZtd^mBq)$GTM z86R#;cyOTN#)g8mIVwQY4tJaRtrl$nn$K7gBP{sX|~qoWsG%}CwD(~e015aB{YAxe?@`!vkHmjInNf#bEGk> x-703iFf*gaQ8~zY=?1Yo0gHsnnMH1HPZl@c##+D1w+G}Q22WQ%mvv4FO#riXdr<%Y literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/forward_nav.png b/resources/org/jd/gui/images/forward_nav.png new file mode 100644 index 0000000000000000000000000000000000000000..a6afdee3a9ca37c32ed41c0ecf8d90f43fa05c0f GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*MEQC|NZ^!@AsSkem(p1 z>C`_UcI(f}6@T9D{QK$TU!eH6o4+6Q{CP6-_mi1_Uaa`@V&&hrJAdD8 z{sRqNFzi)^hC+0!Jpvq5xsli2D4!PSL=EAs@`mk6yb5?Y=k zuq<2P|Ns9$`>6uHK0CS|XplxpkY6y+SYiOfzEye>Ks}5}-tI2;cF6{%Kn`btM`SUO z_5fqIli7AaMzyDlV~E7%*7LXdnhbav9$L91YBR0vI8}J!;oticxMo-gJ>LK3+3p)r zGs+J7pZF{r60q|EgNgK&?0W}Si&wZ!l%L~&D!j33&q4Hq)$ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/generate_class.png b/resources/org/jd/gui/images/generate_class.png new file mode 100644 index 0000000000000000000000000000000000000000..904ee07a3cd8212435265f0d16e166f4e58041e4 GIT binary patch literal 297 zcmV+^0oMMBP)h>&v%!3!NPNjh&^>7heh6bvN#`?y3cJnp! vy)I%)Ljoq=Z95LXzPOSJqN>B0FaED@`tD4iQ7B9E00000NkvXXu0mjfhDdvk literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/generate_int.png b/resources/org/jd/gui/images/generate_int.png new file mode 100644 index 0000000000000000000000000000000000000000..82a5d80665642c87d2e0cf8380d2a49af83fbe88 GIT binary patch literal 2918 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 KDooBoK>#}%3&N-X literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/inf_obj.png b/resources/org/jd/gui/images/inf_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f9c42d6f82e0af8e7f42aab584c799a4c84fef GIT binary patch literal 2954 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 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/int_obj.png b/resources/org/jd/gui/images/int_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..745cdea526147bfa77d6284b8dbf4a3c43d5c026 GIT binary patch literal 3254 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 Ov74JfZ&Vq%#s44dC-6}K literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/int_private_obj.png b/resources/org/jd/gui/images/int_private_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..f36c8b5f8f6650012ec8a7701dcea3e2cd26eeee GIT binary patch literal 3271 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 Hu0mjfaz#K$ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/java_obj.png b/resources/org/jd/gui/images/java_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..dceae72198d63ea160d4a81e76d62e981479b90f GIT binary patch literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#jk7LR>$5{{8vu@3$X+efa$A z>-XP3fBm`t;>W|6KOVpS`Q-JF=WlPK>KYaQ1{pX)=KYl-W_2coIA8$VWdjIA3+fP5UC+vCl?#IgyKRY{#TTGTTn=EKDo!?|SryhvRrq!4~IMKhU%V2$n z;hJ`%m955CHf3DdlzD4!&DBkr|Ns97`g(AJ`=R@G0bS->666;QbSKpS!{sc&2B5)= zN#5=*^&a~Rp8`3Y1s;*bK-vS0-A-oP0U3)tT^vIsF2|mDDb^Su(fUw$;zyO`0n500 zPfV$trupuF)tsl@TPwcbs+arnhx;OXV7!I;y}Ql)F${;?1rB;mOFbUq|L`r>hQ!F$ zriBvO4YG>5Ts+R(7^+3i2d-Ffj4>gqf2(H7?4!yDd<06ksv_qz>zEwhNE!D zdoO2X&04>djX~LOQ?BQ#qNR2RSe_ROCF^u0Gwgr8%hu}rXU4iJ#>e$Q_lbZ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/jcu_obj.png b/resources/org/jd/gui/images/jcu_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..dceae72198d63ea160d4a81e76d62e981479b90f GIT binary patch literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#jk7LR>$5{{8vu@3$X+efa$A z>-XP3fBm`t;>W|6KOVpS`Q-JF=WlPK>KYaQ1{pX)=KYl-W_2coIA8$VWdjIA3+fP5UC+vCl?#IgyKRY{#TTGTTn=EKDo!?|SryhvRrq!4~IMKhU%V2$n z;hJ`%m955CHf3DdlzD4!&DBkr|Ns97`g(AJ`=R@G0bS->666;QbSKpS!{sc&2B5)= zN#5=*^&a~Rp8`3Y1s;*bK-vS0-A-oP0U3)tT^vIsF2|mDDb^Su(fUw$;zyO`0n500 zPfV$trupuF)tsl@TPwcbs+arnhx;OXV7!I;y}Ql)F${;?1rB;mOFbUq|L`r>hQ!F$ zriBvO4YG>5Ts+R(7^+3i2d-Ffj4>gqf2(H7?4!yDd<06ksv_qz>zEwhNE!D zdoO2X&04>djX~LOQ?BQ#qNR2RSe_ROCF^u0Gwgr8%hu}rXU4iJ#>e$Q_lbZ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/jd_icon_128.png b/resources/org/jd/gui/images/jd_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..b29e5a9f921bf01909a187a0a0ecbbe5c3939730 GIT binary patch literal 14178 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 E1C>}A)c^nh literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/jd_icon_32.png b/resources/org/jd/gui/images/jd_icon_32.png new file mode 100644 index 0000000000000000000000000000000000000000..2d5cfab01447abb20163229f56c76ec4994fdbc1 GIT binary patch literal 2206 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 AAOHXW literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/manifest_obj.png b/resources/org/jd/gui/images/manifest_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec970c19736b7c5948251f729bf125db42847cc GIT binary patch literal 463 zcmV;=0WkiFP)Px$iAh93R5;76lRZyVQ4ofo*>!gf8yePTVWj|+TkaK>U{9hIzkrHv{{a8METOjA z&{9~D&_N}MF;Wmd0u2d9(1O^gg^BK-Gh=aX@ZNAQjZSisGs&FieP<>I{xKw->}<5{ zzT)MzW4V{My&l`|fy+H-J6+2YD5Vo`#RAoOgX!q`9hVt^GeM2qQ>{0s)Ei7ii@bR? zXZZjxygm6u-0c&0`&@nf0l?njB`^CmmbbGW_Zry0P|1WVYpN}2tWE1Wm>Pp_#} z$^fXsPzwOwhXR21bdz^y*9?co`}5B{n`wp`4NmhNXbGR(7orJ{E^qj7@rCa{f6<9r z!GXb`7$B$*J;XEPs2Z=g5143-(i|HNb5g@wsbC9EPy(R-u*&S?M|`~bMki|Bwr1WK zxPmnftaMxGy)geY*q(pVLX+t_6e002ovPDHLk FV1hey(dPgF literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/methdef_obj.png b/resources/org/jd/gui/images/methdef_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..a4131b9ba8d0d96217e1ec6431866c65731b4164 GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*Ye?fZ$MW?-ZM%ZocFCnI zR!(1HS-!!tVuL`;9HF?mqVe;@66Q-LFOW%DB$K*GCS{>a>O#5H#Y!1V)v}kX=PdvK z|3AKg)5dlFr(S+0_F(<)<#B^a7u?G*I3qN@3DD)tSg(+^)f6PgAm3`|aF8lI5V z`Q#h((KqI6S;GlQt>=@wPdeM2bhkTcXZ3AT-}8iouQfGqo16dt{}0qnBxqc5wh^dQ zs3gcQ7^o2yFg)77UkE76nB?v5BG1YzuouYTEbxdd2GSm2>~=ES4#=?gba4!kxV-h8 zB^QGN59`Gp$8_D^*GCF=^G|CE-j|gTchP=@y2Hd+Mw7tMOor2jF54K)tu7ic%rBRl d;Mc#LyWk0b^C1bIr$D0^JYD@<);T3K0RXKNUHSk3 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/methpro_obj.png b/resources/org/jd/gui/images/methpro_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..3e4c0d7853c1b6980cde9e8f8a46770b3192959e GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*>;F$1{=b~~|JB6plU4W4 z(bzphefLcD|IcQuYnR{LtF)7B|(0{K=l}aLHlOyE1&|#ByV>Yc~)M5y+96Ufk$L9koEv$x0Bg+ zK!&rYi(`ny<+P^f#mw3`gjI0jEwKbLh*2~7awsAp~f literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/methpub_obj.png b/resources/org/jd/gui/images/methpub_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..30041952863fbb9fbbe0e9cc3e9e1c3dfd9b7aad GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}LV!<*D|3SfYon)ZPnh1+1m`(9 zzKe@f*0mOH>&@TTRl0qG{qzL;8S!4TQ^S@Q#IGtzT2)ZEv8-@oY0LhWroBxq`&yc| z)_3e|?AX!RxubE$u?f@ncC0=>bM^TdTQ1H0|NlSGlKe^g{{boak|4iepa>qoa8|Mm z+hKJO$xC^VF0*z1|%O$WD@{VjKx9jP7LeL$-D%KdAc};NL=o{ zVCZ!?fT7``{VW%4R%ed@V-F4$Q>BvfD;v#UTJC8T7byJ5)TigyC9zd$eRt5On%bqA z9GoWa(mu}L|I(a6%=PBJ`nrj}EIY6KnCC3jt`c}4ul~3JQ25?m`{dl)Ee{#@J)h*= zDsbN<^z6--oW~AdcDKIF`trk!{i*%>Z!BxiO#9_ix|2W_tJ9zA&_t zFTHT|s_D)vGxj}Cm^$n9?b&=m_FVUi4K7=xESvsCXM6LuRjTcUC)|WsO+tG`g2S@< q_U=qu`pm;{>B_808V7!yUmkDyGWkzxi)$UwuMD29elF{r5}E)=Ieaky literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/module_obj.png b/resources/org/jd/gui/images/module_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..300adac048ebb69b05511ef3ed5f2e9fbfdd8a62 GIT binary patch literal 522 zcmV+l0`>igP)s;j%|>#wV-EtV7+RdcEgU5U7L+qF=wFtks1 zq)|h+R$JbZ{)&n$O7I$*H970}W`;#GHUm9i%RcWDP|#bOo1GDWlgH}w5^LUe94ri_ zX~fqBPeXo!K`fbQ3%VgRq+@^HiHq%dN^((BC$@j|;c|Bohl|5l9j*t*r9Fq}MJ8KH z%w?B~UuyxdB<^ppH#dmb-#_F%YrrOHkBg(8ND{k3=@y5^8g`6ZY_?~eNgr+2X_G0*3O4D@0{)MJei5sdC zd~*`H&z^!V8em;2h=`>l~QZTh^$vlq-? zxMa?<6*E__n!0sE|HicwcW&z2e(n)oiD>38oLlSPsUr`posV z&bP0l+XkKV^JR{ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/open.png b/resources/org/jd/gui/images/open.png new file mode 100644 index 0000000000000000000000000000000000000000..0430baaf50765aa5c313b3da35d3d2ad5092f2d0 GIT binary patch literal 498 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*Qt#iQyV)wt9y$IC&#DE zO-PxS03=iACa2GgPn{bUKQAz5aZv0c*U%NNVJp0%mbOkjVd=ltGGL8;$SMuD&3c|2 z^u0Ffdu=fFTRUm%n@QW=OxpT-(ze%gkA9ka?9;rXpXMF=wDQ`|l~;ePy!K<`!@s{? z&ii(M+W(J-{=eS*=3@8%r%V3d>iiEBxmf!DYVG5LwKq2vURYCcac$*=HI@It0O(RY z;D%)CX`r-ONswPKL_LWl!@_<)L!b$aN#5=*_IAkzr9cj6fk$L9koEv$x0Bg+Kt`vh zi(`ny<AEIQcD@AqbASA9v%ZozqTFR<<1)U%OUub!r|GDoxbkV1Kg(vdH~V1K>zun{_{es))rK)0iwc{CwhLonDOJoiJza& z|9G+C=j&a+KVSRx_R#P5CtqCX_;6#wj|Ve;JXrAKM#ql}6+eL73k~OITJ5UWIM}Ma zsZwKcy6oy)rCpU82kW(0r_0VslwX~zIwxAZ*I(p67yvyrM1koil`TN0JCy|a1w;Ho z0mVvgNO=tnSp*^X|C)c7kKy0Y#1`Nt0Kmr5U|zHga7z z;CX&pBWlKxZR$r_E>By`$~N7^_oZ9J$AZ3ODefBM3bhjTC$kTBs~t-J>@DAVDc}3v Yt`9m3?Bk3)f$nASboFyt=akR{0AlzWTL1t6 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/package_obj.png b/resources/org/jd/gui/images/package_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..922c43547b5bc0641964422a5f86e0258586feef GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!cYsfb>;M1%-(Fny^yI?*O@>FC zjc)Iscd$zL`py~qOSKM`YhT|neS5CP?n13|tGibwC{GTRUze=9G)8Gbq~fATrQ-{l z3T?#a6+~3}JN*2(JJxJ!0?=5-k|4ie28U-i(tw;SPZ!6Kid((?H@O-VL|8B96nox& z_xAsO6MptZa!uzBD=_!nFxg*jb1pZ2dgHXDS8IHkd_)%8_KGJg>9{t-vB5)dl6)B} z)9*-^kgZ0a*EY>#Y7Kv8Z56CjUb67U1>uCn1=+D|caF!$?Pll?XYGqRVQB%hmBG{1 K&t;ucLK6Vs-e~#& literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/packagefolder_obj.png b/resources/org/jd/gui/images/packagefolder_obj.png new file mode 100644 index 0000000000000000000000000000000000000000..93053b772f5529aae3d02f2e27314b9ffa1f440f GIT binary patch literal 421 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMffdHQn*Z&Ov*B0qFxl8`I(J?Pg z{l|rh9}i~yxX_ShXY}IOlpilPytvTujQE%inZ4pgiy(*AH`!qOa-N`HrW@v>`kRQiJ?_tYD`zkh5`tI^?BGoYPR z2fwa!#Q_avED7=pW^j0RBMrn!@^*Kzw@WrC1#&nGJR*yMv;STR1{LESiVAy79CKJO${sw$j@dBme00_;J+KLg5pYiv}M z7q~E+JCTwB3mtuq@C`OgV1q#?D38rxY^?nku;9UhG>Qb4ic^VA>1xRVTfk&eBTT@e zU%&$XS!w3D2=?L=>~_G4(NPUsz-VlJHyBzVkM8a|{5>-oRj*8ei3x3)#nM$F52aG^ j^!JRSwCMN2q%B(?>T`DDnyLF500000NkvXXu0mjfZT;q= literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/paste.png b/resources/org/jd/gui/images/paste.png new file mode 100644 index 0000000000000000000000000000000000000000..b66e9dd36885717c08bdd7069e0a503d530116a8 GIT binary patch literal 799 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GXl47#jk7LR`On|MmInul6bH+NZ4j z^!4|TpTFbE7U#CCjW3>-P&}=$X+itcb@yNVc=YPW`_I4LefrrreNV%bEsayQOk8@r zY2vE(scWY%KQLqYfxg)rdS|R!zw6As7eAi8{qgzR@17Z})`7U+AHMqW==G0RAAa6{ z`Tf!B?@vLpzb4IIcJJl)NpqHc`u1z}!7E>X{F*g?;midK7cQBzV#W0JYbWjA(zR_v z--b1l9-QdEwYTQevBHnX3O}8!{CJ}B)0yT^XPZA===*fB@5|MhpRdmPa&zgIyBoef z-1YUzp^rxkKb@%je5U#Hg}yIWW`4dh>+6lBUv4b@dUwOOhr7N#KJ@L$p>NMl+*p@$ zW<}|RH5FGjRG(W@d309d;aMr?R+b%KRCH=-$>nub2WRITnU}wBM)umqp!F?b8#`k* z_a^U|mbG<4`jczNt{hzd|NnnrU{VNjqE+VujmRnq@(TtUNFTtk=gFPNKwBA;yxm>u zJ@ywq1#&nGJR*yMv6CEIF<=M~4IHbGAC zpsJpl+PSF`6ZynAxF3lK2?5a~4z6~t1CAUK3T6feOfN|AC>>;4sHgW&@7NlLgghp( zj-qeH-;6JcrX?FNcQLRg)zr+L@83d9}DyigQu&X%Q~loCIAKPx#@kvBMR2b8Z(7j5-Pyog8e?sqVu1NF2&7e~dqNE7j9CXt~aBy+)0bG0z-@+FV zaq$HleF7nnK*&^w#F(@t28Gr^8*uYXzv;j^20*iDS4lP{PIHQ~#@7x}7_hsujlH>H z7|o(xJw3l5EJ+Y-;cJhgtjP0MzPeA25BD*XY>KcX(PWIWU5*Y;QMOAo86zx7l1(w= zG)H=xs#{WZOMu?e)5K}cpeSqPp5prCjCC%5eRFqDQPvE6?I7Bk+s6k0uFfxdS8o-* zb}*wbVA#!30+je^T6@^diNb(C>(pq3>)X5+4Ii^vzs~s2Pv7keYSR=uYF+>U002ov JPDHLkV1kuZg>nD@ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/preferences.png b/resources/org/jd/gui/images/preferences.png new file mode 100644 index 0000000000000000000000000000000000000000..1c23d0e56f3ec8dac2ea1bf737aebd4c038c461e GIT binary patch literal 330 zcmV-Q0k!^#P)`6pHRCwB?Q%ep+KoG5(%+fV1>>b34 zkhrQNh=_>KlGx$^G}TFU7}Gv8m2`ARzfXM{g%I#hyss|Qb$w7UO%r+lx~tUpJ>+=~ zZQDL`z|nObIF5ttY8*$fZ5uBg%=0YQwpMg*n&#R;Q4|VgS=R2%gj#|%Uv(J~;j>%h zLQ9Zknb0_rL`0}9Vw$E}ubItNLT2v*oCm1PN@=ixVEEebm)T zwlRt#K}DIS35H=%ts~_#@NNuufMQz(!{e8c6L;uFL6L)Uz`S*?RGSN{Ec`uD@3zaI|&1G2wf{r#Zt z&(pcTpUnLYB=0u=dC<4FMQl&A*p@2cjTORMszkO_i|lC<+gUHVqh54(qu8!Sv6XoO zEAs@`mkO;d5?Ws>ygWx>S+>Cc|Nnt*hXZ%(sv022rX#w2fd z7kj&8gHj-ev%n*=7)X17vD?XPJ0N3$r;B5V#O2U)H-(xEcpNTrgj`s)LurvmEF)vN z>x=*Yr+Z4ezJH?nTv2$!ys+n{cp~_EfpZTqt|NsfrmEFWEzesPS{%^^nKMb zF2B<^A0Q#xgEAKph|K|Od=&Dr-bt_ZqSEMwo$Y@$VebddY=RR#e`FPjqC;QGlJ#y*!$!jmq z-FkfGRuW%|NkEtGV}*u%@wSHwnml&`2_>rKoh{=-^$1jw1hFq+ufz!V}IdOAcwQSBeEDs zdw{Xq$!t3yRkMQK4zT3*8Q>`SA?fE}> z$KM^V_eYg;|B!#6C#YLzCbntUfz1~4{--`G{KNYva$b-=HGpZ_?1ER_r}={VM0=;HW+rRM(Yz*!6bTvaaEf6rp^8PCP{*z?L| zmKR49FKIp=scBSf_4|%KNxGVNoJXG?~+_kQncTf6l(JQ63JCB^&*?YixT4_&P z;+n9G$mP2aSY9>>w382-GL?DX-7r(v!0jTw!J@vg%t>!ex;FMW=mY)9;OXk;vd$@? F2>=e)qg4O^ literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/save_all.png b/resources/org/jd/gui/images/save_all.png new file mode 100644 index 0000000000000000000000000000000000000000..eeea6be9f455cdb9e82d5482ebb452977c037e74 GIT binary patch literal 747 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 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/static_ovr.png b/resources/org/jd/gui/images/static_ovr.png new file mode 100644 index 0000000000000000000000000000000000000000..3c721da2fda6f19318db3cbdfdbc2f2de1572fbc GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^>_E)H!VDyjYyB_iZVbAgZ z|Nrx-RjLA|7)yfuf*Bm1-ADs+6g*uVLpZJ{Cm4#9B_s$IvIy!qFr6taZ0XeGvNUL5 ZV2BE3k$>!%c@L1ItEcW90ivJ`cH95GyK=z>+`iQU z7Q1_={r|Z$Ww;Fh`S19#{QqZ8mHa<(tl;`}YNyRw4 z(Dwhy<36x+_d&gI=T<9N3>2{E&XyAn#1CkJ_=J=|1lbG<^?P?ZfG&VUBiL0SvAdo4 zT>uKilgA6eA${^h;s1?m;=u--00tgN?9_>(|NHl*;Wi-B#riu&U^!z3UZkt_TcYy^ kP{VzSGFY^OxeOsS0Qo6I?&!jS-v9sr07*qoM6N<$f{XFOt^fc4 literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/war_obj.gif b/resources/org/jd/gui/images/war_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..31ecb7aee34b13d6db9d5e9271870cd68efaa1c8 GIT binary patch literal 1014 zcmZ?wbhEHb6krfw_|CwvqH^`J_Cs}L{RJgQlQXA>Mpq?ebR?AS3d>y^mfRJVSQlQr zHMMF*OykMOiY@Ox{Rn73m)Ni}uWLigoZTz-TwA#Lba8F>zH^VSJ^pg<`R7Nkzk4}}eA1?#rAHd3Z$5MT?WG5wEs-{P@kc*B^hl^;|r5{pIVA-`{=y@$u`=&)fZ`nuDnAHH(f{k&=6n$wS87w)@Sz4t=@p$kqM&SdR4 zley(s|FO%{_8(6;d@=RVx#XRPW-eMBeffItsncg4J=$^b;P;xxaDObhUFk@_#>^@aOsBja`Zx zfT&yX_uc0AFK_<+^XvJ=wST_9|NQjgkEd5l{C$7^{Q3X?e}+*&#}H8b$->CM(8{0# zvJ;di7&tC7aEopVUcTU=z@ zHa-Q`Dvidb_Nh`vUKI?HjZNK>=6~)~6f`-pb_?rGsYpERHBrr@M~8Dm08@vcS_+5d zqNV%_dI4-2JsTFWa`O7D_~WR&qI-%w1B+LOA`^4BW*XC6&CgFyu`x2KzX;f<)FPyx za;(Kud08W4qv)!Jj}w(UCaXt3*pRq^p~Fe0_}-S2lTtkT9a&^V0yb|r+%A&UaiF1q Yp^?c-Q`Bwa1P1PxH+FEdvM^W!08Y(!=>Px# literal 0 HcmV?d00001 diff --git a/resources/org/jd/gui/images/xml_obj.gif b/resources/org/jd/gui/images/xml_obj.gif new file mode 100644 index 0000000000000000000000000000000000000000..4083e21e64b30efdb50ff05fd8fdaa670cc13c69 GIT binary patch literal 357 zcmV-r0h<0tNk%w1VGsZi0M!5h`1$G-OdC_vGyM?D6-3n6iPGvC!Y}(&6&a;PKJm@Y3P& z)#LNg-|pAt^w{O}*W~lr=Jes~_T%jK>+$%;*Xir=_wMuf@%8!h_WAVo`1knvn5ntZ z-|W)h?7hs`@%8xg_W0J}=hxxqxWU2q`T64K-s9)r{{8Rp?bh(@*6!=r_VCjF`QrBP z(){hY{qxWK^3S@LCeFBT`{9uM=cBQTA+U-eu!|x4-Glx7`uh6%-sJ6hN%*(`0004W zQchC35CLX>Q7Jur z9Vsz>W{3cjqJ|ikgt(ZRA`?`Ft{{iHrihBNE>s1JxxAu)f{>EDIn)d`8#`+=RZ}Z_ z8>lV9CZ29i&W { - jd.loadFile(exportPath.resolve(Versions.getLatest().getExportedJar()).toFile()); - }); - deobf.export(exportPath, Versions.getLatest()); - } - }); - - // close button - cls = new JButton("Close"); - cls.setBounds(initPanel.getWidth() / 2 + 10, initPanel.getHeight() / 7 * 5, initPanel.getWidth()/6, 30); - cls.setForeground(text); - cls.setBackground(button); - initPanel.add(cls); - cls.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - onClose(); - } - }); - - // theme - thm = new JButton(this.theme.getName()); - thm.setBounds(initPanel.getWidth() / 4 * 3, initPanel.getHeight() / 2, initPanel.getWidth()/6, 30); - thm.setForeground(text); - thm.setBackground(button); - initPanel.add(thm); - thm.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - Theme theme; - - String light = "Light Mode"; - String dark = "Dark Mode"; - - switch (thm.getText()) { - case "Light Mode": - thm.setText(dark); - cfg.setTheme(dark); - theme = Theme.DARK; - setTheme(theme); - updateColors(); - break; - - case "Dark Mode": - thm.setText(light); - cfg.setTheme(light); - theme = Theme.LIGHT; - setTheme(theme); - updateColors(); - break; - } - } - }); - - // make application work - gui.setBackground(background); - gui.addWindowListener(new WindowAdapter() { - public void windowClosed(WindowEvent e) { - onClose(); - } - }); - gui.setDefaultCloseOperation(3); - gui.setVisible(true); - - initPanel.addComponentListener(new ComponentAdapter() { - public void componentResized(ComponentEvent e) { - cls.setBounds(initPanel.getWidth() / 2 + 10, initPanel.getHeight() / 7 * 5, initPanel.getWidth()/6, 30); - - exportJar.setBounds(initPanel.getWidth() / 3 - 10, initPanel.getHeight() / 7 * 5, initPanel.getWidth()/6, 30); - - versionChooser.setBounds(initPanel.getWidth() / 12, initPanel.getHeight() / 4, initPanel.getWidth() / 6 * 5, 30); - - versionChooserLabel.setLocation(initPanel.getWidth() / 12, initPanel.getHeight() / 4 - 20); - versionChooserLabel.setSize(500, 20); - - exportPath.setBounds(initPanel.getWidth() / 12, initPanel.getHeight() / 2, initPanel.getWidth() / 6 * 4, 30); - - exportPathLable.setLocation(initPanel.getWidth() / 12, initPanel.getHeight() / 2 - 20); - exportPathLable.setSize(500, 20); - - thm.setBounds(initPanel.getWidth() / 4 * 3, initPanel.getHeight() / 2, initPanel.getWidth()/6, 30); - } - }); - - gui.add(initPanel); - } - - private void setTheme(Theme theme) { - this.theme = theme; - } - - private void updateColors() { - this.background = this.theme.getBg(); - this.text = this.theme.getText(); - this.button = this.theme.getBtn(); - - cls.setForeground(text); - cls.setBackground(button); - - versionChooserLabel.setForeground(text); - versionChooserLabel.setBackground(background); - - versionChooser.setForeground(text); - versionChooser.setBackground(background); - - exportPathLable.setForeground(text); - exportPathLable.setBackground(background); - - exportPath.setForeground(text); - exportPath.setBackground(background); - - exportJar.setForeground(text); - exportJar.setBackground(button); - - thm.setForeground(text); - thm.setBackground(button); - - initPanel.setBackground(background); - } - - private void onClose() { - this.cfg.setExportPath(exportPath.getText()); - System.exit(0); - } - - public JFrame getFrame() { - return this.gui; - } -} +package com.jacoco.mcdata; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JPanel; + +import com.jacoco.mcdata.controller.ActionsController; +import com.jacoco.mcdata.controller.InitializationController; +import com.jacoco.mcdata.controller.JDController; +import com.jacoco.mcdata.files.Config; +import com.jacoco.mcdata.files.Deobfuscation; +import com.jacoco.mcdata.view.View; + +import cuchaz.enigma.EnigmaProfile; +import cuchaz.enigma.translation.mapping.serde.MappingFormat; + +public class Gui { + + private JFrame frame; + private BorderLayout layout; + + private Deobfuscation deobf; + + private List views = new ArrayList(); + + public Gui(Config cfg) { + Theme theme = cfg.getTheme(); + this.deobf = new Deobfuscation(MappingFormat.PROGUARD, EnigmaProfile.EMPTY); + + this.frame = new JFrame("MCData"); + + // coordinates + Dimension size = new Dimension(1000, 800); + + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + int centerX = screenSize.width / 2 - size.width / 2; + int centerY = screenSize.height / 2 - size.height / 2 - 25; + + this.layout = new BorderLayout(); + frame.setLayout(this.layout); + + frame.setLocation(centerX, centerY); + frame.setSize(size); + frame.setMinimumSize(size); + frame.setBackground(theme.getBg()); + + Dimension prefSize = new Dimension(200, 0); + JPanel west = new JPanel(); + JPanel east = new JPanel(); + west.setPreferredSize(prefSize); + east.setPreferredSize(prefSize); + west.setBackground(theme.getBg()); + east.setBackground(theme.getBg()); + + InitializationController initController = new InitializationController(cfg, this.views); + addView(initController.getView(), BorderLayout.NORTH); + frame.add(west, BorderLayout.WEST); + JDController jdController = new JDController(cfg); + addView(jdController.getView(), BorderLayout.CENTER); + frame.add(east, BorderLayout.EAST); + ActionsController actionsController = new ActionsController(initController, jdController, cfg, deobf, this::onClose); + addView(actionsController.getView(), BorderLayout.SOUTH); + frame.setVisible(true); + } + + private void onClose() { + System.exit(0); + } + + public void addView(View view, String constraint) { + views.add(view); + this.frame.add(view.getPanel(), constraint); + } + + public JFrame getFrame() { + return this.frame; + } +} \ No newline at end of file diff --git a/src/com/jacoco/mcdata/Main.java b/src/com/jacoco/mcdata/Main.java index 9163e7e..5c9151e 100644 --- a/src/com/jacoco/mcdata/Main.java +++ b/src/com/jacoco/mcdata/Main.java @@ -1,33 +1,19 @@ -package com.jacoco.mcdata; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -import com.jacoco.mcdata.files.Config; - -public class Main { - - private static Path tmpDir; - private static Config cfg; - private static Gui gui; - - public static void main(String[] args) throws IOException { - tmpDir = Files.createTempDirectory("MCData_"); - tmpDir.toFile().deleteOnExit(); - cfg = new Config(); - gui = new Gui(cfg.getTheme(), cfg); - } - - public static Path getTmpDir() { - return tmpDir; - } - - public static Config getCfg() { - return cfg; - } - - public static Gui getGui() { - return gui; - } -} +package com.jacoco.mcdata; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import com.jacoco.mcdata.files.Config; + +public class Main { + + public static Path tmpDir; + + public static void main(String[] args) throws IOException { + tmpDir = Files.createTempDirectory("MCData_"); + tmpDir.toFile().deleteOnExit(); + Config cfg = new Config(); + new Gui(cfg); + } +} \ No newline at end of file diff --git a/src/com/jacoco/mcdata/Theme.java b/src/com/jacoco/mcdata/Theme.java index ef35e83..a5907b1 100644 --- a/src/com/jacoco/mcdata/Theme.java +++ b/src/com/jacoco/mcdata/Theme.java @@ -1,55 +1,55 @@ -package com.jacoco.mcdata; - -import java.awt.Color; - -public enum Theme { - LIGHT("Light Mode", new Color(254, 254, 254), new Color(0, 0, 0)), - DARK("Dark Mode", new Color(0, 0, 50), new Color(254, 254, 254)); - - private String name; - private Color bg; - private Color text; - private Color btn; - - Theme(String name, Color bg, Color text) { - this.name = name; - this.bg = bg; - this.text = text; - - int r = this.bg.getRed(), g = this.bg.getGreen(), b = this.bg.getBlue(); - int chg = 50; - - if (r >= 100) { - btn = new Color(r - chg, g - chg, b - chg); - } else if (r <= 100) { - btn = new Color(r + chg, g + chg, b - 20 + chg); - } - } - - public static Theme getThemeFromName(String name) { - switch(name) { - case "Light Mode": - return Theme.LIGHT; - case "Dark Mode": - return Theme.LIGHT; - default: - return Theme.LIGHT; - } - } - - public String getName() { - return this.name; - } - - public Color getBg() { - return this.bg; - } - - public Color getText() { - return this.text; - } - - public Color getBtn() { - return this.btn; - } +package com.jacoco.mcdata; + +import java.awt.Color; + +public enum Theme { + LIGHT("Light Mode", new Color(254, 254, 254), new Color(0, 0, 0)), + DARK("Dark Mode", new Color(0, 0, 50), new Color(254, 254, 254)); + + private String name; + private Color bg; + private Color text; + private Color btn; + + Theme(String name, Color bg, Color text) { + this.name = name; + this.bg = bg; + this.text = text; + + int r = this.bg.getRed(), g = this.bg.getGreen(), b = this.bg.getBlue(); + int chg = 50; + + if (r >= 100) { + btn = new Color(r - chg, g - chg, b - chg); + } else if (r <= 100) { + btn = new Color(r + chg, g + chg, b - 20 + chg); + } + } + + public static Theme getThemeFromName(String name) { + switch(name) { + case "Light Mode": + return Theme.LIGHT; + case "Dark Mode": + return Theme.LIGHT; + default: + return Theme.LIGHT; + } + } + + public String getName() { + return this.name; + } + + public Color getBg() { + return this.bg; + } + + public Color getText() { + return this.text; + } + + public Color getBtn() { + return this.btn; + } } \ No newline at end of file diff --git a/src/com/jacoco/mcdata/Utils.java b/src/com/jacoco/mcdata/Utils.java new file mode 100644 index 0000000..512c7b3 --- /dev/null +++ b/src/com/jacoco/mcdata/Utils.java @@ -0,0 +1,90 @@ +package com.jacoco.mcdata; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.nio.file.Paths; +import java.util.Arrays; +import java.util.List; + +import org.jd.gui.service.platform.PlatformService; + +public class Utils { + + private static List jsonSpecials = Arrays.asList('"', '\\', '/', 'b', 'f', 'n', 'r', 't'); + + public static String prettyPrint(String json) { + StringReader reader = new StringReader(json); + StringBuilder builder = new StringBuilder(); + int depth = 0; + + try { + Character c = ' '; + while((c = (char) reader.read()) < 255 && c > 0) { + switch(c) { + case '"': + boolean isString = true; + while(isString) { + builder.append(c); + c = (char) reader.read(); + if(c.equals('\\')) { + builder.append(c); + if(!jsonSpecials.contains(c = (char) reader.read())) + builder.append('\\'); + } else if(c.equals('"')) { + builder.append(c); + isString = false; + } + } + break; + case '{': + case '[': + builder.append(c); + builder.append("\n"); + for(int i = 0; i < depth+1; i++) builder.append("\t"); + depth++; + break; + case '}': + case ']': + Character lastChar = builder.charAt(builder.length()-1); + if(lastChar.equals('\t')) { + builder.deleteCharAt(builder.length()-1); + } else { + builder.append("\n"); + for(int i = 0; i < depth-1; i++) builder.append("\t"); + } + builder.append(c); + depth--; + break; + case ',': + builder.append(c); + builder.append("\n"); + for(int i = 0; i < depth; i++) builder.append("\t"); + break; + case ':': + builder.append(c); builder.append(' '); + break; + default: + builder.append(c); + break; + } + } + } catch (IOException e) { + return null; + } + + return builder.toString(); + } + + public static File getMinecraftDir() { + String workingDirectory; + if (PlatformService.getInstance().isWindows()) { + workingDirectory = System.getenv("AppData"); + } else { + workingDirectory = System.getProperty("user.home"); + if(PlatformService.getInstance().isMac()) + workingDirectory += "/Library/Application Support"; + } + return Paths.get(workingDirectory).resolve(".minecraft").toFile(); + } +} diff --git a/src/com/jacoco/mcdata/controller/ActionsController.java b/src/com/jacoco/mcdata/controller/ActionsController.java new file mode 100644 index 0000000..02928ca --- /dev/null +++ b/src/com/jacoco/mcdata/controller/ActionsController.java @@ -0,0 +1,43 @@ +package com.jacoco.mcdata.controller; + +import java.awt.event.ActionListener; +import java.nio.file.Path; + +import com.jacoco.mcdata.files.Config; +import com.jacoco.mcdata.files.Deobfuscation; +import com.jacoco.mcdata.version.Versions; +import com.jacoco.mcdata.view.ActionsView; + +public class ActionsController { + + private InitializationController initController; + private JDController jdController; + private Config cfg; + private Deobfuscation deobf; + private Runnable close; + + private ActionsView view; + + public ActionsController(InitializationController initController, JDController jdController, Config cfg, Deobfuscation deobf, Runnable close) { + this.initController = initController; + this.jdController = jdController; + this.cfg = cfg; + this.deobf = deobf; + this.close = close; + + this.view = new ActionsView(cfg, exportListener, e -> this.close.run()); + } + + public ActionsView getView() { + return this.view; + } + + private ActionListener exportListener = e -> { + cfg.setExportPath(initController.getExportPath()); + Path exportPath = cfg.getExportPath(); + deobf.addOnFinishEvent(() -> { + jdController.loadFile(exportPath.resolve(Versions.getLatest().getExportedJar()).toFile()); + }); + deobf.export(exportPath, Versions.getLatest()); + }; +} diff --git a/src/com/jacoco/mcdata/controller/InitializationController.java b/src/com/jacoco/mcdata/controller/InitializationController.java new file mode 100644 index 0000000..1d48a2b --- /dev/null +++ b/src/com/jacoco/mcdata/controller/InitializationController.java @@ -0,0 +1,112 @@ +package com.jacoco.mcdata.controller; + +import java.awt.FileDialog; +import java.awt.event.ActionEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.LookAndFeel; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +import com.jacoco.mcdata.Theme; +import com.jacoco.mcdata.files.Config; +import com.jacoco.mcdata.version.Version; +import com.jacoco.mcdata.version.Versions; +import com.jacoco.mcdata.view.InitializationView; +import com.jacoco.mcdata.view.View; + +public class InitializationController { + + private Config cfg; + + private InitializationView view; + private JPanel panel; + private List components; + + private List views; + + public InitializationController(Config cfg, List views) { + this.cfg = cfg; + this.views = views; + + this.view = new InitializationView( + cfg, + chooseVersion, + selectExportPath, + this::themeAction + ); + + Runtime.getRuntime().addShutdownHook(new Thread(() -> cfg.setExportPath(((JTextField) view.getComponents().get(3)).getText()))); + + this.panel = view.getPanel(); + this.components = view.getComponents(); + } + + public InitializationView getView() { + return this.view; + } + + public String getExportPath() { + return ((JTextField) this.components.get(3)).getText(); + } + + private MouseAdapter chooseVersion = new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + try { + FileDialog fd = new FileDialog(new JFrame(), "Choose Folder"); + fd.setVisible(true); + Path path = Paths.get(fd.getDirectory()); + ((JTextField) e.getComponent()).setText(path.toString()); + Versions.add(new Version(path)); + } catch (NullPointerException ex) {} + } + }; + + private MouseAdapter selectExportPath = new MouseAdapter() { + public void mouseClicked(MouseEvent e) { + try { + JFileChooser fd = null; + LookAndFeel previousLF = UIManager.getLookAndFeel(); + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + fd = new JFileChooser("Choose File"); + UIManager.setLookAndFeel(previousLF); + } catch (IllegalAccessException | UnsupportedLookAndFeelException | InstantiationException | ClassNotFoundException ex) {} + fd.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + fd.showOpenDialog(panel); + ((JTextField) e.getComponent()).setText(fd.getSelectedFile().toString()); + cfg.setExportPath(fd.getSelectedFile().toString()); + } catch (NullPointerException ex) {} + } + }; + + private void themeAction(ActionEvent e) { + JButton btn = (JButton) e.getSource(); + + String light = Theme.LIGHT.getName(); + String dark = Theme.DARK.getName(); + + switch(((JButton) e.getSource()).getText()) { + case "Light Mode": + btn.setText(dark); + cfg.setTheme(dark); + for(View guiView : this.views) guiView.updateTheme(Theme.DARK); + break; + case "Dark Mode": + btn.setText(light); + cfg.setTheme(light); + for(View guiView : this.views) guiView.updateTheme(Theme.LIGHT); + break; + } + } +} diff --git a/src/com/jacoco/mcdata/controller/JDController.java b/src/com/jacoco/mcdata/controller/JDController.java new file mode 100644 index 0000000..6329984 --- /dev/null +++ b/src/com/jacoco/mcdata/controller/JDController.java @@ -0,0 +1,33 @@ +package com.jacoco.mcdata.controller; + +import java.io.File; +import java.util.List; + +import org.jd.gui.JDGui; + +import com.jacoco.mcdata.files.Config; +import com.jacoco.mcdata.view.JDView; + +public class JDController { + + private JDView view; + private JDGui jd; + + public JDController(Config cfg) { + this.view = new JDView(cfg.getTheme()); + this.jd = new JDGui(view.getPanel(), cfg); + jd.show(); + } + + public JDView getView() { + return this.view; + } + + public void loadFile(File file) { + this.jd.loadFile(file); + } + + public void loadFiles(List files) { + this.jd.loadFiles(files); + } +} diff --git a/src/com/jacoco/mcdata/files/Config.java b/src/com/jacoco/mcdata/files/Config.java index 03eb3b6..78f005b 100644 --- a/src/com/jacoco/mcdata/files/Config.java +++ b/src/com/jacoco/mcdata/files/Config.java @@ -1,110 +1,131 @@ -package com.jacoco.mcdata.files; - -import java.io.File; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import com.jacoco.mcdata.Theme; - -public class Config { - - private String fn = "Config.json"; - - private JSONObject jo; - - private Path sourcesPath; - private File cfg; - - private Theme thm; - private String theme; - private Path export; - - public Config() { - this.sourcesPath = Paths.get(ClassLoader.getSystemClassLoader().getResource(".").getPath().substring(1)).resolve("Sources"); - this.cfg = this.sourcesPath.resolve(fn).toFile(); - - try { - - if(!cfg.exists()) { - Files.createDirectories(this.sourcesPath); - this.export = this.sourcesPath.resolve("Export"); - Files.createDirectories(this.export); - setupConfig(this.cfg); - this.thm = Theme.LIGHT; - } else { - this.jo = (JSONObject) JSONValue.parse(new FileReader(this.cfg)); - this.theme = jo.get("theme").toString(); - - try{ - export = Paths.get(jo.get("Export Path").toString()); - } catch (NullPointerException e) { - export = this.sourcesPath.resolve("Export"); - } - - switch(this.theme) { - case "Light Mode" : this.thm = Theme.LIGHT; - break; - case "Dark Mode" : this.thm = Theme.DARK; - break; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @SuppressWarnings("unchecked") - private void setupConfig(File path) throws IOException { - // create Config.json - this.jo = new JSONObject(); - - jo.put("theme", "Light Mode"); - jo.put("Export Path", this.export.toString()); - - FileWriter writer = new FileWriter(cfg); - writer.write(jo.toJSONString()); - writer.close(); - } - - public Path getExportPath() { - return this.export; - } - - public Theme getTheme() { - return this.thm; - } - - @SuppressWarnings("unchecked") - public void setExportPath(String path) { - try { - this.export = Paths.get(path); - this.jo.replace("Export Path", path); - FileWriter writer = new FileWriter(this.cfg); - writer.write(this.jo.toJSONString()); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - } - - @SuppressWarnings("unchecked") - public void setTheme(String color) { - try { - this.thm = Theme.getThemeFromName(color); - this.jo.replace("theme", color); - FileWriter writer = new FileWriter(this.cfg); - writer.write(this.jo.toJSONString()); - writer.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } -} +package com.jacoco.mcdata.files; + +import java.io.File; +import java.io.FileReader; +import java.io.PrintWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.jacoco.mcdata.Utils; +import com.jacoco.mcdata.Theme; + +public class Config { + + private final String fn = "Config.json"; + + private JSONObject jo; + + private Path sourcesPath; + private File cfg; + + private Theme thm; + private String theme; + private Path export; + + public Config() { + this.sourcesPath = Paths.get(ClassLoader.getSystemClassLoader().getResource(".").getPath().substring(1)).resolve("Sources"); + this.cfg = this.sourcesPath.resolve(fn).toFile(); + + try { + if(!cfg.exists()) { + Files.createDirectories(this.sourcesPath); + this.export = this.sourcesPath.resolve("Export"); + Files.createDirectories(this.export); + setupConfig(this.cfg); + this.thm = Theme.LIGHT; + } else { + this.jo = (JSONObject) JSONValue.parse(new FileReader(this.cfg)); + this.theme = jo.get("theme").toString(); + + try{ + export = Paths.get(jo.get("exportPath").toString()); + } catch (NullPointerException e) { + export = this.sourcesPath.resolve("Export"); + } + + switch(this.theme) { + case "Light Mode" : this.thm = Theme.LIGHT; + break; + case "Dark Mode" : this.thm = Theme.DARK; + break; + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + private void setupConfig(File path) throws IOException { + this.jo = new JSONObject(); + + jo.put("theme", "Light Mode"); + jo.put("exportPath", this.export.toString()); + jo.put("jd", null); + + PrintWriter writer = new PrintWriter(cfg); + writer.write(Utils.prettyPrint(jo.toJSONString())); + writer.close(); + } + + public Path getSourcesPath() { + return this.sourcesPath; + } + + public Path getExportPath() { + return this.export; + } + + public Theme getTheme() { + return this.thm; + } + + public JSONObject getJD() { + return (JSONObject) this.jo.get("jd"); + } + + @SuppressWarnings("unchecked") + public void setExportPath(String path) { + try { + this.export = Paths.get(path); + this.jo.replace("exportPath", path); + PrintWriter writer = new PrintWriter(this.cfg); + writer.write(Utils.prettyPrint(this.jo.toJSONString())); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + + @SuppressWarnings("unchecked") + public void setTheme(String color) { + try { + this.thm = Theme.getThemeFromName(color); + this.jo.replace("theme", color); + PrintWriter writer = new PrintWriter(this.cfg); + writer.write(Utils.prettyPrint(this.jo.toJSONString())); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @SuppressWarnings("unchecked") + public void saveJDConfig(JSONObject jo) { + try { + this.jo.replace("jd", jo); + PrintWriter writer; + writer = new PrintWriter(this.cfg); + writer.write(Utils.prettyPrint(this.jo.toJSONString())); + writer.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/com/jacoco/mcdata/files/Deobfuscation.java b/src/com/jacoco/mcdata/files/Deobfuscation.java index f343525..15d7722 100644 --- a/src/com/jacoco/mcdata/files/Deobfuscation.java +++ b/src/com/jacoco/mcdata/files/Deobfuscation.java @@ -1,153 +1,146 @@ -package com.jacoco.mcdata.files; - -import java.awt.BorderLayout; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.nio.file.Path; -import java.util.concurrent.CompletableFuture; - -import javax.swing.BorderFactory; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JProgressBar; - -import com.jacoco.mcdata.Gui; -import com.jacoco.mcdata.Main; -import com.jacoco.mcdata.Version; - -import cuchaz.enigma.Enigma; -import cuchaz.enigma.EnigmaProfile; -import cuchaz.enigma.EnigmaProject; -import cuchaz.enigma.ProgressListener; -import cuchaz.enigma.gui.dialog.ProgressDialog.ProgressRunnable; -import cuchaz.enigma.translation.mapping.EntryMapping; -import cuchaz.enigma.translation.mapping.serde.MappingFormat; -import cuchaz.enigma.translation.mapping.tree.EntryTree; -import cuchaz.enigma.utils.Utils; - -public class Deobfuscation { - - private Gui gui; - - private Enigma enigma; - private EnigmaProject project; - - private MappingFormat format; - private ProgressDialog pd; - - private Runnable onFinish; - - public Deobfuscation(Gui gui, EnigmaProfile profile, MappingFormat format) { - this.gui = gui; - this.enigma = Enigma.builder().setProfile(profile).build(); - this.format = format; - this.pd = new ProgressDialog(); - } - - public void export(Path exportPath, Version version) { - version.setExportedJar(exportPath.resolve(version.getName() + ".jar")); - - pd.runOffThread(progress -> { - pd.frame.setTitle("Exporting Jar 1/4"); - project = enigma.openJar(version.getOriginalJar(), progress); - - pd.frame.setTitle("Exporting Jar 2/4"); - Path downloadedMap = version.getObfuscationMap().downloadFile(Main.getTmpDir(), progress); - - pd.frame.setTitle("Exporting Jar 3/4"); - EntryTree mappings = format.read(downloadedMap, progress, null); - project.setMappings(mappings); - - EnigmaProject.JarExport jar = project.exportRemappedJar(progress); - pd.frame.setTitle("Exporting Jar 4/4"); - jar.write(version.getExportedJar(), progress); - }); - } - - public void addOnFinishEvent(Runnable runnable) { - this.onFinish = runnable; - } - - class ProgressDialog implements ProgressListener, AutoCloseable { - private JFrame frame = new JFrame(String.format("Progress", new Object[] { "Enigma" })); - - private JLabel labelTitle; - - private JLabel labelText; - - private JProgressBar progress; - - public void setup(JFrame parent) { - Container pane = this.frame.getContentPane(); - FlowLayout layout = new FlowLayout(); - layout.setAlignment(0); - pane.setLayout(layout); - this.labelTitle = new JLabel(); - pane.add(this.labelTitle); - JPanel panel = new JPanel(); - pane.add(panel); - panel.setLayout(new BorderLayout()); - this.labelText = Utils.unboldLabel(new JLabel()); - this.progress = new JProgressBar(); - this.labelText.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); - panel.add(this.labelText, "North"); - panel.add(this.progress, "Center"); - panel.setPreferredSize(new Dimension(360, 50)); - pane.doLayout(); - this.frame.setSize(400, 120); - this.frame.setResizable(false); - this.frame.setLocationRelativeTo(parent); - this.frame.setVisible(true); - this.frame.setDefaultCloseOperation(0); - } - - public CompletableFuture runOffThread(ProgressRunnable runnable) { - OnExport onExport = new OnExport() { - public Void run() { - try (ProgressDialog progress = ProgressDialog.this) { - progress.setup(gui.getFrame()); - runnable.run(progress); - } catch (Exception ex) { - throw new Error(ex); - } - return null; - } - - public Void finish(Void arg) { - onFinish.run(); - return null; - } - }; - - CompletableFuture future = CompletableFuture.supplyAsync(onExport::run); - future.thenApplyAsync(onExport::finish); - - return future; - } - - public void close() { - this.frame.dispose(); - } - - public void init(int totalWork, String title) { - this.labelTitle.setText(title); - this.progress.setMinimum(0); - this.progress.setMaximum(totalWork); - this.progress.setValue(0); - } - - public void step(int numDone, String message) { - this.labelText.setText(message); - if (numDone != -1) { - this.progress.setValue(numDone); - this.progress.setIndeterminate(false); - } else { - this.progress.setIndeterminate(true); - } - this.frame.validate(); - this.frame.repaint(); - } - } -} +package com.jacoco.mcdata.files; + +import java.awt.BorderLayout; +import java.awt.Container; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.nio.file.Path; +import java.util.concurrent.CompletableFuture; + +import javax.swing.BorderFactory; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JProgressBar; + +import com.jacoco.mcdata.Main; +import com.jacoco.mcdata.version.Version; + +import cuchaz.enigma.Enigma; +import cuchaz.enigma.EnigmaProfile; +import cuchaz.enigma.EnigmaProject; +import cuchaz.enigma.ProgressListener; +import cuchaz.enigma.gui.dialog.ProgressDialog.ProgressRunnable; +import cuchaz.enigma.translation.mapping.EntryMapping; +import cuchaz.enigma.translation.mapping.serde.MappingFormat; +import cuchaz.enigma.translation.mapping.tree.EntryTree; +import cuchaz.enigma.utils.Utils; + +public class Deobfuscation { + + private Enigma enigma; + private MappingFormat format; + private Runnable onFinish; + + public Deobfuscation(MappingFormat format, EnigmaProfile profile) { + this.enigma = Enigma.builder().setProfile(profile).build(); + this.format = format; + } + + public void export(Path exportPath, Version version) { + version.setExportedJar(exportPath.resolve(version.getName() + ".jar")); + + try (ProgressDialog pd = new ProgressDialog()) { + pd.runOffThread(progress -> { + pd.frame.setTitle("Exporting Jar 1/4"); + EnigmaProject project = enigma.openJar(version.getOriginalJar(), progress); + + pd.frame.setTitle("Exporting Jar 2/4"); + Path downloadedMap = version.getObfuscationMap().downloadFile(Main.tmpDir, progress); + + pd.frame.setTitle("Exporting Jar 3/4"); + EntryTree mappings = format.read(downloadedMap, progress, null); + project.setMappings(mappings); + + EnigmaProject.JarExport jar = project.exportRemappedJar(progress); + pd.frame.setTitle("Exporting Jar 4/4"); + jar.write(version.getExportedJar(), progress); + }); + } + } + + public void addOnFinishEvent(Runnable runnable) { + this.onFinish = runnable; + } + + class ProgressDialog implements ProgressListener, AutoCloseable { + private JFrame frame = new JFrame(String.format("Progress", new Object[] { "Enigma" })); + + private JLabel labelTitle; + + private JLabel labelText; + + private JProgressBar progress; + + public void setup() { + Container pane = this.frame.getContentPane(); + FlowLayout layout = new FlowLayout(); + layout.setAlignment(0); + pane.setLayout(layout); + this.labelTitle = new JLabel(); + pane.add(this.labelTitle); + JPanel panel = new JPanel(); + pane.add(panel); + panel.setLayout(new BorderLayout()); + this.labelText = Utils.unboldLabel(new JLabel()); + this.progress = new JProgressBar(); + this.labelText.setBorder(BorderFactory.createEmptyBorder(0, 0, 10, 0)); + panel.add(this.labelText, "North"); + panel.add(this.progress, "Center"); + panel.setPreferredSize(new Dimension(360, 50)); + pane.doLayout(); + this.frame.setSize(400, 120); + this.frame.setResizable(false); + this.frame.setLocationRelativeTo(null); + this.frame.setVisible(true); + this.frame.setDefaultCloseOperation(0); + } + + public CompletableFuture runOffThread(ProgressRunnable runnable) { + OnExport onExport = new OnExport() { + public Void run() { + try (ProgressDialog progress = ProgressDialog.this) { + progress.setup(); + runnable.run(progress); + } catch (Exception ex) { + throw new Error(ex); + } + return null; + } + + public Void finish(Void arg) { + onFinish.run(); + return null; + } + }; + + CompletableFuture future = CompletableFuture.supplyAsync(onExport::run); + future.thenApplyAsync(onExport::finish); + + return future; + } + + public void close() { + this.frame.dispose(); + } + + public void init(int totalWork, String title) { + this.labelTitle.setText(title); + this.progress.setMinimum(0); + this.progress.setMaximum(totalWork); + this.progress.setValue(0); + } + + public void step(int numDone, String message) { + this.labelText.setText(message); + if (numDone != -1) { + this.progress.setValue(numDone); + this.progress.setIndeterminate(false); + } else { + this.progress.setIndeterminate(true); + } + this.frame.validate(); + this.frame.repaint(); + } + } +} diff --git a/src/com/jacoco/mcdata/files/ObfuscationMap.java b/src/com/jacoco/mcdata/files/ObfuscationMap.java index 983470f..289a533 100644 --- a/src/com/jacoco/mcdata/files/ObfuscationMap.java +++ b/src/com/jacoco/mcdata/files/ObfuscationMap.java @@ -1,67 +1,67 @@ -package com.jacoco.mcdata.files; - -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.nio.file.Files; -import java.nio.file.Path; - -import org.json.simple.JSONObject; -import org.json.simple.JSONValue; - -import com.jacoco.mcdata.Versions; - -import cuchaz.enigma.ProgressListener; - -public class ObfuscationMap { - - private Path fileMap; - private URL mapurl; - - public ObfuscationMap(Path path) { - try { - JSONObject jo = (JSONObject) ((JSONObject) ((JSONObject) - JSONValue.parse(new FileReader(path.toString()))).get("downloads")).get("client_mappings"); - this.mapurl = new URL(jo.get("url").toString()); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public Path downloadFile(Path tmpDir, ProgressListener progress) { - try { - progress.init(3, "Downloading Obfuscation Map as a Temp File"); - - progress.step(1, "Creating Temp File"); - fileMap = Files.createTempFile(tmpDir, Versions.getLatest().getName() + "_", ".txt"); - fileMap.toFile().deleteOnExit(); - - progress.step(2, "Connecting to URL"); - ReadableByteChannel rbc = Channels.newChannel(mapurl.openStream()); - progress.step(3, "Writing File"); - FileOutputStream fos = new FileOutputStream(fileMap.toFile()); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } catch (IOException e) { - e.printStackTrace(); - } - - return this.fileMap; - } - - public Path getFile() throws FileNotFoundException { - if(this.fileMap.toFile().exists()) - return this.fileMap; - else - throw new FileNotFoundException(); - } - - public URL getURL() { - return this.mapurl; - } -} +package com.jacoco.mcdata.files; + +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.json.simple.JSONObject; +import org.json.simple.JSONValue; + +import com.jacoco.mcdata.version.Versions; + +import cuchaz.enigma.ProgressListener; + +public class ObfuscationMap { + + private Path fileMap; + private URL mapurl; + + public ObfuscationMap(Path path) { + try { + JSONObject jo = (JSONObject) ((JSONObject) ((JSONObject) + JSONValue.parse(new FileReader(path.toString()))).get("downloads")).get("client_mappings"); + this.mapurl = new URL(jo.get("url").toString()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public Path downloadFile(Path tmpDir, ProgressListener progress) { + try { + progress.init(3, "Downloading Obfuscation Map as a Temp File"); + + progress.step(1, "Creating Temp File"); + fileMap = Files.createTempFile(tmpDir, Versions.getLatest().getName() + "_", ".txt"); + fileMap.toFile().deleteOnExit(); + + progress.step(2, "Connecting to URL"); + ReadableByteChannel rbc = Channels.newChannel(mapurl.openStream()); + progress.step(3, "Writing File"); + FileOutputStream fos = new FileOutputStream(fileMap.toFile()); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + return this.fileMap; + } + + public Path getFile() throws FileNotFoundException { + if(this.fileMap.toFile().exists()) + return this.fileMap; + else + throw new FileNotFoundException(); + } + + public URL getURL() { + return this.mapurl; + } +} \ No newline at end of file diff --git a/src/com/jacoco/mcdata/files/OnExport.java b/src/com/jacoco/mcdata/files/OnExport.java index 7eb3275..a7a193d 100644 --- a/src/com/jacoco/mcdata/files/OnExport.java +++ b/src/com/jacoco/mcdata/files/OnExport.java @@ -1,7 +1,7 @@ -package com.jacoco.mcdata.files; - -public interface OnExport { - public Void run(); - - public Void finish(Void arg); -} +package com.jacoco.mcdata.files; + +public interface OnExport { + public Void run(); + + public Void finish(Void arg); +} diff --git a/src/com/jacoco/mcdata/Version.java b/src/com/jacoco/mcdata/version/Version.java similarity index 92% rename from src/com/jacoco/mcdata/Version.java rename to src/com/jacoco/mcdata/version/Version.java index 1a74916..0ce79da 100644 --- a/src/com/jacoco/mcdata/Version.java +++ b/src/com/jacoco/mcdata/version/Version.java @@ -1,61 +1,61 @@ -package com.jacoco.mcdata; - -import java.nio.file.Path; - -import com.jacoco.mcdata.files.ObfuscationMap; - -public class Version { - - private String name; - private Path oJar; - private Path eJar; - private Path json; - private ObfuscationMap obfuscationMap; - - public Version(Path path) { - this.name = path.getFileName().toString(); - this.oJar = path.resolve(name + ".jar"); - this.json = path.resolve(name + ".json"); - this.obfuscationMap = new ObfuscationMap(this.json); - } - - public String getName() { - return name; - } - - public Path getOriginalJar() { - return oJar; - } - - public Path getExportedJar() { - return eJar; - } - - public Path getJson() { - return json; - } - - public ObfuscationMap getObfuscationMap() { - return obfuscationMap; - } - - public void setName(String name) { - this.name = name; - } - - public void setOriginalJar(Path oJar) { - this.oJar = oJar; - } - - public void setExportedJar(Path eJar) { - this.eJar = eJar; - } - - public void setJson(Path json) { - this.json = json; - } - - public void setObfuscationMap(ObfuscationMap obfuscationMap) { - this.obfuscationMap = obfuscationMap; - } -} +package com.jacoco.mcdata.version; + +import java.nio.file.Path; + +import com.jacoco.mcdata.files.ObfuscationMap; + +public class Version { + + private String name; + private Path oJar; + private Path eJar; + private Path json; + private ObfuscationMap obfuscationMap; + + public Version(Path path) { + this.name = path.getFileName().toString(); + this.oJar = path.resolve(name + ".jar"); + this.json = path.resolve(name + ".json"); + this.obfuscationMap = new ObfuscationMap(this.json); + } + + public String getName() { + return name; + } + + public Path getOriginalJar() { + return oJar; + } + + public Path getExportedJar() { + return eJar; + } + + public Path getJson() { + return json; + } + + public ObfuscationMap getObfuscationMap() { + return obfuscationMap; + } + + public void setName(String name) { + this.name = name; + } + + public void setOriginalJar(Path oJar) { + this.oJar = oJar; + } + + public void setExportedJar(Path eJar) { + this.eJar = eJar; + } + + public void setJson(Path json) { + this.json = json; + } + + public void setObfuscationMap(ObfuscationMap obfuscationMap) { + this.obfuscationMap = obfuscationMap; + } +} diff --git a/src/com/jacoco/mcdata/Versions.java b/src/com/jacoco/mcdata/version/Versions.java similarity index 90% rename from src/com/jacoco/mcdata/Versions.java rename to src/com/jacoco/mcdata/version/Versions.java index 932433c..03fc675 100644 --- a/src/com/jacoco/mcdata/Versions.java +++ b/src/com/jacoco/mcdata/version/Versions.java @@ -1,31 +1,31 @@ -package com.jacoco.mcdata; - -import java.util.ArrayList; -import java.util.List; - -public class Versions { - - private Versions() {} - - private static List versions = new ArrayList(); - - public static List getVersions() { - return versions; - } - - public static Version getLatest() { - return versions.get(versions.size()-1); - } - - public static void add(Version version) { - versions.add(version); - } - - public static void remove(Version version) { - versions.remove(version); - } - - public static void clear() { - versions.clear(); - } -} +package com.jacoco.mcdata.version; + +import java.util.ArrayList; +import java.util.List; + +public class Versions { + + private Versions() {} + + private static List versions = new ArrayList(); + + public static List getVersions() { + return versions; + } + + public static Version getLatest() { + return versions.get(versions.size()-1); + } + + public static void add(Version version) { + versions.add(version); + } + + public static void remove(Version version) { + versions.remove(version); + } + + public static void clear() { + versions.clear(); + } +} diff --git a/src/com/jacoco/mcdata/view/ActionsView.java b/src/com/jacoco/mcdata/view/ActionsView.java new file mode 100644 index 0000000..07f5da0 --- /dev/null +++ b/src/com/jacoco/mcdata/view/ActionsView.java @@ -0,0 +1,61 @@ +package com.jacoco.mcdata.view; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; + +import com.jacoco.mcdata.Theme; +import com.jacoco.mcdata.files.Config; + +public class ActionsView extends View { + + private JPanel panel; + private Theme theme; + private List components = new ArrayList(); + + public ActionsView( + Config cfg, + ActionListener exportListener, + ActionListener closeListener) { + this.theme = cfg.getTheme(); + this.panel = new JPanel(); + + Dimension buttonSize = new Dimension(100, 40); + GridBagConstraints constraints = new GridBagConstraints(); + constraints.insets = new Insets(0, 50, 0, 50); + constraints.fill = GridBagConstraints.NONE; + panel.setLayout(new GridBagLayout()); + panel.setPreferredSize(new Dimension(0, 100)); + applyTheme(panel, theme, NORMAL); + + JButton export = new JButton("Export"); + export.setPreferredSize(buttonSize); + applyTheme(export, theme, BUTTON); + panel.add(export, constraints); + export.addActionListener(exportListener); + components.add(export); + + JButton close = new JButton("Close"); + close.setPreferredSize(buttonSize); + applyTheme(close, theme, BUTTON); + panel.add(close, constraints); + close.addActionListener(closeListener); + components.add(close); + } + + public JPanel getPanel() { + return panel; + } + + public List getComponents() { + return components; + } +} diff --git a/src/com/jacoco/mcdata/view/InitializationView.java b/src/com/jacoco/mcdata/view/InitializationView.java new file mode 100644 index 0000000..967b9c5 --- /dev/null +++ b/src/com/jacoco/mcdata/view/InitializationView.java @@ -0,0 +1,95 @@ +package com.jacoco.mcdata.view; + +import java.awt.Dimension; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; + +import com.jacoco.mcdata.Theme; +import com.jacoco.mcdata.files.Config; + +public class InitializationView extends View { + + private List components = new ArrayList(); + + private JPanel panel; + + private JTextField versionChooser; + private JLabel versionChooserLabel; + + private JTextField exportPath; + private JLabel exportPathLabel; + + private JButton thm; + + private Theme theme; + + public InitializationView( + Config cfg, + MouseAdapter chooseVersion, + MouseAdapter selectExportPath, + ActionListener themeAction) { + this.theme = cfg.getTheme(); + this.panel = new JPanel(); + + GridBagConstraints constraints = new GridBagConstraints(); + constraints.insets = new Insets(5, 0, 0, 0); + panel.setLayout(new GridBagLayout()); + panel.setPreferredSize(new Dimension(0, 150)); + applyTheme(panel, theme, NORMAL); + + versionChooserLabel = new JLabel("Choose Version Folder"); + applyTheme(versionChooserLabel, theme, NORMAL); + versionChooserLabel.setPreferredSize(new Dimension(400, 10)); + panel.add(versionChooserLabel, constraints); + components.add(versionChooserLabel); + + versionChooser = new JTextField("Choose Folder"); + applyTheme(versionChooser, theme, NORMAL); + versionChooser.setPreferredSize(new Dimension(400, 30)); + constraints.gridy = 1; + panel.add(versionChooser, constraints); + versionChooser.addMouseListener(chooseVersion); + components.add(versionChooser); + + exportPathLabel = new JLabel("Choose Export Folder"); + applyTheme(exportPathLabel, theme, NORMAL); + exportPathLabel.setPreferredSize(new Dimension(400, 10)); + constraints.gridy = 2; + panel.add(exportPathLabel, constraints); + components.add(exportPathLabel); + + exportPath = new JTextField(cfg.getExportPath().toString()); + applyTheme(exportPath, theme, NORMAL); + exportPath.setPreferredSize(new Dimension(400, 30)); + constraints.gridy = 3; + panel.add(exportPath, constraints); + exportPath.addMouseListener(selectExportPath); + components.add(exportPath); + + thm = new JButton(this.theme.getName()); + applyTheme(thm, theme, BUTTON); + thm.setPreferredSize(new Dimension(100, 30)); + panel.add(thm, constraints); + thm.addActionListener(themeAction); + components.add(thm); + } + + public List getComponents() { + return this.components; + } + + public JPanel getPanel() { + return this.panel; + } +} diff --git a/src/com/jacoco/mcdata/view/JDView.java b/src/com/jacoco/mcdata/view/JDView.java new file mode 100644 index 0000000..6457724 --- /dev/null +++ b/src/com/jacoco/mcdata/view/JDView.java @@ -0,0 +1,29 @@ +package com.jacoco.mcdata.view; + +import java.awt.BorderLayout; +import java.util.Collections; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.JPanel; + +import com.jacoco.mcdata.Theme; + +public class JDView extends View { + + private JPanel panel; + + public JDView(Theme thm) { + this.panel = new JPanel(); + panel.setLayout(new BorderLayout()); + applyTheme(panel, thm, NORMAL); + } + + public JPanel getPanel() { + return this.panel; + } + + public List getComponents() { + return Collections.emptyList(); + } +} diff --git a/src/com/jacoco/mcdata/view/View.java b/src/com/jacoco/mcdata/view/View.java new file mode 100644 index 0000000..b6f83a2 --- /dev/null +++ b/src/com/jacoco/mcdata/view/View.java @@ -0,0 +1,48 @@ +package com.jacoco.mcdata.view; + +import java.awt.Color; +import java.util.List; + +import javax.swing.JComponent; +import javax.swing.JPanel; + +import com.jacoco.mcdata.Theme; + +public abstract class View { + + public abstract JPanel getPanel(); + public abstract List getComponents(); + + protected final String NORMAL = "normal"; + protected final String BUTTON = "button"; + + public void updateTheme(Theme theme) { + Color text = theme.getText(); + Color background = theme.getBg(); + Color button = theme.getBtn(); + getComponents().forEach(e -> { + switch(e.getName()) { + case NORMAL: + e.setForeground(text); + e.setBackground(background); + break; + case BUTTON: + e.setForeground(text); + e.setBackground(button); + break; + } + }); + } + + protected void applyTheme(JComponent component, Theme theme, String type) { + Color text = theme.getText(); + Color background = theme.getBg(); + Color button = theme.getBtn(); + component.setForeground(text); + if(type.equals(NORMAL)) + component.setBackground(background); + else if(type.equals(BUTTON)) + component.setBackground(button); + component.setName(type); + } +} \ No newline at end of file diff --git a/src/org/jd/gui/Constants.java b/src/org/jd/gui/Constants.java index 75d5cdd..d842f81 100644 --- a/src/org/jd/gui/Constants.java +++ b/src/org/jd/gui/Constants.java @@ -16,8 +16,6 @@ public class Constants { 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; } diff --git a/src/org/jd/gui/JDGui.java b/src/org/jd/gui/JDGui.java index 94308c0..b2cfa25 100644 --- a/src/org/jd/gui/JDGui.java +++ b/src/org/jd/gui/JDGui.java @@ -8,68 +8,54 @@ package org.jd.gui; import java.io.File; -import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.swing.JPanel; import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; 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.service.ConfigurationPersister; + +import com.jacoco.mcdata.files.Config; public class JDGui { protected MainController controller; + protected JPanel parent; + protected Configuration configuration; - public JDGui() { + public JDGui(JPanel parent, Config cfg) { + this.parent = parent; // Load preferences - ConfigurationPersister persister = ConfigurationPersisterService.getInstance().get(); - Configuration configuration = persister.load(); + ConfigurationPersister persister = new ConfigurationPersister(cfg); + this.configuration = persister.load(); Runtime.getRuntime().addShutdownHook(new Thread(() -> persister.save(configuration))); - - // 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(); + } + + public void show() { + new Thread( + () -> { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + // Create main controller and show main frame + controller = new MainController(parent, configuration); + controller.show(Collections.emptyList()); + }, + "JD-Gui" + ).start(); } public void loadFile(File file) { controller.openFile(file); } - - protected static boolean checkHelpFlag(String[] args) { - if (args != null) { - for (String arg : args) { - if ("-h".equals(arg)) { - return true; - } - } - } - return false; - } - - protected static List newList(String[] paths) { - if (paths == null) { - return Collections.emptyList(); - } else { - ArrayList files = new ArrayList<>(paths.length); - for (String path : paths) { - files.add(new File(path)); - } - return files; - } - } + + public void loadFiles(List files) { + controller.openFiles(files); + } } diff --git a/src/org/jd/gui/controller/MainController.java b/src/org/jd/gui/controller/MainController.java index bcc458a..a70aa60 100644 --- a/src/org/jd/gui/controller/MainController.java +++ b/src/org/jd/gui/controller/MainController.java @@ -7,6 +7,7 @@ package org.jd.gui.controller; +import java.awt.Component; import java.awt.Desktop; import java.awt.Frame; import java.awt.Point; @@ -36,8 +37,10 @@ import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JFrame; +import javax.swing.JInternalFrame; import javax.swing.JLayer; import javax.swing.JOptionPane; +import javax.swing.JPanel; import javax.swing.TransferHandler; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.filechooser.FileSystemView; @@ -89,6 +92,8 @@ public class MainController implements API { protected Configuration configuration; protected MainView mainView; + protected List files = new ArrayList<>(); + protected JPanel internalContainer; protected GoToController goToController; protected OpenTypeController openTypeController; @@ -105,8 +110,8 @@ public class MainController implements API { protected ScheduledExecutorService executor = Executors.newScheduledThreadPool(2); protected ArrayList containerChangeListeners = new ArrayList<>(); - @SuppressWarnings("unchecked") - public MainController(Configuration configuration) { + public MainController(JPanel internalContainer, Configuration configuration) { + this.internalContainer = internalContainer; this.configuration = configuration; SwingUtil.invokeLater(() -> { @@ -116,8 +121,14 @@ public MainController(Configuration configuration) { } // Create main frame - mainView = new MainView( - configuration, this, history, + mainView = createView(MainView.INTERNAL); + }); + } + + @SuppressWarnings("unchecked") + protected MainView createView(int boundedness) { + return new MainView( + boundedness, configuration, this, history, e -> onOpen(), e -> onClose(), e -> onSaveSource(), @@ -144,16 +155,20 @@ public MainController(Configuration configuration) { e -> onAbout(), () -> panelClosed(), page -> onCurrentPageChanged((JComponent)page), - file -> openFile((File)file)); - }); - } + file -> openFile((File)file), + comp -> onPanelClosed((Component) comp), + () -> onWindowClose()); + } // --- Show GUI --- // @SuppressWarnings("unchecked") - public void show() { + public void show(List files) { SwingUtil.invokeLater(() -> { // Show main frame mainView.show(configuration.getMainWindowLocation(), configuration.getMainWindowSize(), configuration.isMainWindowMaximize()); + if (!files.isEmpty()) { + openFiles(files); + } }); // Background initializations @@ -166,29 +181,32 @@ public void show() { 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(); - }); + // Populate recent files menu + mainView.updateRecentFilesMenu(configuration.getRecentFiles()); + // Background controller creation + JFrame mainFrame = null; + Component tempMainFrame = mainView.getMainFrame(); + if(tempMainFrame instanceof JFrame) + mainFrame = (JFrame) tempMainFrame; + else if(tempMainFrame instanceof JInternalFrame) + internalContainer.add(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(); @@ -238,7 +256,7 @@ protected void onClose() { protected void onSaveSource() { if (currentPage instanceof ContentSavable) { JFileChooser chooser = new JFileChooser(); - JFrame mainFrame = mainView.getMainFrame(); + Component mainFrame = mainView.getMainFrame(); chooser.setSelectedFile(new File(configuration.getRecentSaveDirectory(), ((ContentSavable)currentPage).getFileName())); @@ -276,7 +294,7 @@ protected void onSaveAllSources() { if (currentPanel instanceof SourcesSavable) { SourcesSavable sourcesSavable = (SourcesSavable)currentPanel; JFileChooser chooser = new JFileChooser(); - JFrame mainFrame = mainView.getMainFrame(); + Component mainFrame = mainView.getMainFrame(); chooser.setSelectedFile(new File(configuration.getRecentSaveDirectory(), sourcesSavable.getSourceFileName())); @@ -483,6 +501,8 @@ public void openFiles(List files) { if (errors.isEmpty()) { for (File file : files) { if (openURI(file.toURI())) { + if(!this.files.contains(file)) + this.files.add(file); configuration.addRecentFile(file); mainView.updateRecentFilesMenu(configuration.getRecentFiles()); } @@ -506,6 +526,27 @@ public void openFiles(List files) { JOptionPane.showMessageDialog(mainView.getMainFrame(), messages.toString(), "Error", JOptionPane.ERROR_MESSAGE); } } + + public void onWindowClose() { + Component comp = mainView.getMainFrame(); + if(comp instanceof JFrame) + this.mainView = createView(MainView.INTERNAL); + else if(comp instanceof JInternalFrame) + this.mainView = createView(MainView.EXTERNAL); + SwingUtil.invokeLater(() -> { + // Show main frame + Component newComp = mainView.getMainFrame(); + if(newComp instanceof JFrame) + mainView.show(configuration.getMainWindowLocation(), configuration.getMainWindowSize(), configuration.isMainWindowMaximize()); + else if(newComp instanceof JInternalFrame) { + internalContainer.add(newComp); + newComp.setVisible(true); + } + if (!files.isEmpty()) { + openFiles(files); + } + }); + } // --- Drop files transfer handler --- // protected class FilesTransferHandler extends TransferHandler { @@ -536,32 +577,40 @@ protected class MainFrameListener extends ComponentAdapter { public MainFrameListener(Configuration configuration) { this.configuration = configuration; } + + public String printstuff() { + return "stuff"; + } @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); - } + Component mainFrame = mainView.getMainFrame(); + if(mainFrame instanceof JFrame) + if ((((JFrame) 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); - } + Component mainFrame = mainView.getMainFrame(); + if(mainFrame instanceof JFrame) + if ((((JFrame) mainFrame).getExtendedState() & Frame.MAXIMIZED_BOTH) == Frame.MAXIMIZED_BOTH) { + configuration.setMainWindowMaximize(true); + } else { + configuration.setMainWindowSize(mainFrame.getSize()); + configuration.setMainWindowMaximize(false); + } } } + public void onPanelClosed(Component component) { + files.remove(new File(component.getName())); + } + protected void panelClosed() { SwingUtil.invokeLater(() -> { // Fire 'indexesChanged' event diff --git a/src/org/jd/gui/service/ConfigurationPersister.java b/src/org/jd/gui/service/ConfigurationPersister.java new file mode 100644 index 0000000..6737d72 --- /dev/null +++ b/src/org/jd/gui/service/ConfigurationPersister.java @@ -0,0 +1,155 @@ +/* + * 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; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Toolkit; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; +import java.util.Map; +import java.util.jar.Manifest; + +import org.jd.gui.Constants; +import org.jd.gui.model.configuration.Configuration; +import org.jd.gui.util.exception.ExceptionUtil; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.jacoco.mcdata.files.Config; + +public class ConfigurationPersister { + protected static final String ERROR_BACKGROUND_COLOR = "JdGuiPreferences.errorBackgroundColor"; + protected static final String JD_CORE_VERSION = "JdGuiPreferences.jdCoreVersion"; + + protected Config cfg; + + public ConfigurationPersister(Config cfg) { + this.cfg = cfg; + } + + 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); + + File recentSaveDirectory = new File(System.getProperty("user.dir")); + + config.setRecentLoadDirectory(recentSaveDirectory); + config.setRecentSaveDirectory(recentSaveDirectory); + + JSONObject jo = cfg.getJD(); + if(jo != null) { + JSONObject gui = (JSONObject) jo.get("gui"); + JSONObject mainWindow = (JSONObject) gui.get("mainWindow"); + JSONObject location = (JSONObject) mainWindow.get("location"); + Point loc = new Point(Integer.parseInt(location.get("x").toString()), Integer.parseInt(location.get("y").toString())); + config.setMainWindowLocation(loc); + JSONObject size = (JSONObject) mainWindow.get("size"); + Dimension dim = new Dimension(Integer.parseInt(size.get("w").toString()), Integer.parseInt(size.get("h").toString())); + config.setMainWindowSize(dim); + config.setMainWindowMaximize(Boolean.valueOf(mainWindow.get("maximize").toString())); + JSONArray recentFilePaths = (JSONArray) jo.get("recentFilePaths"); + List recentFiles = new ArrayList(); + for(Object o : recentFilePaths) { + recentFiles.add(new File(o.toString())); + } + config.setRecentFiles(recentFiles); + JSONObject recentDirectories = (JSONObject) jo.get("recentDirectories"); + config.setRecentLoadDirectory(new File(recentDirectories.get("loadPath").toString())); + config.setRecentSaveDirectory(new File(recentDirectories.get("savePath").toString()));; + JSONObject preferences = (JSONObject) jo.get("preferences"); + for(Object o : preferences.keySet()) { + String key = o.toString(); + config.getPreferences().put(key, preferences.get(key).toString()); + } + } + + 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 enumeration = ConfigurationPersister.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"; + } + + @SuppressWarnings("unchecked") + public void save(Configuration configuration) { + Point l = configuration.getMainWindowLocation(); + Dimension s = configuration.getMainWindowSize(); + + try { + JSONObject jd = new JSONObject(); + JSONObject gui = new JSONObject(); + JSONObject mainWindow = new JSONObject(); + JSONObject location = new JSONObject(); + location.put("x", String.valueOf(l.x)); + location.put("y", String.valueOf(l.y)); + mainWindow.put("location", location); + JSONObject size = new JSONObject(); + size.put("w", String.valueOf(s.width)); + size.put("h", String.valueOf(s.height)); + mainWindow.put("size", size); + mainWindow.put("maximize", String.valueOf(configuration.isMainWindowMaximize())); + gui.put("mainWindow", mainWindow); + jd.put("gui", gui); + JSONArray recentFilePaths = new JSONArray(); + for (File recentFile : configuration.getRecentFiles()) { + recentFilePaths.add(recentFile.toString()); + } + jd.put("recentFilePaths", recentFilePaths); + JSONObject recentDirectories = new JSONObject(); + recentDirectories.put("loadPath", configuration.getRecentLoadDirectory().getAbsolutePath()); + recentDirectories.put("savePath", configuration.getRecentSaveDirectory().getAbsolutePath()); + jd.put("recentDirectories", recentDirectories); + JSONObject preferences = new JSONObject(); + for (Map.Entry preference : configuration.getPreferences().entrySet()) { + preferences.put(preference.getKey(), preference.getValue()); + } + jd.put("preferences", preferences); + + cfg.saveJDConfig(jd); + } catch (Exception e) { + assert ExceptionUtil.printStackTrace(e); + } + } +} diff --git a/src/org/jd/gui/service/actions/CopyQualifiedNameContextualActionsFactory.java b/src/org/jd/gui/service/actions/CopyQualifiedNameContextualActionsFactory.java index 89eb680..2217484 100644 --- a/src/org/jd/gui/service/actions/CopyQualifiedNameContextualActionsFactory.java +++ b/src/org/jd/gui/service/actions/CopyQualifiedNameContextualActionsFactory.java @@ -27,7 +27,7 @@ public Collection make(API api, Container.Entry entry, String fragment) } public static class CopyQualifiedNameAction extends AbstractAction { - protected static final ImageIcon ICON = new ImageIcon(CopyQualifiedNameAction.class.getClassLoader().getResource("org/jd/gui/images/cpyqual_menu.png")); + protected static final ImageIcon ICON = new ImageIcon(CopyQualifiedNameAction.class.getResource("/org/jd/gui/images/cpyqual_menu.png")); protected API api; protected Container.Entry entry; diff --git a/src/org/jd/gui/service/configuration/ConfigurationPersister.java b/src/org/jd/gui/service/configuration/ConfigurationPersister.java deleted file mode 100644 index 40c1dcd..0000000 --- a/src/org/jd/gui/service/configuration/ConfigurationPersister.java +++ /dev/null @@ -1,16 +0,0 @@ -/* - * 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); -} diff --git a/src/org/jd/gui/service/configuration/ConfigurationPersisterService.java b/src/org/jd/gui/service/configuration/ConfigurationPersisterService.java deleted file mode 100644 index fb4ba71..0000000 --- a/src/org/jd/gui/service/configuration/ConfigurationPersisterService.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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; - } -} diff --git a/src/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java b/src/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java deleted file mode 100644 index 3e9bee2..0000000 --- a/src/org/jd/gui/service/configuration/ConfigurationXmlPersisterProvider.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * 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 names = new Stack<>(); - List recentFiles = new ArrayList<>(); - boolean maximize = false; - Map 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 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 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); - } - } -} diff --git a/src/org/jd/gui/service/treenode/DtdFileTreeNodeFactoryProvider.java b/src/org/jd/gui/service/treenode/DtdFileTreeNodeFactoryProvider.java index db19551..b71dda9 100644 --- a/src/org/jd/gui/service/treenode/DtdFileTreeNodeFactoryProvider.java +++ b/src/org/jd/gui/service/treenode/DtdFileTreeNodeFactoryProvider.java @@ -19,7 +19,7 @@ import java.io.File; public class DtdFileTreeNodeFactoryProvider extends TextFileTreeNodeFactoryProvider { - protected static final ImageIcon ICON = new ImageIcon(DtdFileTreeNodeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/dtd_obj.gif")); + protected static final ImageIcon ICON = new ImageIcon(DtdFileTreeNodeFactoryProvider.class.getResource("/org/jd/gui/images/dtd_obj.gif")); @Override public String[] getSelectors() { return appendSelectors("*:file:*.dtd"); } diff --git a/src/org/jd/gui/service/type/AbstractTypeFactoryProvider.java b/src/org/jd/gui/service/type/AbstractTypeFactoryProvider.java index 2847a06..08a73c7 100644 --- a/src/org/jd/gui/service/type/AbstractTypeFactoryProvider.java +++ b/src/org/jd/gui/service/type/AbstractTypeFactoryProvider.java @@ -346,32 +346,32 @@ protected static ImageIcon[] mergeIcons(ImageIcon[] backgrounds, ImageIcon overl return result; } - protected static final ImageIcon ABSTRACT_OVERLAY_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/abstract_ovr.png")); - protected static final ImageIcon FINAL_OVERLAY_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/final_ovr.png")); - protected static final ImageIcon STATIC_OVERLAY_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/static_ovr.png")); - - protected static final ImageIcon CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/class_default_obj.png")); - protected static final ImageIcon PUBLIC_CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/class_obj.png")); - protected static final ImageIcon PROTECTED_CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/class_protected_obj.png")); - protected static final ImageIcon PRIVATE_CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/class_private_obj.png")); - - protected static final ImageIcon INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/int_default_obj.png")); - protected static final ImageIcon PUBLIC_INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/int_obj.png")); - protected static final ImageIcon PROTECTED_INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/int_protected_obj.png")); - protected static final ImageIcon PRIVATE_INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/int_private_obj.png")); - - protected static final ImageIcon ANNOTATION_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/annotation_obj.png")); - protected static final ImageIcon ENUM_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/enum_obj.png")); - - protected static final ImageIcon FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/field_default_obj.png")); - protected static final ImageIcon PUBLIC_FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/field_public_obj.png")); - protected static final ImageIcon PROTECTED_FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/field_protected_obj.png")); - protected static final ImageIcon PRIVATE_FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/field_private_obj.png")); - - protected static final ImageIcon METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/methdef_obj.png")); - protected static final ImageIcon PUBLIC_METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/methpub_obj.png")); - protected static final ImageIcon PROTECTED_METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/methpro_obj.png")); - protected static final ImageIcon PRIVATE_METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getClassLoader().getResource("org/jd/gui/images/methpri_obj.png")); + protected static final ImageIcon ABSTRACT_OVERLAY_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/abstract_ovr.png")); + protected static final ImageIcon FINAL_OVERLAY_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/final_ovr.png")); + protected static final ImageIcon STATIC_OVERLAY_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/static_ovr.png")); + + protected static final ImageIcon CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/class_default_obj.png")); + protected static final ImageIcon PUBLIC_CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/class_obj.png")); + protected static final ImageIcon PROTECTED_CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/class_protected_obj.png")); + protected static final ImageIcon PRIVATE_CLASS_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/class_private_obj.png")); + + protected static final ImageIcon INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/int_default_obj.png")); + protected static final ImageIcon PUBLIC_INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/int_obj.png")); + protected static final ImageIcon PROTECTED_INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/int_protected_obj.png")); + protected static final ImageIcon PRIVATE_INTERFACE_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/int_private_obj.png")); + + protected static final ImageIcon ANNOTATION_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/annotation_obj.png")); + protected static final ImageIcon ENUM_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/enum_obj.png")); + + protected static final ImageIcon FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/field_default_obj.png")); + protected static final ImageIcon PUBLIC_FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/field_public_obj.png")); + protected static final ImageIcon PROTECTED_FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/field_protected_obj.png")); + protected static final ImageIcon PRIVATE_FIELD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/field_private_obj.png")); + + protected static final ImageIcon METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/methdef_obj.png")); + protected static final ImageIcon PUBLIC_METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/methpub_obj.png")); + protected static final ImageIcon PROTECTED_METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/methpro_obj.png")); + protected static final ImageIcon PRIVATE_METHOD_ICON = new ImageIcon(ClassFileTypeFactoryProvider.class.getResource("/org/jd/gui/images/methpri_obj.png")); // Default icon set protected static final ImageIcon[] DEFAULT_CLASS_ICONS = { diff --git a/src/org/jd/gui/view/AboutView.java b/src/org/jd/gui/view/AboutView.java index b7792c3..23f7786 100644 --- a/src/org/jd/gui/view/AboutView.java +++ b/src/org/jd/gui/view/AboutView.java @@ -43,7 +43,7 @@ public AboutView(JFrame mainFrame) { subpanel.setBorder(BorderFactory.createLineBorder(Color.BLACK)); subpanel.setBackground(Color.WHITE); subpanel.setLayout(new BorderLayout()); - JLabel logo = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().getImage("resources/org/jd/gui/images/jd_icon_64.png"))); + JLabel logo = new JLabel(new ImageIcon(Toolkit.getDefaultToolkit().getImage(AboutView.class.getResource("/org/jd/gui/images/jd_icon_64.png")))); logo.setBorder(BorderFactory.createEmptyBorder(15, 15, 15, 15)); subpanel.add(logo, BorderLayout.WEST); Box subvbox = Box.createVerticalBox(); diff --git a/src/org/jd/gui/view/MainView.java b/src/org/jd/gui/view/MainView.java index dcb5704..2908eb9 100644 --- a/src/org/jd/gui/view/MainView.java +++ b/src/org/jd/gui/view/MainView.java @@ -7,28 +7,22 @@ package org.jd.gui.view; -import org.jd.gui.Constants; -import org.jd.gui.api.API; -import org.jd.gui.api.feature.*; -import org.jd.gui.model.configuration.Configuration; -import org.jd.gui.model.history.History; -import org.jd.gui.service.platform.PlatformService; -import org.jd.gui.util.exception.ExceptionUtil; -import org.jd.gui.view.component.IconButton; -import org.jd.gui.view.component.panel.MainTabbedPanel; - -import javax.imageio.ImageIO; -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; -import javax.swing.text.BadLocationException; -import javax.swing.text.Document; -import java.awt.*; +import static org.jd.gui.util.swing.SwingUtil.invokeLater; +import static org.jd.gui.util.swing.SwingUtil.newAction; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Desktop; +import java.awt.Dimension; +import java.awt.Point; +import java.awt.Toolkit; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; import java.io.File; import java.io.IOException; import java.net.URI; @@ -37,13 +31,63 @@ import java.util.Map; import java.util.function.Consumer; -import static org.jd.gui.util.swing.SwingUtil.*; +import javax.imageio.ImageIO; +import javax.swing.Action; +import javax.swing.BorderFactory; +import javax.swing.Box; +import javax.swing.DefaultComboBoxModel; +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JTextField; +import javax.swing.JToolBar; +import javax.swing.KeyStroke; +import javax.swing.border.Border; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.InternalFrameAdapter; +import javax.swing.event.InternalFrameEvent; +import javax.swing.text.BadLocationException; +import javax.swing.text.Document; + +import org.jd.gui.Constants; +import org.jd.gui.api.API; +import org.jd.gui.api.feature.ContentCopyable; +import org.jd.gui.api.feature.ContentSavable; +import org.jd.gui.api.feature.ContentSearchable; +import org.jd.gui.api.feature.ContentSelectable; +import org.jd.gui.api.feature.FocusedTypeGettable; +import org.jd.gui.api.feature.LineNumberNavigable; +import org.jd.gui.api.feature.PageChangeListener; +import org.jd.gui.api.feature.PageClosable; +import org.jd.gui.api.feature.PreferencesChangeListener; +import org.jd.gui.api.feature.SourcesSavable; +import org.jd.gui.api.feature.UriGettable; +import org.jd.gui.api.feature.UriOpenable; +import org.jd.gui.model.configuration.Configuration; +import org.jd.gui.model.history.History; +import org.jd.gui.service.platform.PlatformService; +import org.jd.gui.util.exception.ExceptionUtil; +import org.jd.gui.view.component.IconButton; +import org.jd.gui.view.component.panel.MainTabbedPanel; @SuppressWarnings({"hiding", "unchecked", "rawtypes"}) public class MainView implements UriOpenable, PreferencesChangeListener { - protected History history; + public static final int EXTERNAL = 0; + public static final int INTERNAL = 1; + + protected History history; protected Consumer openFilesCallback; - protected JFrame mainFrame; + protected Component mainFrame; protected JMenu recentFiles = new JMenu("Recent Files"); protected Action closeAction; protected Action openTypeAction; @@ -57,7 +101,7 @@ public class MainView implements UriOpenable protected Color findErrorBackgroundColor; public MainView( - Configuration configuration, API api, History history, + int boundedness, Configuration configuration, API api, History history, ActionListener openActionListener, ActionListener closeActionListener, ActionListener saveActionListener, @@ -84,19 +128,36 @@ public MainView( ActionListener aboutActionListener, Runnable panelClosedCallback, Consumer currentPageChangedCallback, - Consumer openFilesCallback) { + Consumer openFilesCallback, + Consumer mainPanelCloseEvent, + Runnable windowCloseAction) { this.history = history; this.openFilesCallback = openFilesCallback; // Build GUI invokeLater(() -> { - try { - mainFrame = new JFrame("Java Decompiler"); - mainFrame.setIconImages(Arrays.asList(ImageIO.read(MainView.class.getResource("/org/jd/gui/images/jd_icon_32.png")), ImageIO.read(MainView.class.getResource("/org/jd/gui/images/jd_icon_64.png")), ImageIO.read(MainView.class.getResource("/org/jd/gui/images/jd_icon_128.png")))); - mainFrame.setMinimumSize(new Dimension(Constants.MINIMAL_WIDTH, Constants.MINIMAL_HEIGHT)); - mainFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - } catch (IOException e1) { - e1.printStackTrace(); - } + if(boundedness == EXTERNAL) { + try { + mainFrame = new JFrame("Java Decompiler"); + ((JFrame) mainFrame).setIconImages(Arrays.asList(ImageIO.read(MainView.class.getResource("/org/jd/gui/images/jd_icon_32.png")), ImageIO.read(MainView.class.getResource("/org/jd/gui/images/jd_icon_64.png")), ImageIO.read(MainView.class.getResource("/org/jd/gui/images/jd_icon_128.png")))); + ((JFrame) mainFrame).addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + windowCloseAction.run(); + } + }); + } catch (IOException e1) { + e1.printStackTrace(); + } + } else if(boundedness == INTERNAL) { + mainFrame = new JInternalFrame("Java Decompiler"); + ((JInternalFrame) mainFrame).setFrameIcon(new ImageIcon(MainView.class.getResource("/org/jd/gui/images/jd_icon_32.png"))); + ((JInternalFrame) mainFrame).setClosable(true); + ((JInternalFrame) mainFrame).addInternalFrameListener(new InternalFrameAdapter() { + public void internalFrameClosing(InternalFrameEvent e) { + windowCloseAction.run(); + } + }); + } + mainFrame.setMinimumSize(new Dimension(Constants.MINIMAL_WIDTH, Constants.MINIMAL_HEIGHT)); // Find panel // Action findNextAction = newAction("Next", new ImageIcon(MainView.class.getResource("/org/jd/gui/images/next_nav.png")), true, findNextActionListener); @@ -249,7 +310,10 @@ public void keyReleased(KeyEvent e) { menu.addSeparator(); menu.add(aboutAction).setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0)); } - mainFrame.setJMenuBar(menuBar); + if(boundedness == EXTERNAL) + ((JFrame) mainFrame).setJMenuBar(menuBar); + else if(boundedness == INTERNAL) + ((JInternalFrame) mainFrame).setJMenuBar(menuBar); // Icon bar // JPanel panel = new JPanel(); @@ -266,7 +330,7 @@ public void keyReleased(KeyEvent e) { toolBar.add(new IconButton(forwardAction)); panel.add(toolBar, BorderLayout.PAGE_START); - mainTabbedPanel = new MainTabbedPanel(api); + mainTabbedPanel = new MainTabbedPanel(api, mainPanelCloseEvent); mainTabbedPanel.getPageChangedListeners().add(new PageChangeListener() { protected JComponent currentPage = null; @@ -279,7 +343,10 @@ public void keyReleased(KeyEvent e) { invokeLater(() -> { if (page == null) { // Update title - mainFrame.setTitle("Java Decompiler"); + if(boundedness == EXTERNAL) + ((JFrame) mainFrame).setTitle("Java Decompiler"); + else if(boundedness == INTERNAL) + ((JInternalFrame) mainFrame).setTitle("Java Decompiler"); // Update menu saveAction.setEnabled(false); copyAction.setEnabled(false); @@ -293,7 +360,10 @@ public void keyReleased(KeyEvent e) { String path = page.getUri().getPath(); int index = path.lastIndexOf('/'); String name = (index == -1) ? path : path.substring(index + 1); - mainFrame.setTitle((name != null) ? name + " - Java Decompiler" : "Java Decompiler"); + if(boundedness == EXTERNAL) + ((JFrame) mainFrame).setTitle((name != null) ? name + " - Java Decompiler" : "Java Decompiler"); + else if(boundedness == INTERNAL) + ((JInternalFrame) mainFrame).setTitle((name != null) ? name + " - Java Decompiler" : "Java Decompiler"); // Update history history.add(page.getUri()); // Update history actions @@ -338,7 +408,10 @@ public void stateChanged(ChangeEvent e) { panel.add(mainTabbedPanel, BorderLayout.CENTER); panel.add(findPanel, BorderLayout.PAGE_END); - mainFrame.add(panel); + if(boundedness == EXTERNAL) + ((JFrame) mainFrame).add(panel); + else if(boundedness == INTERNAL) + ((JInternalFrame) mainFrame).add(panel); }); } @@ -347,12 +420,13 @@ public void show(Point location, Dimension size, boolean maximize) { // Set position, resize and show mainFrame.setLocation(location); mainFrame.setSize(size); - mainFrame.setExtendedState(maximize ? JFrame.MAXIMIZED_BOTH : 0); + if(mainFrame instanceof JFrame) + ((JFrame) mainFrame).setExtendedState(maximize ? JFrame.MAXIMIZED_BOTH : 0); mainFrame.setVisible(true); }); } - public JFrame getMainFrame() { + public Component getMainFrame() { return mainFrame; } diff --git a/src/org/jd/gui/view/OpenTypeHierarchyView.java b/src/org/jd/gui/view/OpenTypeHierarchyView.java index 650773d..74e5722 100644 --- a/src/org/jd/gui/view/OpenTypeHierarchyView.java +++ b/src/org/jd/gui/view/OpenTypeHierarchyView.java @@ -31,8 +31,8 @@ import java.util.concurrent.Future; public class OpenTypeHierarchyView { - protected static final ImageIcon ROOT_CLASS_ICON = new ImageIcon("resources/org/jd/gui/images/generate_class.png"); - protected static final ImageIcon ROOT_INTERFACE_ICON = new ImageIcon("resources/org/jd/gui/images/generate_int.png"); + protected static final ImageIcon ROOT_CLASS_ICON = new ImageIcon(OpenTypeHierarchyView.class.getResource("/org/jd/gui/images/generate_class.png")); + protected static final ImageIcon ROOT_INTERFACE_ICON = new ImageIcon(OpenTypeHierarchyView.class.getResource("/org/jd/gui/images/generate_int.png")); protected static final TreeNodeComparator TREE_NODE_COMPARATOR = new TreeNodeComparator(); diff --git a/src/org/jd/gui/view/component/AbstractTextPage.java b/src/org/jd/gui/view/component/AbstractTextPage.java index 88cc749..2580857 100644 --- a/src/org/jd/gui/view/component/AbstractTextPage.java +++ b/src/org/jd/gui/view/component/AbstractTextPage.java @@ -33,8 +33,8 @@ public class AbstractTextPage extends JPanel implements LineNumberNavigable, ContentSearchable, UriOpenable, PreferencesChangeListener { protected static final String FONT_SIZE_KEY = "ViewerPreferences.fontSize"; - protected static final ImageIcon COLLAPSED_ICON = new ImageIcon(AbstractTextPage.class.getClassLoader().getResource("org/jd/gui/images/plus.png")); - protected static final ImageIcon EXPANDED_ICON = new ImageIcon(AbstractTextPage.class.getClassLoader().getResource("org/jd/gui/images/minus.png")); + protected static final ImageIcon COLLAPSED_ICON = new ImageIcon(AbstractTextPage.class.getResource("/org/jd/gui/images/plus.png")); + protected static final ImageIcon EXPANDED_ICON = new ImageIcon(AbstractTextPage.class.getResource("/org/jd/gui/images/minus.png")); protected static final Color DOUBLE_CLICK_HIGHLIGHT_COLOR = new Color(0x66ff66); protected static final Color SEARCH_HIGHLIGHT_COLOR = new Color(0xffff66); diff --git a/src/org/jd/gui/view/component/panel/MainTabbedPanel.java b/src/org/jd/gui/view/component/panel/MainTabbedPanel.java index 4305e2e..2c90dde 100644 --- a/src/org/jd/gui/view/component/panel/MainTabbedPanel.java +++ b/src/org/jd/gui/view/component/panel/MainTabbedPanel.java @@ -17,15 +17,18 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.function.Consumer; @SuppressWarnings("unchecked") public class MainTabbedPanel extends TabbedPanel implements UriOpenable, PreferencesChangeListener, PageChangeListener { protected ArrayList pageChangedListeners = new ArrayList<>(); // Flag to prevent the event cascades protected boolean pageChangedListenersEnabled = true; + protected Consumer panelCloseEvent; - public MainTabbedPanel(API api) { + public MainTabbedPanel(API api, Consumer panelCloseEvent) { super(api); + this.panelCloseEvent = panelCloseEvent; } @Override @@ -135,6 +138,12 @@ public List getPages() { public ArrayList getPageChangedListeners() { return pageChangedListeners; } + + @Override + public void removeComponent(Component component) { + panelCloseEvent.accept(component); + super.removeComponent(component); + } // --- URIOpener --- // @Override diff --git a/src/org/jd/gui/view/component/panel/TabbedPanel.java b/src/org/jd/gui/view/component/panel/TabbedPanel.java index bb90c19..263afe0 100644 --- a/src/org/jd/gui/view/component/panel/TabbedPanel.java +++ b/src/org/jd/gui/view/component/panel/TabbedPanel.java @@ -23,8 +23,8 @@ import java.util.Map; public class TabbedPanel extends JPanel implements PreferencesChangeListener { - protected static final ImageIcon CLOSE_ICON = new ImageIcon("resources/org/jd/gui/images/close.gif"); - protected static final ImageIcon CLOSE_ACTIVE_ICON = new ImageIcon("resources/org/jd/gui/images/close_active.gif"); + protected static final ImageIcon CLOSE_ICON = new ImageIcon(TabbedPanel.class.getResource("/org/jd/gui/images/close.gif")); + protected static final ImageIcon CLOSE_ACTIVE_ICON = new ImageIcon(TabbedPanel.class.getResource("/org/jd/gui/images/close_active.gif")); protected static final String TAB_LAYOUT = "UITabsPreferencesProvider.singleLineTabs";