From e4f30afbe8063fb18ad1bc21ca92c4e7e5e64f7b Mon Sep 17 00:00:00 2001
From: Amandine Tournay <amandine.tournay@pasteur.fr>
Date: Tue, 9 Mar 2021 19:13:48 +0100
Subject: [PATCH] Added project

---
 .gitignore                                    |   6 +
 pom.xml                                       |  83 ++++++++
 .../TimeStampOverlay$DisplayStyle.class       | Bin 0 -> 1243 bytes
 .../fab/timestamp/TimeStampOverlay.class      | Bin 0 -> 5735 bytes
 .../fab/timestamp/TimeStampOverlay.java       | 178 ++++++++++++++++++
 .../plugins/fab/timestamp/Timestamp.class     | Bin 0 -> 1124 bytes
 .../java/plugins/fab/timestamp/Timestamp.java |  26 +++
 7 files changed, 293 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 pom.xml
 create mode 100644 src/main/java/plugins/fab/timestamp/TimeStampOverlay$DisplayStyle.class
 create mode 100644 src/main/java/plugins/fab/timestamp/TimeStampOverlay.class
 create mode 100644 src/main/java/plugins/fab/timestamp/TimeStampOverlay.java
 create mode 100644 src/main/java/plugins/fab/timestamp/Timestamp.class
 create mode 100644 src/main/java/plugins/fab/timestamp/Timestamp.java

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3d47f98
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+.idea/
+target/
+.settings/
+*.iml
+.project
+.classpath
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..4a6defa
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <!-- Inherited Icy Parent POM -->
+    <parent>
+        <groupId>org.bioimageanalysis.icy</groupId>
+        <artifactId>parent-pom-plugin</artifactId>
+        <version>1.0.3</version>
+    </parent>
+
+    <!-- Project Information -->
+    <artifactId>timestamp-overlay</artifactId>
+    <version>1.0.6</version>
+
+    <packaging>jar</packaging>
+
+    <name>Timestamp Overlay</name>
+    <description>Displays a customizable time stamp over a 2D sequence.</description>
+    <url>http://icy.bioimageanalysis.org/plugin/timestamp-overlay/</url>
+    <inceptionYear>2020</inceptionYear>
+
+    <organization>
+        <name>Institut Pasteur</name>
+        <url>https://pasteur.fr</url>
+    </organization>
+
+    <licenses>
+        <license>
+            <name>GNU GPLv3</name>
+            <url>https://www.gnu.org/licenses/gpl-3.0.en.html</url>
+            <distribution>repo</distribution>
+        </license>
+    </licenses>
+
+    <developers>
+        <developer>
+            <id>sdallongeville</id>
+            <name>Stéphane Dallongeville</name>
+            <url>https://research.pasteur.fr/fr/member/stephane-dallongeville/</url>
+            <roles>
+                <role>founder</role>
+                <role>lead</role>
+                <role>architect</role>
+                <role>developer</role>
+                <role>debugger</role>
+                <role>tester</role>
+                <role>maintainer</role>
+                <role>support</role>
+            </roles>
+        </developer>
+    </developers>
+
+    <!-- Project properties -->
+    <properties>
+
+    </properties>
+
+    <!-- Project build configuration -->
+    <build>
+
+    </build>
+
+    <!-- List of project's dependencies -->
+    <dependencies>
+        <!-- The core of Icy -->
+        <dependency>
+            <groupId>org.bioimageanalysis.icy</groupId>
+            <artifactId>icy-kernel</artifactId>
+        </dependency>
+    </dependencies>
+
+    <!-- Icy Maven repository (to find parent POM) -->
+    <repositories>
+        <repository>
+            <id>icy</id>
+            <name>Icy's Nexus</name>
+            <url>https://icy-nexus.pasteur.fr/repository/Icy/</url>
+        </repository>
+    </repositories>
+</project>
diff --git a/src/main/java/plugins/fab/timestamp/TimeStampOverlay$DisplayStyle.class b/src/main/java/plugins/fab/timestamp/TimeStampOverlay$DisplayStyle.class
new file mode 100644
index 0000000000000000000000000000000000000000..dfca7e9ba05cd8567731af1d9f74b4c160bbee1b
GIT binary patch
literal 1243
zcmbVL?@!uL6g|%Zh1#iO1M$axGY9BEXJ(c_jK<+Y2AWtTA^Y@TPgYY3X^RQ})rKE5
zTW0oof7G)3D${1kl7%Miz4yI)&O5g~{rT(b6@X2=QZdD_*|!EA({>9dyjAebu5dlx
z?HB5l88SOO6OP4)>9?lar)YRXOQ;Aj%$)KwUa+{`DU|I&mm$1=v|B4Pysl0_S!4*+
zD-u3kJ~*zW8@tuxvca(RVM4ZOsco6I>1{J8nQVjT_j(^i6k!bvvpVK*mmyLbw<I&w
z+i?ufG3`#Vl5NDO_nwY0B2lQaNa|1#ky%Pd6fvTznzlF?bX&ry^OhwT;?-W8TMh1*
zvi27>D3~P)-Y3(gQ_r|H5R|;hWG5R>!(%*E@q}S6AbaR~qO0Q>(hM=~IDFXd^@j|(
z;BbenQ_=Q{mB74zmS|uG)fabo!cYmq#_uFM(btgUXLLMAmfR6!-Ltss76Vdlj=3F6
znv2|_8NGqi7W<}r#fiV|nV0=EwPAK_?hPF3c^9CS9Hoh*Z`09w#kPgxYZb1Fb%vGy
zb2veRzs=4%`9`6CPuW?Jo&qS6oq)MTX(rkUQPeO^eL7V~RLd*>4Xhczqg-I-9C5$6
zAM%St_&aSWBgBnnXoQ4uj`=Tyn8E@*HHttAi%8NfSLIF4AM<aJ8mULktu9|+=@uBF
z28=<vpQ~7wLP_KUJRHNfXb1^UjxgVRujH<pC8?&SEM4N!+GpCimT}F-ZY0FW2`gic
l9QDYvv^dLM;>8cJf8!M7e9l#@`SB(45=nT50ycJ1zX4a!Fq{AY

literal 0
HcmV?d00001

diff --git a/src/main/java/plugins/fab/timestamp/TimeStampOverlay.class b/src/main/java/plugins/fab/timestamp/TimeStampOverlay.class
new file mode 100644
index 0000000000000000000000000000000000000000..a3e9ba1400212327f34cf891c077f373e2dac685
GIT binary patch
literal 5735
zcmbVQ33yc175;BBGjC?{fEW@?SOWyeOdu0L*0>~Of(#Hqk`My6ILy2x4`zw8fN@`_
zYm3&Uh_w`LD^^-XG(!}%+FBLA?sl=e-K@67?ycR#|K2x4CLy$ZO}?3T@4M%od+s^^
z`R}>&>U&Q=2VlOa*H9oZvp16NHe*R&S8%H@Wk!u;Dj4ncwXxMITWfb1iAb<dgH2$p
z8S3-(2F+N?Ncge?0;A+CCEI3PmJ%pgy)C#S=!*nn-M-dT!i;s-3y9133GmY=VC#y<
zC^yEE3+_z$mh%OL^st%i<zlU=zK9{PVD*{VR^`u|Mm4S!?N}C1$HD>=1{diz;!)pv
zBb1_H5o4a8l1^z!t9dyWE6c5IL?~j$V}V%MpwW$0tsQ~3rWIS-8kenZuF6_eMQ>G|
z^j6hyZw;|XpkOn1?l{+snW^&y##gVFeoPvdrj1z0@U><e^_~s%O;bE<I8n}BNTn(m
zZWLm?j#5mZnboIy*R#QeNtmKxvcUZR!(}=uF-pL`e0^g}vkL;#bm$nRp-P}q#Zty-
zxcjR7@$}Y+;l^~#l*Y{x(5n6XljaC`bd1Ir*{ab|45w_((Q%g5^6AjvbYm{&YnaDv
zjpz{_=U@Rn(QTww7-n}5K~q@m2}o6obhzNuu!Q(KX`+OY6O609F<}NHZY;)m(lk2#
z>=FDH2w0{z=y0P*0@92bYtqrJMxrgqtw|`yL&3;~AhofdeQ8Vem`Q=^GeoC^SuWPJ
z<2147>fEIad1KN_8i8@u{!N}!!|ldOtk$qfVDw<3wFFZ=I$E%XE(&g?dA4f5$M0yo
zdv7n39gfCTI~!D^;rMF#grnj12Gww5BQ|O16gW!;AxcF)sjWR_Ms#e(#dK%FN+x@?
zKj85@@j(HG?-K52&;ZNmWoa`KHWF@ZMOZ^fpm?~14g+0;%8p<pZLDQ$W`1PWZr#T0
zs~>UKTQJ^@EiiR#!*=FVu(#KcDL%0}aH@RPka{Pg%)fA@oEeuhdkMq*6|)R=dJS@B
zLPrurpEDKD1*f$7)G1tT2fa08Ubv@H1IZ(A_twtbxExn%xPs0ebWDJJ+HG(R16RqY
z57|z3uwJ_K8Xec-I&Qryo?x5=mW;5I&3TCVZ|=MSAJVWZOX_I`J4@D9+;7B943e2_
zj`pTV*(1`<CMRwo(CX@XDxJ8E;@o)DjIr|(+E`a-wQsiul17LFA5{ZZ`!4!(M%{wi
zxn0qu8~0$3hK~(#nME+tE%!<b{P_;I#+X|!1*AZ%g_sw9_Om>$`kVNU5h)A@<+0Nf
zPbauO%}S@3+zy%%mjEh=a;_s`B-0W4bQF)W(Ds&KZ#LcS>cA6d&iYz%;f0A{Z;u&D
z@(?*qKC9QEU~ES)=?jGVnpBGn@4~})M8juu$t$%r#UpV>{~$g`@a*g{rE$fB=aw2~
z{2#?34UaKk3OPf~(D679E22p$aZ2TxYiaOokUE~!(T@yck~C71FG+HFlIkFqf&v3N
zO7N5<63^y<n+MEM9nVNQ*5Zk<84E_7c#f>qlujg!SgNus5sVs3nP<=AiyB@KD3xq7
z+ygqkBvt6-x^?lSDbLw9N#|eIVTVJW2QTY*1;+;IP~tzq7%S@cI~uAKX_2tMimz+<
zT0U#F^L(|?`we{4(y)vts3cW6#B=Q=h7{fz{g7q7DtDv|-TWGkYWTLmB<1GQ3A!lv
zT^--U>vTv<U`=~lbF07<D{7~kMC}4U&~YJFNc(@J<Hz_32`mfQeD?1!Q$0=bXf((&
zh^+fR^yX(qme6FZ-_Y?hdHA`*iQrD_y&J#4uQdEJd*muhb7*c?jQ=KnZTZfcpz0{*
z$3=N4$xWyq1gQd!)y*&bvWAURKhPO(<F^`qBT#V?(Zh=j9lw)cun{jCrTjZOexG~M
zDPR0i$Dia2CnY+}aH>bX{EI9cj>*>Fbo^aaCPcd|{m2L1-1?y1xvi*j&|$%q96WOR
zGHFu;Qx1}nVr*%JEJ0#%Z#VkZkwuaQIVF(iE@KB1#J9@mYnF{Xr>Whpi<_}jj!1^*
z3mL;L3WQA)g}KvK`f{j7UD$<#>zm1@cr2NY%Jo?%ZIUycx^M|M2k9SL(9{#8r5tQ>
z3!UB<tozD_dOvHA9Dj$|EQ)n;mM9S@qJ~_l%8>E+8?k0%Sm%mTU6hG&bXWGWz-43I
z(yVf;_RZZP)>(H6xl2qE<+`X4<4MJe(&^mAq@FXZvW8UL%7%%$m?S2X&l5&8zQf2a
zb$SyvX`)h~N^Yt<ZTb|S`Fa!aZW&TvV=TrRC}b>`H0Ko4NSiWUE7iTH(pn<y7E?qO
z3r;aZ9^<EG1M5v0lUcf`79R2j2}p)Z1!M!E$yUW6G=~P6N1fY@2D=RvA6ZC_7`A${
zsbF<og0Z|5h`G9$Cu@6KTcD*`6X)>up{A)ET@!CjhkBNqMkL&vNW>Ew#&VHXo|4?B
zDeK=dxkt6d>}{`B&L)2cVlgAp6bTaSjFZDUjrl(RCWfhGyF${niyyMPB5qdw>dE3=
zJz03GC+{2T$vcC3^2VT^ye|O7Zn+=!?bKL`GJcO^?~|Ncz~?G&$=OFx;XRCr{g~=K
zis_xB`F8{}`cdsIF71ccTiB1;s#)u;$)K*dG~ADc6kXg|vef2%65b;?w;vZgPIU!n
z<o8Tv_Dq^Rg{D<vBDXV*|FckyIq>jm;bk3OgJqN*XPJQ}_}QaDXvT6H>5@!u8C!6a
z6|)YAgEI#ZSm`On+W78;cKJ-o-bL&=<Wu!p+0)o-RlRohob0u;XB$Ar5?9FwmKK%S
z_hIr;Z0W2h8bI&}y36bt^pr$0h-Gjo#~u4nlRsXPwmplTorPtN0ra&F;Od;@0Zf%T
zuD=fzL*#GH36yEWRo$9ZrJbRw51&-!9Ik42R+aM%Ro#(ORqh(SXSlLEEoJ4d0o*-w
zi}NS$g)h6!Swps&oilpal!~H53}vAL!{wOF_G031DZx-rES`%AIFFDxpHR2}J~Utv
zCC?)q{QO_R@V7AdJ#0l0U~#(=pCBxrz-kO|<PEIBTUd+tuuc@>B2k0&Vm?|$0BvF&
z+QntqAa<ccJd92Su!|)a#X;=FeG*@6eH`}_bawF&_1;G-M~Qvd$6T@VM}j+;8BPM%
zBd*7OwlpjfDLlZI6MoT+2RXxq6(WRBQK|@^rpk$MouIj{LLM~yE7W-1!0bu#zt%?x
ze+Ca(Ko)OvuFUA;H7~>Vc+FuP$l&ueOrZ-hcwzuY*qWNb)3uLKW|uUUADN|P{P>u0
zTRKagC0gfX@CD+PQ0>Qy2e5H=1}_of+n3nNZKZg1`vAVO)FFj#Dz|N4qE$FD_|{>3
zhu;riinm;oQtipnd-g)J9e}NH0N+=N#&FD0L5Tm5U1`>f{M7QZFoT~eGv&Jh{Cugc
zg8v!3CC6_H$>wn>W;OpH`+v^huigq9Sw!-J1%;KQBH$9(5Tvt1%;_*Gsfz`N$pCL-
zV57WH$2byaD}gI`bKHY8UERm<Ux62JCEmnUtZS}Tp<U0Q(3vN><2c^MKa|ssD;ANi
zJC1+iUtE79SNJ!BXQTE8{0FZyd{Hb^0cFjN*#y)Wj>>>8gJ!R-I6;7F8ia;NHO$rU
zJOle$Aqx1a@C2ns7^4I+;Cz?B5IDi;DY6yUaxEKY9IMF)u~$YuBede^eoXex&WNJj
z{d6)LquE$ECnLsqGh(bIliClDxARHNwp}7gn2iB(_H%@zMat~Rck@WyN@dM{jFRGB
zDNeHHDs%Q@y!DE#?WMHW{vfB@bK~3hV_bI42^~kpl(Ax}{fL-;D!u0nqt=;&A?-p1
zH+BQ_WEX>RBY&g18RKyaf7rT}1b-XddIuKZPUiVt%;S5QxA*dQk^33=eGK#i*va5t
zN2lMyEZNQb-5xx`ygSJ6M|op<3@`F>_6iQGaC<E$o(%Uf;br#A962Uti#aM&j%C9w
z!{~zMoIb6nWXgnMCz1D*6%AZNG{{MHhed7YORyd4kUo9Jy-FT}%s$&%=0u10u&86l
zZgo1J5VeQ6Kry#Fk#sYOXPk#m3)c>%uT&W+F(((VfPIA~7Mvj82|nf5e5{gR{N;Ed
b1q#F>v6#;is-2Fv#S+>(i3P~ghVu6T;7P@w

literal 0
HcmV?d00001

diff --git a/src/main/java/plugins/fab/timestamp/TimeStampOverlay.java b/src/main/java/plugins/fab/timestamp/TimeStampOverlay.java
new file mode 100644
index 0000000..0d3ea62
--- /dev/null
+++ b/src/main/java/plugins/fab/timestamp/TimeStampOverlay.java
@@ -0,0 +1,178 @@
+package plugins.fab.timestamp;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.event.KeyEvent;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.util.concurrent.TimeUnit;
+
+import icy.canvas.IcyCanvas;
+import icy.gui.frame.progress.AnnounceFrame;
+import icy.math.MathUtil;
+import icy.math.UnitUtil;
+import icy.painter.Overlay;
+import icy.sequence.Sequence;
+import icy.util.GraphicsUtil;
+import icy.util.StringUtil;
+
+public class TimeStampOverlay extends Overlay
+{
+    enum DisplayStyle
+    {
+        FRAME, TIME
+    };
+
+    String timeStampText;
+    int x;
+    int y;
+    Font font;
+    DisplayStyle displayStyle = DisplayStyle.FRAME;
+    Rectangle2D textBound = new Rectangle2D.Double(0, 0, 0, 0);
+    int fontSize = 20;
+    int displaySelectionIndex = 0;
+
+    public TimeStampOverlay(Sequence sequence)
+    {
+        super("Timestamp");
+
+        x = 20;
+        y = sequence.getHeight() - 20;
+        font = new Font("Arial", Font.BOLD, fontSize);
+    }
+
+    /**
+     * Display the time with all the units.
+     * 
+     * @param valueInMs
+     *        : value in milliseconds
+     * @param displayMs : Even if a unit is not relevant (equals to zero), it will be displayed.
+     * @return <b>Example:</b> "2h 3min 40sec 350ms".
+     */
+    public static String getTimeAsString(double valueInMs, boolean displayMs)
+    {
+        double v = Math.abs(valueInMs);
+
+        final int day = (int) (v / (24d * 60d * 60d * 1000d));
+        v %= 24d * 60d * 60d * 1000d;
+        final int hour = (int) (v / (60d * 60d * 1000d));
+        v %= 60d * 60d * 1000d;
+        final int minute = (int) (v / (60d * 1000d));
+        v %= 60d * 1000d;
+        final int second = (int) (v / 1000d);
+        v %= 1000d;
+        final double ms = MathUtil.round(v, 1);
+
+        String result = "";
+
+        if (day > 0)
+            result += day + "d ";
+        if (hour > 0)
+            result += String.format("%2dh ", Integer.valueOf(hour));
+        else if (!StringUtil.isEmpty(result))
+            result += "00h ";
+        if (minute > 0)
+            result += String.format("%2dmin ", Integer.valueOf(minute));
+        else if (!StringUtil.isEmpty(result))
+            result += "00min ";
+        if (second > 0)
+            result += String.format("%2dsec ", Integer.valueOf(second));
+        else if (!StringUtil.isEmpty(result))
+            result += "00sec ";
+        if (ms > 0d)
+            result += String.format("%05.1fms", Double.valueOf(ms));
+        else if (displayMs && !StringUtil.isEmpty(result))
+            result += String.format("%05.1fms", Double.valueOf(0));
+
+        return result;
+    }
+
+    @Override
+    public void paint(Graphics2D g, Sequence sequence, IcyCanvas canvas)
+    {
+
+        if (g == null)
+            return;
+
+        g.setColor(Color.white);
+        g.setFont(font);
+
+        switch (displayStyle)
+        {
+            case FRAME:
+                timeStampText = "Current frame: " + canvas.getPositionT();
+                break;
+
+            case TIME:
+                final double timeIntervalMs = sequence.getTimeInterval() * 1000d;
+                final TimeUnit unit = UnitUtil.getBestTimeUnit(timeIntervalMs * 10);
+                double ms = canvas.getPositionT() * timeIntervalMs;
+
+                // minute or "higher" time unit ?
+                if (unit.ordinal() >= TimeUnit.MINUTES.ordinal())
+                    timeStampText = getTimeAsString(ms, (timeIntervalMs % 1000d) != 0d);
+                else
+                    timeStampText = UnitUtil.displayTimeAsStringWithComma(ms, 3, unit);
+                break;
+        }
+
+        g.drawString(timeStampText, x, y);
+
+        Rectangle2D r = GraphicsUtil.getStringBounds(g, font, timeStampText);
+        r.setRect(r.getX() + x, r.getY() + y, r.getWidth(), r.getHeight());
+        textBound = r;
+    }
+
+    @Override
+    public void keyPressed(KeyEvent e, Point2D imagePoint, IcyCanvas canvas)
+    {
+        if (e.isConsumed())
+            return;
+
+        if (e.getKeyChar() == 'm')
+        {
+            x = (int) imagePoint.getX();
+            y = (int) imagePoint.getY();
+            canvas.getSequence().painterChanged(this);
+            return;
+        }
+
+        // if ( !isPointInTextArea( imagePoint ) ) return;
+
+        if (e.getKeyChar() == 't')
+        {
+            displaySelectionIndex++;
+            if (displaySelectionIndex >= DisplayStyle.values().length)
+            {
+                displaySelectionIndex = 0;
+            }
+
+            displayStyle = DisplayStyle.values()[displaySelectionIndex];
+
+        }
+
+        if (e.getKeyChar() == '+')
+        {
+            fontSize++;
+        }
+
+        if (e.getKeyChar() == '-')
+        {
+            fontSize--;
+            if (fontSize < 2)
+                fontSize = 2;
+        }
+
+        if (e.getKeyChar() == 'k')
+        {
+            canvas.getSequence().removePainter(this);
+            new AnnounceFrame("Time Stamp removed", 2);
+        }
+
+        font = new Font("Arial", Font.BOLD, fontSize);
+        canvas.getSequence().painterChanged(this);
+
+        e.consume();
+    }
+}
diff --git a/src/main/java/plugins/fab/timestamp/Timestamp.class b/src/main/java/plugins/fab/timestamp/Timestamp.class
new file mode 100644
index 0000000000000000000000000000000000000000..09638ce64d13ceab40237f6f438d4c8e12bb17ef
GIT binary patch
literal 1124
zcmah|O;1xn6g@)=t+fbL`BY&LftE&Q;f^*<)Pz-4k~SFKnCa`Z9eI84F>eaif8_=e
zNnE<{HyPud*9QwDaWUWbo_p>+cYgl<_8q`;?By`Uuo3yAz7As1lO198P{mdbBhkLz
z<&b6A*4|i542A5()=1BO6i12Y3(x8>kR4w!%+z(DZG$0Gt{gLDUxi&&Kn8b;n8pml
zTvG??&1l$Brakc}HA7GO$I@tbPA{`|pks#3=6|@=D3BQiIm|O`Ig0&}7Cj?}N<=2?
z8x_Z*9fp2eM~Ch<j}l`q>jOLV8}&}Z<=ArBa@p;w?tWc#=-MRX$d{ht<8WlSH!^W(
zczC7^w*$p*+;(Gb)o06P(B*a<DINwidWlgl^!@N$2Yv1<Yn36>kb46e^i}fS)p6v@
z@j(*L*9~s@0gunM^#;6W!XZsW*f}{(czF~%tYjZk!BmB(2zBRN70<|B2cA(fR$TC|
zO1Hf*usqgZRAM(It05(l0wuXSUXu)clEP`3n4XZSQGXfNMN+#0=J3Ety2!9tZhn$y
zQuvgbXjwxvYn9^y7?z7z!79T-Us=~AXR4)6M=J2BQC7>9rV}hqZ^ZReEr*8;JGTp;
z2=<n=pz0N{hR2S_I>TD|7C=Xa<4F#iME0LCi`c?bh5~g#3e2!Ffs3RLNIj9>*D4<v
z^4Fv(#am)B%o0!U<h6{_mM*lYl{|H*-8Z@CS}1na-*>gcCRHm#e-fCY9sLxVb9554
zGFqqiE|LG5JQrwo&me=lG#4iZw9e9rpl_T{ktH}_;|g=7g-hJuyTDSj`UCUTE3Cb*
zUgFUOHr_ed3>@qdMFuIG$0C6(V}ayb$7&L0X#$monMDcP*r9N{<dFyah4ma2nW0SQ
HDOCOd63#F@

literal 0
HcmV?d00001

diff --git a/src/main/java/plugins/fab/timestamp/Timestamp.java b/src/main/java/plugins/fab/timestamp/Timestamp.java
new file mode 100644
index 0000000..e6d10a7
--- /dev/null
+++ b/src/main/java/plugins/fab/timestamp/Timestamp.java
@@ -0,0 +1,26 @@
+package plugins.fab.timestamp;
+
+import icy.gui.frame.progress.ToolTipFrame;
+import icy.plugin.abstract_.PluginActionable;
+import icy.sequence.Sequence;
+
+public class Timestamp extends PluginActionable
+{
+
+    // IcyFrame mainFrame ;
+
+    @Override
+    public void run()
+    {
+        new ToolTipFrame("<html>" + "<b>TimeStamp added.</b>" + "<br>"
+                + "<br>Place your cursor over the TimeStamp's text and type one of the following letters to change the display:"
+                + "<br>" + "<li> t : switch from frame to time (using time scale) display"
+                + "<li> +/- : increase / decrease font size" + "<li> m : move time stamp to cursor location"
+                + "<li> k : remove time stamp" + "</html>");
+
+        final Sequence sequence = getActiveSequence();
+
+        if (sequence != null)
+            sequence.addOverlay(new TimeStampOverlay(sequence));
+    }
+}
-- 
GitLab