├── .gitignore ├── .idea ├── .name ├── codeStyleSettings.xml ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── encodings.xml ├── modules.xml └── vcs.xml ├── AfterglowTheme.iml ├── README.md ├── Screenshot.png ├── resources ├── META-INF │ └── plugin.xml ├── file-icons │ ├── file_type_binary.png │ ├── file_type_binary@2x.png │ ├── file_type_bower.png │ ├── file_type_bower@2x.png │ ├── file_type_c#.png │ ├── file_type_c#@2x.png │ ├── file_type_c++.png │ ├── file_type_c++@2x.png │ ├── file_type_c.png │ ├── file_type_c@2x.png │ ├── file_type_clojure.png │ ├── file_type_clojure@2x.png │ ├── file_type_cmake.png │ ├── file_type_cmake@2x.png │ ├── file_type_coffescript.png │ ├── file_type_coffescript@2x.png │ ├── file_type_css.png │ ├── file_type_css@2x.png │ ├── file_type_default.png │ ├── file_type_default@2x.png │ ├── file_type_docker.png │ ├── file_type_docker@2x.png │ ├── file_type_elixir.png │ ├── file_type_elixir@2x.png │ ├── file_type_font.png │ ├── file_type_font@2x.png │ ├── file_type_git.png │ ├── file_type_git@2x.png │ ├── file_type_go.png │ ├── file_type_go@2x.png │ ├── file_type_gruntfile.png │ ├── file_type_gruntfile@2x.png │ ├── file_type_gulpfile.png │ ├── file_type_gulpfile@2x.png │ ├── file_type_haskell.png │ ├── file_type_haskell@2x.png │ ├── file_type_header.png │ ├── file_type_header@2x.png │ ├── file_type_html.png │ ├── file_type_html@2x.png │ ├── file_type_image.png │ ├── file_type_image@2x.png │ ├── file_type_jade.png │ ├── file_type_jade@2x.png │ ├── file_type_java.png │ ├── file_type_java@2x.png │ ├── file_type_js.png │ ├── file_type_js@2x.png │ ├── file_type_lua.png │ ├── file_type_lua@2x.png │ ├── file_type_markdown.png │ ├── file_type_markdown@2x.png │ ├── file_type_markup.png │ ├── file_type_markup@2x.png │ ├── file_type_mustache.png │ ├── file_type_mustache@2x.png │ ├── file_type_npm.png │ ├── file_type_npm@2x.png │ ├── file_type_objectivec.png │ ├── file_type_objectivec@2x.png │ ├── file_type_php.png │ ├── file_type_php@2x.png │ ├── file_type_puppet.png │ ├── file_type_puppet@2x.png │ ├── file_type_python.png │ ├── file_type_python@2x.png │ ├── file_type_react.png │ ├── file_type_react@2x.png │ ├── file_type_ruby.png │ ├── file_type_ruby@2x.png │ ├── file_type_rust.png │ ├── file_type_rust@2x.png │ ├── file_type_scala.png │ ├── file_type_scala@2x.png │ ├── file_type_scss.png │ ├── file_type_scss@2x.png │ ├── file_type_settings.png │ ├── file_type_settings@2x.png │ ├── file_type_source.png │ ├── file_type_source@2x.png │ ├── file_type_sql.png │ ├── file_type_sql@2x.png │ ├── file_type_swift.png │ ├── file_type_swift@2x.png │ ├── file_type_tex.png │ ├── file_type_tex@2x.png │ ├── file_type_text.png │ ├── file_type_text@2x.png │ ├── file_type_typescript.png │ ├── file_type_typescript@2x.png │ ├── file_type_vue.png │ ├── file_type_vue@2x.png │ ├── file_type_yaml.png │ └── file_type_yaml@2x.png ├── icons │ ├── folder-closed.png │ ├── folder-closed@2x.png │ ├── folder-open.png │ ├── folder-open@2x.png │ ├── folder.png │ └── folder@2x.png └── theme │ └── theme.json ├── scripts └── find_unused_icons.py └── src └── com └── widerwille └── afterglow ├── AfterglowComponent.java ├── AfterglowConfigurable.java ├── AfterglowFileIconProvider.java ├── AfterglowIconCache.java ├── AfterglowIconProvider.java ├── AfterglowProjectViewNodeDecorator.java ├── AfterglowSettings.java ├── AfterglowTheme.java ├── AfterglowThemeManager.java └── AfterglowTintedIcon.java /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/*.iml 2 | .idea/workspace.xml 3 | .idea/tasks.xml 4 | .idea/vcs.xml 5 | .idea/misc.xml 6 | .idea/dictionaries 7 | .idea/InspectionProfiles 8 | 9 | .DS_Store 10 | /out/ 11 | 12 | AfterglowTheme.jar 13 | -------------------------------------------------------------------------------- /.idea/.name: -------------------------------------------------------------------------------- 1 | AfterglowTheme -------------------------------------------------------------------------------- /.idea/codeStyleSettings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 13 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 27 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /AfterglowTheme.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Afterglow IntelliJ 2 | 3 | This theme for IntelliJ is based on the the [Afterglow Sublime Text](https://github.com/YabataDesign/afterglow-theme) theme, 4 | and replaces the default sidebar icons and colour of IntelliJ. It should be compatible with all IntelliJ IDEs and has been tested 5 | with IntelliJ IDEA Ultimate, CLion, AppCode, WebStorm, PyCharm and RubyMine. 6 | The plugin can be downloaded at the [JetBrains plugin repository](https://plugins.jetbrains.com/plugin/8066) 7 | 8 | This theme looks best with the [Afterglow Color Scheme](https://github.com/boneskull/jetbrains-afterglow-scheme) by 9 | [boneskull](https://github.com/boneskull), which implements the Afterglow Sublime Text color scheme. 10 | 11 | # Screenshot 12 | 13 | Pictures, thousand words etc. Note that Afterglow IntelliJ comes with the original themes found in the Sublime Text plugin, 14 | but the screenshot only shows three. The themes are: Default (White), Blue, Magenta, Orange and Green, the theme can 15 | be switched via the IntelliJ settings dialogue. 16 | 17 | ![Screenshot](./Screenshot.png) 18 | 19 | # Acknowledgments 20 | 21 | ![YourKit logo](https://www.yourkit.com/images/yklogo.png) 22 | 23 | YourKit supports open source projects with its full-featured Java Profiler. 24 | YourKit, LLC is the creator of [YourKit Java Profiler](https://www.yourkit.com/java/profiler/index.jsp) and [YourKit .NET Profiler](https://www.yourkit.com/.net/profiler/index.jsp) innovative and intelligent tools for profiling Java and .NET applications. 25 | 26 | YourKit has offered an open source license for Afterglow to improve its performance (so that issues like [this](https://github.com/JustSid/AfterglowIntelliJ/issues/5) don't happen again). 27 | 28 | # License 29 | 30 | The project is available under the MIT license, the original Afterglow icons are copyright by [Yabata Design](https://github.com/YabataDesign). -------------------------------------------------------------------------------- /Screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/Screenshot.png -------------------------------------------------------------------------------- /resources/META-INF/plugin.xml: -------------------------------------------------------------------------------- 1 | 2 | com.widerwille.afterglow 3 | Afterglow Theme 4 | 1.0.8 5 | Sidney Just 6 | 7 | Theme based on the Afterglow Sublime Text theme. It replaces the sidebar icons and sidebar background colour, source code is available 9 | under the MIT license on Github. This theme is an extension of the Darcular theme, which should be applied.

10 |

Forks and pull requests are welcome, although I also take Github issues :)

11 | ]]>
12 | 13 |

1.0.8

