├── .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 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/.idea/compiler.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
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 | 
18 |
19 | # Acknowledgments
20 |
21 | 
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 | 1.0.7
19 | Added icon for Vue (supporting vue-for-idea and vue.js plugins)
20 | Fixed files losing their extension (for example the CMake icon in CLion would become the text icon after some time)
21 | Fixed icons like PyCharm's Python icon not showing their Afterglow goodness
22 |
23 | 1.0.6
24 | Added icon for Swift
25 | Added icon for Rust (intellij-rust Plugin)
26 | Fixed slow context (right-click) menus under Windows. If you are still experiencing slow downs, please file an issue
27 | Fixed missing folder icon in the Windows File -> New menu
28 |
29 | 1.0.5
30 | Fixed broken file icons in the File -> New menu (big thanks to gicmo for the pull request)
31 | The Afterglow settings are now stored in the IntelliJ app config folder (big thanks to gicmo for the pull request)
32 |
33 | 1.0.4
34 | Added support for Gulp and Bower (big thanks to grundic for the pull request)
35 | Added support for Scala (big thanks to drhumlen for the pull request)
36 | Fixed AppCode 3.4 EAP support
37 |
38 | 1.0.3
39 | Fixed some directories not being coloured properply, this especially affected AppCode. Sorry, got too excited with the previous release and released it too early
40 | Fixed the change log HTML
41 |
42 | 1.0.2
43 | Added support for the original Afterglow color schemes (default, blue, green, orange and magenta). This can be changed in the settings
44 | Replaced the default collapse and expand icons with the + and - icons from Afterglow
45 |
46 | 1.0.1
47 | Added support for the Markdown and MarkdownSupport plugin
48 | Added support for the 'npm file' file type
49 | Fixed the description to be well formed HTML
50 |
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 |
--------------------------------------------------------------------------------