From d876bc766301bfadf6887940e8d84628f432fc8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20L=C3=A4ubrich?= Date: Sat, 11 Jan 2025 08:26:34 +0100 Subject: [PATCH] Add an example for providing an icon pack There are some ongoing demands for providing custom icons to the Eclipse IDE or RCP applications. This now adds an example of how such an "icon-pack" can be created and used inside Eclipse IDE. --- .../org.eclipse.ui.examples.iconpack/.project | 22 +++++ .../org.eclipse.core.resources.prefs | 2 + .../.settings/org.eclipse.pde.core.prefs | 4 + .../META-INF/MANIFEST.MF | 9 ++ .../README.MD | 78 ++++++++++++++++++ .../about.html | 36 ++++++++ .../build.properties | 6 ++ .../forceQualifierUpdate.txt | 1 + .../myicons/saveme.png | Bin 0 -> 4317 bytes .../myicons/saveme@2x.png | Bin 0 -> 4521 bytes .../replaced_icon.png | Bin 0 -> 20615 bytes .../transform.txt | 4 + 12 files changed, 162 insertions(+) create mode 100644 examples/org.eclipse.ui.examples.iconpack/.project create mode 100644 examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.core.resources.prefs create mode 100644 examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.pde.core.prefs create mode 100644 examples/org.eclipse.ui.examples.iconpack/META-INF/MANIFEST.MF create mode 100644 examples/org.eclipse.ui.examples.iconpack/README.MD create mode 100644 examples/org.eclipse.ui.examples.iconpack/about.html create mode 100644 examples/org.eclipse.ui.examples.iconpack/build.properties create mode 100644 examples/org.eclipse.ui.examples.iconpack/forceQualifierUpdate.txt create mode 100644 examples/org.eclipse.ui.examples.iconpack/myicons/saveme.png create mode 100644 examples/org.eclipse.ui.examples.iconpack/myicons/saveme@2x.png create mode 100644 examples/org.eclipse.ui.examples.iconpack/replaced_icon.png create mode 100644 examples/org.eclipse.ui.examples.iconpack/transform.txt diff --git a/examples/org.eclipse.ui.examples.iconpack/.project b/examples/org.eclipse.ui.examples.iconpack/.project new file mode 100644 index 00000000000..f50ac3dc96d --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/.project @@ -0,0 +1,22 @@ + + + org.eclipse.ui.examples.iconpack + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.core.resources.prefs b/examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000000..99f26c0203a --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.pde.core.prefs b/examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 00000000000..e8ff8be0bab --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +pluginProject.equinox=false +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/examples/org.eclipse.ui.examples.iconpack/META-INF/MANIFEST.MF b/examples/org.eclipse.ui.examples.iconpack/META-INF/MANIFEST.MF new file mode 100644 index 00000000000..303312da8d3 --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/META-INF/MANIFEST.MF @@ -0,0 +1,9 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Iconpack +Bundle-SymbolicName: org.eclipse.ui.examples.iconpack +Bundle-Version: 1.0.0.qualifier +Bundle-Vendor: Eclipse.org +Automatic-Module-Name: org.eclipse.ui.examples.iconpack +Equinox-Transformer: /transform.txt +Require-Capability: osgi.extender;filter:="(osgi.extender=equinox.transforms.hook)" diff --git a/examples/org.eclipse.ui.examples.iconpack/README.MD b/examples/org.eclipse.ui.examples.iconpack/README.MD new file mode 100644 index 00000000000..81f601c4c09 --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/README.MD @@ -0,0 +1,78 @@ +# Example for providing an icon pack to Eclipse IDE / RCP + +This example demonstrate how to create an icon pack for the Eclipse IDE or a custom RCP application. + +An icon pack on a technical level is a simple bundle that can be installed like any other piece of software and +ships one or more alternative representations of an existing icon resource to one or more bundles already installed +in the system. This allows an icon pack to customize the look and feel of Eclipse RCP Applications even further +beyond what is already possible with css. + +For a bundle to be recognized by the system one needs the following things demonstrated in this example: + +1. The bundle should list the following header in its manifest to make sure the equinox transform hook is made available when installing it: +`Require-Capability: osgi.extender;filter:="(osgi.extender=equinox.transforms.hook)"` +2. It needs to maintain transformer rules file, in our example this is done by the file `transform.txt` but any +name / extension is valid here, the format of the file is described below. +3. It must list the location in the manifest with the `Equinox-Transformer: /transform.txt` bundle header to be recognized by the framework +4. Make sure that the icons and the transform rules files are included in the `bin.include` in the `build.properties`! + +## writing transformer rules file + +a transformer rules file is a simple text file that (similar to rewrite rules in a webserver) tells the framework what resources in a bundle should be replaced +with another. + +The general format is `,,,`, where the last part can be omitted here as it defaults +to `replace` what is the one we need for icon packs. + +### replace one icon by another + +Now assume we want to replace the save icon because a floppy-disk is really nothing people today know and might wonder what this strange quadratic thing should actually +mean to them and today a downwards arrow is more common (even though for demonstration purpose our icon looks quite ugly so it is easily spotted as being replaced). + +1. We first need to know the bundle that provides this what in this case is the `org.eclipse.ui` so our pattern for matching this bundle would be `org\.eclipse\.ui`, +what would only match this single bundle. If an icon has to be replaced in multiple bundles we can either use a less narrow pattern or use two different rules. +2. Then one needs to find the icon to replace in this case it is `icons/full/etool16/save_edit.png`, as before we could use an exact match or we can use a more +generic form to possibly match multiple path. In the example we use `icons/.*/save_edit.png`, please note that you even can replace a gif file by a png or whatever +fileformat fits your needs. The code will still see the old name so this might still be used with care if the caller maybe make decisions based on the extension! +3. Of course we need our replacement resource that will be used and we put it in as the last instruction as we are using the default replace tranformer that just keeps +the provided resource as a replacement for the original. + +The full line then looks like this: + +``` +org\.eclipse\.ui,icons/.*/save_edit.png,/myicons/saveme.png +``` + +### replace multiple icons + +A transformer rules file can contain as many lines as you want and you can replace also icons from as many bundles as you like in the same icon pack. + +## Running the example + +If you want to run the example, make sure that you add the following to your run configuration (or extend an existing configuration): + +``` +-Dosgi.framework.extensions=org.eclipse.equinox.transforms.hook +``` + +this enables the equinox transforms hook extension also make sure that at least version `1.4.200` is used as it includes the required enhancements +used in this example. + +Also make sure the example is included in the launch e.g. add it to an existing feature of your product / launch configuration. + +If everything worked well, you should see your new save icon in the toolbar like this: + +![example showing replaced icon](replaced_icon.png) + +## Future enhancements + +This example is currently only a very bare example, everyone is encouraged to help enhancing it and sharing ideas how this can be made more comfortable, +also there is currently no tooling around this so any help is appreciated. + +Here is an (incomplete) list of things that might be useful in future versions: + +1. supporting capture groups in a transform instruction to match a large amount of icon with one line and also support `@2x` variants more easily (currently it requires a duplicate line) +2. having a way to exactly match a bundle without the need to escape special chars like `.` and supporting simple ant style glob pattern +3. some tooling that allows to select a bundle and generate a list of icon replacements automatically +4. support systemproperty or variable placeholders to support for example a theming system +5. ... \ No newline at end of file diff --git a/examples/org.eclipse.ui.examples.iconpack/about.html b/examples/org.eclipse.ui.examples.iconpack/about.html new file mode 100644 index 00000000000..164f781a8fd --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/about.html @@ -0,0 +1,36 @@ + + + + +About + + +