15 |
  • Fixes icons getting accidentally replaced
  • 16 |
  • Fixed NullPointerException
  • 17 | 18 | 23 | 29 | 33 | 38 | 42 | 46 | 51 | ]]> 52 |
    53 | 54 | 55 | com.intellij.modules.lang 56 | 57 | 58 | 59 | com.widerwille.afterglow.AfterglowComponent 60 | 61 | 62 | com.widerwille.afterglow.AfterglowIconCache 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 72 | 73 | 74 | 75 |
    -------------------------------------------------------------------------------- /resources/file-icons/file_type_binary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_binary.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_binary@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_binary@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_bower.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_bower.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_bower@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_bower@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_c#.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_c#.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_c#@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_c#@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_c++.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_c++.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_c++@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_c++@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_c.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_c@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_c@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_clojure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_clojure.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_clojure@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_clojure@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_cmake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_cmake.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_cmake@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_cmake@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_coffescript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_coffescript.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_coffescript@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_coffescript@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_css.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_css@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_css@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_default.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_default@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_docker.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_docker@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_docker@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_elixir.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_elixir.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_elixir@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_elixir@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_font.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_font.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_font@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_font@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_git.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_git.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_git@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_git@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_go.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_go@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_go@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_gruntfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_gruntfile.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_gruntfile@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_gruntfile@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_gulpfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_gulpfile.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_gulpfile@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_gulpfile@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_haskell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_haskell.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_haskell@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_haskell@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_header.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_header@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_header@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_html.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_html@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_html@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_image.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_image@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_image@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_jade.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_jade.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_jade@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_jade@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_java.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_java@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_java@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_js.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_js@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_js@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_lua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_lua.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_lua@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_lua@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_markdown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_markdown.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_markdown@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_markdown@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_markup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_markup.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_markup@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_markup@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_mustache.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_mustache.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_mustache@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_mustache@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_npm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_npm.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_npm@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_npm@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_objectivec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_objectivec.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_objectivec@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_objectivec@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_php.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_php@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_php@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_puppet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_puppet.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_puppet@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_puppet@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_python.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_python@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_python@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_react.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_react.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_react@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_react@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_ruby.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_ruby@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_ruby@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_rust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_rust.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_rust@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_rust@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_scala.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_scala.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_scala@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_scala@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_scss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_scss.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_scss@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_scss@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_settings.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_settings@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_source.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_source.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_source@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_source@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_sql.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_sql@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_sql@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_swift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_swift.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_swift@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_swift@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_tex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_tex.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_tex@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_tex@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_text.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_text@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_text@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_typescript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_typescript.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_typescript@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_typescript@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_vue.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_vue@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_vue@2x.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_yaml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_yaml.png -------------------------------------------------------------------------------- /resources/file-icons/file_type_yaml@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/file-icons/file_type_yaml@2x.png -------------------------------------------------------------------------------- /resources/icons/folder-closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/icons/folder-closed.png -------------------------------------------------------------------------------- /resources/icons/folder-closed@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/icons/folder-closed@2x.png -------------------------------------------------------------------------------- /resources/icons/folder-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/icons/folder-open.png -------------------------------------------------------------------------------- /resources/icons/folder-open@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/icons/folder-open@2x.png -------------------------------------------------------------------------------- /resources/icons/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/icons/folder.png -------------------------------------------------------------------------------- /resources/icons/folder@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JustSid/AfterglowIntelliJ/d8db351e841e2dc5b9b0080641134ec10beb180e/resources/icons/folder@2x.png -------------------------------------------------------------------------------- /resources/theme/theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "options": 3 | { 4 | "name": "Afterglow", 5 | "author": "Sidney Just", 6 | "colors": { 7 | "sidebar.selection": [ 54, 54, 54 ], 8 | "sidebar.background": [ 32, 32, 32 ], 9 | "sidebar.text": [ 160, 160, 160 ] 10 | }, 11 | "tints": [ 12 | { 13 | "name": "White", 14 | "identifier": "Default", 15 | "color": [ 108, 153, 187 ] 16 | }, 17 | { 18 | "name": "Blue", 19 | "identifier": "Blue", 20 | "color": [ 108, 153, 187 ] 21 | }, 22 | { 23 | "name": "Magenta", 24 | "identifier": "Magenta", 25 | "color": [ 128,67, 93 ] 26 | }, 27 | { 28 | "name": "Orange", 29 | "identifier": "Orange", 30 | "color": [ 229, 181, 103 ] 31 | }, 32 | { 33 | "name": "Green", 34 | "identifier": "Green", 35 | "color": [ 124, 144, 68 ] 36 | }, 37 | { 38 | "name": "Yellow", 39 | "identifier": "Yellow", 40 | "color": [ 231, 183, 90 ] 41 | } 42 | ] 43 | }, 44 | "icons": [ 45 | { "name": "ANY", "icon": "/file-icons/file_type_default.png" }, 46 | { "name": "BINARY", "icon": "/file-icons/file_type_binary.png" }, 47 | { "name": "TEXT", "icon": "/file-icons/file_type_text.png" }, 48 | { "name": "FOLDER", "icon": "/icons/folder.png", "tint": true }, 49 | { "name": "EXPANDED", "icon": "/icons/folder-open.png" }, 50 | { "name": "COLLAPSED", "icon": "/icons/folder-closed.png" }, 51 | { "name": "CFILE", "icon": "/file-icons/file_type_c.png" }, 52 | { "name": "CPPFILE", "icon": "/file-icons/file_type_c++.png" }, 53 | { "name": "CSHARP", "icon": "/file-icons/file_type_c#.png" }, 54 | { "name": "CMAKE", "icon": "/file-icons/file_type_cmake.png" }, 55 | { "name": "MFILE", "icon": "/file-icons/file_type_objectivec.png" }, 56 | { "name": "HEADER", "icon": "/file-icons/file_type_header.png" }, 57 | { "name": "RUST", "icon": "/file-icons/file_type_rust.png" }, 58 | { "name": "HASKELL", "icon": "/file-icons/file_type_haskell.png" }, 59 | { "name": "RUBY", "icon": "/file-icons/file_type_ruby.png" }, 60 | { "name": "PYTHON", "icon": "/file-icons/file_type_python.png" }, 61 | { "name": "JAVASCRIPT", "icon": "/file-icons/file_type_js.png" }, 62 | { "name": "TYPESCRIPT", "icon": "/file-icons/file_type_typescript.png" }, 63 | { "name": "REACT", "icon": "/file-icons/file_type_react.png" }, 64 | { "name": "SWIFT", "icon": "/file-icons/file_type_swift.png" }, 65 | { "name": "COFFEE", "icon": "/file-icons/file_type_coffescript.png" }, 66 | { "name": "JAVA", "icon": "/file-icons/file_type_java.png" }, 67 | { "name": "PHP", "icon": "/file-icons/file_type_php.png" }, 68 | { "name": "VUE", "icon": "/file-icons/file_type_vue.png" }, 69 | { "name": "SHELL", "icon": "/file-icons/file_type_source.png" }, 70 | { "name": "MARKDOWN", "icon": "/file-icons/file_type_markdown.png" }, 71 | { "name": "GIT", "icon": "/file-icons/file_type_git.png" }, 72 | { "name": "FONT", "icon": "/file-icons/file_type_font.png" }, 73 | { "name": "HTML", "icon": "/file-icons/file_type_html.png" }, 74 | { "name": "CSS", "icon": "/file-icons/file_type_css.png" }, 75 | { "name": "SCSS", "icon": "/file-icons/file_type_scss.png" }, 76 | { "name": "JADE", "icon": "/file-icons/file_type_jade.png" }, 77 | { "name": "XML", "icon": "/file-icons/file_type_markup.png" }, 78 | { "name": "JSON", "icon": "/file-icons/file_type_settings.png" }, 79 | { "name": "YAML", "icon": "/file-icons/file_type_yaml.png" }, 80 | { "name": "GRUNT", "icon": "/file-icons/file_type_gruntfile.png" }, 81 | { "name": "GULP", "icon": "/file-icons/file_type_gulpfile.png" }, 82 | { "name": "BOWER", "icon": "/file-icons/file_type_bower.png" }, 83 | { "name": "NPM", "icon": "/file-icons/file_type_npm.png" }, 84 | { "name": "TEXT", "icon": "/file-icons/file_type_text.png" }, 85 | { "name": "IMAGE", "icon": "/file-icons/file_type_image.png" }, 86 | { "name": "SQL", "icon": "/file-icons/file_type_sql.png" }, 87 | { "name": "SCALA", "icon": "/file-icons/file_type_scala.png" } 88 | ], 89 | "overrides": [ 90 | { 91 | "types": [ "objectivec" ], 92 | "extensions": [ "h", "hpp", "pch" ], 93 | "icon": "HEADER" 94 | }, 95 | { 96 | "types": [ "objectivec" ], 97 | "extensions": [ "cpp" ], 98 | "icon": "CPPFILE" 99 | }, 100 | { 101 | "types": [ "objectivec" ], 102 | "extensions": [ "c" ], 103 | "icon": "CFILE" 104 | }, 105 | { 106 | "types": [ "objectivec" ], 107 | "extensions": [ "m", "mm" ], 108 | "icon": "MFILE" 109 | }, 110 | { 111 | "types": [ "c#" ], 112 | "icon": "CSHARP" 113 | }, 114 | { 115 | "types": [ "c++" ], 116 | "icon": "CPPFILE" 117 | }, 118 | { 119 | "extensions": [ "json" ], 120 | "types": [ "json" ], 121 | "icon": "JSON", 122 | "overrides": [ "/fileTypes/json.png" ] 123 | }, 124 | { 125 | "name": "package.json", 126 | "types": [ "npm file", "npmignore" ], 127 | "icon": "NPM" 128 | }, 129 | { 130 | "name": "bower.json", 131 | "icon": "BOWER" 132 | }, 133 | { 134 | "extensions": [ "xml", "plist" ], 135 | "types": [ "xml", "plist" ], 136 | "icon": "XML" 137 | }, 138 | { 139 | "extensions": [ "html", "xhtml" ], 140 | "types": [ "html", "xhtml" ], 141 | "icon": "HTML", 142 | "overrides": [ "/fileTypes/html.png" ] 143 | }, 144 | { 145 | "extensions": [ "css" ], 146 | "types": [ "css" ], 147 | "icon": "CSS", 148 | "overrides": [ "/fileTypes/css.png" ] 149 | }, 150 | { 151 | "extensions": [ "scss", "sass" ], 152 | "types": [ "scss", "sass" ], 153 | "icon": "SCSS" 154 | }, 155 | { 156 | "extensions": [ "yaml" ], 157 | "types": [ "yaml" ], 158 | "icon": "YAML" 159 | }, 160 | { 161 | "extensions": [ "jade" ], 162 | "types": [ "jade" ], 163 | "icon": "JADE" 164 | }, 165 | { 166 | "extensions": [ "js" ], 167 | "types": [ "javascript", "ecmascript 6" ], 168 | "icon": "JAVASCRIPT", 169 | "overrides": [ "/fileTypes/javaScript.png" ] 170 | }, 171 | { 172 | "name": "gruntfile.js", 173 | "icon": "GRUNT" 174 | }, 175 | { 176 | "name": "gulpfile.js", 177 | "icon": "GULP" 178 | }, 179 | { 180 | "extensions": [ "ts" ], 181 | "types": [ "typescript" ], 182 | "icon": "TYPESCRIPT", 183 | "overrides": [ "/fileTypes/typeScript.png" ] 184 | }, 185 | { 186 | "extensions": [ "coffee", "litcoffee" ], 187 | "types": [ "coffescript", "literal coffeescript" ], 188 | "icon": "COFFEE" 189 | }, 190 | { 191 | "extensions": [ "rb", "podfile" ], 192 | "types": [ "ruby", "podfile" ], 193 | "icon": "RUBY" 194 | }, 195 | { 196 | "extensions": [ "py" ], 197 | "types": [ "python" ], 198 | "icon": "PYTHON" 199 | }, 200 | { 201 | "extensions": [ "php" ], 202 | "types": [ "php" ], 203 | "icon": "PHP" 204 | }, 205 | { 206 | "extensions": [ "hs", "lhs" ], 207 | "types": [ "haskell" ], 208 | "icon": "HASKELL" 209 | }, 210 | { 211 | "extensions": [ "java" ], 212 | "types": [ "java" ], 213 | "icon": "JAVA", 214 | "overrides": [ "/fileTypes/javaClass.png" ] 215 | }, 216 | { 217 | "types": [ "images" ], 218 | "icon": "IMAGE" 219 | }, 220 | { 221 | "extensions": [ "sql" ], 222 | "types": [ "sql" ], 223 | "icon": "SQL" 224 | }, 225 | { 226 | "extensions": [ "strings" ], 227 | "types": [ "strings" ], 228 | "icon": "TEXT", 229 | "overrides": [ "/fileTypes/text.png" ] 230 | }, 231 | { 232 | "extensions": [ "gitignore", "gitmodules" ], 233 | "types": [ "git file" ], 234 | "icon": "GIT" 235 | }, 236 | { 237 | "extensions": [ "md", "markdown" ], 238 | "types": [ "markdown" ], 239 | "icon": "MARKDOWN" 240 | }, 241 | { 242 | "extensions": [ "sh" ], 243 | "types": [ "bash" ], 244 | "icon": "SHELL", 245 | "overrides": [ "/fileTypes/xslt.png" ] 246 | }, 247 | { 248 | "extensions": [ "rs", "toml" ], 249 | "types": [ "toml file", "rust" ], 250 | "icon": "RUST" 251 | }, 252 | { 253 | "extensions": [ "swift" ], 254 | "types": [ "swift" ], 255 | "icon": "SWIFT" 256 | }, 257 | { 258 | "extensions": [ "vue" ], 259 | "types": [ "vue", "vue.js file" ], 260 | "icon": "VUE" 261 | }, 262 | { 263 | "extensions": [ "ttf", "otf", "ttc" ], 264 | "icon": "FONT" 265 | }, 266 | { 267 | "extensions": [ "tsx", "jsx" ], 268 | "icon": "FONT" 269 | }, 270 | { 271 | "name": "CMakeLists.txt", 272 | "types": [ "cmake" ], 273 | "extensions": [ "cmake" ], 274 | "icon": "CMAKE" 275 | }, 276 | { 277 | "icon": "ANY", 278 | "overrides": [ "/fileTypes/anyType.png" ] 279 | }, 280 | { 281 | "icon": "FOLDER", 282 | "overrides": [ "/modules/sourceRoot.png", "/modules/sourceFolder.png", "/modules/moduleGroup.png", "/nodes/folder.png", "/nodes/newFolder.png", "/nodes/TreeOpen.png", "/nodes/TreeClosed.png", "/nodes/ppFile.png" ] 283 | } 284 | ] 285 | } -------------------------------------------------------------------------------- /scripts/find_unused_icons.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # 3 | # Script for listing unused icons in a plugin. 4 | 5 | import os 6 | import re 7 | import fnmatch 8 | 9 | ICON_USAGE_RE = re.compile(r"""IconLoader\.getIcon[ \t]*\([ \t]*(['"])/?((\\\1|.)*?)\1[ \t]*\)[ \t]*;""", 10 | flags=re.MULTILINE) 11 | 12 | 13 | def collect_file_recursively(path, pattern): 14 | """ 15 | Method returns list of files in `path` that would match some `pattern`. 16 | :param path: path for exploring. 17 | :param pattern: pattern to match for. 18 | :return: list of matches. 19 | """ 20 | matches = list() 21 | for root, folders, filenames in os.walk(path): 22 | for filename in fnmatch.filter(filenames, pattern): 23 | matches.append(os.path.join(root, filename)) 24 | return matches 25 | 26 | 27 | def collect_resource_icons(my_dir): 28 | """ 29 | Method for searching existing icons in `resources` folder. 30 | :param my_dir: folder of current script. 31 | :return: set of found icons. 32 | """ 33 | path = os.path.normpath(os.path.join(my_dir, os.path.pardir, 'resources')) 34 | 35 | resource_icons = set() 36 | for icon in collect_file_recursively(path, '*.png'): 37 | if icon.endswith('@2x.png'): 38 | continue 39 | resource_icons.add(os.path.relpath(icon, path)) 40 | 41 | return resource_icons 42 | 43 | 44 | def collect_java_files(my_dir): 45 | """ 46 | Method searches `*.java` files of a plugin. 47 | :param my_dir: folder of current script. 48 | :return: list of found java sources. 49 | """ 50 | path = os.path.normpath(os.path.join(my_dir, os.path.pardir, 'src')) 51 | return collect_file_recursively(path, '*.java') 52 | 53 | 54 | def find_icons_in_java(filename): 55 | """ 56 | Method parses java file and searching usage of any icon resource in it. 57 | :param filename: absolute path to java source file. 58 | :return: list of used icons. 59 | """ 60 | icons = list() 61 | content = open(filename, 'rb').read() 62 | for match in ICON_USAGE_RE.findall(content): 63 | icons.append(match[1]) 64 | return icons 65 | 66 | 67 | def main(my_dir): 68 | java_files = collect_java_files(my_dir) 69 | 70 | # get icons, used in java source files 71 | icon_usages = set() 72 | for filename in java_files: 73 | icon_usages = icon_usages.union(find_icons_in_java(filename)) 74 | 75 | # get existing icons 76 | icons_in_resources = collect_resource_icons(my_dir) 77 | # get missing files 78 | unused = sorted(icons_in_resources - icon_usages) 79 | 80 | if len(unused): 81 | print('Here is icons, that are not used:') 82 | for name in unused: 83 | print("'{}' is not used!".format(name)) 84 | 85 | 86 | if __name__ == '__main__': 87 | current_dir = os.path.dirname(os.path.realpath(__file__)) 88 | main(current_dir) 89 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowComponent.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.icons.AllIcons; 4 | import com.intellij.openapi.components.ApplicationComponent; 5 | import com.intellij.ui.Gray; 6 | import com.intellij.util.containers.HashMap; 7 | import org.jetbrains.annotations.NotNull; 8 | 9 | import javax.swing.*; 10 | import java.awt.*; 11 | import java.lang.reflect.Field; 12 | import java.lang.reflect.Modifier; 13 | import java.util.ArrayList; 14 | 15 | public class AfterglowComponent implements ApplicationComponent 16 | { 17 | private AfterglowTheme.Tint activeTheme = null; 18 | 19 | public void initComponent() 20 | { 21 | AfterglowThemeManager.initialize(); 22 | 23 | Color selectionColor = AfterglowThemeManager.getColor(AfterglowThemeManager.ColorType.SidebarSelection); 24 | Color backgroundColor = AfterglowThemeManager.getColor(AfterglowThemeManager.ColorType.SidebarBackground); 25 | Color textColor = AfterglowThemeManager.getColor(AfterglowThemeManager.ColorType.SidebarText); 26 | 27 | if(selectionColor == null) 28 | selectionColor = Gray._54; 29 | if(backgroundColor == null) 30 | backgroundColor = Gray._32; 31 | if(textColor == null) 32 | textColor = Gray._160; 33 | 34 | // This is a very evil hack 35 | // Basically the UIUtil class tries to figure out which colour to use for the selected 36 | // cell, and when the cell doesn't have the focus, it checks wether "Tree.textBackground" 37 | // is dark or not. If it's dark, it will return a hard coded color, but, if it's light 38 | // it will return a static field color... Which we can force replace. Yay for hacks 39 | 40 | /*UIManager.put("Tree.textBackground", new Color(255, 255, 255, 0)); 41 | 42 | try 43 | { 44 | setFinalStatic(UIUtil.class, "UNFOCUSED_SELECTION_COLOR", selectionColor); 45 | } 46 | catch(Exception e) 47 | { 48 | e.printStackTrace(); 49 | }*/ 50 | 51 | // The above hack is GREAT! Except it breaks other trees, and I can't figure out how to fix them 52 | // so screw it... I'll go back to thee and hack you even more! 53 | 54 | 55 | // General colours 56 | UIManager.put("Tree.background", backgroundColor); 57 | UIManager.put("Tree.textBackground", backgroundColor); 58 | UIManager.put("Tree.selectionBackground", selectionColor); 59 | 60 | UIManager.put("Tree.foreground", textColor); 61 | 62 | // Icons 63 | try 64 | { 65 | Icon expanded = AfterglowThemeManager.getIconForName("EXPANDED"); 66 | Icon collapsed = AfterglowThemeManager.getIconForName("COLLAPSED"); 67 | 68 | if(expanded != null) 69 | { 70 | UIManager.put("Tree.expandedIcon", expanded); 71 | setFinalStatic(AllIcons.Mac.class, "Tree_white_down_arrow", expanded); 72 | } 73 | 74 | if(collapsed != null) 75 | { 76 | UIManager.put("Tree.collapsedIcon", collapsed); 77 | setFinalStatic(AllIcons.Mac.class, "Tree_white_right_arrow", collapsed); 78 | } 79 | 80 | } 81 | catch(Exception e) 82 | { 83 | e.printStackTrace(); 84 | } 85 | 86 | 87 | AfterglowSettings settings = AfterglowSettings.getInstance(); 88 | String theme = settings.theme; 89 | 90 | applyTheme(AfterglowThemeManager.getTint(theme)); 91 | } 92 | 93 | public void disposeComponent() 94 | { 95 | } 96 | 97 | @NotNull 98 | public String getComponentName() 99 | { 100 | return "AfterglowComponent"; 101 | } 102 | 103 | 104 | public void applyTheme(AfterglowTheme.Tint tint) 105 | { 106 | AfterglowThemeManager.applyTint(tint.getColor()); 107 | fixIcons(); 108 | 109 | activeTheme = tint; 110 | 111 | AfterglowSettings settings = AfterglowSettings.getInstance(); 112 | settings.theme = tint.getIdentifier(); 113 | } 114 | 115 | public AfterglowTheme.Tint getActiveTheme() 116 | { 117 | return activeTheme; 118 | } 119 | 120 | 121 | public void fixIcons() 122 | { 123 | // Override Icon Pack icons 124 | { 125 | HashMap replacements = new HashMap<>(); 126 | ArrayList overrides = AfterglowThemeManager.getIconPackOverrides(); 127 | 128 | if(overrides != null) 129 | { 130 | for(AfterglowTheme.Override override : overrides) 131 | { 132 | Icon icon = override.getIcon(); 133 | 134 | try 135 | { 136 | for(String name : override.getOverrides()) 137 | replacements.put(name, icon); 138 | } 139 | catch(NullPointerException e) 140 | { 141 | e.printStackTrace(); 142 | } 143 | } 144 | 145 | fixIcons(AllIcons.class, replacements); 146 | } 147 | } 148 | } 149 | 150 | private void fixIcons(Class iconsClass, HashMap replacements) 151 | { 152 | Field[] fields = iconsClass.getDeclaredFields(); 153 | 154 | for(int i = 0; i < fields.length; i ++) 155 | { 156 | Field subClass = fields[i]; 157 | 158 | if(Modifier.isStatic(subClass.getModifiers())) 159 | { 160 | try 161 | { 162 | Object ignored = subClass.get(null); 163 | Class byClass = ignored.getClass(); 164 | 165 | if(byClass.getName().endsWith("$CachedImageIcon")) 166 | { 167 | Icon icon = findReplacement(ignored, replacements); 168 | if(icon != null) 169 | { 170 | try 171 | { 172 | setFinalStatic(subClass, icon); 173 | System.out.println("Added diversion of " + subClass.getName()); 174 | } 175 | catch(Exception e) 176 | { 177 | e.printStackTrace(); 178 | } 179 | } 180 | } 181 | } 182 | catch(IllegalAccessException e) 183 | { 184 | e.printStackTrace(); 185 | } 186 | } 187 | } 188 | 189 | Class[] classes = iconsClass.getDeclaredClasses(); 190 | 191 | for(Class cls : classes) 192 | fixIcons(cls, replacements); 193 | } 194 | 195 | private Icon findReplacement(Object object, HashMap replacements) 196 | { 197 | try 198 | { 199 | Field pathField = object.getClass().getDeclaredField("myOriginalPath"); 200 | 201 | pathField.setAccessible(true); 202 | 203 | Object path = pathField.get(object); 204 | 205 | if(path instanceof String) 206 | { 207 | pathField.setAccessible(false); 208 | return replacements.get(path); 209 | } 210 | 211 | pathField.setAccessible(false); 212 | return null; 213 | } 214 | catch(Exception e) 215 | { 216 | e.printStackTrace(); 217 | return null; 218 | } 219 | } 220 | 221 | private static void setFinalStatic(Class cls, String fieldName, Object newValue) throws Exception 222 | { 223 | Field[] fields = cls.getDeclaredFields(); 224 | 225 | for(int i = 0; i < fields.length; i ++) 226 | { 227 | Field field = fields[i]; 228 | 229 | if(field.getName().equals(fieldName)) 230 | { 231 | setFinalStatic(field, newValue); 232 | return; 233 | } 234 | } 235 | } 236 | 237 | private static void setFinalStatic(Field field, Object newValue) throws Exception 238 | { 239 | field.setAccessible(true); 240 | 241 | Field modifiersField = Field.class.getDeclaredField("modifiers"); 242 | modifiersField.setAccessible(true); 243 | modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 244 | 245 | field.set(null, newValue); 246 | 247 | modifiersField.setInt(field, field.getModifiers() | Modifier.FINAL); 248 | modifiersField.setAccessible(false); 249 | 250 | field.setAccessible(false); 251 | } 252 | } 253 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowConfigurable.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.openapi.application.ApplicationManager; 4 | import com.intellij.openapi.options.Configurable; 5 | import com.intellij.openapi.options.ConfigurationException; 6 | import com.intellij.openapi.ui.ComboBox; 7 | import com.intellij.ui.Gray; 8 | import org.jetbrains.annotations.Nls; 9 | import org.jetbrains.annotations.Nullable; 10 | 11 | import javax.swing.*; 12 | import java.awt.*; 13 | import java.util.ArrayList; 14 | 15 | public class AfterglowConfigurable implements Configurable 16 | { 17 | private JComponent component = null; 18 | private ComboBox selectionBox; 19 | private ArrayList tints = null; 20 | 21 | @Nullable 22 | @Override 23 | public JComponent createComponent() 24 | { 25 | if(component == null) 26 | { 27 | AfterglowComponent afterglow = ApplicationManager.getApplication().getComponent(AfterglowComponent.class); 28 | 29 | tints = AfterglowThemeManager.getTints(); 30 | 31 | ArrayList options = new ArrayList<>(); 32 | 33 | for(AfterglowTheme.Tint tint : tints) 34 | options.add(tint.getName()); 35 | 36 | 37 | final JPanel comboPanel = new JPanel(); 38 | 39 | JLabel label = new JLabel("Theme:"); 40 | 41 | selectionBox= new ComboBox(options.toArray()); 42 | selectionBox.setSelectedItem(afterglow.getActiveTheme().getName()); 43 | 44 | comboPanel.add(label); 45 | comboPanel.add(selectionBox); 46 | 47 | 48 | JLabel help = new JLabel("Changing may require reloading the project"); 49 | help.setForeground(Gray._180); 50 | 51 | final JPanel container = new JPanel(); 52 | container.setLayout(new BorderLayout()); 53 | container.add(comboPanel, BorderLayout.LINE_START); 54 | container.add(help, BorderLayout.SOUTH); 55 | 56 | component = container; 57 | } 58 | 59 | return component; 60 | } 61 | 62 | @Override 63 | public void disposeUIResources() 64 | { 65 | component = null; 66 | } 67 | 68 | @Nls 69 | @Override 70 | public String getDisplayName() 71 | { 72 | return "Afterglow"; 73 | } 74 | 75 | @Nullable 76 | @Override 77 | public String getHelpTopic() 78 | { 79 | return null; 80 | } 81 | 82 | @Override 83 | public boolean isModified() 84 | { 85 | AfterglowComponent afterglow = ApplicationManager.getApplication().getComponent(AfterglowComponent.class); 86 | return !(selectionBox.getSelectedItem().equals(afterglow.getActiveTheme().getName())); 87 | } 88 | 89 | @Override 90 | public void reset() 91 | { 92 | AfterglowComponent afterglow = ApplicationManager.getApplication().getComponent(AfterglowComponent.class); 93 | selectionBox.setSelectedItem(afterglow.getActiveTheme().getName()); 94 | } 95 | 96 | @Override 97 | public void apply() throws ConfigurationException 98 | { 99 | AfterglowComponent afterglow = ApplicationManager.getApplication().getComponent(AfterglowComponent.class); 100 | 101 | int index = selectionBox.getSelectedIndex(); 102 | afterglow.applyTheme(tints.get(index)); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowFileIconProvider.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.ide.FileIconProvider; 4 | import com.intellij.openapi.application.ApplicationManager; 5 | import com.intellij.openapi.project.DumbAware; 6 | import com.intellij.openapi.project.Project; 7 | import com.intellij.openapi.util.Iconable; 8 | import com.intellij.openapi.vfs.VirtualFile; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import javax.swing.*; 13 | 14 | public class AfterglowFileIconProvider implements FileIconProvider, DumbAware 15 | { 16 | @Nullable 17 | public final Icon getIcon(@NotNull VirtualFile file, @Iconable.IconFlags int flags, @Nullable Project project) 18 | { 19 | AfterglowIconCache cache = ApplicationManager.getApplication().getComponent(AfterglowIconCache.class); 20 | return cache.getIcon(file, flags); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowIconCache.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | 4 | import com.intellij.openapi.components.ApplicationComponent; 5 | import com.intellij.openapi.fileTypes.FileType; 6 | import com.intellij.openapi.vfs.VirtualFile; 7 | import com.intellij.util.containers.HashMap; 8 | import org.jetbrains.annotations.NonNls; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import javax.swing.*; 13 | 14 | public class AfterglowIconCache implements ApplicationComponent 15 | { 16 | private HashMap fileCache; 17 | 18 | @Override 19 | public void initComponent() 20 | { 21 | fileCache = new HashMap<>(); 22 | } 23 | 24 | @Override 25 | public void disposeComponent() 26 | { 27 | fileCache = null; 28 | } 29 | 30 | @NonNls 31 | @NotNull 32 | public String getComponentName() 33 | { 34 | return "AfterglowIconCache"; 35 | } 36 | 37 | @Nullable 38 | public void clearCache() 39 | { 40 | fileCache = new HashMap<>(); 41 | } 42 | 43 | @Nullable 44 | private String getLookup(VirtualFile file, int flags) 45 | { 46 | String lookup; 47 | 48 | try 49 | { 50 | FileType type = file.getFileType(); 51 | String typeName = type.getName(); 52 | 53 | // Special handling for files that share the same type as others, but have a different icon 54 | if(typeName.equalsIgnoreCase("javascript") || typeName.equalsIgnoreCase("ecmascript 6")) 55 | { 56 | if(file.getName().equalsIgnoreCase("gruntfile.js")) 57 | return "gruntfile.js"; 58 | if(file.getName().equalsIgnoreCase("gulpfile.js")) 59 | return "gulpfile.js"; 60 | } 61 | else if(typeName.equalsIgnoreCase("json")) 62 | { 63 | if(file.getName().equalsIgnoreCase("package.json")) 64 | return "package.json"; 65 | if(file.getName().equalsIgnoreCase("bower.json")) 66 | return "bower.json"; 67 | } 68 | 69 | lookup = typeName + "." + file.getExtension(); 70 | } 71 | catch(Exception e) 72 | { 73 | lookup = file.getPath(); 74 | } 75 | 76 | return lookup; 77 | } 78 | 79 | @Nullable 80 | public Icon getIcon(VirtualFile file, int flags) 81 | { 82 | if(file.isDirectory()) 83 | return AfterglowThemeManager.DIRECTORY; 84 | 85 | // Generate the lookup into the cache 86 | String lookup = getLookup(file, flags); 87 | 88 | if(lookup == null) 89 | return AfterglowThemeManager.getIcon(file); 90 | 91 | 92 | // Retrieve the actual icon 93 | Icon result = fileCache.get(lookup); 94 | 95 | if(result == null) 96 | { 97 | result = AfterglowThemeManager.getIcon(file); 98 | 99 | if(result != null) 100 | fileCache.put(lookup, result); 101 | } 102 | 103 | return result; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowIconProvider.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.ide.IconProvider; 4 | import com.intellij.openapi.application.ApplicationManager; 5 | import com.intellij.openapi.project.DumbAware; 6 | import com.intellij.openapi.vfs.VirtualFile; 7 | import com.intellij.psi.PsiElement; 8 | import com.intellij.psi.PsiFile; 9 | import org.jetbrains.annotations.NotNull; 10 | import org.jetbrains.annotations.Nullable; 11 | 12 | import javax.swing.*; 13 | 14 | public class AfterglowIconProvider extends IconProvider implements DumbAware 15 | { 16 | @Nullable 17 | public final Icon getIcon(@NotNull PsiElement element, int flags) 18 | { 19 | PsiFile containingFile = element.getContainingFile(); 20 | 21 | if(containingFile != null) 22 | { 23 | VirtualFile vFile = containingFile.getVirtualFile(); 24 | if(vFile == null) 25 | return AfterglowThemeManager.DIRECTORY; 26 | 27 | AfterglowIconCache cache = ApplicationManager.getApplication().getComponent(AfterglowIconCache.class); 28 | return cache.getIcon(vFile, flags); 29 | } 30 | 31 | return null; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowProjectViewNodeDecorator.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.ide.projectView.PresentationData; 4 | import com.intellij.ide.projectView.ProjectViewNode; 5 | import com.intellij.ide.projectView.ProjectViewNodeDecorator; 6 | import com.intellij.openapi.application.ApplicationManager; 7 | import com.intellij.openapi.vfs.VirtualFile; 8 | import com.intellij.packageDependencies.ui.PackageDependenciesNode; 9 | import com.intellij.ui.ColoredTreeCellRenderer; 10 | 11 | import javax.swing.*; 12 | 13 | 14 | public class AfterglowProjectViewNodeDecorator implements ProjectViewNodeDecorator 15 | { 16 | @Override 17 | public void decorate(ProjectViewNode node, PresentationData data) 18 | { 19 | VirtualFile file = node.getVirtualFile(); 20 | if(file == null) 21 | return; 22 | 23 | AfterglowIconCache cache = ApplicationManager.getApplication().getComponent(AfterglowIconCache.class); 24 | Icon icon = cache.getIcon(file, 0); 25 | 26 | if(icon != null) 27 | data.setIcon(icon); 28 | } 29 | 30 | @Override 31 | public void decorate(PackageDependenciesNode node, ColoredTreeCellRenderer cellRenderer) 32 | {} 33 | } 34 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowSettings.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | 4 | import com.intellij.ide.util.PropertiesComponent; 5 | import com.intellij.openapi.components.PersistentStateComponent; 6 | import com.intellij.openapi.components.ServiceManager; 7 | import com.intellij.openapi.components.State; 8 | import com.intellij.openapi.components.Storage; 9 | import com.intellij.util.xmlb.XmlSerializerUtil; 10 | import com.intellij.util.xmlb.annotations.Tag; 11 | import org.jetbrains.annotations.Nullable; 12 | 13 | 14 | @State( 15 | name = "AfterglowSettings", 16 | storages = @Storage(id = "Afterglow", file = "$APP_CONFIG$/afterglow.xml") 17 | ) 18 | public class AfterglowSettings implements PersistentStateComponent { 19 | 20 | private static final String THEME_IMPORT_KEY = "com.widerwille.Afterglow.theme"; 21 | 22 | @Tag 23 | public String theme; 24 | 25 | public AfterglowSettings() { 26 | 27 | PropertiesComponent component = PropertiesComponent.getInstance(); 28 | theme = component.getValue(THEME_IMPORT_KEY, "Default"); 29 | } 30 | 31 | @Nullable 32 | @Override 33 | public AfterglowSettings getState() { 34 | return this; 35 | } 36 | 37 | @Override 38 | public void loadState(AfterglowSettings afterglowSettings) { 39 | XmlSerializerUtil.copyBean(afterglowSettings, this); 40 | } 41 | 42 | public static AfterglowSettings getInstance() { 43 | return ServiceManager.getService(AfterglowSettings.class); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowTheme.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.google.gson.*; 4 | import com.intellij.openapi.diagnostic.Logger; 5 | import com.intellij.openapi.util.IconLoader; 6 | import com.intellij.openapi.vfs.VirtualFile; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | import javax.swing.*; 11 | import java.awt.*; 12 | import java.io.BufferedReader; 13 | import java.io.InputStream; 14 | import java.io.InputStreamReader; 15 | import java.net.URL; 16 | import java.util.*; 17 | 18 | public class AfterglowTheme 19 | { 20 | private static final Logger LOG = Logger.getInstance(AfterglowTheme.class); 21 | 22 | private URL url; 23 | private String name; 24 | private String author; 25 | private JsonObject options; 26 | private HashMap iconTable = new HashMap<>(); 27 | private HashMap tintTable = new HashMap<>(); 28 | private ArrayList tintList = new ArrayList<>(); 29 | private ArrayList overrides = new ArrayList<>(); 30 | private boolean defaultTheme; 31 | 32 | private AfterglowTheme(@NotNull URL fileURL) throws Exception 33 | { 34 | InputStream stream = fileURL.openStream(); 35 | BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); 36 | 37 | String line; 38 | StringBuilder content = new StringBuilder(); 39 | 40 | while((line = reader.readLine()) != null) 41 | content.append(line); 42 | 43 | try 44 | { 45 | ParseTheme(content.toString()); 46 | 47 | defaultTheme = (AfterglowTheme.class.getResource("/theme/theme.json") == fileURL); 48 | url = fileURL; 49 | } 50 | catch(Exception e) 51 | { 52 | reader.close(); 53 | 54 | LOG.error("Couldn't parse theme, error: " + e.getLocalizedMessage()); 55 | throw e; 56 | } 57 | finally 58 | { 59 | reader.close(); 60 | } 61 | } 62 | 63 | static public AfterglowTheme CreateThemeWithURL(@NotNull URL fileURL) throws Exception 64 | { 65 | return new AfterglowTheme(fileURL); 66 | } 67 | 68 | @NotNull 69 | public String getName() 70 | { 71 | return name; 72 | } 73 | @NotNull 74 | public String getAuthor() 75 | { 76 | return author; 77 | } 78 | @NotNull 79 | public URL getUrl() 80 | { 81 | return url; 82 | } 83 | 84 | public boolean isDefaultTheme() 85 | { 86 | return defaultTheme; 87 | } 88 | 89 | @Nullable 90 | public ArrayList getIconPackOverrides() 91 | { 92 | ArrayList result = new ArrayList<>(); 93 | 94 | for(Override override : overrides) 95 | { 96 | if(override.getOverrides() != null) 97 | result.add(override); 98 | } 99 | 100 | return (result.size() > 0) ? result : null; 101 | } 102 | 103 | @Nullable 104 | public Icon getIconForName(@NotNull String name) 105 | { 106 | ThemeIcon icon = iconTable.get(name); 107 | if(icon != null) 108 | return icon.getIcon(); 109 | 110 | return null; 111 | } 112 | 113 | @Nullable 114 | public Icon getIcon(VirtualFile virtualFile) 115 | { 116 | ArrayList matchList = new ArrayList<>(); 117 | File file = new File(virtualFile); 118 | 119 | for(Override override : overrides) 120 | { 121 | if(override.MatchesFile(file)) 122 | matchList.add(override); 123 | } 124 | 125 | if(matchList.size() == 0) 126 | return null; 127 | 128 | Override best = matchList.get(0); 129 | for(int i = 1; i < matchList.size(); i++) 130 | { 131 | Override other = matchList.get(i); 132 | if(other.IsBetterMatch(best, file)) 133 | best = other; 134 | } 135 | 136 | return best.getIcon(); 137 | } 138 | 139 | public Color getColor(@NotNull String name) 140 | { 141 | JsonObject colors = options.getAsJsonObject("colors"); 142 | if(colors == null) 143 | return null; 144 | 145 | JsonArray values = colors.getAsJsonArray(name); 146 | if(values == null || values.size() != 3) 147 | return null; 148 | 149 | int r = values.get(0).getAsInt(); 150 | int g = values.get(1).getAsInt(); 151 | int b = values.get(2).getAsInt(); 152 | 153 | return new Color(r, g, b); 154 | } 155 | 156 | public Tint getTint(@NotNull String identifier) 157 | { 158 | return tintTable.get(identifier); 159 | } 160 | 161 | public ArrayList getTints() 162 | { 163 | return tintList; 164 | } 165 | 166 | public void applyTint(Color color) 167 | { 168 | for(ThemeIcon icon : iconTable.values()) 169 | icon.applyTint(color); 170 | } 171 | 172 | 173 | private void ParseTheme(@NotNull String content) 174 | { 175 | JsonElement root = new JsonParser().parse(content); 176 | JsonObject rootObject = root.getAsJsonObject(); 177 | 178 | options = rootObject.getAsJsonObject("options"); 179 | JsonArray icons = rootObject.getAsJsonArray("icons"); 180 | JsonArray overrides = rootObject.getAsJsonArray("overrides"); 181 | 182 | if(options == null || icons == null || overrides == null) 183 | throw new InternalError("options, icons and overrides mustn't be null"); 184 | 185 | // Options 186 | name = options.getAsJsonPrimitive("name").getAsString(); 187 | author = options.getAsJsonPrimitive("author").getAsString(); 188 | 189 | try 190 | { 191 | JsonArray array = options.getAsJsonArray("tints"); 192 | if(array != null) 193 | { 194 | for(int i = 0; i < array.size(); i ++) 195 | { 196 | JsonObject object = array.get(i).getAsJsonObject(); 197 | 198 | try 199 | { 200 | Tint tint = new Tint(object); 201 | 202 | tintTable.put(tint.getIdentifier(), tint); 203 | tintList.add(tint); 204 | } 205 | catch(Exception e) 206 | {} 207 | } 208 | } 209 | } 210 | catch(Exception e) 211 | {} 212 | 213 | // Load all icons 214 | for(int i = 0; i < icons.size(); i++) 215 | { 216 | JsonObject object = icons.get(i).getAsJsonObject(); 217 | 218 | try 219 | { 220 | ThemeIcon icon = new ThemeIcon(object); 221 | iconTable.put(icon.getIdentifier(), icon); 222 | } 223 | catch(Exception e) 224 | { 225 | LOG.error("Couldn't load icon"); 226 | e.printStackTrace(); 227 | } 228 | } 229 | 230 | // Load the overrides 231 | for(int i = 0; i < overrides.size(); i++) 232 | { 233 | JsonObject object = overrides.get(i).getAsJsonObject(); 234 | 235 | String iconName = object.getAsJsonPrimitive("icon").getAsString(); 236 | ThemeIcon icon = iconTable.get(iconName); 237 | 238 | if(icon != null) 239 | { 240 | Override override = new Override(object, icon); 241 | this.overrides.add(override); 242 | } 243 | else 244 | LOG.error("Couldn't resolve icon " + iconName); 245 | } 246 | } 247 | 248 | private class File 249 | { 250 | private String extension; 251 | private String name; 252 | private String type; 253 | 254 | private File(VirtualFile file) 255 | { 256 | type = file.getFileType().getName().toLowerCase(); 257 | name = file.getName().toLowerCase(); 258 | extension = file.getExtension(); 259 | 260 | if(extension != null) 261 | extension = extension.toLowerCase(); 262 | else 263 | extension = ""; 264 | } 265 | 266 | String getExtension() 267 | { 268 | return extension; 269 | } 270 | String getName() 271 | { 272 | return name; 273 | } 274 | String getType() 275 | { 276 | return type; 277 | } 278 | } 279 | 280 | public class ThemeIcon 281 | { 282 | private Icon original; 283 | private Icon postProcessed = null; // Tinted, if tintable icon 284 | private boolean tintable = false; 285 | private String identifier; 286 | 287 | private ThemeIcon(@NotNull JsonObject object) 288 | { 289 | String name = object.getAsJsonPrimitive("name").getAsString(); 290 | String file = object.getAsJsonPrimitive("icon").getAsString(); 291 | 292 | if(name == null || file == null) 293 | throw new IllegalArgumentException("Invalid arguments, icon needs a name and a file"); 294 | 295 | identifier = name; 296 | original = IconLoader.getIcon(file); 297 | 298 | JsonPrimitive tintable = object.getAsJsonPrimitive("tint"); 299 | if(tintable != null && tintable.isBoolean()) 300 | this.tintable = tintable.getAsBoolean(); 301 | } 302 | 303 | private void applyTint(Color color) 304 | { 305 | if(tintable) 306 | postProcessed = new AfterglowTintedIcon(original, color); 307 | } 308 | 309 | public String getIdentifier() 310 | { 311 | return identifier; 312 | } 313 | public Icon getIcon() 314 | { 315 | return (postProcessed != null) ? postProcessed : original; 316 | } 317 | } 318 | 319 | public class Tint 320 | { 321 | private String name; 322 | private String identifier; 323 | private Color color; 324 | 325 | private Tint(@NotNull JsonObject tint) 326 | { 327 | JsonElement nameElement = tint.getAsJsonPrimitive("name"); 328 | if(nameElement != null) 329 | name = nameElement.getAsString(); 330 | 331 | JsonElement identifierElement = tint.getAsJsonPrimitive("identifier"); 332 | if(identifierElement != null) 333 | identifier = identifierElement.getAsString(); 334 | 335 | color = getColor(tint.getAsJsonArray("color")); 336 | } 337 | 338 | private Color getColor(@NotNull JsonArray values) 339 | { 340 | if(values == null || values.size() != 3) 341 | return null; 342 | 343 | int r = values.get(0).getAsInt(); 344 | int g = values.get(1).getAsInt(); 345 | int b = values.get(2).getAsInt(); 346 | 347 | return new Color(r, g, b); 348 | } 349 | 350 | public String getName() 351 | { 352 | return name; 353 | } 354 | public String getIdentifier() 355 | { 356 | return identifier; 357 | } 358 | public Color getColor() 359 | { 360 | return color; 361 | } 362 | } 363 | 364 | public class Override 365 | { 366 | private ThemeIcon icon = null; 367 | private String name = null; 368 | private Set extensions = new HashSet<>(); 369 | private Set types = new HashSet<>(); 370 | private Set overrides = new HashSet<>(); 371 | private Set defaults = new HashSet<>(); 372 | 373 | public Override(@NotNull JsonObject override, @NotNull ThemeIcon icon) 374 | { 375 | this.icon = icon; 376 | 377 | JsonElement nameElement = override.getAsJsonPrimitive("name"); 378 | if(nameElement != null) 379 | name = nameElement.getAsString().toLowerCase(); 380 | 381 | JsonArray extensions = override.getAsJsonArray("extensions"); 382 | JsonArray types = override.getAsJsonArray("types"); 383 | JsonArray overrides = override.getAsJsonArray("overrides"); 384 | JsonArray defaults = override.getAsJsonArray("defaults"); 385 | 386 | if(extensions != null) 387 | { 388 | for(int i = 0; i < extensions.size(); i++) 389 | this.extensions.add(extensions.get(i).getAsString().toLowerCase()); 390 | } 391 | 392 | if(types != null) 393 | { 394 | for(int i = 0; i < types.size(); i++) 395 | this.types.add(types.get(i).getAsString().toLowerCase()); 396 | } 397 | 398 | if(overrides != null) 399 | { 400 | for(int i = 0; i < overrides.size(); i++) 401 | this.overrides.add(overrides.get(i).getAsString()); 402 | } 403 | 404 | if(defaults != null) 405 | { 406 | for(int i = 0; i < defaults.size(); i++) 407 | this.defaults.add(defaults.get(i).getAsString()); 408 | } 409 | 410 | if(this.overrides.size() == 0) 411 | this.overrides = null; 412 | 413 | if(this.defaults.size() == 0) 414 | this.defaults = null; 415 | } 416 | 417 | @NotNull 418 | Icon getIcon() 419 | { 420 | return icon.getIcon(); 421 | } 422 | 423 | @Nullable 424 | Set getOverrides() 425 | { 426 | return overrides; 427 | } 428 | 429 | boolean MatchesFile(@NotNull File file) 430 | { 431 | if(name != null && name.equalsIgnoreCase(file.getName())) 432 | return true; 433 | if(types.contains(file.getType())) 434 | return true; 435 | if(extensions.contains(file.getExtension())) 436 | return true; 437 | 438 | return false; 439 | } 440 | boolean IsBetterMatch(@NotNull Override other, @NotNull File file) 441 | { 442 | if(name != null && name.equalsIgnoreCase(file.getName())) 443 | return true; 444 | if(other.name != null && other.name.equalsIgnoreCase(file.getName())) 445 | return false; 446 | 447 | if(extensions.contains(file.getExtension())) 448 | return true; 449 | if(other.extensions.contains(file.getExtension())) 450 | return false; 451 | 452 | if(types.contains(file.getType())) 453 | return true; 454 | if(other.types.contains(file.getType())) 455 | return false; 456 | 457 | return true; // Only extensions are left now, so both are an equally good match 458 | } 459 | } 460 | } 461 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowThemeManager.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.openapi.application.ApplicationManager; 4 | import com.intellij.openapi.diagnostic.Logger; 5 | import com.intellij.openapi.fileTypes.FileType; 6 | import com.intellij.openapi.vfs.VirtualFile; 7 | import org.jetbrains.annotations.NotNull; 8 | import org.jetbrains.annotations.Nullable; 9 | 10 | import javax.imageio.ImageIO; 11 | import javax.swing.*; 12 | import java.awt.*; 13 | import java.io.File; 14 | import java.io.IOException; 15 | import java.net.URL; 16 | import java.util.ArrayList; 17 | import java.util.ListIterator; 18 | 19 | public class AfterglowThemeManager 20 | { 21 | private static final Logger LOG = Logger.getInstance(AfterglowThemeManager.class); 22 | 23 | public static Icon DIRECTORY = null; 24 | public static Icon ANY = null; 25 | public static Icon BINARY = null; 26 | public static Icon TEXT = null; 27 | 28 | private static ArrayList themes = new ArrayList<>(); 29 | 30 | public static void initialize() 31 | { 32 | try 33 | { 34 | URL fileURL = AfterglowTheme.class.getResource("/theme/theme.json"); 35 | AfterglowTheme theme = AfterglowTheme.CreateThemeWithURL(fileURL); 36 | 37 | themes.add(theme); 38 | } 39 | catch(Exception e) 40 | { 41 | LOG.error("Couldn't load theme.json", e); 42 | } 43 | } 44 | 45 | public static void addTheme(AfterglowTheme theme) 46 | { 47 | themes.add(theme); 48 | 49 | AfterglowIconCache cache = ApplicationManager.getApplication().getComponent(AfterglowIconCache.class); 50 | cache.clearCache(); 51 | } 52 | 53 | public static void applyTint(Color color) 54 | { 55 | for(AfterglowTheme theme : themes) 56 | theme.applyTint(color); 57 | 58 | // Update icons that may have changed 59 | DIRECTORY = getIconForName("FOLDER"); 60 | ANY = getIconForName("ANY"); 61 | BINARY = getIconForName("BINARY"); 62 | TEXT = getIconForName("TEXT"); 63 | } 64 | 65 | @Nullable 66 | public static ArrayList getIconPackOverrides() 67 | { 68 | ArrayList result = new ArrayList<>(); 69 | 70 | ListIterator iterator = themes.listIterator(themes.size()); 71 | 72 | while(iterator.hasPrevious()) 73 | { 74 | AfterglowTheme theme = iterator.previous(); 75 | 76 | ArrayList overrides = theme.getIconPackOverrides(); 77 | if(overrides != null) 78 | result.addAll(overrides); 79 | } 80 | 81 | return (result.size() > 0) ? result : null; 82 | } 83 | 84 | @NotNull 85 | public static ArrayList getTints() 86 | { 87 | ArrayList result = new ArrayList<>(); 88 | 89 | ListIterator iterator = themes.listIterator(themes.size()); 90 | 91 | while(iterator.hasPrevious()) 92 | { 93 | AfterglowTheme theme = iterator.previous(); 94 | 95 | ArrayList tints = theme.getTints(); 96 | if(tints != null) 97 | result.addAll(tints); 98 | } 99 | 100 | return result; 101 | } 102 | 103 | @NotNull 104 | public static AfterglowTheme.Tint getTint(@NotNull String identifier) 105 | { 106 | ListIterator iterator = themes.listIterator(themes.size()); 107 | 108 | while(iterator.hasPrevious()) 109 | { 110 | AfterglowTheme theme = iterator.previous(); 111 | 112 | ArrayList tints = theme.getTints(); 113 | for(AfterglowTheme.Tint tint : tints) 114 | { 115 | if(tint.getIdentifier().equals(identifier)) 116 | return tint; 117 | } 118 | } 119 | 120 | // Fallback to the default themes default tint 121 | return themes.get(0).getTints().get(0); 122 | } 123 | 124 | @Nullable 125 | public static Icon getIconForName(@NotNull String name) 126 | { 127 | ListIterator iterator = themes.listIterator(themes.size()); 128 | 129 | while(iterator.hasPrevious()) 130 | { 131 | AfterglowTheme theme = iterator.previous(); 132 | 133 | Icon icon = theme.getIconForName(name); 134 | if(icon != null) 135 | return icon; 136 | } 137 | 138 | return null; 139 | } 140 | 141 | @Nullable 142 | public static Icon getIcon(VirtualFile virtualFile) 143 | { 144 | if(virtualFile.isDirectory()) 145 | return DIRECTORY; 146 | 147 | ListIterator iterator = themes.listIterator(themes.size()); 148 | 149 | while(iterator.hasPrevious()) 150 | { 151 | AfterglowTheme theme = iterator.previous(); 152 | 153 | Icon icon = theme.getIcon(virtualFile); 154 | if(icon != null) 155 | return icon; 156 | } 157 | 158 | FileType type = virtualFile.getFileType(); 159 | 160 | switch(type.getName().toLowerCase()) 161 | { 162 | case "plain_text": 163 | return TEXT; 164 | 165 | case "unknown": 166 | default: 167 | return type.isBinary() ? BINARY : ANY; 168 | } 169 | } 170 | 171 | public enum ColorType 172 | { 173 | SidebarSelection, 174 | SidebarBackground, 175 | SidebarText 176 | } 177 | 178 | @Nullable 179 | public static Color getColor(ColorType type) 180 | { 181 | String name = null; 182 | switch(type) 183 | { 184 | case SidebarSelection: 185 | name = "sidebar.selection"; 186 | break; 187 | case SidebarBackground: 188 | name = "sidebar.background"; 189 | break; 190 | case SidebarText: 191 | name = "sidebar.text"; 192 | break; 193 | } 194 | 195 | ListIterator iterator = themes.listIterator(themes.size()); 196 | 197 | while(iterator.hasPrevious()) 198 | { 199 | AfterglowTheme theme = iterator.previous(); 200 | 201 | Color color = theme.getColor(name); 202 | if(color != null) 203 | return color; 204 | } 205 | 206 | return null; 207 | } 208 | } 209 | -------------------------------------------------------------------------------- /src/com/widerwille/afterglow/AfterglowTintedIcon.java: -------------------------------------------------------------------------------- 1 | package com.widerwille.afterglow; 2 | 3 | import com.intellij.util.ui.UIUtil; 4 | 5 | import javax.swing.*; 6 | import java.awt.*; 7 | import java.awt.image.BufferedImage; 8 | 9 | public class AfterglowTintedIcon implements Icon 10 | { 11 | private BufferedImage image; 12 | private int width; 13 | private int height; 14 | 15 | public AfterglowTintedIcon(Icon original, Color tint) 16 | { 17 | width = original.getIconWidth(); 18 | height = original.getIconHeight(); 19 | 20 | BufferedImage imageIcon = UIUtil.createImage(width, height, BufferedImage.TYPE_INT_ARGB); 21 | { 22 | Graphics graphics = imageIcon.createGraphics(); 23 | original.paintIcon(null, graphics, 0, 0); 24 | graphics.dispose(); 25 | } 26 | 27 | image = UIUtil.createImage(width, height, BufferedImage.TYPE_INT_ARGB); 28 | 29 | { 30 | for(int y = 0; y < image.getHeight(); y ++) 31 | { 32 | for(int x = 0; x < image.getWidth(); x ++) 33 | { 34 | int alpha = imageIcon.getRGB(x, y) >> 24 & 0xff; 35 | 36 | Color sourceColor = new Color(imageIcon.getRGB(x, y)); 37 | Color imageColor = multiplyColor(new Color(sourceColor.getRed(), sourceColor.getGreen(), sourceColor.getBlue(), alpha), tint); 38 | 39 | image.setRGB(x, y, imageColor.getRGB()); 40 | } 41 | } 42 | } 43 | } 44 | 45 | public BufferedImage getImage() 46 | { 47 | return image; 48 | } 49 | 50 | public boolean isRetina() 51 | { 52 | return UIUtil.isRetina(); 53 | } 54 | 55 | 56 | private Color multiplyColor(Color color1, Color color2) 57 | { 58 | float[] color1Components = color1.getRGBComponents(null); 59 | float[] color2Components = color2.getRGBColorComponents(null); 60 | float[] newComponents = new float[3]; 61 | 62 | for(int i = 0; i < 3; i ++) 63 | newComponents[i] = color1Components[i] * color2Components[i]; 64 | 65 | return new Color(newComponents[0], newComponents[1], newComponents[2], color1Components[3]); 66 | } 67 | 68 | @Override 69 | public void paintIcon(Component c, Graphics g, int x, int y) 70 | { 71 | g.drawImage(image, x, y, getIconWidth(), getIconHeight(), c); 72 | } 73 | 74 | 75 | @Override 76 | public int getIconWidth() 77 | { 78 | return width; 79 | } 80 | 81 | @Override 82 | public int getIconHeight() 83 | { 84 | return height; 85 | } 86 | } 87 | --------------------------------------------------------------------------------