From aed739761eda5bd5712cd55f0ed20161ecd977ab Mon Sep 17 00:00:00 2001 From: Anton Keks Date: Thu, 8 Dec 2016 23:21:51 +0200 Subject: [PATCH] provide @2x start/stop/kill icons --- build.xml | 2 +- resources/images/buttons/kill.png | Bin 802 -> 724 bytes resources/images/buttons/kill.svg | 66 +++++++----------- resources/images/buttons/kill@2x.png | Bin 0 -> 1417 bytes resources/images/buttons/start.png | Bin 622 -> 494 bytes resources/images/buttons/start.svg | 59 +++++++--------- resources/images/buttons/start@2x.png | Bin 0 -> 871 bytes resources/images/buttons/stop.png | Bin 339 -> 338 bytes resources/images/buttons/stop.svg | 57 +++++++-------- resources/images/buttons/stop@2x.png | Bin 0 -> 423 bytes src/net/azib/ipscan/config/Labels.java | 4 +- src/net/azib/ipscan/gui/MainWindow.java | 18 ++--- .../gui/actions/StartStopScanningAction.java | 14 ++-- .../azib/ipscan/gui/util/LayoutHelper.java | 13 +++- test/net/azib/ipscan/config/LabelsTest.java | 24 +++---- 15 files changed, 111 insertions(+), 146 deletions(-) create mode 100644 resources/images/buttons/kill@2x.png create mode 100644 resources/images/buttons/start@2x.png create mode 100644 resources/images/buttons/stop@2x.png diff --git a/build.xml b/build.xml index 9810f9ac..c58f5c8c 100755 --- a/build.xml +++ b/build.xml @@ -287,7 +287,7 @@ <methods>; <fields>; } - -keep class org.eclipse.swt.internal.image.*FileFormat + -keep class org.eclipse.swt.internal.buttonImage.*FileFormat -keep class * { % *Proc(int); % *Proc(int, int); diff --git a/resources/images/buttons/kill.png b/resources/images/buttons/kill.png index d8781869fd2e279c131858047f8c073dbb462e7a..9d2f103d2dce2598a569f7c4772bde94d6549194 100644 GIT binary patch delta 674 zcmV;T0$u&02Gj*1iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyl3fBMt z4c7reD4TeZMks$#NklVjncKLs9FgW2+l%-f8&{GX~D$C*U zlk@fU1Mz6ooZs5&J#Ly`7V`OJ0AwT(7;7P9psQ5!tr61GY8Z=&Lg5<#5C9kq2D^{x z`tyfvZH8^z$QFxuytbBEC*-!y`Mowp>AxVQ&$exBIu2$uEjO7?AFe34$=K?;VRRHZ zkF@H#sz`r{c1pFcj9osds;4g2)%iH**pU)%Dc!UQ8BT0(FI5OW0Pb8aH*HaR`lsVG zpU^aw2!Ret4~7Y$LI@N%$16fI42Vyq)30ki007M8axWVxJ>y6jiK;3ULO=)sTL?^- zN}G(3JCmu@%zh~V09-&y*WH^T00<#!`_&3aJQ{x;KWCc#eU@c%&QVt23V|jev=yMI z)imc5j4khpF&>Fbc3Rez0l(iTgaC6KjBadX^HTDogivsfaH*vK0D4;t<5QwgSgD*4 z3x#fkbiMCdDC7fxqLdg-r7~I99a^yMnU9<^065^fxU{olc?fy-n}SZp7W10cr6`L3 zh^lIOAFZxtvaUP)G?|?J%-D;NrnPSq(rigd->d4zuE#S}K7*8*9sphuiOdqot ziDdFkwLc@l;JA>o-*MgRQ|a`(Jua6?ZZ$SG{So~8qy2mR0xtgnSb%eLA^-pY07*qo IM6N<$g1$8|_W%F@ delta 753 zcmVHaiBL{Q4GJ0x0000DNk~Le0000E0000D2nGNE0GZrhe~}>@3h@8{ z4et*MIx89Abc}=uUDTWs0h-BA`DSUAtGJTG92kPRNO34=caDW&Aa7xy)@~2{NQ`} z{RmMMVWnxsne6Nj#dUQWV_RDb%W>=Yhn1!!3Q>HkP^o`TZVV6S0I;$g7oj|(qYAZB z`PI?iU+Z@|^SAf+dykUIH;losZ>4EzHt@c`y}gCs*}1qD2%OhdRkf@yFTbYDYW3`c z!9i1j$Ab%r1l)eVEEtXU>;{AH{PXkUcPy3$+4?#qTUjA~hQl~WCTXo+ZzNOc^u&tK zC!}c_Btd_mD>oOS+pU}(8FAn3>}-&)tx<)@!RV~ES17+ULH&~+hL(zZ)Q2}2O)|g0H9B&8@$@s_@s$p zh2C}8K!~dI3ECzne~5;QmLm4F4t~as|B*MG8!8siTtuM zXc^{qCOQqRG_BC&ZdHjEz-gJmnc3%{i-7I`0h( zROdRKNycCZQkPY#PeTreQMI^8o&aEVhhvgNL@tM>q9Pl>BSI8KIBII1wKg@`X6ELI`rh8Hg2F;G z%W<0kaEqob6(uFl58`o!p{tA3l$L%3aP2wt4u{F~&}6kiUij3xFP$;}U-Xqum-L2V*x400000NkvXXu0mjfeJfj5 diff --git a/resources/images/buttons/kill.svg b/resources/images/buttons/kill.svg index 1ede1df7..266906c1 100644 --- a/resources/images/buttons/kill.svg +++ b/resources/images/buttons/kill.svg @@ -1,24 +1,24 @@ + + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16px" + height="16px" + id="svg1872" + sodipodi:version="0.32" + inkscape:version="0.91 r13725" + sodipodi:docname="kill.svg" + inkscape:export-filename="/home/anton/dev/ipscan/resources/images/buttons/kill@2x.png" + inkscape:export-xdpi="180" + inkscape:export-ydpi="180" + version="1.1"> + inkscape:window-y="48" + inkscape:window-maximized="0" /> @@ -218,26 +219,9 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - - - diff --git a/resources/images/buttons/kill@2x.png b/resources/images/buttons/kill@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6488a117b10c08ced097930bf6541f979a93c8f8 GIT binary patch literal 1417 zcmV;41$O$0P)^wZWB|uMY&y6Z17&(|+s<25bK}K-L_<$(?J~KmnWB zwtGuKWX%B_-^dIlQpX~_#UPde!~jhKfzJS(-0%0JyS^UXkqBwP2C?nlSU4Oi1npaZ zKE4CM9%k&dETu#uB67RSFzQPJWX%aUb-*z2PVEBt*2+qJ7!E51Y*5U%@*x)U&Ju89 zr&4%T1OO0ZM*G~HB9V{~^*TZ1b|4V=n1EAn27~B|L~@pzyk5L-7>YzT67$VtK3@P> zXgdXi=LtB`qG@=ID7U0-qt!GOL_$pTZBYOc@d7}lt~+%LTfJVq=l7E)veD&o-RcSk zYyH9CIT4BN(sjIEAP)e@>4A~A4R`x|H!Rz3xj!@0poq{=SqWwaGebnc%vh&ssL^%$ z(=@9E_(*`}SIWxphRgLlW@-E=5qdoy7NU_1u|xi*^72{+XJxqjhyXFwN$^ zWU|o`!4|J~S@9~Ru-olc5lvh6)Xa<#0M~V$g=mzSJ9@^(hMZoF<4JgLeB6%K)m=e4 zz2jjj)ntiaOGSmFk<<5KW_+(y*1WwZkr;6DDF~1UvHg*0Hf5Nx+2bh*Fl5{K4qyRB zNu=#!A~9IVqbR@LP&7L%|?AgF(k>?@Om~ZgP_UWwwVi8I1wd zDzyx<(zdbIwrNPysx?hJ(pX-8DIX&DGMbt?4dBS(a2UtJVaJyBrPKIge4GUs1alLB zt3N$^hTE3q7$3@H(3(z@h-}tfuCMdga{v@k07Qs*y^h5mm?q995-cJEtZ8jMiNruv zJpL|#tG`$l?qo{tyk+}12f$|jKmm78_xH=slao1teW?^akH=YnLDu#5p2v?z0pJtB zLOdQ5;QX()jXQZ~#S=}#ZI6cqc&K#!a6UlJ4BSg5&23(9k0Lts+ta7(Yus)MxZSun zJBv?8MwmqgS<~9G=Fjs0i6)a@$*NTi36bp<5kkxu25`&mW*c~bkG)F*aTv$H_huJip669w zQPA2_bCF_35e-2R2!VfqTSHrGTU%T0y%5#V(30ZNREu*hExm|}r>6eSe!u%Q90n1R zC-fbj7aqQ!=XrqtR&c?*3PeUGJI%$v03xuY^h@{J?AT0C06`ILBM~%2KhNm%=JKz9 z`A~ecD5&HRX|x$G^X>NV9Y!OAb0|}KLI?70QWgtS|ps5 zJp(u( z)#3GVOJ6j%JsI25qh>i23nzOr1AsAS_okwz$g>q$gGR5*>Llg&$1Q5eRbbLO5qR~>Wa z_QBkn>7pzG(IBEg24tMe5e+m3T0}S-iNIP!{R`2eDE$YbMIVc3QEu)~h*Vh8rbR^1 zR#LR?%|7VP$2o6{nIv#xvR-%&hxa-BczHN4BO?4y@n#QpcLM|grB<8msS z-V@HPTxuHPrqBd~8dPm8&d=K!=eV&|003BTEF9du-@Gt(u767aB7%4!aHzEpQ=?~y zGycU0RzvZ8VS(PiTVkrJpsEU0rJZ^Xi^U-T?TyBsxITH; zN?K;Ve>^4+=K=tuQp%UVeAaB4wrAa?iR`IQ!$&+DfRs|c-4skS`My8x`+ip=?{5M8 bPu@>2sTbY-cQO?K0000 + + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16px" + height="16px" + id="svg1872" + sodipodi:version="0.32" + inkscape:version="0.91 r13725" + sodipodi:docname="start.svg" + inkscape:export-filename="/home/anton/dev/ipscan/resources/images/buttons/start.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90" + version="1.1"> + inkscape:window-y="48" + inkscape:window-maximized="0" /> @@ -198,20 +199,10 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - diff --git a/resources/images/buttons/start@2x.png b/resources/images/buttons/start@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..59dba3e90e794fbec9bcda49a54e9cd94196b21a GIT binary patch literal 871 zcmV-t1DO1YP)x2Y@q$=%5SB$O96;K(RN>uR}zEm zvC4Yst9tXHMgc$s0M+Yu%DKTXR+9n1N=AtHM*&{76V7LS!+kAH1(2xF{Zf+nl{moU zPQrZMmUg;Nla18dtTQ!W*RECfLI4s5d$OHk6v{tVu3E~Xo$4ENGuibM;q7$K7pRQZ z3sS3?W6?9+h3^}DKVW<10p-;Sh-L{Gb64^|9hZ%O3|Xxf&TtoM6xHfuYP=f7)OgkX z^}bI$89!9CYH>k*~~Ej(E50s)Vt5%`vJZm5bVDXdvn5G)z>OI zWMN_|yYssp1ZF;&c3v(lZG3tZ;9Q3AI7J4-L?_O;$On+gCR-60}l;Send zq955Q=YysK0MIEghG+*0yz^Mf`IwRF?{5wOKtc#cR7_G4c+K{EZ#EYIAO_m4Rj>Li zoZ%umvlK#W5c(wq@UvLq=bHzhz_$?kRRDhQgz?hC?|(K0Kn(7mu;_gaI z5q+bO+4$r%xpM*Vi$3{V1vPNgs3qx xzO|hDuHJm(CtzeWES~2sZ)O{=^}jAd{{UBCVcK12lPLfI002ovPDHLkV1jv`j&A?} literal 0 HcmV?d00001 diff --git a/resources/images/buttons/stop.png b/resources/images/buttons/stop.png index d65587b269d8360dfa88f743a412a15070a54d51..d88e22f2668c64933f7dc8a99cb62470270f7c95 100644 GIT binary patch delta 285 zcmV+&0pkAC0@4B@iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVUZyl3fBMt z4c7reD4TeZMks&JNkl86a`Wg__9Pr*c-$0aQJ01@WDL*pr57;dOchmb;@5JjKOuAxW((Wm4F93fS%kRGK(bo3km2|Bu5 zg;PW+k&s14Vx--*cZLFtMN%Z`^Q5P*k>+bAd1|%ZLX1PsXadR?lP2FIjFLyt*V&Bw zZWj?jRllby`#fj5UNc@U7Y3j|7*K3BIOp)* + + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="16px" + height="16px" + id="svg1872" + sodipodi:version="0.32" + inkscape:version="0.91 r13725" + sodipodi:docname="stop.svg" + inkscape:export-filename="/mnt/work/svn_sf/ipscan/resources/images/buttons/stop.png" + inkscape:export-xdpi="90.639999" + inkscape:export-ydpi="90.639999" + version="1.1"> + inkscape:window-y="48" + inkscape:window-maximized="0" /> @@ -208,17 +209,9 @@ id="layer1" inkscape:label="Layer 1" inkscape:groupmode="layer"> - - diff --git a/resources/images/buttons/stop@2x.png b/resources/images/buttons/stop@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..81d7cb9a47528bdd485dd34b7f7f92b79aa9cc3a GIT binary patch literal 423 zcmV;Y0a*TtP)xgDO)d)127fT0U@Eb*nUnJn$T2niVTrp@V7ksDf0UqFFyqSn8?*UgQE^~i>-9w z-S^-*EED+f7Px?`9PWYGcj!0dIov$L-By8fcmwuY9{wdEFi7B~Z0tBbiU2OhV@^gR ztkzf&lu|4g3#i2m(PM2n2y3(3psxrc)+qx{g~#^^IiK7-k}k0-~Jm_wedB7fk2@d+|A#9E@g RUs(VE002ovPDHLkV1m)nsX71v literal 0 HcmV?d00001 diff --git a/src/net/azib/ipscan/config/Labels.java b/src/net/azib/ipscan/config/Labels.java index 7a9169ac..7eb9cc76 100644 --- a/src/net/azib/ipscan/config/Labels.java +++ b/src/net/azib/ipscan/config/Labels.java @@ -81,7 +81,7 @@ public final class Labels { instance.labels = instance.labelsFallback; } } - + /** * Retrieves an InputStream to load the image, specified by a key in resource file. * @param key @@ -90,7 +90,7 @@ public final class Labels { String imagePath = get(key); return getClass().getClassLoader().getResourceAsStream(imagePath); } - + /** * Retrieves a String specified by the label key * @param key diff --git a/src/net/azib/ipscan/gui/MainWindow.java b/src/net/azib/ipscan/gui/MainWindow.java index be8384ce..ac970b0a 100644 --- a/src/net/azib/ipscan/gui/MainWindow.java +++ b/src/net/azib/ipscan/gui/MainWindow.java @@ -19,13 +19,16 @@ import net.azib.ipscan.gui.menu.ResultsContextMenu; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; -import org.eclipse.swt.graphics.*; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.*; import org.eclipse.swt.widgets.*; import javax.inject.Inject; import javax.inject.Named; +import static net.azib.ipscan.gui.util.LayoutHelper.buttonImage; import static net.azib.ipscan.gui.util.LayoutHelper.formData; /** @@ -166,28 +169,19 @@ public class MainWindow { prefsButton = createToolbarButton(controlsArea); ToolItem item = new ToolItem(prefsButton, SWT.PUSH); - item.setImage(image("prefs")); + item.setImage(buttonImage("prefs")); item.setToolTipText(Labels.getLabel("title.preferences")); item.addListener(SWT.Selection, preferencesListener); fetchersButton = createToolbarButton(controlsArea); item = new ToolItem(fetchersButton, SWT.PUSH); - item.setImage(image("fetchers")); + item.setImage(buttonImage("fetchers")); item.setToolTipText(Labels.getLabel("title.fetchers.select")); item.addListener(SWT.Selection, chooseFetchersListsner); feederSelectionListener.widgetSelected(null); } - private Image image(final String baseName) { - return new Image(Display.getCurrent(), new ImageDataProvider() { - @Override public ImageData getImageData(int zoom) { - String suffix = zoom >= 200 ? "@2x.png" : ".png"; - return new ImageData(getClass().getResourceAsStream("/images/buttons/" + baseName + suffix)); - } - }); - } - private ToolBar createToolbarButton(Composite controlsArea) { ToolBar bar = new ToolBar(controlsArea, SWT.FLAT); bar.setCursor(bar.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); diff --git a/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java b/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java index b65de20c..d57ae87b 100644 --- a/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java +++ b/src/net/azib/ipscan/gui/actions/StartStopScanningAction.java @@ -31,6 +31,8 @@ import javax.inject.Named; import javax.inject.Singleton; import java.net.InetAddress; +import static net.azib.ipscan.gui.util.LayoutHelper.buttonImage; + /** * Start/Stop button action class. * It listens to presses on the buttons as well as updates gui statuses @@ -64,11 +66,11 @@ public class StartStopScanningAction implements SelectionListener, ScanningProgr this.display = display; // preload button images - buttonImages[ScanningState.IDLE.ordinal()] = new Image(display, Labels.getInstance().getImageAsStream("button.start.img")); - buttonImages[ScanningState.SCANNING.ordinal()] = new Image(display, Labels.getInstance().getImageAsStream("button.stop.img")); + buttonImages[ScanningState.IDLE.ordinal()] = buttonImage("start"); + buttonImages[ScanningState.SCANNING.ordinal()] = buttonImage("stop"); buttonImages[ScanningState.STARTING.ordinal()] = buttonImages[ScanningState.SCANNING.ordinal()]; buttonImages[ScanningState.RESTARTING.ordinal()] = buttonImages[ScanningState.SCANNING.ordinal()]; - buttonImages[ScanningState.STOPPING.ordinal()] = new Image(display, Labels.getInstance().getImageAsStream("button.kill.img")); + buttonImages[ScanningState.STOPPING.ordinal()] = buttonImage("kill"); buttonImages[ScanningState.KILLING.ordinal()] = buttonImages[ScanningState.STOPPING.ordinal()]; // preload button texts @@ -98,7 +100,7 @@ public class StartStopScanningAction implements SelectionListener, ScanningProgr // add listeners to all state changes stateMachine.addTransitionListener(this); - // set the default image + // set the default buttonImage ScanningState state = stateMachine.getState(); button.setImage(buttonImages[state.ordinal()]); button.setText(buttonTexts[state.ordinal()]); @@ -191,7 +193,7 @@ public class StartStopScanningAction implements SelectionListener, ScanningProgr statusBar.setStatusText(Labels.getLabel("state.killingThreads")); break; } - // change button image + // change button buttonImage button.setImage(buttonImages[state.ordinal()]); button.setText(buttonTexts[state.ordinal()]); } @@ -255,7 +257,7 @@ public class StartStopScanningAction implements SelectionListener, ScanningProgr else statusBar.getShell().setText(mainWindowTitle); - // change button image according to the current state + // change button buttonImage according to the current state button.setImage(buttonImages[stateMachine.getState().ordinal()]); } }); diff --git a/src/net/azib/ipscan/gui/util/LayoutHelper.java b/src/net/azib/ipscan/gui/util/LayoutHelper.java index 9515605c..d0d18947 100644 --- a/src/net/azib/ipscan/gui/util/LayoutHelper.java +++ b/src/net/azib/ipscan/gui/util/LayoutHelper.java @@ -7,11 +7,11 @@ package net.azib.ipscan.gui.util; import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Font; -import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.*; import org.eclipse.swt.layout.FormAttachment; import org.eclipse.swt.layout.FormData; import org.eclipse.swt.layout.FormLayout; +import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; /** @@ -47,4 +47,13 @@ public class LayoutHelper { fontData.setHeight(fontData.getHeight() * 4/3); return new Font(shell.getDisplay(), fontData); } + + public static Image buttonImage(final String baseName) { + return new Image(Display.getCurrent(), new ImageDataProvider() { + @Override public ImageData getImageData(int zoom) { + String suffix = zoom >= 200 ? "@2x.png" : ".png"; + return new ImageData(getClass().getResourceAsStream("/images/buttons/" + baseName + suffix)); + } + }); + } } diff --git a/test/net/azib/ipscan/config/LabelsTest.java b/test/net/azib/ipscan/config/LabelsTest.java index 573e47a0..aba1ec56 100644 --- a/test/net/azib/ipscan/config/LabelsTest.java +++ b/test/net/azib/ipscan/config/LabelsTest.java @@ -1,25 +1,17 @@ package net.azib.ipscan.config; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import junit.framework.AssertionFailedError; +import org.junit.Before; +import org.junit.Test; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.net.URL; import java.util.Locale; import java.util.MissingResourceException; import java.util.regex.Matcher; import java.util.regex.Pattern; -import junit.framework.AssertionFailedError; - -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.*; public class LabelsTest { @@ -59,18 +51,18 @@ public class LabelsTest { // exception is good } } - + @Test public void testImageAsStream() throws IOException { InputStream stream = Labels.getInstance().getImageAsStream("button.start.img"); - // Now check the first bytes of GIF image header + // Now check the first bytes of GIF buttonImage header stream.read(); assertEquals((int)'P', stream.read()); assertEquals((int)'N', stream.read()); assertEquals((int)'G', stream.read()); stream.close(); } - + /** * This test recursively processes all source files and tries * to resolve every label it finds.