About This Content

+ +

November 30, 2017

+

License

+ +

+ The Eclipse Foundation makes available all content in this plug-in + ("Content"). Unless otherwise indicated below, the Content + is provided to you under the terms and conditions of the Eclipse + Public License Version 2.0 ("EPL"). A copy of the EPL is + available at http://www.eclipse.org/legal/epl-2.0. + For purposes of the EPL, "Program" will mean the Content. +

+ +

+ If you did not receive this Content directly from the Eclipse + Foundation, the Content is being redistributed by another party + ("Redistributor") and different terms and conditions may + apply to your use of any object code in the Content. Check the + Redistributor's license that was provided with the Content. If no such + license exists, contact the Redistributor. Unless otherwise indicated + below, the terms and conditions of the EPL still apply to any source + code in the Content and such source code may be obtained at http://www.eclipse.org. +

+ + + \ No newline at end of file diff --git a/examples/org.eclipse.ui.examples.iconpack/build.properties b/examples/org.eclipse.ui.examples.iconpack/build.properties new file mode 100644 index 00000000000..10a6e4470b9 --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/build.properties @@ -0,0 +1,6 @@ +bin.includes = META-INF/,\ + myicons/,\ + about.html,\ + transform.txt + +src.includes = about.html \ No newline at end of file diff --git a/examples/org.eclipse.ui.examples.iconpack/forceQualifierUpdate.txt b/examples/org.eclipse.ui.examples.iconpack/forceQualifierUpdate.txt new file mode 100644 index 00000000000..8ad7a91157b --- /dev/null +++ b/examples/org.eclipse.ui.examples.iconpack/forceQualifierUpdate.txt @@ -0,0 +1 @@ +# To force a version qualifier update add the bug here \ No newline at end of file diff --git a/examples/org.eclipse.ui.examples.iconpack/myicons/saveme.png b/examples/org.eclipse.ui.examples.iconpack/myicons/saveme.png new file mode 100644 index 0000000000000000000000000000000000000000..0f957d8a2e151c4d8848d969f12be516ce7d12a8 GIT binary patch literal 4317 zcmeHKeQ*@z8NZWok&B)bNel{PIZb24z5UGXWz8i`atC+fk!un|G>LX^_ub3F-R{z53q}m!P!8(<9*)W^LwA?_df4C`#$bny7*?}?M9tWceC5&D2LCP+I6D=-m@+aaq!XCTv@G_ zb1_5-%c2wjh}xt81jHp#r;C3Q^wyXT;Wu4Z60#n+yA`2cPc(J)bOhuD1qH)@2&L>08sRWW=91yuR!gr)Is8eg8{Wt_|M0)P1yW z%aXQJ`+AOS-1V&dXz|=7Bi{tYUw6dg^_yhPS<)=eo^jDqr%hG48CYKi2p83qSwh`2|u# z!|d8L)Af6+=GAsYqe^;8U)Ic6pZi1S{k>T3D;q8xI=iwX_WoxFuIhIFRBS(%K8-%G zeAlc7Vsl;kw7vh{nPuPRtQNNtIc|6S_z8Qo;*_&#YwXhd&}nfoDXFe=FDdXTmQVNc3JJJv$aZf|Fa9I&h{MBkDgp>s$#dLdp5?OuyrqI z2h!#|^Wc%1j{V_{`~P+L(ad)T7rs-wJFhh*qbFsCdG=9n$(#or(g}A@TldA+))$?- zoE^^n{GOJlczt?(+q|O7S>JBovt>tzvbnXP>*`y-FIv=c(DK1=|Nix*o*+}E8={mK zUcI)(fM0YsAK2sk)#|=r|CvAT$$jkLfC>Lrczf45*Q$q03UBG%@gW0RcGh&s?{(Jv zbMEe2e$p;(>D8M|Ej>4Yy^r<2{%RyN^z|!WT$;B1c=$EzxmjUYb#Vz+SGDH>mY0JT zPLO@T5)Ue{>~y+<92g`mxb?|88agZh`PdVuJ(A5QaKC|+Cp1!)ESo= zNpqnQDF_Q9TkcpiOaWVVbG@o6EQZBmF-wfH$YDQ5*iai0TO5&JU6JpbP66uT&1iFv%PC$?3o&ZCX$HO{gKB|T1cG%6@_^crF zlE5ZjaUKYO5h#=K#M299gTkLh)&7=h%vv>oXDnbXl`2i^u zjgNIyN`v&1diX7FeO)11!zdNlFfjWSV{Cn zE%gTdvem}FLemDfqqx%c&iRk+CcS>+Dm?oD+y ztu-??{SNalyh*9LXj`y%WzN2wOUIux-tpCsZ~Vj4(m=fK%{*g?MJS(--Lb7LRjdWm UGf<@(#-wvQmpWc9`C03K0d_zR2mk;8 literal 0 HcmV?d00001 diff --git a/examples/org.eclipse.ui.examples.iconpack/myicons/saveme@2x.png b/examples/org.eclipse.ui.examples.iconpack/myicons/saveme@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..93a325b47a882b0d2a0cbed00c62cc1b7d54c4b7 GIT binary patch literal 4521 zcmeHKdr(tX8o!j6g@UNTg$~wh6d%QEyxCSC1#zMuL`+zIt!Oew)xN5<* z#f4U@MJa;{j7qycnZ@c>KpwX0YONhbI%QWV6#s|D_#c?J zqb}p~gLAedeSW<-gQ=Y&zF6qa+u5BsBQF2Qx!k{3zti<<<@sxk$EihW#ZQBqQQuX~ zX`73?((lj6Y1q2bZ}!|jAa9gyFInE&jW&N-9sIMmGhlCfLwAwMa_QORY4?iD7fFf~ zjjxDK%0s|!M~m-vN`5~7*%v!DZ$P26wpDAqZmh333PEmL>F8*^HadDJ8<0c!#*bC8 zEqdP8_{5V{f!=?N&Ay=D+gru&N;<6ni%(^8Mr+fpgPX4&m_=u2^HP2N|GOx8MrwIZ zjy2GuX=Z@EN&B5)k;2;}0um zs!BBmYPWcvR_nOYrpihDwE*W{c|CecwRYCUhZr?$LL=wB zrRXU*w>@=r>ZYGkt%lA|XG!;#&GVm9wADWuEe+It==f`R)q1qsH+avgD=FnCnGa9i zznB(uxo6>})M|Nw$MhPH*ZI8b`lZ3E)O4G+W=GYN(;r0jz6fO&+7AvKlk4_>ry%nyQz|Uq>`l2FQayQb8C6o}=I@_h^BQ@4 zL*1EEHgo^8+S||F_uXJlhxJZnK-oEHP+kVz3KX}PgcxBll0t{c3hEAmBBC5t49_H4 z*hr?+W)=UznX`PDCRF^@avh?xMw1zItdk)VopDLHGZR-5{HREu2nPxXOeBlJ4pWxd zhB{Py7cUB)IkSilyC7_)if_>A;b;p(!ZM*uhzK+eI#!wCf;Ck42S08}JS36x4BE+8mbc(_7| zi!n^$q9SlK#=@8|u$;6BOD9EEbGmDQ6C7Ql*Q)puAu?joXJIS_98~-jv^mEyGLS@@ z$V3+7)D$bEVRD5sOeR;#6 zAu-m%Bv~w3Dn1ty%y|wE>%ev*Fcwo|ED1;vi5x}5s92nYgri~^ipUp&S7a34LeNy+ zZ=t!(14j%jc`R)M^XIut13M~_%pQ0fc+H|+TM33;n*zn~ffQ_5E=joJ1Y83{cm`%p zCqefZEY~4B{VSzF;W&m-5=0;llNtpw8Dk&k7!St!n_NC4 z$0^bb{sq~=VJYZNXAC%Kc^Ut-ObzvO--`O`UBL3XHFk{+f_$fOmm5@89t4cutX8M- z?s4<=_V?^F;|4Z9e3A_0Q0^pZtvpxgHs?*lSDRSAR1`3_knG`%N%PwC->j^&xo0`~)2FQ2uo(oZHOZ>x!}t$KI&tOPcU3OEUW4_}#E zfA(f|Fj0R0>$v9RIVl-Ot|cCdioxH%&|ln@JE#4P6SrzR-pan+bC~88ooIU!e}9(2 U_QB0#X+UvEtBF$|Te_~`eC*A?XLX(UguVw z_f)<2+u0PbW~S$vnVz1WmIcA`pT*z4!FdA$f!<0=h$w(SFx|lO7kFskXM9Xh2=J@d zT}jPRLEnYQ*51b0%o0rG=w=Hh0=t?SgFvoJR`Sbldl=v!Z_x0+CgAf#Tolf}Q&aX6xfF+&M={QAU{)1IsI?!Mzs1A(CY z&4h*JC546mu^wO*sa{dM5+F`euBmFF{= zOKfImho*&y{7j>Qua)ZLWQz{lMTp|kB{?N3)k;rU8+6va<(29(vC;Mb%KBoQJcka$ z(q^9j-i|Rw8y%+NG>ecoQB=)1o{?Nq(sh1;*GX|z)GgixlEIp}Lj!j!vWdk!N_7Tz zc4<7f-YSP@Agcb6kDP#g->)}POI6EzOUqVmJ&Bk(Etwn{HPjzjg)0$VHrzFYBio#7 z8xcD}d0aEK&OW^E_mD2u=sxv`RspLYEJhV90twozyb!jsh}nW<)sO6p#z6j~+mH5? zzo@=O8A73({=nzIC45XTi_1v0jq$U~eCVs^7yH^tH(9!TeN$z{E(dyHw#{pJii2ag zkaTY=6OHigvRdD4E~E75+(u@2G#bo5lJM3L;(OPcF~tu4nx&a(GnS@#h*$7VAlW#s z6$%;oYZWxO!lSjN!NL0Fx_0LVCVk$%k?rWcJs^0lW`KaH$;xmU+E~%)8`&6u>0GUB z0m%b_c=%my^$jh+jzk7v6EkaGl9QGW5+XArUJ_MSSq52KVX�gu6Xh(fzZMp}U14 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